aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx')
-rw-r--r--src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx206
1 files changed, 82 insertions, 124 deletions
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
index ebfa3fc65..fb083ea75 100644
--- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
+++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/DocCreatorMenu.tsx
@@ -1,4 +1,3 @@
-
import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { action, computed, makeObservable, observable, runInAction } from 'mobx';
@@ -22,7 +21,7 @@ import { ViewType } from './TemplateFieldTypes/TemplateField';
import { Template } from './Template';
import { TemplateFieldSize, TemplateFieldType, TemplateLayouts } from './TemplateBackend';
import { TemplateManager } from './Backend/TemplateManager';
-import { TemplateMenuAIUtils } from './Backend/TemplateMenuAIUtils'
+import { TemplateMenuAIUtils } from './Backend/TemplateMenuAIUtils';
import { TemplatePreviewGrid } from './Menu/TemplatePreviewGrid';
import { FireflyStructureOptions, TemplateEditingWindow } from './Menu/TemplateEditingWindow';
import { DocCreatorMenuButton } from './Menu/DocCreatorMenuButton';
@@ -158,18 +157,12 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
return bounds;
}
- setUpButtonClick = (e: React.PointerEvent, func: (...args: any) => void) => {
- setupMoveUpEvents(
- this,
- e,
- returnFalse,
- emptyFunction,
- undoable(clickEv => {
- clickEv.stopPropagation();
- clickEv.preventDefault();
- func();
- }, 'create docs')
- );
+ setUpButtonClick = (e: React.PointerEvent, func: () => void) => {
+ setupMoveUpEvents(this, e, returnFalse, emptyFunction, clickEv => {
+ clickEv.stopPropagation();
+ clickEv.preventDefault();
+ undoable(func, 'create docs')();
+ });
};
@action
@@ -301,16 +294,13 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
this._pageX = x + translation.x;
this._pageY = y + translation.y;
};
-
- async createDocsForPreview(): Promise<Doc[]> { return this._dataViz && this._selectedTemplate ? ((await this.templateManager.createDocsFromTemplate(this._dataViz, this._selectedTemplate, this.fieldsInfos, this.DEBUG_MODE)).filter(doc => doc).map(doc => doc!) ?? []) as unknown as Doc[] : []; }
- @action updateSelectedTemplate = async (template: Template) => {
- if (this._selectedTemplate === template) {
- this._selectedTemplate = undefined;
- return;
- } else {
- this._selectedTemplate = template;
- }
+ async createDocsForPreview() {
+ return this._dataViz && this._selectedTemplate ? ((await this.templateManager.createDocsFromTemplate(this._dataViz, this._selectedTemplate, this.fieldsInfos, this.DEBUG_MODE)).filter(doc => doc).map(doc => doc!) ?? []) : [];
+ }
+
+ @action updateSelectedTemplate = (template: Template) => {
+ this._selectedTemplate = this._selectedTemplate === template ? undefined : template; // toggle selection
};
// testTemplate = async () => {
@@ -318,27 +308,16 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
// };
@action addField = () => {
- const newFields: Col[] = this._userCreatedFields.concat([{ title: '', type: TemplateFieldType.UNSET, desc: '', sizes: [], AIGenerated: true }]);
- this._userCreatedFields = newFields;
+ this._userCreatedFields = this._userCreatedFields.concat([{ title: '', type: TemplateFieldType.UNSET, desc: '', sizes: [], AIGenerated: true }]);
};
@action removeField = (field: { title: string; type: string; desc: string }) => {
if (this._dataViz?.axes.includes(field.title)) {
this._dataViz.selectAxes(this._dataViz.axes.filter(col => col !== field.title));
} else {
- const toRemove = this._userCreatedFields.filter(f => f === field);
- if (!toRemove) return;
-
- if (toRemove.length > 1) {
- while (toRemove.length > 1) {
- toRemove.pop();
- }
- }
-
- if (this._userCreatedFields.length === 1) {
- this._userCreatedFields = [];
- } else {
- this._userCreatedFields.splice(this._userCreatedFields.indexOf(toRemove[0]), 1);
+ const toRemove = this._userCreatedFields.findIndex(f => f === field);
+ if (toRemove !== -1) {
+ this._userCreatedFields.splice(toRemove, 1);
}
}
};
@@ -390,35 +369,22 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
this.forceUpdate();
};
- compileFieldDescriptions = (templates: Template[]): string => {
- let descriptions: string = '';
- templates.forEach(template => {
- descriptions += `---------- NEW TEMPLATE TO INCLUDE: The title is: ${template.title}. Its fields are: `;
- descriptions += template.descriptionSummary;
- });
-
- return descriptions;
- };
-
- compileColDescriptions = (cols: Col[]): string => {
- let descriptions: string = ' ------------- COL DESCRIPTIONS START HERE:';
- cols.forEach(col => (descriptions += `{title: ${col.title}, sizes: ${String(col.sizes)}, type: ${col.type}, descreiption: ${col.desc}} `));
+ compileFieldDescriptions = (templates: Template[]) =>
+ templates.map(template => `---------- NEW TEMPLATE TO INCLUDE: The title is: ${template.title}. Its fields are: ` + template.descriptionSummary).join(''); // prettier-ignore
- return descriptions;
- };
+ compileColDescriptions = (cols: Col[]) =>
+ ' ------------- COL DESCRIPTIONS START HERE:' + cols.map(col => `{title: ${col.title}, sizes: ${String(col.sizes)}, type: ${col.type}, descreiption: ${col.desc}} `).join(''); // prettier-ignore
- getColByTitle = (title: string) => {
- return this.fieldsInfos.filter(col => col.title === title)[0];
- };
+ getColByTitle = (title: string): Col | undefined => this.fieldsInfos.filter(col => col.title === title)[0];
@action
assignColsToFields = async (templates: Template[], cols: Col[]): Promise<[Template, { [field: number]: Col }][]> => {
- const fieldDescriptions: string = this.compileFieldDescriptions(templates);
- const colDescriptions: string = this.compileColDescriptions(cols);
+ const fieldDescriptions = this.compileFieldDescriptions(templates);
+ const colDescriptions = this.compileColDescriptions(cols);
const inputText = fieldDescriptions.concat(colDescriptions);
- const prompt: string = `(${Math.random() * 100000}) ${inputText}`;
+ const prompt = `(${Math.random() * 100000}) ${inputText}`;
this._GPTLoading = true;
@@ -431,23 +397,25 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
Object.entries(assignments).forEach(([tempTitle, assignment]) => {
const template = templates.filter(temp => temp.title === tempTitle)[0];
- if (!template) return;
- const toObj = Object.entries(assignment).reduce(
- (a, [fieldID, colTitle]) => {
- const col = this.getColByTitle(colTitle);
- if (!col.AIGenerated) {
- var field = template.getFieldByID(Number(fieldID));
- field.setContent(col.defaultContent ?? '', col.type === TemplateFieldType.VISUAL ? ViewType.IMG : ViewType.TEXT);
- field = template.getFieldByID(Number(fieldID));
- field.setTitle(col.title);
- } else {
- a[Number(fieldID)] = this.getColByTitle(colTitle);
- }
- return a;
- },
- {} as { [field: number]: Col }
- );
- brokenDownAssignments.push([template, toObj]);
+ if (template) {
+ const toObj = Object.entries(assignment).reduce(
+ (a, [fieldID, colTitle]) => {
+ const col = this.getColByTitle(colTitle);
+ if (col) {
+ if (!col.AIGenerated) {
+ const field = template.getFieldByID(Number(fieldID));
+ field?.setContent(col.defaultContent ?? '', col.type === TemplateFieldType.VISUAL ? ViewType.IMG : ViewType.TEXT);
+ field?.setTitle(col.title);
+ } else {
+ a[Number(fieldID)] = col;
+ }
+ }
+ return a;
+ },
+ {} as { [field: number]: Col }
+ );
+ brokenDownAssignments.push([template, toObj]);
+ }
});
return brokenDownAssignments;
@@ -459,39 +427,32 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
return [];
};
- generatePresetTemplates = async () => {
- const templates: Template[] = [];
-
+ generatePresetTemplates = action(() => {
if (this.DEBUG_MODE) {
- templates.push(...this.templateManager.templates);
+ this.setSuggestedTemplates(this.templateManager._templates);
+ this._GPTLoading = false;
} else {
this._dataViz?.updateColDefaults();
-
const contentFields = this.fieldsInfos.filter(field => field.type !== TemplateFieldType.DATA);
-
- templates.push(...this.templateManager.getValidTemplates(contentFields));
-
- const assignments = await this.assignColsToFields(templates, contentFields);
-
- const renderedTemplatePromises = assignments.map(([template, assgns]) => TemplateMenuAIUtils.applyGPTContentToTemplate(template, assgns));
-
- await Promise.all(renderedTemplatePromises);
+ const templates = this.templateManager.getValidTemplates(contentFields);
+
+ return this.assignColsToFields(templates, contentFields)
+ .then(pairs =>
+ Promise.all(pairs.map(([templ, assgns]) => TemplateMenuAIUtils.applyGPTContentToTemplate(templ, assgns))))
+ .then(action(() => {
+ this.setSuggestedTemplates(templates);
+ this._GPTLoading = false;
+ })); // prettier-ignore
}
+ });
- setTimeout(
- action(() => {
- this.setSuggestedTemplates(templates);
- this._GPTLoading = false;
- })
- );
- };
-
- generateVariations = async (onDoc: Doc, prompt: string, options: FireflyStructureOptions): Promise<string[]> => {
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ generateVariations = async (onDoc: Doc, prompt: string, options: FireflyStructureOptions) => {
// const { numVariations, temperature, useStyleRef } = options;
this.variations = [];
const mainCollection = this._dataViz?.DocumentView?.().containerViewPath?.().lastElement()?.ComponentView as CollectionFreeFormView;
- const clone: Doc = (await Doc.MakeClone(onDoc)).clone;
+ const clone = Doc.MakeClone(onDoc).clone;
mainCollection.addDocument(clone);
clone.x = 10000;
clone.y = 10000;
@@ -499,13 +460,13 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
// await DrawingFillHandler.drawingToImage(clone, 100 - temperature, prompt, useStyleRef ? clone : undefined, this, numVariations)
return this.variations;
- }
+ };
- variations: string[] = []
+ variations: string[] = [];
@action addVariation = (url: string) => {
this.variations.push(url);
- }
+ };
addRenderedCollectionToMainview = (collection: Doc) => {
if (collection) {
@@ -517,10 +478,11 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
}
};
- @action editLastTemplate = () => { if (this._editedTemplateTrail.length) this._currEditingTemplate = this._editedTemplateTrail.pop()}
+ @action editLastTemplate = () => {
+ if (this._editedTemplateTrail.length) this._currEditingTemplate = this._editedTemplateTrail.pop();
+ };
@action setExpandedView = (template: Template | undefined) => {
-
if (template) {
this._menuContent = 'templateEditing';
this._currEditingTemplate && this._editedTemplateTrail.push(this._currEditingTemplate);
@@ -533,27 +495,23 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
//Docs.Create.FreeformDocument([doc], { _height: NumListCast(doc._height)[0], _width: NumListCast(doc._width)[0], title: ''});
};
- @computed
- get templatesView() { return (
- <div className='docCreatorMenu-templates-view'>
- <div className="docCreatorMenu-templates-displays">
- <TemplatePreviewGrid
- title={'Suggested Templates'}
- menu={this}
- loading={this._GPTLoading}
- optionsButtonOpts={this.optionsButtonOpts}
- templates={this._suggestedTemplates}
- />
- <div className="docCreatorMenu-GPT-options">
- <div className="docCreatorMenu-GPT-options-container">
- <DocCreatorMenuButton icon={'arrows-rotate'} styles={'border'} function={this.generatePresetTemplates}/>
+ @computed
+ get templatesView() {
+ return (
+ <div className="docCreatorMenu-templates-view">
+ <div className="docCreatorMenu-templates-displays">
+ <TemplatePreviewGrid title={'Suggested Templates'} menu={this} loading={this._GPTLoading} optionsButtonOpts={this.optionsButtonOpts} templates={this._suggestedTemplates} />
+ <div className="docCreatorMenu-GPT-options">
+ <div className="docCreatorMenu-GPT-options-container">
+ <DocCreatorMenuButton icon={'arrows-rotate'} styles={'border'} function={this.generatePresetTemplates} />
+ </div>
</div>
</div>
</div>
- </div>
- )};
-
- private optionsButtonOpts: [IconProp, () => any] = ['gear', () => (this._menuContent = 'dashboard')];
+ );
+ }
+
+ private optionsButtonOpts: [IconProp, () => void] = ['gear', () => (this._menuContent = 'dashboard')];
get renderSelectedViewType() {
switch (this._menuContent) {
@@ -634,7 +592,7 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
{topButton('magnifying-glass', 'options', onOptionsSelected, 'middle')}
{topButton('bars', 'saved', onSavedSelected, 'right')}
</div>
- <DocCreatorMenuButton icon={'minus'} styles={'float-right'} function={this.closeMenu}/>
+ <DocCreatorMenuButton icon={'minus'} styles={'float-right'} function={this.closeMenu} />
</div>
{this.renderSelectedViewType}
</div>
@@ -642,4 +600,4 @@ export class DocCreatorMenu extends ObservableReactComponent<DocCreateMenuProps>
</div>
);
}
-} \ No newline at end of file
+}