aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2023-04-27 16:45:59 -0400
committerbobzel <zzzman@gmail.com>2023-04-27 16:45:59 -0400
commitba5b687011526188bb024ddf37c254aaf285c06d (patch)
tree47df4f82053066d75ed32683375c2bb965be35d5 /src/client/views/collections/collectionSchema/SchemaTableCell.tsx
parentb82a909a63a6de414d075735453240ebc02f5aa3 (diff)
performance tuning for schema views to avoid re-rendering each table cell when child docs change.
Diffstat (limited to 'src/client/views/collections/collectionSchema/SchemaTableCell.tsx')
-rw-r--r--src/client/views/collections/collectionSchema/SchemaTableCell.tsx48
1 files changed, 26 insertions, 22 deletions
diff --git a/src/client/views/collections/collectionSchema/SchemaTableCell.tsx b/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
index 374b92d72..686b21283 100644
--- a/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
+++ b/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
@@ -1,31 +1,34 @@
import React = require('react');
+import { action, computed, observable } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc, DocListCast, Field, Opt } from '../../../../fields/Doc';
-import { Utils, emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnFalse, returnZero } from '../../../../Utils';
+import { extname } from 'path';
+import DatePicker from 'react-datepicker';
+import { DateField } from '../../../../fields/DateField';
+import { Doc, DocListCast, Field } from '../../../../fields/Doc';
+import { Cast, DateCast } from '../../../../fields/Types';
+import { ImageField } from '../../../../fields/URLField';
+import { emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnFalse, returnZero, Utils } from '../../../../Utils';
import { Transform } from '../../../util/Transform';
import { EditableView } from '../../EditableView';
+import { Colors } from '../../global/globalEnums';
import { FieldView, FieldViewProps } from '../../nodes/FieldView';
import { KeyValueBox } from '../../nodes/KeyValueBox';
import { DefaultStyleProvider } from '../../StyleProvider';
import { CollectionSchemaView, ColumnType, FInfotoColType } from './CollectionSchemaView';
import './CollectionSchemaView.scss';
-import { action, computed, observable } from 'mobx';
-import { extname } from 'path';
-import { Cast, DateCast, StrCast } from '../../../../fields/Types';
-import { ImageField } from '../../../../fields/URLField';
-import { DateField } from '../../../../fields/DateField';
-import DatePicker from 'react-datepicker';
-import { Colors } from '../../global/globalEnums';
-import { SelectionManager } from '../../../util/SelectionManager';
+import { FInfo } from '../../../documents/Documents';
export interface SchemaTableCellProps {
Document: Doc;
col: number;
- schemaView: () => CollectionSchemaView | undefined;
+ deselectCell: () => void;
+ selectCell: (doc: Doc, col: number) => void;
+ selectedCell: () => [Doc, number] | undefined;
fieldKey: string;
columnWidth: number;
isRowActive: () => boolean | undefined;
- // setColumnValues: (field: string, value: string) => boolean;
+ getFinfo: (fieldKey: string) => FInfo | undefined;
+ setColumnValues: (field: string, value: string) => boolean;
}
@observer
@@ -33,11 +36,11 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
private _editorRef: EditableView | null = null;
@computed get readOnly() {
- return this.props.schemaView()?.fieldInfos[this.props.fieldKey]?.readOnly ?? false;
+ return this.props.getFinfo(this.props.fieldKey)?.readOnly ?? false;
}
@computed get selected() {
- const selected: [Doc, number] | undefined = this.props.schemaView()?._selectedCell;
+ const selected: [Doc, number] | undefined = this.props.selectedCell();
return this.props.isRowActive() && selected && selected[0] == this.props.Document && selected[1] == this.props.col;
}
@@ -57,11 +60,12 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
this._editorRef?.setIsFocused(true);
}
if (e.key == 'Escape') {
- this.props.schemaView()?.deselectCell();
+ this.props.deselectCell();
}
};
-
- get defaultCellContent() {
+ colWidthFunc = () => this.props.columnWidth;
+ colRowHeightFunc = () => CollectionSchemaView._rowHeight;
+ @computed get defaultCellContent() {
const props: FieldViewProps = {
Document: this.props.Document,
docFilters: returnEmptyFilter,
@@ -81,8 +85,8 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
whenChildContentsActiveChanged: emptyFunction,
ScreenToLocalTransform: Transform.Identity,
focus: emptyFunction,
- PanelWidth: () => this.props.columnWidth,
- PanelHeight: () => CollectionSchemaView._rowHeight,
+ PanelWidth: this.colWidthFunc,
+ PanelHeight: this.colRowHeightFunc,
addDocTab: returnFalse,
pinToPres: returnZero,
};
@@ -95,7 +99,7 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
GetValue={() => Field.toKeyValueString(this.props.Document, this.props.fieldKey)}
SetValue={(value: string, shiftDown?: boolean, enterKey?: boolean) => {
if (shiftDown && enterKey) {
- // this.props.setColumnValues(this.props.fieldKey, value);
+ this.props.setColumnValues(this.props.fieldKey, value);
}
return KeyValueBox.SetField(this.props.Document, this.props.fieldKey, value);
}}
@@ -106,7 +110,7 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
}
get getCellType() {
- const columnTypeStr = this.props.schemaView()?.fieldInfos[this.props.fieldKey]?.fieldType;
+ const columnTypeStr = this.props.getFinfo(this.props.fieldKey)?.fieldType;
if (columnTypeStr) {
if (columnTypeStr in FInfotoColType) {
return FInfotoColType[columnTypeStr];
@@ -139,7 +143,7 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
<div
className="schema-table-cell"
onPointerDown={action(e => {
- if (!this.selected) this.props.schemaView()?.selectCell(this.props.Document, this.props.col);
+ if (!this.selected) this.props.selectCell(this.props.Document, this.props.col);
})}
style={{ width: this.props.columnWidth, border: this.selected ? `solid 2px ${Colors.MEDIUM_BLUE}` : undefined }}>
{this.content}