aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.tsx48
-rw-r--r--src/client/views/collections/collectionSchema/SchemaCellField.tsx12
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu.tsx97
3 files changed, 115 insertions, 42 deletions
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
index 59ccec71f..9623b0d12 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
@@ -45,6 +45,7 @@ import { docs_v1 } from 'googleapis';
import { SchemaCellField } from './SchemaCellField';
import { threadId } from 'worker_threads';
import { FontIconBox } from '../../nodes/FontIconBox/FontIconBox';
+import { SnappingManager } from '../../../util/SnappingManager';
const { SCHEMA_NEW_NODE_HEIGHT } = require('../../global/globalCssVariables.module.scss'); // prettier-ignore
@@ -1271,6 +1272,49 @@ export class CollectionSchemaView extends CollectionSubView() {
return toReturn;
}
+ @computed get filteredDocs() {
+ const childDocFilters = this.childDocFilters();
+ const childFiltersByRanges = this.childDocRangeFilters();
+ const searchDocs = this.searchFilterDocs();
+
+ const docsforFilter: Doc[] = [];
+ this._docs.forEach(d => {
+ // dragging facets
+ const dragged = this._props.childFilters?.().some(f => f.includes(ClientUtils.noDragDocsFilter));
+ if (dragged && SnappingManager.CanEmbed && DragManager.docsBeingDragged.includes(d)) return;
+ let notFiltered = d.z || Doc.IsSystem(d) || DocUtils.FilterDocs([d], this.unrecursiveDocFilters(), childFiltersByRanges, this.Document).length > 0;
+ if (notFiltered) {
+ notFiltered = (!searchDocs.length || searchDocs.includes(d)) && DocUtils.FilterDocs([d], childDocFilters, childFiltersByRanges, this.Document).length > 0;
+ const fieldKey = Doc.LayoutFieldKey(d);
+ const isAnnotatableDoc = d[fieldKey] instanceof List && !(d[fieldKey] as List<Doc>)?.some(ele => !(ele instanceof Doc));
+ const docChildDocs = d[isAnnotatableDoc ? fieldKey + '_annotations' : fieldKey];
+ const sidebarDocs = isAnnotatableDoc && d[fieldKey + '_sidebar'];
+ if (docChildDocs !== undefined || sidebarDocs !== undefined) {
+ let subDocs = [...DocListCast(docChildDocs), ...DocListCast(sidebarDocs)];
+ if (subDocs.length > 0) {
+ let newarray: Doc[] = [];
+ notFiltered = notFiltered || (!searchDocs.length && DocUtils.FilterDocs(subDocs, childDocFilters, childFiltersByRanges, d).length);
+ while (subDocs.length > 0 && !notFiltered) {
+ newarray = [];
+ // eslint-disable-next-line no-loop-func
+ subDocs.forEach(t => {
+ const docFieldKey = Doc.LayoutFieldKey(t);
+ const isSubDocAnnotatable = t[docFieldKey] instanceof List && !(t[docFieldKey] as List<Doc>)?.some(ele => !(ele instanceof Doc));
+ notFiltered =
+ notFiltered || ((!searchDocs.length || searchDocs.includes(t)) && ((!childDocFilters.length && !childFiltersByRanges.length) || DocUtils.FilterDocs([t], childDocFilters, childFiltersByRanges, d).length));
+ DocListCast(t[isSubDocAnnotatable ? docFieldKey + '_annotations' : docFieldKey]).forEach(newdoc => newarray.push(newdoc));
+ isSubDocAnnotatable && DocListCast(t[docFieldKey + '_sidebar']).forEach(newdoc => newarray.push(newdoc));
+ });
+ subDocs = newarray;
+ }
+ }
+ }
+ }
+ notFiltered && docsforFilter.push(d);
+ });
+ return docsforFilter;
+ }
+
@computed get docs() {
let docsFromChildren: Doc[] = [];
@@ -1279,7 +1323,7 @@ export class CollectionSchemaView extends CollectionSubView() {
let docsNotAlreadyDisplayed = this.subCollectionDocs(d, true).filter(dc => !this._docs.includes(dc));
docsFromChildren = docsFromChildren.concat(docsNotAlreadyDisplayed);
});
- let docs = this._docs.concat(docsFromChildren);
+ let docs = this.filteredDocs;
return docs;
}
@@ -1288,7 +1332,7 @@ export class CollectionSchemaView extends CollectionSubView() {
const numbers: Doc[] = [];
const strings: Doc[] = [];
- this._docs.forEach(doc => {
+ this.docs.forEach(doc => {
if (!isNaN(Number(Field.toString(doc[field] as FieldType)))) numbers.push(doc);
else strings.push(doc);
});
diff --git a/src/client/views/collections/collectionSchema/SchemaCellField.tsx b/src/client/views/collections/collectionSchema/SchemaCellField.tsx
index e1059b8fc..1ee79fa0b 100644
--- a/src/client/views/collections/collectionSchema/SchemaCellField.tsx
+++ b/src/client/views/collections/collectionSchema/SchemaCellField.tsx
@@ -151,6 +151,7 @@ export class SchemaCellField extends ObservableReactComponent<SchemaCellFieldPro
setContent = (content: string, restoreCursorPos?: boolean) => {
const pos = this.cursorPosition;
this._displayedContent = this.makeSpans(content);
+ console.log('print', content);
restoreCursorPos && setTimeout(() => this.setCursorPosition(pos));
}
@@ -217,10 +218,11 @@ export class SchemaCellField extends ObservableReactComponent<SchemaCellFieldPro
setRange(this._inputref.childNodes);
};
- shouldUpdate = (prevVal: string, currVal: string) => {
- if (this._props.getCells(currVal).length !== this._props.getCells(prevVal).length) return true;
- //if (contains self-ref pattern)
- };
+ //This function checks if a visual update (eg. coloring a cell reference) should be made. It's meant to
+ //save on processing upkeep vs. constantly rerendering, but I think the savings are minimal for now
+ // shouldUpdate = (prevVal: string, currVal: string) => {
+ // if (this._props.getCells(currVal).length !== this._props.getCells(prevVal).length) return true;
+ // };
onChange = (e: FormEvent<HTMLDivElement> | undefined, newText?: string) => {
const prevVal = this._unrenderedContent;
@@ -233,7 +235,7 @@ export class SchemaCellField extends ObservableReactComponent<SchemaCellFieldPro
}
this._unrenderedContent = targVal;
this._props.highlightCells?.(targVal);
- if (this.shouldUpdate(prevVal, targVal)) {this.setContent(targVal, true)};
+ this.setContent(targVal, true);
this.setupRefSelect(this.refSelectConditionMet);
};
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu.tsx
index 01d5bc83b..8afd1bbf1 100644
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu.tsx
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu.tsx
@@ -604,7 +604,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
}
})
- validTemplates = validTemplates.map(title => TemplateLayouts.fieldByTitle(title));
+ validTemplates = validTemplates.map(title => TemplateLayouts.getTemplateByTitle(title));
return validTemplates;
};
@@ -667,7 +667,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
const field: Field = template.fields[Number(info.number)];
const col = this.getColByTitle(title);
- const doc = FieldFuncs.TextField({
+ const doc = FieldUtils.TextField({
tl: field.tl,
br: field.br },
template.height,
@@ -692,7 +692,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
const createGeneratedImage = async(fieldNum: string, col: Col, prompt: string) => {
const url = await this.generateGPTImage(prompt);
const field: Field = template.fields[Number(fieldNum)];
- const doc = FieldFuncs.ImageField({
+ const doc = FieldUtils.ImageField({
tl: field.tl,
br: field.br },
template.height,
@@ -755,7 +755,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
const field: Field = template.fields[Number(f)];
const col = strCol[1];
- const doc = (col.type === TemplateFieldType.VISUAL ? FieldFuncs.ImageField : FieldFuncs.TextField)({
+ const doc = (col.type === TemplateFieldType.VISUAL ? FieldUtils.ImageField : FieldUtils.TextField)({
tl: field.tl,
br: field.br },
template.height,
@@ -771,7 +771,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
});
template.decorations.forEach(dec => {
- const doc = FieldFuncs.FreeformField({
+ const doc = FieldUtils.FreeformField({
tl: dec.tl,
br: dec.br },
template.height,
@@ -856,7 +856,7 @@ export class DocCreatorMenu extends ObservableReactComponent<FieldViewProps> {
const brokenDownAssignments: [TemplateDocInfos, {[field: number]: Col}][] = [];
Object.entries(assignments).forEach(([tempTitle, assignment]) => {
- const template = TemplateLayouts.fieldByTitle(tempTitle);
+ const template = TemplateLayouts.getTemplateByTitle(tempTitle);
if (!template) return;
const toObj = Object.entries(assignment).reduce((a, [fieldNum, colTitle]) => {
a[Number(fieldNum)] = this.getColByTitle(colTitle);
@@ -1468,14 +1468,45 @@ export type Col = {
}
type Field = {
- tl: [number, number],
- br: [number, number],
- types?: TemplateFieldType[],
- sizes?: TemplateFieldSize[],
- description?: string;
+ tl: [number, number];
+ br: [number, number];
opts: FieldOpts;
- subfields?: ['freeform' | 'stacking' | 'carousel', Field[]];
-};
+ subfields?: Field[];
+ types?: TemplateFieldType[];
+ sizes?: TemplateFieldSize[];
+ isDecoration?: boolean;
+ description?: string;
+}
+
+// class ContentField implements Field {
+// tl: [number, number];
+// br: [number, number];
+// opts: FieldOpts;
+// subfields?: Field[];
+// types?: TemplateFieldType[];
+// sizes?: TemplateFieldSize[];
+// description?: string;
+
+// constructor( tl: [number, number], br: [number, number],
+// opts: FieldOpts, subfields?: Field[],
+// types?: TemplateFieldType[],
+// sizes?: TemplateFieldSize[],
+// description?: string) {
+// this.tl = tl;
+// this.br = br;
+// this.opts = opts;
+// this.subfields = subfields;
+// this.types = types;
+// this.sizes = sizes;
+// this.description = description;
+// }
+
+// render = (content: any): Doc => {
+// return new Doc;
+// }
+// }
+
+type DecorationField = Field;
type InkDecoration = {
@@ -1505,13 +1536,24 @@ export interface FieldOpts {
//animation?: boolean;
fontBold?: boolean;
fontTransform?: 'uppercase' | 'lowercase';
+ fieldViewType?: 'freeform' | 'stacked';
}
interface TemplateOpts extends FieldOpts {
}
-export class FieldFuncs {
+export class FieldUtils {
+
+ public static contentFields = (fields: Field[]) => {
+ let toRet: Field[] = [];
+ fields.forEach(field => {
+ if (!field.isDecoration) { toRet.push(field) };
+ toRet = toRet.concat(FieldUtils.contentFields(field.subfields ?? []));
+ });
+
+ return toRet;
+ }
public static calculateFontSize = (contWidth: number, contHeight: number, text: string, uppercase: boolean): number => {
const words: string[] = text.split(/\s+/).filter(Boolean);
@@ -1555,9 +1597,6 @@ export class FieldFuncs {
return currFontSize - 1;
};
-
-
-
private static getDimensions = (coords: {tl: [number, number], br: [number, number]}, parentWidth: number, parentHeight: number): {width: number, height: number, coord: {x: number, y: number}} => {
const l = coords.tl[0] * parentHeight / 2; const t = coords.tl[1] * parentWidth / 2; //prettier-ignore
@@ -1570,7 +1609,7 @@ export class FieldFuncs {
}
public static FreeformField = (coords: {tl: [number, number], br: [number, number]}, parentWidth: number, parentHeight: number, title: string, content: string, opts: FieldOpts) => {
- const {width, height, coord} = FieldFuncs.getDimensions(coords, parentWidth, parentHeight);
+ const {width, height, coord} = FieldUtils.getDimensions(coords, parentWidth, parentHeight);
const docWithBasicOpts = (Docs.Create.FreeformDocument)([], {
isDefaultTemplateDoc: true,
@@ -1592,7 +1631,7 @@ export class FieldFuncs {
}
public static TextField = (coords: {tl: [number, number], br: [number, number]}, parentWidth: number, parentHeight: number, title: string, content: string, opts: FieldOpts) => {
- const {width, height, coord} = FieldFuncs.getDimensions(coords, parentWidth, parentHeight);
+ const {width, height, coord} = FieldUtils.getDimensions(coords, parentWidth, parentHeight);
const bool = true;
@@ -1603,7 +1642,7 @@ export class FieldFuncs {
title: title,
x: coord.x,
y: coord.y,
- _text_fontSize: `${FieldFuncs.calculateFontSize(width, height, content, true)}` ,
+ _text_fontSize: `${FieldUtils.calculateFontSize(width, height, content, true)}` ,
backgroundColor: opts.backgroundColor ?? '',
text_fontColor: opts.color,
contentBold: opts.fontBold,
@@ -1623,7 +1662,7 @@ export class FieldFuncs {
}
public static ImageField = (coords: {tl: [number, number], br: [number, number]}, parentWidth: number, parentHeight: number, title: string, content: string, opts: FieldOpts) => {
- const {width, height, coord} = FieldFuncs.getDimensions(coords, parentWidth, parentHeight);
+ const {width, height, coord} = FieldUtils.getDimensions(coords, parentWidth, parentHeight);
const doc = Docs.Create.ImageDocument(content, {
isDefaultTemplateDoc: true,
@@ -1647,7 +1686,7 @@ export class FieldFuncs {
}
public static CarouselField = (coords: {tl: [number, number], br: [number, number]}, parentWidth: number, parentHeight: number, title: string, fields: Doc[]) => {
- const {width, height, coord} = FieldFuncs.getDimensions(coords, parentWidth, parentHeight);
+ const {width, height, coord} = FieldUtils.getDimensions(coords, parentWidth, parentHeight);
const doc = Docs.Create.Carousel3DDocument(fields, { _height: height, _width: width, title: title, x: coord.x, y: coord.y, _text_fontSize: `${height/2}` })
@@ -1664,7 +1703,7 @@ export class TemplateLayouts {
) as TemplateDocInfos[];
}
- public static fieldByTitle = (title: string): TemplateDocInfos | undefined => {
+ public static getTemplateByTitle = (title: string): TemplateDocInfos | undefined => {
switch (title){
case 'fourfield1':
return TemplateLayouts.FourField001;
@@ -1984,18 +2023,6 @@ export class TemplateLayouts {
borderWidth: '8',
rotation: 45,
},
- subfields: [
- 'freeform',
- [{
- tl: [-2, -2],
- br: [2, 2],
- types: [TemplateFieldType.VISUAL],
- sizes: [TemplateFieldSize.LARGE, TemplateFieldSize.HUGE],
- opts: {
- rotation: 315,
- }
- }]
- ]
}, {
tl: [-.7, .2],
br: [.7, .46],