diff options
| author | bobzel <zzzman@gmail.com> | 2022-06-03 08:39:14 -0400 | 
|---|---|---|
| committer | bobzel <zzzman@gmail.com> | 2022-06-03 08:39:14 -0400 | 
| commit | 3e75896a0c6e59036a6b9467521f4fe68fdda1a0 (patch) | |
| tree | 758cfb37a9a17d4b276f7bcc908a56185b718978 /src/client/views/nodes/LabelBox.tsx | |
| parent | ca26b43095622d07ae81fc08d4037be38d9a8b28 (diff) | |
| parent | 8799738abd11a878579814e64163e0f8a95b5116 (diff) | |
Merge branch 'master' into presentation_upgrade
Diffstat (limited to 'src/client/views/nodes/LabelBox.tsx')
| -rw-r--r-- | src/client/views/nodes/LabelBox.tsx | 61 | 
1 files changed, 42 insertions, 19 deletions
diff --git a/src/client/views/nodes/LabelBox.tsx b/src/client/views/nodes/LabelBox.tsx index d539ca9b8..b0b050cea 100644 --- a/src/client/views/nodes/LabelBox.tsx +++ b/src/client/views/nodes/LabelBox.tsx @@ -4,7 +4,7 @@ import * as React from 'react';  import { Doc, DocListCast } from '../../../fields/Doc';  import { List } from '../../../fields/List';  import { listSpec } from '../../../fields/Schema'; -import { Cast, StrCast, NumCast } from '../../../fields/Types'; +import { Cast, StrCast, NumCast, BoolCast } from '../../../fields/Types';  import { DragManager } from '../../util/DragManager';  import { undoBatch } from '../../util/UndoManager';  import { ContextMenu } from '../ContextMenu'; @@ -23,18 +23,23 @@ export interface LabelBoxProps {  @observer  export class LabelBox extends ViewBoxBaseComponent<(FieldViewProps & LabelBoxProps)>() {      public static LayoutString(fieldKey: string) { return FieldView.LayoutString(LabelBox, fieldKey); } -    public static LayoutStringWithTitle(fieldType: { name: string }, fieldStr: string, label: string) { -        return `<${fieldType.name} fieldKey={'${fieldStr}'} label={'${label}'} {...props} />`;  //e.g., "<ImageBox {...props} fieldKey={"data} />" +    public static LayoutStringWithTitle(fieldStr: string, label?: string) { +        return !label ? LabelBox.LayoutString(fieldStr) : `<LabelBox fieldKey={'${fieldStr}'} label={'${label}'} {...props} />`;  //e.g., "<ImageBox {...props} fieldKey={"data} />"      }      private dropDisposer?: DragManager.DragDropDisposer; - +    private _timeout: any;      componentDidMount() {          this.props.setContentView?.(this);      } +    componentWillUnMount() { +        this._timeout && clearTimeout(this._timeout); +    }      getTitle() { -        return this.rootDoc["title-custom"] ? StrCast(this.rootDoc.title) : this.props.label ? this.props.label : -            typeof this.rootDoc[this.fieldKey] === "string" ? StrCast(this.rootDoc[this.fieldKey]) : StrCast(this.rootDoc.title); +        return this.rootDoc["title-custom"] ? StrCast(this.rootDoc.title) : +            this.props.label ? this.props.label : +                typeof this.rootDoc[this.fieldKey] === "string" ? StrCast(this.rootDoc[this.fieldKey]) : +                    StrCast(this.rootDoc.title);      }      protected createDropTarget = (ele: HTMLDivElement) => { @@ -73,21 +78,38 @@ export class LabelBox extends ViewBoxBaseComponent<(FieldViewProps & LabelBoxPro      @observable _mouseOver = false;      @computed get hoverColor() { return this._mouseOver ? StrCast(this.layoutDoc._hoverBackgroundColor) : "unset"; } -    fitTextToBox = (r: any) => { -        BigText(r, { +    fitTextToBox = (r: any): any => { +        const singleLine = BoolCast(this.rootDoc._singleLine, true); +        const params = {              rotateText: null,              fontSizeFactor: 1, -            minimumFontSize: NumCast(this.layoutDoc._minFontSize), -            maximumFontSize: NumCast(this.layoutDoc._maxFontSize), +            minimumFontSize: NumCast(this.rootDoc._minFontSize, 8), +            maximumFontSize: NumCast(this.rootDoc._maxFontSize, 1000),              limitingDimension: "both",              horizontalAlign: "center",              verticalAlign: "center",              textAlign: "center", -            whiteSpace: "nowrap" -        }); +            singleLine, +            whiteSpace: singleLine ? "nowrap" : "pre-wrap" +        }; +        this._timeout = undefined; +        if (!r) return params; +        if (!r.offsetHeight || !r.offsetWidth) return this._timeout = setTimeout(() => this.fitTextToBox(r)); +        const parent = r.parentNode; +        const parentStyle = parent.style; +        parentStyle.display = ""; +        parentStyle.alignItems = ""; +        r.setAttribute("style", ""); +        r.style.width = singleLine ? "" : "100%"; + +        r.style.textOverflow = "ellipsis"; +        r.style.overflow = "hidden"; +        BigText(r, params); +        return params;      }      // (!missingParams || !missingParams.length ? "" : "(" + missingParams.map(m => m + ":").join(" ") + ")")      render() { +        const boxParams = this.fitTextToBox(null);// this causes mobx to trigger re-render when data changes          const params = Cast(this.paramsDoc["onClick-paramFieldKeys"], listSpec("string"), []);          const missingParams = params?.filter(p => !this.paramsDoc[p]);          params?.map(p => DocListCast(this.paramsDoc[p])); // bcz: really hacky form of prefetching ... @@ -104,16 +126,17 @@ export class LabelBox extends ViewBoxBaseComponent<(FieldViewProps & LabelBoxPro                      fontFamily: StrCast(this.layoutDoc._fontFamily) || "inherit",                      letterSpacing: StrCast(this.layoutDoc.letterSpacing),                      textTransform: StrCast(this.layoutDoc.textTransform) as any, +                    paddingLeft: NumCast(this.rootDoc._xPadding), +                    paddingRight: NumCast(this.rootDoc._xPadding), +                    paddingTop: NumCast(this.rootDoc._yPadding), +                    paddingBottom: NumCast(this.rootDoc._yPadding),                      width: this.props.PanelWidth(),                      height: this.props.PanelHeight(), -                    whiteSpace: this.layoutDoc._singleLine ? "pre" : "pre-wrap" +                    whiteSpace: boxParams.singleLine ? "pre" : "pre-wrap"                  }} > -                    <span ref={r => { -                        if (r) { -                            if (!r.offsetWidth || !r.offsetHeight) setTimeout(() => this.fitTextToBox(r)); -                            else this.fitTextToBox(r); -                        } -                    }}>{label.startsWith("#") ? (null) : label}</span> +                    <span style={{ width: boxParams.singleLine ? "" : "100%" }} ref={action((r: any) => this.fitTextToBox(r))}> +                        {label.startsWith("#") ? (null) : label.replace(/([^a-zA-Z])/g, "$1\u200b")} +                    </span>                  </div>                  <div className="labelBox-fieldKeyParams" >                      {!missingParams?.length ? (null) : missingParams.map(m => <div key={m} className="labelBox-missingParam">{m}</div>)}  | 
