diff options
| author | Nathan-SR <144961007+Nathan-SR@users.noreply.github.com> | 2025-05-11 21:18:55 -0400 |
|---|---|---|
| committer | Nathan-SR <144961007+Nathan-SR@users.noreply.github.com> | 2025-05-11 21:18:55 -0400 |
| commit | 4219c751c0f984fac6e5995c1ab955a8d63a28cd (patch) | |
| tree | e638ff6aeb977f175916bcf14a8e332ae6f47dac /src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu | |
| parent | e62f51bacace3d91f388202135426445721097cc (diff) | |
many changes to firefly UI (options added) and starting work on finalizing conditionals
Diffstat (limited to 'src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu')
3 files changed, 126 insertions, 76 deletions
diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx index 0434d0ccb..4ff509d73 100644 --- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx +++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplateEditingWindow.tsx @@ -1,5 +1,5 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { action, observable, reaction, runInAction } from "mobx"; +import { action, makeAutoObservable, makeObservable, observable, reaction, runInAction } from "mobx"; import React from "react"; import { returnFalse, returnEmptyFilter, returnTrue } from "../../../../../../ClientUtils"; import { emptyFunction } from "../../../../../../Utils"; @@ -16,93 +16,77 @@ import { ObservableReactComponent } from "../../../../ObservableReactComponent"; import { IDisposer } from "mobx-utils"; import { ImageField } from "../../../../../../fields/URLField"; import { DocCreatorMenuButton } from "./DocCreatorMenuButton"; +import { TbHistory } from "react-icons/tb"; -interface TemplateEditingWindowProps { +export type FireflyStructureOptions = { + numVariations: number; + temperature: number; + useStyleRef: boolean; +} + +interface FireflyVariationsTabProps { menu: DocCreatorMenu; template: Template; } @observer -export class TemplateEditingWindow extends ObservableReactComponent<TemplateEditingWindowProps> { +export class FireflyVariationsTab extends ObservableReactComponent<FireflyVariationsTabProps> { - private fireflyPrompt: string = 'Use this template to generate an empty baseball card template.'; - private previewWindow: HTMLDivElement | null = null; - private disposers: { [name: string]: IDisposer } = {}; - private promptInput: HTMLTextAreaElement | null = null; + private prompt: string = 'Use this template to generate an empty baseball card template.'; + + @observable private promptInput: HTMLTextAreaElement | null = null; @observable _loading: boolean = false; @observable _variationsTabOpen: boolean = false; @observable _variationURLs: string[] = []; - @observable _variations: Template[] = []; - - componentDidMount(): void { - this.disposers.windowDimensions = reaction(() => - this._props.menu._resizing, - () => { this.forceUpdate() }, - { fireImmediately: true } - ); - } - - componentWillUnmount() { - Object.values(this.disposers).forEach(disposer => disposer?.()); - } - - setPromptInputRef: React.LegacyRef<HTMLTextAreaElement> = (node) => { - this.promptInput = node; - this.forceUpdate(); - } - setContainerRef: React.LegacyRef<HTMLDivElement> = (node) => { - this.previewWindow = node; - this.forceUpdate(); - } + @observable private fireflyOptions: FireflyStructureOptions = {numVariations: 3, temperature: 0, useStyleRef: false}; - @action setVariationTab = (open: boolean) => { - this._variationsTabOpen = open; - if (this.previewWindow && open) { - this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * .6); - } else if (this.previewWindow && !open) { - this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * 5/3); - } - this.forceUpdate(); + constructor(props: FireflyVariationsTabProps) { + super(props); + makeObservable(this); } generateVariations = async () => { this._props.menu._variations = []; this._loading = true; - this._variationURLs = await this._props.menu.generateVariations(this._props.template.clone(false).getRenderedDoc()!, this.fireflyPrompt); + const doc: Doc = this._props.template.clone(false).getRenderedDoc()!; + this._variationURLs = await this._props.menu.generateVariations(doc, this.prompt, this.fireflyOptions); this._variationURLs.forEach(url => { const newTemplate: Template = this._props.template.clone(true); this._props.menu._variations.push(newTemplate); }); - this._loading = false; setTimeout(() => { this._variationURLs.forEach((url, i) => { this._props.menu._variations[i].setImageAsBackground(url, true); }); - this.forceUpdate(); + this._loading = false; }); } - get fireflyVariationsTab() { + setPromptInputRef: React.LegacyRef<HTMLTextAreaElement> = (node) => { + this.promptInput = node; + } + render() { return ( - <> + <div className='docCreatorMenu-editing-firefly-section'> <div className="docCreatorMenu-option-divider full no-margin-bottom"/> <TemplatePreviewGrid menu={this._props.menu} title={'Generate Variations'} loading={this._loading} + styles={'scrolling'} templates={this._props.menu._variations} optionsButtonOpts={['gear', () => {}]} previewBoxRightButtonOpts={['gear', (template: Template) => {this.forceUpdate();}]} /> - <div className="docCreatorMenu-section"> - <div className="docCreatorMenu-variation-prompt-input"> + <div className="docCreatorMenu-firefly-options"> + <div className="docCreatorMenu-variation-prompt-row"> <textarea className="docCreatorMenu-variation-prompt-input-textbox" ref={this.setPromptInputRef} - onChange={e => this.fireflyPrompt = e.target.value} + onChange={e => this.prompt = e.target.value} onInput={() => { if (this.promptInput !== null) { this.promptInput.style.height = 'auto'; @@ -114,13 +98,84 @@ export class TemplateEditingWindow extends ObservableReactComponent<TemplateEdit /> <DocCreatorMenuButton icon={'arrows-rotate'} styles={'border'} function={this.generateVariations}/> </div> - <div className='docCreatorMenu-variation-options-container'> - - </div> + <nav className="options‑menu"> + <div className="menu‑item switch"> + <input type="checkbox" checked={this.fireflyOptions.useStyleRef} + onChange={(e) => runInAction(() => this.fireflyOptions.useStyleRef = e.target.checked)} + /> + <span className="slider round"></span> + <span className="firefly-option-label">Use template as style guide</span> + </div> + <div className="menu‑item"> + <span className="firefly-option-label">Variations</span> + <input type="range" id="variations" + min="1" + max="5" + value={this.fireflyOptions.numVariations} + onChange={(e) => runInAction(() => this.fireflyOptions.numVariations = Number(e.target.value))} + /> + <span className="value" id="varVal">{this.fireflyOptions.numVariations}</span> + </div> + <div className="menu‑item"> + <span className="firefly-option-label">Temperature</span> + <input type="range" id="temperature" + min="1" + max="100" + value={this.fireflyOptions.temperature} + onChange={(e) => runInAction(() => this.fireflyOptions.temperature = Number(e.target.value))} + /> + <span className="value" id="tempVal">{this.fireflyOptions.temperature}</span> + </div> + </nav> </div> - </> + </div> ) } +} + +interface TemplateEditingWindowProps { + menu: DocCreatorMenu; + template: Template; +} + +@observer +export class TemplateEditingWindow extends ObservableReactComponent<TemplateEditingWindowProps> { + + private disposers: { [name: string]: IDisposer } = {}; + + @observable private previewWindow: HTMLDivElement | null = null; + + @observable _variationsTabOpen: boolean = false; + + constructor(props: TemplateEditingWindowProps) { + super(props); + makeObservable(this); + } + + componentDidMount(): void { + this.disposers.windowDimensions = reaction(() => + this._props.menu._resizing, + () => { this.forceUpdate() }, + { fireImmediately: true } + ); + } + + componentWillUnmount() { + Object.values(this.disposers).forEach(disposer => disposer?.()); + } + + setContainerRef: React.LegacyRef<HTMLDivElement> = (node) => { + this.previewWindow = node; + } + + @action setVariationTab = (open: boolean) => { + this._variationsTabOpen = open; + if (this.previewWindow && open) { + this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * .6); + } else if (this.previewWindow && !open) { + this.previewWindow.style.height = String(Number(this.previewWindow.clientHeight) * 5/3); + } + } get renderedDocPreview(){ const doc: Doc = this._props.template.getRenderedDoc() as unknown as Doc; @@ -158,7 +213,11 @@ export class TemplateEditingWindow extends ObservableReactComponent<TemplateEdit <div className="docCreatorMenu-expanded-template-preview"> <div className="top-panel"/> {this.renderedDocPreview} - {this._variationsTabOpen ? this.fireflyVariationsTab : null} + {this._variationsTabOpen ? <FireflyVariationsTab + menu={this._props.menu} + template={this._props.template} + /> + : null} <div className="right-buttons-panel"> <DocCreatorMenuButton icon={'minimize'} function={() => { if (this._props.template === this._props.menu._selectedTemplate) { @@ -167,6 +226,7 @@ export class TemplateEditingWindow extends ObservableReactComponent<TemplateEdit this._props.menu.setExpandedView(undefined); }}/> <DocCreatorMenuButton icon={'lightbulb'} function={() => this.setVariationTab(!this._variationsTabOpen)}/> + <DocCreatorMenuButton icon={'arrow-rotate-backward'} function={() => { this._props.menu.setExpandedView(this._props.template); this.forceUpdate(); }}/> </div> </div> </div> diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx index c9f817d2f..de2f9e455 100644 --- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx +++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewBox.tsx @@ -1,7 +1,7 @@ import { Colors } from "@dash/components/src"; import { FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import { Template } from "../Template"; -import { reaction, runInAction } from "mobx"; +import { makeObservable, observable, reaction, runInAction } from "mobx"; import React from "react"; import { ObservableReactComponent } from "../../../../ObservableReactComponent"; import { DocCreatorMenu } from "../DocCreatorMenu"; @@ -17,7 +17,7 @@ import { ImageField } from "../../../../../../fields/URLField"; import { ImageCast } from "../../../../../../fields/Types"; import { observer } from "mobx-react"; -export interface TemplatePreviewBox_props { +export interface TemplatePreviewBoxProps { template: Template; menu: DocCreatorMenu; leftButtonOpts?: [icon: IconProp, func: (...args: any) => void] @@ -25,32 +25,18 @@ export interface TemplatePreviewBox_props { } @observer -export class TemplatePreviewBox extends ObservableReactComponent<TemplatePreviewBox_props> { +export class TemplatePreviewBox extends ObservableReactComponent<TemplatePreviewBoxProps> { - private previewWindow: HTMLDivElement | null = null; - // private icon: ImageField | undefined = undefined; + @observable private previewWindow: HTMLDivElement | null = null; setContainerRef: React.LegacyRef<HTMLDivElement> = (node) => { this.previewWindow = node; - this.forceUpdate(); } - // componentDidMount(): void { - // console.log('mounted') - // setTimeout(() => { - // const docView = DocumentView.getDocumentView(this.doc); - // if (docView) { - // console.log('docview found') - // docView.ComponentView?.updateIcon?.(); - // setTimeout(() => { - // console.log('componentview found: ', docView.ComponentView) - // this.icon = ImageCast(docView.Document.icon); - // console.log('icon is:', this.icon, ' from: ', docView.Document.icon); - // this.forceUpdate(); - // }, 5000); - // } - // }, 1000); - // } + constructor(props: TemplatePreviewBoxProps) { + super(props); + makeObservable(this); + } get doc() { return this._props.template.getRenderedDoc() as Doc; @@ -83,8 +69,6 @@ export class TemplatePreviewBox extends ObservableReactComponent<TemplatePreview <button className="option-button right" onPointerDown={e => this._props.menu.setUpButtonClick(e, () => this._props.rightButtonOpts)}> <FontAwesomeIcon icon={this._props.rightButtonOpts![0]} color="white" /> </button> : null } - {/* { this.icon ? - <img className="docCreatorMenu-preview-image" src={this.icon.url.href.replace('.png', '_o.png')} /> */} <DocumentView Document={this.doc} isContentActive={emptyFunction} // !!! should be return false diff --git a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx index 84ca6546d..d53853c52 100644 --- a/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx +++ b/src/client/views/nodes/DataVizBox/DocCreatorMenu/Menu/TemplatePreviewGrid.tsx @@ -1,6 +1,6 @@ import { Colors } from "@dash/components/src"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { action, observable, runInAction } from "mobx"; +import { action, makeObservable, observable, runInAction } from "mobx"; import React from "react"; import ReactLoading from "react-loading"; import { Doc } from "../../../../../../fields/Doc"; @@ -18,6 +18,7 @@ export interface SuggestedTemplatesProps { loading?: boolean; templates: Template[]; title: string; + styles?: string; optionsButtonOpts?: [IconProp, (...args: any) => any]; previewBoxLeftButtonOpts?: [IconProp, (...args: any) => any]; previewBoxRightButtonOpts?: [IconProp, (...args: any) => any]; @@ -26,6 +27,11 @@ export interface SuggestedTemplatesProps { @observer export class TemplatePreviewGrid extends ObservableReactComponent<SuggestedTemplatesProps> { + constructor(props: SuggestedTemplatesProps) { + super(props); + makeObservable(this); + } + render() { return ( <div className="docCreatorMenu-section"> @@ -35,7 +41,7 @@ export class TemplatePreviewGrid extends ObservableReactComponent<SuggestedTempl <DocCreatorMenuButton icon={this._props.optionsButtonOpts[0] as IconProp} styles={'float-right'} function={() => runInAction(this._props.optionsButtonOpts![1])}/> : null} </div> - <div className="docCreatorMenu-templates-preview-window"> + <div className={"docCreatorMenu-templates-preview-window " + this._props.styles}> {this._props.loading ? (<div className="loading-spinner"> <ReactLoading type="spin" color={StrCast(Doc.UserDoc().userVariantColor)} height={30} width={30} /> |
