aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections
diff options
context:
space:
mode:
authorsharkiecodes <lanyi_stroud@brown.edu>2025-06-01 20:24:04 -0400
committersharkiecodes <lanyi_stroud@brown.edu>2025-06-01 20:24:04 -0400
commit7626527799c0606fa9c4fd4d26a19189dc7e7a0e (patch)
tree858dca125a097e0b43b1685c0d96e8a2ddf1cb1b /src/client/views/collections
parentc1f4a60b0016242a9097357074730f0cc9c151ba (diff)
reactive backgrounds, tagging of pdfs, group-select and suggested templates, text box content influences backgrounds
Diffstat (limited to 'src/client/views/collections')
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.tsx70
1 files changed, 54 insertions, 16 deletions
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index f5e699d3e..0b91d628b 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -28,6 +28,8 @@ import { FormattedTextBox } from '../../nodes/formattedText/FormattedTextBox';
import { SubCollectionViewProps } from '../CollectionSubView';
import { ImageLabelBoxData } from './ImageLabelBox';
import { MarqueeOptionsMenu } from './MarqueeOptionsMenu';
+import { StrListCast } from '../../../../fields/Doc';
+import { requestAiGeneratedPreset, DocumentDescriptor } from '../../nodes/scrapbook/AIPresetGenerator';
import './MarqueeView.scss';
interface MarqueeViewProps {
@@ -519,35 +521,71 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
});
+
+
+ generateScrapbook = action(async () => {
+
+ const selectedDocs = this.marqueeSelect(false);
+ if (!selectedDocs.length) return;
- @undoBatch
- generateScrapbook = action(() => {
- let docs = new Array<Doc>();
+ const descriptors: DocumentDescriptor[] = selectedDocs.map(doc => ({
+ type: typeof doc.$type === 'string' ? doc.$type : 'UNKNOWN',
+ tags: (() => {
+ const internalTagsSet = new Set<string>();
+ StrListCast(doc.$tags_chat ?? new List<string>()).forEach(tag => {
+ internalTagsSet.add(tag);
+ });
+ return Array.from(internalTagsSet);
+ })()
+ }));
+
+
+ const aiPreset = await requestAiGeneratedPreset(descriptors);
+ if (!aiPreset.length) {
+ alert("Failed to generate preset");
+ return;
+ }
+
+ const scrapbookPlaceholders: Doc[] = aiPreset.map(cfg => {
+ const placeholderDoc = Docs.Create.TextDocument(cfg.tag);
+ placeholderDoc.accepts_docType = cfg.type as DocumentType;
+ placeholderDoc.accepts_tagType = cfg.acceptTag ?? cfg.tag;
+
+ const placeholder = new Doc();
+ placeholder.proto = placeholderDoc;
+ placeholder.original = placeholderDoc;
+ placeholder.x = cfg.x;
+ placeholder.y = cfg.y;
+ if (cfg.width != null) placeholder._width = cfg.width;
+ if (cfg.height != null) placeholder._height = cfg.height;
+
+ return placeholder;
+ });
+
+ const scrapbook = Docs.Create.ScrapbookDocument(scrapbookPlaceholders, {
+ backgroundColor: '#e2ad32',
+ x: this.Bounds.left,
+ y: this.Bounds.top,
+ _width: 500,
+ _height: 500,
+ title: 'AI-generated Scrapbook'
+ });
const selected = this.marqueeSelect(false).map(d => {
this._props.removeDocument?.(d);
d.x = NumCast(d.x) - this.Bounds.left;
d.y = NumCast(d.y) - this.Bounds.top;
- docs.push(d);
return d;
});
- const scrapbook = Docs.Create.ScrapbookDocument(docs, {
- backgroundColor: '#e2ad32',
- x: this.Bounds.left,
- y: this.Bounds.top,
- followLinkToggle: true,
- _width: 200,
- _height: 200,
- _layout_showSidebar: true,
- title: 'overview',
- });
+
+ this._props.addDocument?.(scrapbook);
+ selectedDocs.forEach(doc => this._props.removeDocument?.(doc));
const portal = Docs.Create.FreeformDocument(selected, { title: 'summarized documents', x: this.Bounds.left + 200, y: this.Bounds.top, isGroup: true, backgroundColor: 'transparent' });
DocUtils.MakeLink(scrapbook, portal, { link_relationship: 'summary of:summarized by' });
portal.hidden = true;
this._props.addDocument?.(portal);
- //this._props.addLiveTextDocument(summary);
- this._props.addDocument?.(scrapbook);
MarqueeOptionsMenu.Instance.fadeOut(true);
+ this.hideMarquee();
});