aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections/collectionSchema
diff options
context:
space:
mode:
authormehekj <mehek.jethani@gmail.com>2023-01-28 22:38:41 -0500
committermehekj <mehek.jethani@gmail.com>2023-01-28 22:38:41 -0500
commit9d2af1180f0dd5af5ab86b922cd8b0cdfcf4ea09 (patch)
treeb5ea43352db00566b1338cd8ce4c575c4bd00a6c /src/client/views/collections/collectionSchema
parent82de335e0643f907e44cb193c9b2c6da1b3cbaf1 (diff)
checkpoint: schemarow as documentview functioning
Diffstat (limited to 'src/client/views/collections/collectionSchema')
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.scss6
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.tsx129
-rw-r--r--src/client/views/collections/collectionSchema/SchemaRowBox.tsx80
3 files changed, 157 insertions, 58 deletions
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.scss b/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
index 4fa5d80e2..e0d0101a2 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.scss
@@ -126,10 +126,16 @@
}
}
+.schema-row-wrapper {
+ max-height: 70px;
+ overflow: hidden;
+}
+
.schema-header-row,
.schema-row {
display: flex;
flex-direction: row;
+ height: 100%;
max-height: 70px;
overflow: auto;
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
index f7c68c803..c9f934aec 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
@@ -1,14 +1,14 @@
import React = require('react');
import { action, computed, observable, ObservableMap, ObservableSet, trace, untracked } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc, DocListCast, StrListCast } from '../../../../fields/Doc';
+import { DataSym, Doc, DocListCast, Opt, StrListCast } from '../../../../fields/Doc';
import { Id } from '../../../../fields/FieldSymbols';
import { List } from '../../../../fields/List';
import { RichTextField } from '../../../../fields/RichTextField';
import { listSpec } from '../../../../fields/Schema';
-import { Cast, StrCast } from '../../../../fields/Types';
+import { BoolCast, Cast, StrCast } from '../../../../fields/Types';
import { ImageField } from '../../../../fields/URLField';
-import { emptyFunction, returnEmptyString, setupMoveUpEvents } from '../../../../Utils';
+import { emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnEmptyString, returnFalse, returnTrue, setupMoveUpEvents, smoothScroll, Utils } from '../../../../Utils';
import { Docs, DocUtils } from '../../../documents/Documents';
import { DragManager } from '../../../util/DragManager';
import { SelectionManager } from '../../../util/SelectionManager';
@@ -21,6 +21,9 @@ import { CollectionSubView } from '../CollectionSubView';
import './CollectionSchemaView.scss';
import { SchemaColumnHeader } from './SchemaColumnHeader';
import { SchemaRowBox } from './SchemaRowBox';
+import { DocFocusOptions, DocumentView, ViewAdjustment } from '../../nodes/DocumentView';
+import { DefaultStyleProvider } from '../../StyleProvider';
+import { Transform } from '../../../util/Transform';
export enum ColumnType {
Number,
@@ -40,7 +43,7 @@ export class CollectionSchemaView extends CollectionSubView() {
private _closestDropIndex: number = 0;
private _minColWidth: number = 150;
- @observable _rowMenuWidth: number = 100;
+ public static _rowMenuWidth: number = 100;
@observable _selectedDocs: ObservableSet = new ObservableSet<Doc>();
@observable _rowEles: ObservableMap = new ObservableMap<Doc, HTMLDivElement>();
@observable _isDragging: boolean = false;
@@ -69,16 +72,15 @@ export class CollectionSchemaView extends CollectionSubView() {
let widths = Cast(
this.layoutDoc.columnWidths,
listSpec('number'),
- this.columnKeys.map(() => (this.props.PanelWidth() - this._rowMenuWidth) / this.columnKeys.length)
+ this.columnKeys.map(() => (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth) / this.columnKeys.length)
);
const totalWidth = widths.reduce((sum, width) => sum + width, 0);
- if (totalWidth !== this.props.PanelWidth() - this._rowMenuWidth) {
+ if (totalWidth !== this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth) {
widths = widths.map(w => {
const proportion = w / totalWidth;
- return proportion * (this.props.PanelWidth() - this._rowMenuWidth);
+ return proportion * (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth);
});
- // this.layoutDoc.columnWidths = new List<number>(widths);
}
return widths;
@@ -110,8 +112,8 @@ export class CollectionSchemaView extends CollectionSubView() {
let currWidths = [...this.storedColumnWidths];
const newColWidth = this.props.PanelWidth() / (currWidths.length + 1);
currWidths = currWidths.map(w => {
- const proportion = w / (this.props.PanelWidth() - this._rowMenuWidth);
- return proportion * (this.props.PanelWidth() - this._rowMenuWidth - newColWidth);
+ const proportion = w / (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth);
+ return proportion * (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth - newColWidth);
});
currWidths.splice(index + 1, 0, newColWidth);
this.layoutDoc.columnWidths = new List<number>(currWidths);
@@ -133,8 +135,8 @@ export class CollectionSchemaView extends CollectionSubView() {
let currWidths = [...this.storedColumnWidths];
const removedColWidth = currWidths[index];
currWidths = currWidths.map(w => {
- const proportion = w / (this.props.PanelWidth() - this._rowMenuWidth - removedColWidth);
- return proportion * (this.props.PanelWidth() - this._rowMenuWidth);
+ const proportion = w / (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth - removedColWidth);
+ return proportion * (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth);
});
currWidths.splice(index, 1);
this.layoutDoc.columnWidths = new List<number>(currWidths);
@@ -142,8 +144,6 @@ export class CollectionSchemaView extends CollectionSubView() {
let currKeys = [...this.columnKeys];
currKeys.splice(index, 1);
this.layoutDoc.columnKeys = new List<string>(currKeys);
- console.log([...this.storedColumnWidths]);
- console.log([...this.columnKeys]);
};
@action
@@ -399,6 +399,34 @@ export class CollectionSchemaView extends CollectionSubView() {
ContextMenu.Instance.displayMenu(x, y, undefined, true);
};
+ focusDocument = (doc: Doc, options: DocFocusOptions) => {
+ Doc.BrushDoc(doc);
+
+ let focusSpeed = 0;
+ const found = this._mainCont && Array.from(this._mainCont.getElementsByClassName('documentView-node')).find((node: any) => node.id === doc[Id]);
+ if (found) {
+ const top = found.getBoundingClientRect().top;
+ const localTop = this.props.ScreenToLocalTransform().transformPoint(0, top);
+ if (Math.floor(localTop[1]) !== 0) {
+ smoothScroll((focusSpeed = options.zoomTime ?? 500), this._mainCont!, localTop[1] + this._mainCont!.scrollTop, options.easeFunc);
+ }
+ }
+ const endFocus = async (moved: boolean) => options?.afterFocus?.(moved) ?? ViewAdjustment.doNothing;
+ this.props.focus(this.rootDoc, {
+ ...options,
+ afterFocus: (didFocus: boolean) => new Promise<ViewAdjustment>(res => setTimeout(async () => res(await endFocus(didFocus)), focusSpeed)),
+ });
+ };
+
+ isChildContentActive = () =>
+ this.props.isDocumentActive?.() && (this.props.childDocumentsActive?.() || BoolCast(this.rootDoc.childDocumentsActive)) ? true : this.props.childDocumentsActive?.() === false || this.rootDoc.childDocumentsActive === false ? false : undefined;
+
+ getDocTransform(doc: Doc, dref?: DocumentView) {
+ const { scale, translateX, translateY } = Utils.GetScreenTransform(dref?.ContentDiv || undefined);
+ // the document view may center its contents and if so, will prepend that onto the screenToLocalTansform. so we have to subtract that off
+ return new Transform(-translateX + (dref?.centeringX || 0), -translateY + (dref?.centeringY || 0), 1).scale(this.props.ScreenToLocalTransform().Scale);
+ }
+
render() {
return (
<div
@@ -413,7 +441,7 @@ export class CollectionSchemaView extends CollectionSubView() {
onDrop={this.onExternalDrop.bind(this)}>
<div className="schema-table">
<div className="schema-header-row">
- <div className="row-menu" style={{ width: this._rowMenuWidth }}></div>
+ <div className="row-menu" style={{ width: CollectionSchemaView._rowMenuWidth }}></div>
{this.columnKeys.map((key, index) => {
return (
<SchemaColumnHeader
@@ -432,25 +460,58 @@ export class CollectionSchemaView extends CollectionSubView() {
})}
</div>
<div className="schema-table-content">
- {this.childDocs.map((doc: Doc, index: number) => (
- <SchemaRowBox
- {...this.props}
- key={index}
- Document={doc}
- ContainingCollectionDoc={this.props.CollectionView?.props.Document}
- ContainingCollectionView={this.props.CollectionView}
- rowIndex={index}
- columnKeys={this.columnKeys}
- columnWidths={this.displayColumnWidths}
- rowMenuWidth={this._rowMenuWidth}
- selectedDocs={this._selectedDocs}
- selectRow={this.selectRow}
- startDrag={this.startDrag}
- dragging={this._isDragging}
- dropIndex={this.setDropIndex}
- addRowRef={this.addRowRef}
- />
- ))}
+ {this.childDocs.map((doc: Doc, index: number) => {
+ const dataDoc = !doc.isTemplateDoc && !doc.isTemplateForField && !doc.PARAMS ? undefined : this.props.DataDoc;
+ let dref: Opt<DocumentView>;
+
+ return (
+ <div className="schema-row-wrapper">
+ <DocumentView
+ {...this.props}
+ ref={r => (dref = r || undefined)}
+ LayoutTemplate={this.props.childLayoutTemplate}
+ LayoutTemplateString={SchemaRowBox.LayoutString(this.props.fieldKey)}
+ renderDepth={this.props.renderDepth + 1}
+ Document={doc}
+ DataDoc={dataDoc}
+ ContainingCollectionView={this.props.CollectionView}
+ ContainingCollectionDoc={this.Document}
+ PanelWidth={this.props.PanelWidth}
+ PanelHeight={() => 70}
+ styleProvider={DefaultStyleProvider}
+ focus={this.focusDocument}
+ docFilters={this.childDocFilters}
+ docRangeFilters={this.childDocRangeFilters}
+ searchFilterDocs={this.searchFilterDocs}
+ rootSelected={this.rootSelected}
+ ScreenToLocalTransform={() => this.getDocTransform(doc, dref)}
+ bringToFront={emptyFunction}
+ isContentActive={this.isChildContentActive}
+ hideDecorations={true}
+ hideTitle={true}
+ hideDocumentButtonBar={true}
+ />
+ </div>
+ );
+
+ // <SchemaRowBox
+ // {...this.props}
+ // key={index}
+ // Document={doc}
+ // ContainingCollectionDoc={this.props.CollectionView?.props.Document}
+ // ContainingCollectionView={this.props.CollectionView}
+ // rowIndex={index}
+ // columnKeys={this.columnKeys}
+ // columnWidths={this.displayColumnWidths}
+ // rowMenuWidth={CollectionSchemaView._rowMenuWidth}
+ // selectedDocs={this._selectedDocs}
+ // selectRow={this.selectRow}
+ // startDrag={this.startDrag}
+ // dragging={this._isDragging}
+ // dropIndex={this.setDropIndex}
+ // addRowRef={this.addRowRef}
+ // />
+ })}
</div>
</div>
<EditableView GetValue={returnEmptyString} SetValue={this.addNewTextDoc} placeholder={"Type ':' for commands"} contents={'+ New Node'} menuCallback={this.menuCallback} />
diff --git a/src/client/views/collections/collectionSchema/SchemaRowBox.tsx b/src/client/views/collections/collectionSchema/SchemaRowBox.tsx
index 5c1f32565..f790e9dbf 100644
--- a/src/client/views/collections/collectionSchema/SchemaRowBox.tsx
+++ b/src/client/views/collections/collectionSchema/SchemaRowBox.tsx
@@ -1,8 +1,8 @@
import React = require('react');
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { action, ObservableMap, ObservableSet } from 'mobx';
+import { action, computed, ObservableMap, ObservableSet } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc } from '../../../../fields/Doc';
+import { Doc, StrListCast } from '../../../../fields/Doc';
import { undoBatch } from '../../../util/UndoManager';
import { ViewBoxBaseComponent } from '../../DocComponent';
import { Colors } from '../../global/globalEnums';
@@ -11,6 +11,10 @@ import './CollectionSchemaView.scss';
import { SchemaTableCell } from './SchemaTableCell';
import { emptyFunction, setupMoveUpEvents } from '../../../../Utils';
import { DragManager } from '../../../util/DragManager';
+import { OpenWhere } from '../../nodes/DocumentView';
+import { Cast } from '../../../../fields/Types';
+import { listSpec } from '../../../../fields/Schema';
+import { CollectionSchemaView } from './CollectionSchemaView';
export interface SchemaRowBoxProps extends FieldViewProps {
rowIndex: number;
@@ -26,40 +30,61 @@ export interface SchemaRowBoxProps extends FieldViewProps {
}
@observer
-export class SchemaRowBox extends ViewBoxBaseComponent<SchemaRowBoxProps>() {
+export class SchemaRowBox extends ViewBoxBaseComponent<FieldViewProps>() {
public static LayoutString(fieldKey: string) {
return FieldView.LayoutString(SchemaRowBox, fieldKey);
}
private _ref: HTMLDivElement | null = null;
- isSelected = () => this.props.selectedDocs.has(this.props.Document);
bounds = () => this._ref?.getBoundingClientRect();
+ @computed get columnKeys() {
+ return StrListCast(this.props.ContainingCollectionDoc?.columnKeys);
+ }
+
+ @computed get storedColumnWidths() {
+ let widths = Cast(
+ this.props.ContainingCollectionDoc?.columnWidths,
+ listSpec('number'),
+ this.columnKeys.map(() => (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth) / this.columnKeys.length)
+ );
+
+ const totalWidth = widths.reduce((sum, width) => sum + width, 0);
+ if (totalWidth !== this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth) {
+ widths = widths.map(w => {
+ const proportion = w / totalWidth;
+ return proportion * (this.props.PanelWidth() - CollectionSchemaView._rowMenuWidth);
+ });
+ }
+
+ return widths;
+ }
+
@action
onRowPointerDown = (e: React.PointerEvent) => {
e.stopPropagation();
- setupMoveUpEvents(
- this,
- e,
- e => this.props.startDrag(e, this.props.Document, this._ref!, this.props.rowIndex),
- emptyFunction,
- e => this.props.selectRow(e, this.props.Document, this._ref!, this.props.rowIndex)
- );
+ // setupMoveUpEvents(
+ // this,
+ // e,
+ // e => this.props.startDrag(e, this.props.Document, this._ref!, this.props.rowIndex),
+ // emptyFunction,
+ // e => this.props.selectRow(e, this.props.Document, this._ref!, this.props.rowIndex)
+ // );
};
onPointerEnter = (e: any) => {
- if (!this.props.dragging) return;
+ // if (!this.props.dragging) return;
document.removeEventListener('pointermove', this.onPointerMove);
document.addEventListener('pointermove', this.onPointerMove);
};
onPointerMove = (e: any) => {
- if (!this.props.dragging) return;
+ // if (!this.props.dragging) return;
let dragIsRow: boolean = true;
DragManager.docsBeingDragged.forEach(doc => {
- dragIsRow = this.props.selectedDocs.has(doc);
+ // dragIsRow = this.props.selectedDocs.has(doc);
});
if (this._ref && dragIsRow) {
const rect = this._ref.getBoundingClientRect();
@@ -69,11 +94,11 @@ export class SchemaRowBox extends ViewBoxBaseComponent<SchemaRowBoxProps>() {
if (y <= halfLine) {
this._ref.style.borderTop = `solid 2px ${Colors.MEDIUM_BLUE}`;
this._ref.style.borderBottom = '0px';
- this.props.dropIndex(this.props.rowIndex);
+ // this.props.dropIndex(this.props.rowIndex);
} else if (y > halfLine) {
this._ref.style.borderTop = '0px';
this._ref.style.borderBottom = `solid 2px ${Colors.MEDIUM_BLUE}`;
- this.props.dropIndex(this.props.rowIndex + 1);
+ // this.props.dropIndex(this.props.rowIndex + 1);
}
}
};
@@ -90,15 +115,22 @@ export class SchemaRowBox extends ViewBoxBaseComponent<SchemaRowBoxProps>() {
return (
<div
className="schema-row"
- style={this.isSelected() ? { backgroundColor: Colors.LIGHT_BLUE, opacity: this.props.dragging ? 0.5 : 1 } : {}}
- onPointerDown={this.onRowPointerDown}
- onPointerEnter={this.onPointerEnter}
+ style={this.props.isSelected() ? { backgroundColor: Colors.LIGHT_BLUE } : {}}
+ // style={this.isSelected() ? { backgroundColor: Colors.LIGHT_BLUE, opacity: this.props.dragging ? 0.5 : 1 } : {}}
+ // onPointerDown={this.onRowPointerDown}
+ // onPointerEnter={this.onPointerEnter}
onPointerLeave={this.onPointerLeave}
ref={(row: HTMLDivElement | null) => {
- row && this.props.addRowRef(this.props.Document, row);
+ // row && this.props.addRowRef(this.props.Document, row);
this._ref = row;
}}>
- <div className="row-menu" style={{ width: this.props.rowMenuWidth }}>
+ <div
+ className="row-menu"
+ style={
+ {
+ /* width: this.props.rowMenuWidth */
+ }
+ }>
<div
className="schema-row-button"
onPointerDown={undoBatch(e => {
@@ -111,14 +143,14 @@ export class SchemaRowBox extends ViewBoxBaseComponent<SchemaRowBoxProps>() {
className="schema-row-button"
onPointerDown={e => {
e.stopPropagation();
- this.props.addDocTab(this.props.Document, 'add:right');
+ this.props.addDocTab(this.props.Document, OpenWhere.addRight);
}}>
<FontAwesomeIcon icon="external-link-alt" />
</div>
</div>
<div className="row-cells">
- {this.props.columnKeys.map((key, index) => (
- <SchemaTableCell key={key} Document={this.props.Document} fieldKey={key} columnWidth={this.props.columnWidths[index]} />
+ {this.columnKeys.map((key, index) => (
+ <SchemaTableCell key={key} Document={this.props.Document} fieldKey={key} columnWidth={this.storedColumnWidths[index]} />
))}
</div>
</div>