diff options
Diffstat (limited to 'src')
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], |