diff --git a/app/package-lock.json b/app/package-lock.json index 91c994b..b14b0af 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "aalai-beta", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aalai-beta", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", @@ -2031,7 +2031,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2043,7 +2043,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -4242,26 +4242,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -4373,25 +4353,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "dev": true }, "node_modules/@turf/along": { "version": "7.2.0", @@ -9233,7 +9213,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "dev": true }, "node_modules/cross-env": { "version": "7.0.3", @@ -10249,7 +10229,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.3.1" } @@ -15652,7 +15632,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -21308,7 +21288,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -21351,7 +21331,7 @@ "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "devOptional": true, + "dev": true, "dependencies": { "acorn": "^8.11.0" }, @@ -21363,7 +21343,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "dev": true }, "node_modules/tsconfig-paths": { "version": "3.15.0", @@ -21859,7 +21839,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "8.1.1", @@ -22952,7 +22932,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } diff --git a/app/package.json b/app/package.json index ffeff66..c7590c0 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "aalai-beta", - "version": "0.1.0", + "version": "0.1.1", "private": true, "dependencies": { "@dnd-kit/core": "^6.3.1", @@ -56,7 +56,7 @@ "prepare": "husky", "prestart": "tsc scripts/git-prompt.ts && node scripts/git-prompt.js", "start": "react-scripts start", - "build": "GENERATE_SOURCEMAP=false react-scripts build", + "build": "cross-env GENERATE_SOURCEMAP=false react-scripts build", "test": "jest" }, "eslintConfig": { diff --git a/app/src/components/Dashboard/TutorialCard.tsx b/app/src/components/Dashboard/TutorialCard.tsx index 1d30ca6..0ed3db5 100644 --- a/app/src/components/Dashboard/TutorialCard.tsx +++ b/app/src/components/Dashboard/TutorialCard.tsx @@ -1,21 +1,39 @@ import { getUserData } from "../../functions/getUserData"; import { ALPHA_ORG } from "../../pages/Dashboard"; import { DeleteIcon } from "../icons/ContextMenuIcons"; +import RenameInput from "../ui/inputs/RenameInput"; -export const TutorialCard: React.FC<{ tutorial: Tutorial; onClick: (tutorial: Tutorial) => void }> = ({ tutorial, onClick }) => { +export const TutorialCard: React.FC<{ + tutorial: Tutorial; + onClick: (tutorial: Tutorial) => void; +}> = ({ tutorial, onClick }) => { const { organization } = getUserData(); return (
onClick(tutorial)}>
-
+
{ + e.stopPropagation(); + }} + >
-
{tutorial.projectName}
-
{new Date(tutorial.createdAt).toLocaleDateString()}
+
+ +
+
+ {new Date(tutorial.createdAt).toLocaleDateString()} +
{organization === ALPHA_ORG && (
diff --git a/app/src/components/SimulationDashboard/components/block/BlockEditor.tsx b/app/src/components/SimulationDashboard/components/block/BlockEditor.tsx index 205cff3..b837d61 100644 --- a/app/src/components/SimulationDashboard/components/block/BlockEditor.tsx +++ b/app/src/components/SimulationDashboard/components/block/BlockEditor.tsx @@ -1,4 +1,4 @@ -import type { RefObject } from "react"; +import { useState, type RefObject } from "react"; import { Block } from "../../../../types/exportedTypes"; import { getAlphaFromRgba, rgbaToHex } from "../../functions/helpers/colorHandlers"; import { getCurrentBlockStyleValue } from "../../functions/helpers/getCurrentBlockStyleValue"; @@ -8,6 +8,11 @@ import { handleBlurAmountChange } from "../../functions/helpers/handleBlurAmount import InputRange from "../../../ui/inputs/InputRange"; import RegularDropDown from "../../../ui/inputs/RegularDropDown"; import { DeleteIcon } from "../../../icons/ContextMenuIcons"; +import InputWithDropDown from "../../../ui/inputs/InputWithDropDown"; +import { AddIcon, DeviceIcon, ParametersIcon } from "../../../icons/ExportCommonIcons"; +import DataDetailedDropdown from "../../../ui/inputs/DataDetailedDropdown"; +import RenameInput from "../../../ui/inputs/RenameInput"; +import DataSourceSelector from "../../../ui/inputs/DataSourceSelector"; interface BlockEditorProps { blockEditorRef: RefObject; @@ -32,6 +37,10 @@ const BlockEditor: React.FC = ({ updateBlockZIndex, handleRemoveBlock, }) => { + + const [color, setColor] = useState("#000000"); + + return (
@@ -45,219 +54,158 @@ const BlockEditor: React.FC = ({
-
- - - {/* updateBlockPositionType( - selectedBlock, - option.toLowerCase() as "relative" | "absolute" | "fixed" - )} - search={false} - /> */} -
- {currentBlock.positionType === "absolute" && ( - <> -
- - - updateBlockPosition(selectedBlock, { - ...currentBlock.position!, - x: Number(e.target.value), - }) - } - className="form-input" - /> + +
+
+
Size
+ { + updateBlockSize(selectedBlock, { + ...currentBlock.size!, + width: Number(newValue), // Make sure to convert the string back to a number here + }) + }} + /> + { + updateBlockSize(selectedBlock, { + ...currentBlock.size!, + height: Number(newValue), + }) + }} + /> +
+ +
+
Position
+
+ {["relative", "absolute"].map((position) => ( +
updateBlockPositionType(selectedBlock, position as "relative" | "absolute" | "fixed")} + > + {position.charAt(0).toUpperCase() + position.slice(1)} +
+ ))}
-
- - - updateBlockPosition(selectedBlock, { - ...currentBlock.position!, - y: Number(e.target.value), - }) - } - className="form-input" - /> +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
- - )} -
- - handleBackgroundColorChange(currentBlock, selectedBlock, updateBlockStyle, e.target.value)} - className="color-input" - /> + +
+ updateBlockZIndex(selectedBlock, Number(newValue))} + /> + + { + updateBlockStyle(selectedBlock, { + borderRadius: Number(newValue), + }) + }} + /> + +
+
+ +
+
Background
+
+
Color
+
+ setColor(e.target.value)} + onChange={(e) => handleBackgroundColorChange(currentBlock, selectedBlock, updateBlockStyle, e.target.value)} + + /> + +
{color}
+
+
+ handleBackgroundAlphaChange(currentBlock, selectedBlock, updateBlockStyle, Number(value))} + onChange={(value: number) => handleBlurAmountChange(selectedBlock, updateBlockStyle, Number(value))} + + /> + + +
-
- {/* - - handleBackgroundAlphaChange( - currentBlock, - selectedBlock, - updateBlockStyle, - Number(e.target.value) - ) - } - className="range-input" - /> */} - handleBackgroundAlphaChange(currentBlock, selectedBlock, updateBlockStyle, Number(value))} - // onPointerUp={updatedDist} - key={"6"} - /> -
-
- {/* - - handleBlurAmountChange( - selectedBlock, - updateBlockStyle, - Number(e.target.value) - ) - } - className="range-input" - /> */} - handleBlurAmountChange(selectedBlock, updateBlockStyle, Number(value))} - // onPointerUp={updatedDist} - key={"6"} - /> -
-
- - - updateBlockSize(selectedBlock, { - ...currentBlock.size!, - width: Number(e.target.value), - }) - } - className="form-input" - /> -
- -
- - - updateBlockSize(selectedBlock, { - ...currentBlock.size!, - height: Number(e.target.value), - }) - } - className="form-input" - /> -
- -
- - updateBlockZIndex(selectedBlock, Number(e.target.value))} className="form-input" /> -
- -
- - updateBlockStyle(selectedBlock, { padding: Number(e.target.value) })} - className="form-input" - /> -
- -
- - - updateBlockStyle(selectedBlock, { - borderRadius: Number(e.target.value), - }) - } - className="form-input" - /> -
); }; diff --git a/app/src/components/SimulationDashboard/components/element/ElementEditor.tsx b/app/src/components/SimulationDashboard/components/element/ElementEditor.tsx index 3a54ac7..85ba980 100644 --- a/app/src/components/SimulationDashboard/components/element/ElementEditor.tsx +++ b/app/src/components/SimulationDashboard/components/element/ElementEditor.tsx @@ -1,8 +1,15 @@ -import type { RefObject } from "react"; +import { useState, type RefObject } from "react"; import { ExtendedCSSProperties, UIElement } from "../../../../types/exportedTypes"; import { getCurrentElementStyleValue } from "../../functions/helpers/getCurrentElementStyleValue"; import type { DataModelManager } from "../../data/dataModel"; import { DeleteIcon } from "../../../icons/ContextMenuIcons"; +import DataSourceSelector from "../../../ui/inputs/DataSourceSelector"; +import InputWithDropDown from "../../../ui/inputs/InputWithDropDown"; +import InputRange from "../../../ui/inputs/InputRange"; +import RenameInput from "../../../ui/inputs/RenameInput"; +import { AddIcon, AlignJustifyIcon, AlignLeftIcon, AlignRightIcon, DeviceIcon, FlexColumnIcon, FlexRowIcon, FlexRowReverseIcon, ParametersIcon } from "../../../icons/ExportCommonIcons"; +import { getAlphaFromRgba, rgbaToHex, hexToRgba } from "../../functions/helpers/colorHandlers"; +import DataDetailedDropdown from "../../../ui/inputs/DataDetailedDropdown"; interface ElementEditorProps { elementEditorRef: RefObject; @@ -43,6 +50,9 @@ const ElementEditor: React.FC = ({ setShowSwapUI, dataModelManager, }) => { + const [selectType, setSelectType] = useState("design") + const [selectDataMapping, setSelectDataMapping] = useState("singleMachine") + const defaultGraphData = [ { name: "Jan", value: 400 }, { name: "Feb", value: 300 }, @@ -52,6 +62,40 @@ const ElementEditor: React.FC = ({ { name: "Jun", value: 900 }, ]; + const [singleFields, setSingleFields] = useState>([ + { id: "data-source", label: "Data Source", showEyeDropper: true }, + { id: "input-1", label: "Input 1", showEyeDropper: false }, + { id: "input-2", label: "Input 2", showEyeDropper: false }, + ]); + + const [multipleFields, setMultipleFields] = useState>([ + { id: "common-value", label: "Common Value" }, + { id: "data-source-1", label: "Data Source" }, + { id: "data-source-2", label: "Data Source" }, + ]); + + const addField = () => { + if (selectDataMapping === "singleMachine") { + setSingleFields((prev) => [ + ...prev, + { + id: `input-${Date.now()}`, + label: `Input ${prev.filter((f) => f.label.startsWith("Input")).length + 1}`, + showEyeDropper: false, + }, + ]); + return; + } + + setMultipleFields((prev) => [ + ...prev, + { + id: `data-${Date.now()}`, + label: "Data Source", + }, + ]); + }; + return (
@@ -65,492 +109,542 @@ const ElementEditor: React.FC = ({
- {currentElement.type === "label-value" && ( - <> -
- - - updateElementStyle(selectedBlock, selectedElement, { - labelColor: e.target.value, - }) - } - className="color-input" - /> -
-
- - - updateElementStyle(selectedBlock, selectedElement, { - valueColor: e.target.value, - }) - } - className="color-input" - /> -
-
- - -
- -
- - -
- -
- - -
- -
- - - updateElementStyle(selectedBlock, selectedElement, { - gap: `${e.target.value}px`, - }) - } - className="form-input" - /> -
- - )} - - {currentElement.type !== "label-value" && ( -
- - - updateElementStyle(selectedBlock, selectedElement, { - color: e.target.value, - }) - } - className="color-input" - /> +
+
setSelectType("design")}> + Design +
+
setSelectType("data")}> + Data
- )} - -
- -
-
- - - updateElementStyle(selectedBlock, selectedElement, { - fontSize: Number(e.target.value), - }) - } - className="form-input" - /> -
-
- - - updateElementSize(selectedBlock, selectedElement, { - ...currentElement.size!, - width: Number(e.target.value), - }) - } - className="form-input" - /> -
- -
- - - updateElementSize(selectedBlock, selectedElement, { - ...currentElement.size!, - height: Number(e.target.value), - }) - } - className="form-input" - /> -
- -
- - - updateElementStyle(selectedBlock, selectedElement, { - padding: Number(e.target.value), - }) - } - className="form-input" - /> -
- -
- - -
- - {currentElement.positionType === "absolute" && ( + {selectType === "design" && ( <> -
- - - updateElementPosition(selectedBlock, selectedElement, { - ...currentElement.position!, - x: Number(e.target.value), - }) - } - className="form-input" - /> -
-
- - - updateElementPosition(selectedBlock, selectedElement, { - ...currentElement.position!, - y: Number(e.target.value), - }) - } - className="form-input" - /> -
- - )} - - {currentElement.positionType === "fixed" && ( - <> -
- - - updateElementPosition(selectedBlock, selectedElement, { - ...currentElement.position!, - x: Number(e.target.value), - }) - } - className="form-input" - /> -
-
- - - updateElementPosition(selectedBlock, selectedElement, { - ...currentElement.position!, - y: Number(e.target.value), - }) - } - className="form-input" - /> -
- - )} - -
- - updateElementZIndex(selectedBlock, selectedElement, Number(e.target.value))} - className="form-input" - /> -
- - {currentElement.type === "graph" && ( - <> -
- - -
- -
- - updateGraphTitle(selectedBlock, selectedElement, e.target.value)} - className="form-input" - /> -
- - )} - -
- -
- - {/* Data Binding Section */} -
-

Data Binding

-
- -
- - -
- - {currentElement.data?.dataSource === "static" && ( - <> - {currentElement.type === "label-value" && ( -
- - - updateElementData(selectedBlock, selectedElement, { - label: e.target.value, - }) - } - className="form-input" - /> -
- )} -
- - - updateElementData(selectedBlock, selectedElement, { - staticValue: e.target.value, - }) - } - className="form-input" - /> -
- - )} - - {currentElement.data?.dataSource === "dynamic" && ( - <> - {currentElement.type === "label-value" && ( -
- - - updateElementData(selectedBlock, selectedElement, { - label: e.target.value, - }) - } - className="form-input" - /> -
- )} -
- - -
- - )} - - {currentElement.data?.dataSource === "formula" && ( - <> - {currentElement.type === "label-value" && ( -
- - - updateElementData(selectedBlock, selectedElement, { - label: e.target.value, - }) - } - className="form-input" - /> -
- )} -
- - - updateElementData(selectedBlock, selectedElement, { - formula: e.target.value, - }) - } - className="form-input" - /> - - Use {"{key}"} to reference data values. Example: {"{totalUsers} * {growthRate}"} - -
- - )} - - {currentElement.type === "graph" && ( -
- -