aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.tsx32
-rw-r--r--src/client/views/collections/collectionSchema/SchemaColumnHeader.tsx42
-rw-r--r--src/client/views/collections/collectionSchema/SchemaTableCell.tsx2
3 files changed, 72 insertions, 4 deletions
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
index 29b22c0d5..4fb3f68c1 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
@@ -1,12 +1,12 @@
import React = require('react');
import { action, computed, observable, ObservableMap, ObservableSet, untracked } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc, DocListCast, Opt } from '../../../../fields/Doc';
+import { Doc, DocListCast, Field, Opt } from '../../../../fields/Doc';
import { Id } from '../../../../fields/FieldSymbols';
import { List } from '../../../../fields/List';
import { RichTextField } from '../../../../fields/RichTextField';
import { listSpec } from '../../../../fields/Schema';
-import { BoolCast, Cast, StrCast } from '../../../../fields/Types';
+import { BoolCast, Cast, NumCast, StrCast } from '../../../../fields/Types';
import { ImageField } from '../../../../fields/URLField';
import { emptyFunction, returnEmptyString, setupMoveUpEvents, Utils } from '../../../../Utils';
import { Docs, DocUtils } from '../../../documents/Documents';
@@ -89,6 +89,31 @@ export class CollectionSchemaView extends CollectionSubView() {
return this._displayColumnWidths ?? this.storedColumnWidths;
}
+ @computed get sortField() {
+ return StrCast(this.layoutDoc.sortField, 'creationDate');
+ }
+
+ @computed get sortDesc() {
+ return BoolCast(this.layoutDoc.sortDesc);
+ }
+
+ @undoBatch
+ @action
+ setSort = (field: string, desc: boolean) => {
+ this.layoutDoc.sortField = field;
+ this.layoutDoc.sortDesc = desc;
+
+ this.childDocs.sort((docA, docB) => {
+ const aStr = Field.toString(docA[field] as Field);
+ const bStr = Field.toString(docB[field] as Field);
+ var out = 0;
+ if (aStr < bStr) out = -1;
+ if (aStr > bStr) out = 1;
+ if (desc) out *= -1;
+ return out;
+ });
+ };
+
@undoBatch
@action
changeColumnKey = (index: number, newKey: string, defaultVal?: any) => {
@@ -430,6 +455,9 @@ export class CollectionSchemaView extends CollectionSubView() {
columnKeys={this.columnKeys}
columnWidths={this.displayColumnWidths}
possibleKeys={this.documentKeys}
+ sortField={this.sortField}
+ sortDesc={this.sortDesc}
+ setSort={this.setSort}
changeColumnKey={this.changeColumnKey}
addColumn={this.addColumn}
removeColumn={this.removeColumn}
diff --git a/src/client/views/collections/collectionSchema/SchemaColumnHeader.tsx b/src/client/views/collections/collectionSchema/SchemaColumnHeader.tsx
index 8e6d3d78a..9d5dfe507 100644
--- a/src/client/views/collections/collectionSchema/SchemaColumnHeader.tsx
+++ b/src/client/views/collections/collectionSchema/SchemaColumnHeader.tsx
@@ -11,6 +11,9 @@ export interface SchemaColumnHeaderProps {
columnWidths: number[];
columnIndex: number;
possibleKeys: string[];
+ sortField: string;
+ sortDesc: boolean;
+ setSort: (field: string, desc: boolean) => void;
changeColumnKey: (index: number, newKey: string, defaultVal?: any) => void;
addColumn: (index: number, key: string, defaultVal?: any) => void;
removeColumn: (index: number) => void;
@@ -27,12 +30,24 @@ export class SchemaColumnHeader extends React.Component<SchemaColumnHeaderProps>
@observable _newFieldWarning: string = '';
@observable _menuValue: string = '';
@observable _menuOptions: string[] = [];
+ @observable _filterVisible: boolean = false;
private _makeNewColumn = false;
@computed get fieldKey() {
return this.props.columnKeys[this.props.columnIndex];
}
+ @action
+ sortClicked = (e: React.PointerEvent) => {
+ e.stopPropagation();
+ e.preventDefault();
+ if (this.props.sortField == this.fieldKey) {
+ this.props.setSort(this.fieldKey, !this.props.sortDesc);
+ } else {
+ this.props.setSort(this.fieldKey, false);
+ }
+ };
+
@computed get fieldDefaultInput() {
switch (this._newFieldType) {
case ColumnType.Number:
@@ -138,6 +153,14 @@ export class SchemaColumnHeader extends React.Component<SchemaColumnHeaderProps>
);
}
+ @computed get columnFilterMenu() {
+ return (
+ <div className="schema-column-menu">
+ <input className="schema-key-search-input" type="text" value={this._menuValue} onKeyDown={this.onSearchKeyDown} onChange={this.updateKeySearch} onPointerDown={e => e.stopPropagation()} />
+ </div>
+ );
+ }
+
onSearchKeyDown = (e: React.KeyboardEvent) => {
switch (e.key) {
case 'Enter':
@@ -178,6 +201,7 @@ export class SchemaColumnHeader extends React.Component<SchemaColumnHeaderProps>
if (this._menuVisible) {
this._menuVisible = false;
} else {
+ this._filterVisible = false;
this._menuVisible = true;
this._menuValue = '';
this._menuOptions = this.props.possibleKeys;
@@ -190,6 +214,17 @@ export class SchemaColumnHeader extends React.Component<SchemaColumnHeaderProps>
}
};
+ @action
+ toggleFilterMenu = () => {
+ console.log(this._filterVisible);
+ if (this._filterVisible) {
+ this._filterVisible = false;
+ } else {
+ this._filterVisible = true;
+ this._menuVisible = false;
+ }
+ };
+
render() {
return (
<div className="schema-column-header" style={{ width: this.props.columnWidths[this.props.columnIndex] }}>
@@ -218,11 +253,18 @@ export class SchemaColumnHeader extends React.Component<SchemaColumnHeaderProps>
}}>
<FontAwesomeIcon icon="trash" />
</div>
+ <div className="schema-header-button" onPointerDown={this.sortClicked}>
+ <FontAwesomeIcon icon="caret-right" style={this.props.sortField == this.fieldKey ? { transform: `rotate(${this.props.sortDesc ? '270deg' : '90deg'})` } : {}} />
+ </div>
+ <div className="schema-header-button" onPointerDown={e => this.toggleFilterMenu()}>
+ <FontAwesomeIcon icon="filter" />
+ </div>
</div>
<div className="schema-column-resizer right" onPointerDown={e => this.props.resizeColumn(e, this.props.columnIndex, false)}></div>
{this._menuVisible && this.renderColumnMenu}
+ {this._filterVisible && this.columnFilterMenu}
</div>
);
}
diff --git a/src/client/views/collections/collectionSchema/SchemaTableCell.tsx b/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
index 7e2fa1f6f..5d9474173 100644
--- a/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
+++ b/src/client/views/collections/collectionSchema/SchemaTableCell.tsx
@@ -14,8 +14,6 @@ export class SchemaTableCell extends React.Component<SchemaTableCellProps> {
render() {
return (
<div className="schema-table-cell" style={{ width: this.props.columnWidth }}>
- {/* {StrCast(this.props.Document[this.props.fieldKey])} */}
- {/* Field.toKeyValueString(this.props.Document, this.props.fieldKey) */}
{Field.toString(this.props.Document[this.props.fieldKey] as Field)}
</div>
);