+
+
+
{operation.op}
{
- operation.items.map(nugget => {
- return
+ operation.items.map((nugget, i) => {
+ return (
+ <>
+ { }} />
+ {i < operation.items.length-1 && ({getCategoryIcon()})}
+ >
+ )
})
}
@@ -135,8 +163,11 @@ function Operation(props: OperationProps) {
)
})}
+
-
+
);
}
diff --git a/src/components/PromptComposer.css b/src/components/PromptComposer.css
index 0cf0912..284e8ae 100644
--- a/src/components/PromptComposer.css
+++ b/src/components/PromptComposer.css
@@ -1,11 +1,5 @@
-.add-button {
- position: absolute;
- right: 10pt;
- top: 10pt;
-}
-
-.prompt-item {
- margin: 4pt;
- padding: 2pt;
- border-radius: 5pt;
+.composer-main {
+ padding-top: 30pt;
+ border-top: 1px solid black;
+ margin: 10pt;
}
\ No newline at end of file
diff --git a/src/components/PromptComposer.tsx b/src/components/PromptComposer.tsx
index e70e7f8..52670c2 100644
--- a/src/components/PromptComposer.tsx
+++ b/src/components/PromptComposer.tsx
@@ -1,17 +1,18 @@
-import { Button } from '@material-ui/core';
+import { Box, Button, ButtonGroup, Container, Paper, Snackbar, Typography } from '@material-ui/core';
import Masonry from '@mui/lab/Masonry';
import AddIcon from '@mui/icons-material/Add';
import "./PromptComposer.css";
import { PromptLibrary } from './PromptLibrary';
import React, { useEffect, useState } from 'react';
-import { $composition, $library, $slottedComposition, LibraryItem, PromptItem, addToOperation, insertIntoComposition, itemIsNugget, itemIsOperation, lassoNuggets, Composition } from '../lib/prompt';
-import { Category } from '@mui/icons-material';
+import { $composition, $library, $slottedComposition, LibraryItem, PromptItem, addToOperation, insertIntoComposition, itemIsNugget, itemIsOperation, lassoNuggets, Composition, _setComposition, removeItemFromLibrary, removeFromComposition, removeNuggetFromOperation } from '../lib/prompt';
+import { BackHand, Book, Category, DragHandle, LibraryBooks, MouseSharp, Score, Sort } from '@mui/icons-material';
import { useStore } from '@nanostores/react'
import Nugget from './Nugget';
-import { Stack } from '@mui/material';
+import { Stack, ToggleButton, ToggleButtonGroup } from '@mui/material';
import { Op, Operation } from './Operation';
-import { PromptItemProps } from './PromptItem';
-import { $dragDropState, $dropCandidate, $isDragInProgress, $sourceItem, completeDrop, endHoverOver, startDrag, startHoverOver } from '../store/prompt-dnd';
+import { EditorMode, PromptItemProps } from './PromptItem';
+import { ReactSortable } from "react-sortablejs";
+import { $dragDropState, $dropCandidate, $isDragInProgress, $sourceItem, CategoryMismatchError, completeDrop, endHoverOver, startDrag, startHoverOver } from '../store/prompt-dnd';
export interface PromptComposerProps {
@@ -21,11 +22,11 @@ export default function PromptComposer(props: PromptComposerProps) {
const [open, setOpen] = useState(false);
const handleClickOpen = () => {
- setOpen(true);
+ if (!open) { setOpen(true); }
};
const handleClose = () => {
- setOpen(false);
+ if (open) { setOpen(false); }
};
const composition = useStore($composition);
@@ -38,6 +39,31 @@ export default function PromptComposer(props: PromptComposerProps) {
console.log(composition)
}
+ const handleOnDeleteItem = (item: LibraryItem) => {
+ removeItemFromLibrary(item);
+ // also remove from the prompts
+ composition.filter(c => {
+ return (!("op" in c)) && c.item.id === item.id
+ }).forEach((c) => {
+ removeFromComposition(c);
+ });
+ // and from any operation
+ composition.filter(c => {
+ return "op" in c && c.items.find(o => o.item.id === item.id);
+ }).forEach((o) => {
+ if (!("op" in o)) return;
+ o.items.forEach((i) => {
+ if (i.item.id === item.id) removeNuggetFromOperation(o, i);
+ })
+ })
+ }
+
+ const [doSort, setDoSort] = useState(false);
+
+ const [editMode, setEditMode] = useState("dnd" as EditorMode);
+
+ const [error, setError] = useState(null as Error | null);
+
/**
*
* @param promptItem The prompt item that we're rendering
@@ -51,12 +77,14 @@ export default function PromptComposer(props: PromptComposerProps) {
// is either a Nugget or an Operation.
const callbacks = {
onDragStart: (item: PromptItem) => {
+ if (editMode !== "dnd") return;
if (itemIsNugget(promptItem)) {
startDrag(item);
}
// TODO: operation
},
onDrop: (item: PromptItem) => {
+ if (editMode !== "dnd") return;
const dnd = useStore($dragDropState);
const isDragInProgress = useStore($isDragInProgress);
const dropCandidate = useStore($dropCandidate);
@@ -73,14 +101,27 @@ export default function PromptComposer(props: PromptComposerProps) {
}
completeDrop();
},
- onDragEnd: (item: PromptItem) => {
-
+ onDragEnd: () => {
+ try {
+ completeDrop();
+ } catch (err) {
+ if (err instanceof CategoryMismatchError) {
+ setError(err);
+ } else {
+ throw err;
+ }
+ }
},
onMouseEnter: (item: PromptItem) => {
},
onMouseLeave: (item: PromptItem) => {
+ if (editMode !== "dnd") return;
endHoverOver();
},
+ onDelete: (item: PromptItem) => {
+ if (editMode !== "dnd") return;
+ removeFromComposition(item);
+ },
} as PromptItemProps;
return ("op" in promptItem ?
@@ -88,23 +129,73 @@ export default function PromptComposer(props: PromptComposerProps) {
: