@cratis/components 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/dist/cjs/Common/ErrorBoundary.js +26 -0
- package/dist/cjs/Common/ErrorBoundary.js.map +1 -0
- package/dist/cjs/Common/FormElement.js +10 -0
- package/dist/cjs/Common/FormElement.js.map +1 -0
- package/dist/cjs/Common/index.js +12 -0
- package/dist/cjs/Common/index.js.map +1 -0
- package/dist/cjs/EventModeling/EventModeling.css +146 -0
- package/dist/cjs/EventModeling/EventModeling.js +209 -0
- package/dist/cjs/EventModeling/EventModeling.js.map +1 -0
- package/dist/cjs/EventModeling/components/Canvas.js +403 -0
- package/dist/cjs/EventModeling/components/Canvas.js.map +1 -0
- package/dist/cjs/EventModeling/components/CanvasControls.js +10 -0
- package/dist/cjs/EventModeling/components/CanvasControls.js.map +1 -0
- package/dist/cjs/EventModeling/components/Toolbox.js +18 -0
- package/dist/cjs/EventModeling/components/Toolbox.js.map +1 -0
- package/dist/cjs/EventModeling/engine/connectorGraphics.js +173 -0
- package/dist/cjs/EventModeling/engine/connectorGraphics.js.map +1 -0
- package/dist/cjs/EventModeling/engine/elementSprites.js +301 -0
- package/dist/cjs/EventModeling/engine/elementSprites.js.map +1 -0
- package/dist/cjs/EventModeling/index.js +12 -0
- package/dist/cjs/EventModeling/index.js.map +1 -0
- package/dist/cjs/EventModeling/types.js +60 -0
- package/dist/cjs/EventModeling/types.js.map +1 -0
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/groups.js +15 -15
- package/dist/cjs/PivotViewer/components/pivot/groups.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +2 -2
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/cjs/PivotViewer/types.js.map +1 -1
- package/dist/cjs/TimeMachine/TimeMachine.js +0 -3
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/cjs/index.js +16 -12
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +3 -0
- package/dist/esm/Common/ErrorBoundary.js +7 -4
- package/dist/esm/Common/ErrorBoundary.js.map +1 -1
- package/dist/esm/Common/FormElement.js +7 -4
- package/dist/esm/Common/FormElement.js.map +1 -1
- package/dist/esm/Common/index.js +4 -4
- package/dist/esm/Common/index.js.map +1 -1
- package/dist/esm/EventModeling/EventModeling.css +146 -0
- package/dist/esm/EventModeling/EventModeling.d.ts +11 -0
- package/dist/esm/EventModeling/EventModeling.d.ts.map +1 -0
- package/dist/esm/EventModeling/EventModeling.js +207 -0
- package/dist/esm/EventModeling/EventModeling.js.map +1 -0
- package/dist/esm/EventModeling/EventModeling.stories.d.ts +10 -0
- package/dist/esm/EventModeling/EventModeling.stories.d.ts.map +1 -0
- package/dist/esm/EventModeling/EventModeling.stories.js +252 -0
- package/dist/esm/EventModeling/EventModeling.stories.js.map +1 -0
- package/dist/esm/EventModeling/components/Canvas.d.ts +23 -0
- package/dist/esm/EventModeling/components/Canvas.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/Canvas.js +382 -0
- package/dist/esm/EventModeling/components/Canvas.js.map +1 -0
- package/dist/esm/EventModeling/components/CanvasControls.d.ts +10 -0
- package/dist/esm/EventModeling/components/CanvasControls.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/CanvasControls.js +8 -0
- package/dist/esm/EventModeling/components/CanvasControls.js.map +1 -0
- package/dist/esm/EventModeling/components/Toolbox.d.ts +9 -0
- package/dist/esm/EventModeling/components/Toolbox.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/Toolbox.js +16 -0
- package/dist/esm/EventModeling/components/Toolbox.js.map +1 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.d.ts +12 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.d.ts.map +1 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.js +151 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.js.map +1 -0
- package/dist/esm/EventModeling/engine/elementSprites.d.ts +23 -0
- package/dist/esm/EventModeling/engine/elementSprites.d.ts.map +1 -0
- package/dist/esm/EventModeling/engine/elementSprites.js +276 -0
- package/dist/esm/EventModeling/engine/elementSprites.js.map +1 -0
- package/dist/esm/EventModeling/index.d.ts +3 -0
- package/dist/esm/EventModeling/index.d.ts.map +1 -0
- package/dist/esm/EventModeling/index.js +3 -0
- package/dist/esm/EventModeling/index.js.map +1 -0
- package/dist/esm/EventModeling/types.d.ts +79 -0
- package/dist/esm/EventModeling/types.d.ts.map +1 -0
- package/dist/esm/EventModeling/types.js +56 -0
- package/dist/esm/EventModeling/types.js.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +2 -2
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +2 -2
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/groups.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/groups.js +2 -2
- package/dist/esm/PivotViewer/components/pivot/groups.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +4 -4
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.js +2 -2
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/esm/PivotViewer/types.d.ts +2 -2
- package/dist/esm/PivotViewer/types.d.ts.map +1 -1
- package/dist/esm/PivotViewer/types.js.map +1 -1
- package/dist/esm/TimeMachine/TimeMachine.js +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/package.json +3 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +36 -78
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeMachine.js","sources":["../../../TimeMachine/TimeMachine.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Version } from './types';\nimport { ReadModelView } from './ReadModelView';\nimport { EventsView } from './EventsView';\nimport './TimeMachine.css';\n\nenum ViewModes {\n ReadModel = 'ReadModel',\n Events = 'Events',\n}\n\ninterface TimeMachineProps {\n versions: Version[];\n currentVersionIndex?: number;\n onVersionChange?: (index: number) => void;\n /** Scroll sensitivity - higher values require more scrolling to change versions */\n scrollSensitivity?: number;\n}\n\nexport const TimeMachine: React.FC<TimeMachineProps> = ({\n versions,\n currentVersionIndex = 0,\n onVersionChange,\n scrollSensitivity = 50,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(currentVersionIndex);\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n const [isHoveringCard, setIsHoveringCard] = useState(false);\n const [viewMode, setViewMode] = useState<ViewModes>(ViewModes.ReadModel);\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollAccumulatorRef = useRef(0);\n\n const handleVersionSelect = useCallback((index: number) => {\n setSelectedIndex(index);\n onVersionChange?.(index);\n }, [onVersionChange]);\n\n const handleTimelineHover = useCallback((index: number | null) => {\n setHoveredIndex(index);\n }, []);\n\n // Handle trackpad two-finger scroll gesture\n useEffect(() => {\n if (viewMode !== ViewModes.ReadModel) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Only handle navigation when not hovering over a card\n if (isHoveringCard) {\n return; // Allow normal scrolling within cards\n }\n\n // Prevent default scrolling behavior\n e.preventDefault();\n\n // Use deltaX for horizontal scroll, fallback to deltaY for vertical\n // Most trackpads send horizontal delta for two-finger swipe\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n\n // Accumulate scroll delta\n scrollAccumulatorRef.current += delta;\n\n // Check if we've accumulated enough scroll to change version\n if (Math.abs(scrollAccumulatorRef.current) >= scrollSensitivity) {\n const direction = scrollAccumulatorRef.current > 0 ? 1 : -1;\n const newIndex = Math.max(0, Math.min(versions.length - 1, selectedIndex + direction));\n\n if (newIndex !== selectedIndex) {\n setSelectedIndex(newIndex);\n onVersionChange?.(newIndex);\n }\n\n // Reset accumulator after version change\n scrollAccumulatorRef.current = 0;\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [versions.length, selectedIndex, onVersionChange, scrollSensitivity, isHoveringCard, viewMode]);\n\n // Calculate the display index - either hovered or selected\n // (not used in this component; ReadModelView computes its own display index)\n void hoveredIndex;\n void selectedIndex;\n\n // Get all events from all versions\n const allEvents = versions.flatMap(version => version.events || []);\n\n return (\n <div className=\"time-machine\" ref={containerRef}>\n {/* View Switcher */}\n <div className=\"view-switcher\">\n <button\n className={`view-button ${viewMode === ViewModes.ReadModel ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.ReadModel)}\n aria-label=\"Read Model View\"\n title=\"Read Model View\"\n >\n <i className=\"pi pi-box\" />\n </button>\n <button\n className={`view-button ${viewMode === ViewModes.Events ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.Events)}\n aria-label=\"Events View\"\n title=\"Events View\"\n >\n <i className=\"pi pi-list\" />\n </button>\n </div>\n\n {/* Render the appropriate view */}\n {viewMode === ViewModes.ReadModel ? (\n <ReadModelView\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onVersionSelect={handleVersionSelect}\n onHoveringCardChange={setIsHoveringCard}\n />\n ) : (\n <EventsView events={allEvents} />\n )}\n\n {/* Timeline - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <Timeline\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onSelect={handleVersionSelect}\n onHover={handleTimelineHover}\n />\n )}\n\n {/* Navigation arrows - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <div className=\"navigation-controls\">\n <button\n className=\"nav-button prev\"\n disabled={selectedIndex === 0}\n onClick={() => handleVersionSelect(Math.max(0, selectedIndex - 1))}\n aria-label=\"Previous version\"\n >\n ‹\n </button>\n <button\n className=\"nav-button next\"\n disabled={selectedIndex === versions.length - 1}\n onClick={() => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1))}\n aria-label=\"Next version\"\n >\n ›\n </button>\n </div>\n )}\n </div>\n );\n};\n\ninterface TimelineProps {\n versions: Version[];\n selectedIndex: number;\n hoveredIndex: number | null;\n onSelect: (index: number) => void;\n onHover: (index: number | null) => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({\n versions,\n selectedIndex,\n hoveredIndex,\n onSelect,\n onHover,\n}) => {\n const getMagnification = (index: number, hoverIdx: number | null): number => {\n if (hoverIdx === null) return 1;\n const distance = Math.abs(index - hoverIdx);\n // Fish-eye effect: items close to hover get magnified\n if (distance === 0) return 2.0;\n if (distance === 1) return 1.6;\n if (distance === 2) return 1.3;\n if (distance === 3) return 1.1;\n return 1;\n };\n\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n };\n\n return (\n <div\n className=\"timeline\"\n onMouseLeave={() => onHover(null)}\n >\n <div className=\"timeline-track\">\n {versions.map((version, index) => {\n const magnification = getMagnification(index, hoveredIndex);\n const isSelected = index === selectedIndex;\n const isHovered = index === hoveredIndex;\n\n return (\n <div\n key={version.id}\n className={`timeline-entry ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''}`}\n style={{\n '--magnification': magnification,\n } as React.CSSProperties}\n onMouseEnter={() => onHover(index)}\n onClick={() => onSelect(index)}\n >\n <div className=\"timeline-tick\"></div>\n <div className=\"timeline-label\">\n <span className=\"timeline-date\">{formatDate(version.timestamp)}</span>\n <span className=\"timeline-time\">{formatTime(version.timestamp)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TimeMachine;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","_jsx","ReadModelView","EventsView"],"mappings":";;;;;;;;;;AASA,IAAK,SAGJ;AAHD,CAAA,UAAK,SAAS,EAAA;AACZ,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAHI,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AAaP,MAAM,WAAW,GAA+B,CAAC,EACtD,QAAQ,EACR,mBAAmB,GAAG,CAAC,EACvB,eAAe,EACf,iBAAiB,GAAG,EAAE,GACvB,KAAI;IACH,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,mBAAmB,CAAC;IACvE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IACrE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AAC3D,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAY,SAAS,CAAC,SAAS,CAAC;AACxE,IAAA,MAAM,YAAY,GAAGC,YAAM,CAAiB,IAAI,CAAC;AACjD,IAAA,MAAM,oBAAoB,GAAGA,YAAM,CAAC,CAAC,CAAC;AAEtC,IAAA,MAAM,mBAAmB,GAAGC,iBAAW,CAAC,CAAC,KAAa,KAAI;QACxD,gBAAgB,CAAC,KAAK,CAAC;AACvB,QAAA,eAAe,GAAG,KAAK,CAAC;AAC1B,IAAA,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;AAErB,IAAA,MAAM,mBAAmB,GAAGA,iBAAW,CAAC,CAAC,KAAoB,KAAI;QAC/D,eAAe,CAAC,KAAK,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC;IAGNC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,QAAQ,KAAK,SAAS,CAAC,SAAS,EAAE;YACpC;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,CAAC,CAAa,KAAI;YAEpC,IAAI,cAAc,EAAE;gBAClB;YACF;YAGA,CAAC,CAAC,cAAc,EAAE;AAIlB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;AAG3E,YAAA,oBAAoB,CAAC,OAAO,IAAI,KAAK;YAGrC,IAAI,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,iBAAiB,EAAE;AAC/D,gBAAA,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAEtF,gBAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;oBAC9B,gBAAgB,CAAC,QAAQ,CAAC;AAC1B,oBAAA,eAAe,GAAG,QAAQ,CAAC;gBAC7B;AAGA,gBAAA,oBAAoB,CAAC,OAAO,GAAG,CAAC;YAClC;AACF,QAAA,CAAC;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEpE,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;AACrD,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AAQlG,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AAEnE,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,EAAC,GAAG,EAAE,YAAY,EAAA,QAAA,EAAA,CAE7CA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAC5BC,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,YAAA,EAAe,QAAQ,KAAK,SAAS,CAAC,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EAC5E,OAAO,EAAE,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAA,YAAA,EACpC,iBAAiB,EAC5B,KAAK,EAAC,iBAAiB,EAAA,QAAA,EAEvBA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,WAAW,EAAA,CAAG,EAAA,CACpB,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,YAAA,EAAe,QAAQ,KAAK,SAAS,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACzE,OAAO,EAAE,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAA,YAAA,EACjC,aAAa,EACxB,KAAK,EAAC,aAAa,EAAA,QAAA,EAEnBA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,YAAY,EAAA,CAAG,EAAA,CACrB,CAAA,EAAA,CACL,EAGL,QAAQ,KAAK,SAAS,CAAC,SAAS,IAC/BA,cAAA,CAACC,2BAAa,EAAA,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,mBAAmB,EACpC,oBAAoB,EAAE,iBAAiB,EAAA,CACvC,KAEFD,cAAA,CAACE,qBAAU,EAAA,EAAC,MAAM,EAAE,SAAS,EAAA,CAAI,CAClC,EAGA,QAAQ,KAAK,SAAS,CAAC,SAAS,KAC/BF,cAAA,CAAC,QAAQ,EAAA,EACP,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,EAAA,CAC5B,CACH,EAGA,QAAQ,KAAK,SAAS,CAAC,SAAS,KAC/BD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAClCC,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iBAAiB,EAC3B,QAAQ,EAAE,aAAa,KAAK,CAAC,EAC7B,OAAO,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,EAAA,YAAA,EACvD,kBAAkB,EAAA,QAAA,EAAA,QAAA,EAAA,CAGtB,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iBAAiB,EAC3B,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAC/C,OAAO,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,EAAA,YAAA,EACzE,cAAc,EAAA,QAAA,EAAA,QAAA,EAAA,CAGlB,CAAA,EAAA,CACL,CACP,CAAA,EAAA,CACG;AAEV;AAUA,MAAM,QAAQ,GAA4B,CAAC,EACzC,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,OAAO,GACR,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,QAAuB,KAAY;QAC1E,IAAI,QAAQ,KAAK,IAAI;AAAE,YAAA,OAAO,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;QAE3C,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;AAC9B,QAAA,OAAO,CAAC;AACV,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,IAAU,KAAY;AACxC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACtC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,IAAU,KAAY;AACxC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACtC,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,QACEA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,UAAU,EACpB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAA,QAAA,EAEjCA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;gBAC/B,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC;AAC3D,gBAAA,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa;AAC1C,gBAAA,MAAM,SAAS,GAAG,KAAK,KAAK,YAAY;gBAExC,QACED,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAE,CAAA,eAAA,EAAkB,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAA,EAAI,SAAS,GAAG,SAAS,GAAG,EAAE,CAAA,CAAE,EACzF,KAAK,EAAE;AACL,wBAAA,iBAAiB,EAAE,aAAa;AACV,qBAAA,EACxB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAE9BC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,CAAO,EACrCD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAA,CAAQ,EACtEA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAA,CAAQ,CAAA,EAAA,CAClE,CAAA,EAAA,EAZD,OAAO,CAAC,EAAE,CAaX;AAEV,YAAA,CAAC,CAAC,EAAA,CACE,EAAA,CACF;AAEV,CAAC;;;;;"}
|
|
1
|
+
{"version":3,"file":"TimeMachine.js","sources":["../../../TimeMachine/TimeMachine.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Version } from './types';\nimport { ReadModelView } from './ReadModelView';\nimport { EventsView } from './EventsView';\nimport './TimeMachine.css';\n\nenum ViewModes {\n ReadModel = 'ReadModel',\n Events = 'Events',\n}\n\ninterface TimeMachineProps {\n versions: Version[];\n currentVersionIndex?: number;\n onVersionChange?: (index: number) => void;\n /** Scroll sensitivity - higher values require more scrolling to change versions */\n scrollSensitivity?: number;\n}\n\nexport const TimeMachine: React.FC<TimeMachineProps> = ({\n versions,\n currentVersionIndex = 0,\n onVersionChange,\n scrollSensitivity = 50,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(currentVersionIndex);\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n const [isHoveringCard, setIsHoveringCard] = useState(false);\n const [viewMode, setViewMode] = useState<ViewModes>(ViewModes.ReadModel);\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollAccumulatorRef = useRef(0);\n\n const handleVersionSelect = useCallback((index: number) => {\n setSelectedIndex(index);\n onVersionChange?.(index);\n }, [onVersionChange]);\n\n const handleTimelineHover = useCallback((index: number | null) => {\n setHoveredIndex(index);\n }, []);\n\n // Handle trackpad two-finger scroll gesture\n useEffect(() => {\n if (viewMode !== ViewModes.ReadModel) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Only handle navigation when not hovering over a card\n if (isHoveringCard) {\n return; // Allow normal scrolling within cards\n }\n\n // Prevent default scrolling behavior\n e.preventDefault();\n\n // Use deltaX for horizontal scroll, fallback to deltaY for vertical\n // Most trackpads send horizontal delta for two-finger swipe\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n\n // Accumulate scroll delta\n scrollAccumulatorRef.current += delta;\n\n // Check if we've accumulated enough scroll to change version\n if (Math.abs(scrollAccumulatorRef.current) >= scrollSensitivity) {\n const direction = scrollAccumulatorRef.current > 0 ? 1 : -1;\n const newIndex = Math.max(0, Math.min(versions.length - 1, selectedIndex + direction));\n\n if (newIndex !== selectedIndex) {\n setSelectedIndex(newIndex);\n onVersionChange?.(newIndex);\n }\n\n // Reset accumulator after version change\n scrollAccumulatorRef.current = 0;\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [versions.length, selectedIndex, onVersionChange, scrollSensitivity, isHoveringCard, viewMode]);\n\n // Calculate the display index - either hovered or selected\n // (not used in this component; ReadModelView computes its own display index)\n void hoveredIndex;\n void selectedIndex;\n\n // Get all events from all versions\n const allEvents = versions.flatMap(version => version.events || []);\n\n return (\n <div className=\"time-machine\" ref={containerRef}>\n {/* View Switcher */}\n <div className=\"view-switcher\">\n <button\n className={`view-button ${viewMode === ViewModes.ReadModel ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.ReadModel)}\n aria-label=\"Read Model View\"\n title=\"Read Model View\"\n >\n <i className=\"pi pi-box\" />\n </button>\n <button\n className={`view-button ${viewMode === ViewModes.Events ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.Events)}\n aria-label=\"Events View\"\n title=\"Events View\"\n >\n <i className=\"pi pi-list\" />\n </button>\n </div>\n\n {/* Render the appropriate view */}\n {viewMode === ViewModes.ReadModel ? (\n <ReadModelView\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onVersionSelect={handleVersionSelect}\n onHoveringCardChange={setIsHoveringCard}\n />\n ) : (\n <EventsView events={allEvents} />\n )}\n\n {/* Timeline - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <Timeline\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onSelect={handleVersionSelect}\n onHover={handleTimelineHover}\n />\n )}\n\n {/* Navigation arrows - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <div className=\"navigation-controls\">\n <button\n className=\"nav-button prev\"\n disabled={selectedIndex === 0}\n onClick={() => handleVersionSelect(Math.max(0, selectedIndex - 1))}\n aria-label=\"Previous version\"\n >\n ‹\n </button>\n <button\n className=\"nav-button next\"\n disabled={selectedIndex === versions.length - 1}\n onClick={() => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1))}\n aria-label=\"Next version\"\n >\n ›\n </button>\n </div>\n )}\n </div>\n );\n};\n\ninterface TimelineProps {\n versions: Version[];\n selectedIndex: number;\n hoveredIndex: number | null;\n onSelect: (index: number) => void;\n onHover: (index: number | null) => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({\n versions,\n selectedIndex,\n hoveredIndex,\n onSelect,\n onHover,\n}) => {\n const getMagnification = (index: number, hoverIdx: number | null): number => {\n if (hoverIdx === null) return 1;\n const distance = Math.abs(index - hoverIdx);\n // Fish-eye effect: items close to hover get magnified\n if (distance === 0) return 2.0;\n if (distance === 1) return 1.6;\n if (distance === 2) return 1.3;\n if (distance === 3) return 1.1;\n return 1;\n };\n\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n };\n\n return (\n <div\n className=\"timeline\"\n onMouseLeave={() => onHover(null)}\n >\n <div className=\"timeline-track\">\n {versions.map((version, index) => {\n const magnification = getMagnification(index, hoveredIndex);\n const isSelected = index === selectedIndex;\n const isHovered = index === hoveredIndex;\n\n return (\n <div\n key={version.id}\n className={`timeline-entry ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''}`}\n style={{\n '--magnification': magnification,\n } as React.CSSProperties}\n onMouseEnter={() => onHover(index)}\n onClick={() => onSelect(index)}\n >\n <div className=\"timeline-tick\"></div>\n <div className=\"timeline-label\">\n <span className=\"timeline-date\">{formatDate(version.timestamp)}</span>\n <span className=\"timeline-time\">{formatTime(version.timestamp)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TimeMachine;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","_jsx","ReadModelView","EventsView"],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -2,21 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
var index = require('./CommandDialog/index.js');
|
|
4
4
|
var index$1 = require('./CommandForm/index.js');
|
|
5
|
-
var index$2 = require('./
|
|
6
|
-
var index$3 = require('./
|
|
7
|
-
var index$4 = require('./
|
|
8
|
-
var index$5 = require('./
|
|
9
|
-
var index$6 = require('./
|
|
10
|
-
var index$7 = require('./
|
|
5
|
+
var index$2 = require('./Common/index.js');
|
|
6
|
+
var index$3 = require('./DataPage/index.js');
|
|
7
|
+
var index$4 = require('./DataTables/index.js');
|
|
8
|
+
var index$5 = require('./Dialogs/index.js');
|
|
9
|
+
var index$6 = require('./Dropdown/index.js');
|
|
10
|
+
var index$7 = require('./EventModeling/index.js');
|
|
11
|
+
var index$8 = require('./PivotViewer/index.js');
|
|
12
|
+
var index$9 = require('./TimeMachine/index.js');
|
|
11
13
|
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
exports.CommandDialog = index;
|
|
15
17
|
exports.CommandForm = index$1;
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
18
|
-
exports.
|
|
19
|
-
exports.
|
|
20
|
-
exports.
|
|
21
|
-
exports.
|
|
18
|
+
exports.Common = index$2;
|
|
19
|
+
exports.DataPage = index$3;
|
|
20
|
+
exports.DataTables = index$4;
|
|
21
|
+
exports.Dialogs = index$5;
|
|
22
|
+
exports.Dropdown = index$6;
|
|
23
|
+
exports.EventModeling = index$7;
|
|
24
|
+
exports.PivotViewer = index$8;
|
|
25
|
+
exports.TimeMachine = index$9;
|
|
22
26
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Component } from 'react';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
class ErrorBoundary extends Component {
|
|
4
5
|
state = {
|
|
5
6
|
hasError: false,
|
|
6
7
|
error: new Error(),
|
|
@@ -13,9 +14,11 @@ export class ErrorBoundary extends Component {
|
|
|
13
14
|
}
|
|
14
15
|
render() {
|
|
15
16
|
if (this.state.hasError) {
|
|
16
|
-
return (
|
|
17
|
+
return (jsxs("div", { className: 'p-4', children: [jsx("h1", { className: 'text-3xl m-3', children: "Error" }), jsx("p", { children: this.state.error.message }), jsx("p", { children: this.state.error.stack })] }));
|
|
17
18
|
}
|
|
18
19
|
return this.props.children;
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
|
|
23
|
+
export { ErrorBoundary };
|
|
24
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sources":["../../../Common/ErrorBoundary.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n}\ninterface State {\n hasError: boolean;\n error: Error;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n error: new Error(),\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error: error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return (\n <div className='p-4'>\n <h1 className='text-3xl m-3'>Error</h1>\n <p>{this.state.error.message}</p>\n <p>{this.state.error.stack}</p>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;AAaM,MAAO,aAAc,SAAQ,SAAuB,CAAA;AAC/C,IAAA,KAAK,GAAU;AAClB,QAAA,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI,KAAK,EAAE;KACrB;IAEM,OAAO,wBAAwB,CAAC,KAAY,EAAA;QAC/C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3C;IAEO,iBAAiB,CAAC,KAAY,EAAE,SAAoB,EAAA;QACvD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,CAAC;IACtD;IAEO,MAAM,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACrB,YAAA,QACIA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,KAAK,EAAA,QAAA,EAAA,CAChBC,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,OAAA,EAAA,CAAW,EACvCA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAA,CAAK,EACjCA,qBAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAA,CAAK,CAAA,EAAA,CAC7B;QAEd;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;IAC9B;AACH;;;;"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
const FormElement = (props) => {
|
|
4
|
+
return (jsx("div", { className: "card flex flex-column md:flex-row gap-3", children: jsxs("div", { className: "p-inputgroup flex-1", children: [jsx("span", { className: "p-inputgroup-addon", children: props.icon }), props.children] }) }));
|
|
4
5
|
};
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
export { FormElement };
|
|
8
|
+
//# sourceMappingURL=FormElement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormElement.js","
|
|
1
|
+
{"version":3,"file":"FormElement.js","sources":["../../../Common/FormElement.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nexport interface FormElementProps {\n children: React.ReactNode;\n icon: React.ReactNode;\n}\n\nexport const FormElement = (props: FormElementProps) => {\n return (\n <div className=\"card flex flex-column md:flex-row gap-3\">\n <div className=\"p-inputgroup flex-1\">\n <span className=\"p-inputgroup-addon\">\n {props.icon}\n </span>\n {props.children}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;AAQO,MAAM,WAAW,GAAG,CAAC,KAAuB,KAAI;IACnD,QACIA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yCAAyC,EAAA,QAAA,EACpDC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAChCD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC/B,KAAK,CAAC,IAAI,EAAA,CACR,EACN,KAAK,CAAC,QAAQ,CAAA,EAAA,CACb,EAAA,CACJ;AAEd;;;;"}
|
package/dist/esm/Common/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { ErrorBoundary } from './ErrorBoundary.js';
|
|
2
|
+
export { Page } from './Page.js';
|
|
3
|
+
export { FormElement } from './FormElement.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/* Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
Licensed under the MIT license. See LICENSE file in the project root for full license information. */
|
|
3
|
+
|
|
4
|
+
.event-modeling {
|
|
5
|
+
position: relative;
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
background: var(--surface-ground, #f8f9fa);
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
width: 100%;
|
|
11
|
+
height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.event-modeling-canvas-container {
|
|
15
|
+
flex: 1;
|
|
16
|
+
position: relative;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.event-modeling-canvas {
|
|
21
|
+
position: absolute;
|
|
22
|
+
top: 0;
|
|
23
|
+
left: 0;
|
|
24
|
+
z-index: 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.event-modeling-toolbox {
|
|
28
|
+
position: absolute;
|
|
29
|
+
top: 20px;
|
|
30
|
+
left: 20px;
|
|
31
|
+
background: var(--surface-card, #ffffff);
|
|
32
|
+
border-radius: 12px;
|
|
33
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
34
|
+
border: 1px solid var(--surface-border, #dee2e6);
|
|
35
|
+
padding: 8px;
|
|
36
|
+
z-index: 1000;
|
|
37
|
+
display: flex;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.event-modeling-tool-button {
|
|
42
|
+
width: 64px;
|
|
43
|
+
height: 64px;
|
|
44
|
+
border: 2px solid transparent;
|
|
45
|
+
border-radius: 8px;
|
|
46
|
+
background: var(--surface-0, #ffffff);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
display: flex;
|
|
49
|
+
flex-direction: column;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
gap: 4px;
|
|
53
|
+
transition: all 0.15s ease;
|
|
54
|
+
font-size: 11px;
|
|
55
|
+
font-weight: 600;
|
|
56
|
+
color: var(--text-color, #495057);
|
|
57
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.event-modeling-tool-button:hover {
|
|
61
|
+
background: var(--surface-100, #f8f9fa);
|
|
62
|
+
transform: translateY(-1px);
|
|
63
|
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.event-modeling-tool-button.selected {
|
|
67
|
+
border-color: var(--primary-color, #3B82F6);
|
|
68
|
+
background: var(--primary-50, #EFF6FF);
|
|
69
|
+
box-shadow: 0 0 0 1px var(--primary-color, #3B82F6);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.event-modeling-tool-icon {
|
|
73
|
+
font-size: 24px;
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
justify-content: center;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.event-modeling-tool-button.command .event-modeling-tool-icon {
|
|
80
|
+
width: 40px;
|
|
81
|
+
height: 24px;
|
|
82
|
+
background: var(--blue-500, #3b82f6);
|
|
83
|
+
border-radius: 4px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.event-modeling-tool-button.event .event-modeling-tool-icon {
|
|
87
|
+
width: 40px;
|
|
88
|
+
height: 24px;
|
|
89
|
+
background: var(--orange-500, #f59e0b);
|
|
90
|
+
border-radius: 4px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.event-modeling-tool-button.readmodel .event-modeling-tool-icon {
|
|
94
|
+
width: 40px;
|
|
95
|
+
height: 24px;
|
|
96
|
+
background: var(--green-500, #10b981);
|
|
97
|
+
border-radius: 4px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.event-modeling-tool-button.process .event-modeling-tool-icon {
|
|
101
|
+
width: 28px;
|
|
102
|
+
height: 28px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.event-modeling-controls {
|
|
106
|
+
position: absolute;
|
|
107
|
+
bottom: 20px;
|
|
108
|
+
right: 20px;
|
|
109
|
+
background: var(--surface-card, #ffffff);
|
|
110
|
+
border-radius: 12px;
|
|
111
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
112
|
+
border: 1px solid var(--surface-border, #dee2e6);
|
|
113
|
+
padding: 6px;
|
|
114
|
+
z-index: 1000;
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
gap: 4px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.event-modeling-control-button {
|
|
121
|
+
width: 40px;
|
|
122
|
+
height: 40px;
|
|
123
|
+
border: none;
|
|
124
|
+
border-radius: 8px;
|
|
125
|
+
background: var(--surface-0, #ffffff);
|
|
126
|
+
cursor: pointer;
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
transition: all 0.15s ease;
|
|
131
|
+
font-size: 16px;
|
|
132
|
+
font-weight: 600;
|
|
133
|
+
color: var(--text-color, #495057);
|
|
134
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.event-modeling-control-button:hover {
|
|
138
|
+
background: var(--surface-100, #f8f9fa);
|
|
139
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.event-modeling-control-button:disabled {
|
|
143
|
+
opacity: 0.4;
|
|
144
|
+
cursor: not-allowed;
|
|
145
|
+
background: var(--surface-100, #f8f9fa);
|
|
146
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { EventModelingState } from './types';
|
|
3
|
+
import './EventModeling.css';
|
|
4
|
+
export interface EventModelingProps {
|
|
5
|
+
initialState?: EventModelingState;
|
|
6
|
+
onStateChange?: (state: EventModelingState) => void;
|
|
7
|
+
width?: string;
|
|
8
|
+
height?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const EventModeling: React.FC<EventModelingProps>;
|
|
11
|
+
//# sourceMappingURL=EventModeling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventModeling.d.ts","sourceRoot":"","sources":["../../../EventModeling/EventModeling.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgC,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAoF,MAAM,SAAS,CAAC;AAI/H,OAAO,qBAAqB,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IAC/B,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAyRtD,CAAC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React, { useState, useCallback } from 'react';
|
|
3
|
+
import { DEFAULT_ELEMENT_SIZE, calculateOptimalEdges } from './types.js';
|
|
4
|
+
import { Toolbox } from './components/Toolbox.js';
|
|
5
|
+
import { Canvas } from './components/Canvas.js';
|
|
6
|
+
import { CanvasControls } from './components/CanvasControls.js';
|
|
7
|
+
import './EventModeling.css';
|
|
8
|
+
|
|
9
|
+
const EventModeling = ({ initialState, onStateChange, width = '100%', height = '100vh', }) => {
|
|
10
|
+
const [state, setState] = useState(initialState || {
|
|
11
|
+
elements: [],
|
|
12
|
+
connectors: [],
|
|
13
|
+
});
|
|
14
|
+
const [selectedTool, setSelectedTool] = useState('select');
|
|
15
|
+
const [zoom, setZoom] = useState(1);
|
|
16
|
+
const [pan, setPan] = useState({ x: 0, y: 0 });
|
|
17
|
+
const updateState = useCallback((newState) => {
|
|
18
|
+
setState(newState);
|
|
19
|
+
onStateChange?.(newState);
|
|
20
|
+
}, [onStateChange]);
|
|
21
|
+
const handleZoomChange = useCallback((newZoom) => {
|
|
22
|
+
setZoom(newZoom);
|
|
23
|
+
}, []);
|
|
24
|
+
const handlePanChange = useCallback((newPan) => {
|
|
25
|
+
setPan(newPan);
|
|
26
|
+
}, []);
|
|
27
|
+
const handleAddElement = useCallback((type, x, y) => {
|
|
28
|
+
console.log('Adding element:', type, 'at', x, y);
|
|
29
|
+
const size = DEFAULT_ELEMENT_SIZE[type];
|
|
30
|
+
const newElement = {
|
|
31
|
+
id: `${type}-${Date.now()}`,
|
|
32
|
+
type,
|
|
33
|
+
position: { x, y },
|
|
34
|
+
size,
|
|
35
|
+
label: `New ${type.charAt(0).toUpperCase() + type.slice(1)}`,
|
|
36
|
+
};
|
|
37
|
+
updateState({
|
|
38
|
+
...state,
|
|
39
|
+
elements: [...state.elements, newElement],
|
|
40
|
+
});
|
|
41
|
+
setSelectedTool('select');
|
|
42
|
+
}, [state, updateState]);
|
|
43
|
+
const handleUpdateElement = useCallback((id, updates) => {
|
|
44
|
+
const updatedElements = state.elements.map(el => el.id === id ? { ...el, ...updates } : el);
|
|
45
|
+
let updatedConnectors = state.connectors;
|
|
46
|
+
if (updates.position) {
|
|
47
|
+
updatedConnectors = state.connectors.map(connector => {
|
|
48
|
+
if (connector.from.elementId === id || connector.to.elementId === id) {
|
|
49
|
+
const fromElement = updatedElements.find(el => el.id === connector.from.elementId);
|
|
50
|
+
const toElement = updatedElements.find(el => el.id === connector.to.elementId);
|
|
51
|
+
if (fromElement && toElement) {
|
|
52
|
+
const optimalEdges = calculateOptimalEdges(fromElement, toElement);
|
|
53
|
+
return {
|
|
54
|
+
...connector,
|
|
55
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
56
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return connector;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
updateState({
|
|
64
|
+
...state,
|
|
65
|
+
elements: updatedElements,
|
|
66
|
+
connectors: updatedConnectors,
|
|
67
|
+
});
|
|
68
|
+
}, [state, updateState]);
|
|
69
|
+
const handleDeleteElement = useCallback((id) => {
|
|
70
|
+
updateState({
|
|
71
|
+
...state,
|
|
72
|
+
elements: state.elements.filter(el => el.id !== id),
|
|
73
|
+
connectors: state.connectors.filter(conn => conn.from.elementId !== id && conn.to.elementId !== id),
|
|
74
|
+
selectedElementId: state.selectedElementId === id ? undefined : state.selectedElementId,
|
|
75
|
+
});
|
|
76
|
+
}, [state, updateState]);
|
|
77
|
+
const handleAddConnector = useCallback((connector) => {
|
|
78
|
+
if (connector.from.elementId === connector.to.elementId) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const fromElement = state.elements.find(el => el.id === connector.from.elementId);
|
|
82
|
+
const toElement = state.elements.find(el => el.id === connector.to.elementId);
|
|
83
|
+
if (!fromElement || !toElement) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const optimalEdges = calculateOptimalEdges(fromElement, toElement);
|
|
87
|
+
const optimizedConnector = {
|
|
88
|
+
...connector,
|
|
89
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
90
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
91
|
+
};
|
|
92
|
+
const isDuplicate = state.connectors.some(c => c.from.elementId === optimizedConnector.from.elementId &&
|
|
93
|
+
c.to.elementId === optimizedConnector.to.elementId);
|
|
94
|
+
if (isDuplicate) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
updateState({
|
|
98
|
+
...state,
|
|
99
|
+
connectors: [...state.connectors, optimizedConnector],
|
|
100
|
+
});
|
|
101
|
+
}, [state, updateState]);
|
|
102
|
+
const handleDeleteConnector = useCallback((id) => {
|
|
103
|
+
updateState({
|
|
104
|
+
...state,
|
|
105
|
+
connectors: state.connectors.filter(conn => conn.id !== id),
|
|
106
|
+
selectedConnectorId: state.selectedConnectorId === id ? undefined : state.selectedConnectorId,
|
|
107
|
+
});
|
|
108
|
+
}, [state, updateState]);
|
|
109
|
+
const handleSelectElement = useCallback((id) => {
|
|
110
|
+
updateState({
|
|
111
|
+
...state,
|
|
112
|
+
selectedElementId: id,
|
|
113
|
+
selectedConnectorId: undefined,
|
|
114
|
+
});
|
|
115
|
+
}, [state, updateState]);
|
|
116
|
+
const handleSelectConnector = useCallback((id) => {
|
|
117
|
+
updateState({
|
|
118
|
+
...state,
|
|
119
|
+
selectedConnectorId: id,
|
|
120
|
+
selectedElementId: undefined,
|
|
121
|
+
});
|
|
122
|
+
}, [state, updateState]);
|
|
123
|
+
const handleZoomIn = useCallback(() => {
|
|
124
|
+
setZoom(prev => Math.min(5, prev * 1.2));
|
|
125
|
+
}, []);
|
|
126
|
+
const handleZoomOut = useCallback(() => {
|
|
127
|
+
setZoom(prev => Math.max(0.1, prev / 1.2));
|
|
128
|
+
}, []);
|
|
129
|
+
const handleZoomReset = useCallback(() => {
|
|
130
|
+
setZoom(1);
|
|
131
|
+
}, []);
|
|
132
|
+
const handleFitToView = useCallback(() => {
|
|
133
|
+
if (state.elements.length === 0) {
|
|
134
|
+
setZoom(1);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
138
|
+
state.elements.forEach(el => {
|
|
139
|
+
minX = Math.min(minX, el.position.x);
|
|
140
|
+
minY = Math.min(minY, el.position.y);
|
|
141
|
+
maxX = Math.max(maxX, el.position.x + el.size.width);
|
|
142
|
+
maxY = Math.max(maxY, el.position.y + el.size.height);
|
|
143
|
+
});
|
|
144
|
+
const padding = 50;
|
|
145
|
+
const contentWidth = maxX - minX + padding * 2;
|
|
146
|
+
const contentHeight = maxY - minY + padding * 2;
|
|
147
|
+
const canvasWidth = window.innerWidth * 0.8;
|
|
148
|
+
const canvasHeight = window.innerHeight * 0.8;
|
|
149
|
+
const scaleX = canvasWidth / contentWidth;
|
|
150
|
+
const scaleY = canvasHeight / contentHeight;
|
|
151
|
+
const newZoom = Math.min(scaleX, scaleY, 1);
|
|
152
|
+
setZoom(newZoom);
|
|
153
|
+
}, [state.elements]);
|
|
154
|
+
React.useEffect(() => {
|
|
155
|
+
const handleKeyDown = (e) => {
|
|
156
|
+
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
switch (e.key.toLowerCase()) {
|
|
160
|
+
case 'v':
|
|
161
|
+
setSelectedTool('select');
|
|
162
|
+
break;
|
|
163
|
+
case 'c':
|
|
164
|
+
setSelectedTool('command');
|
|
165
|
+
break;
|
|
166
|
+
case 'e':
|
|
167
|
+
setSelectedTool('event');
|
|
168
|
+
break;
|
|
169
|
+
case 'r':
|
|
170
|
+
setSelectedTool('readmodel');
|
|
171
|
+
break;
|
|
172
|
+
case 'p':
|
|
173
|
+
setSelectedTool('process');
|
|
174
|
+
break;
|
|
175
|
+
case 'delete':
|
|
176
|
+
case 'backspace':
|
|
177
|
+
if (state.selectedElementId) {
|
|
178
|
+
handleDeleteElement(state.selectedElementId);
|
|
179
|
+
}
|
|
180
|
+
else if (state.selectedConnectorId) {
|
|
181
|
+
handleDeleteConnector(state.selectedConnectorId);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case '+':
|
|
185
|
+
case '=':
|
|
186
|
+
handleZoomIn();
|
|
187
|
+
break;
|
|
188
|
+
case '-':
|
|
189
|
+
case '_':
|
|
190
|
+
handleZoomOut();
|
|
191
|
+
break;
|
|
192
|
+
case '0':
|
|
193
|
+
handleZoomReset();
|
|
194
|
+
break;
|
|
195
|
+
case 'f':
|
|
196
|
+
handleFitToView();
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
201
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
202
|
+
}, [state, selectedTool, handleDeleteElement, handleDeleteConnector, handleZoomIn, handleZoomOut, handleZoomReset, handleFitToView]);
|
|
203
|
+
return (jsxs("div", { className: "event-modeling", style: { width, height }, children: [jsx(Toolbox, { selectedTool: selectedTool, onToolSelect: setSelectedTool }), jsx(Canvas, { state: state, selectedTool: selectedTool, zoom: zoom, pan: pan, onZoomChange: handleZoomChange, onPanChange: handlePanChange, onAddElement: handleAddElement, onUpdateElement: handleUpdateElement, onAddConnector: handleAddConnector, onSelectElement: handleSelectElement, onSelectConnector: handleSelectConnector }), jsx(CanvasControls, { zoom: zoom, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onZoomReset: handleZoomReset, onFitToView: handleFitToView })] }));
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
export { EventModeling };
|
|
207
|
+
//# sourceMappingURL=EventModeling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventModeling.js","sources":["../../../EventModeling/EventModeling.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback } from 'react';\nimport { EventModelingState, ElementData, Connector, ElementType, DEFAULT_ELEMENT_SIZE, calculateOptimalEdges } from './types';\nimport { Toolbox } from './components/Toolbox';\nimport { Canvas } from './components/Canvas';\nimport { CanvasControls } from './components/CanvasControls';\nimport './EventModeling.css';\n\nexport interface EventModelingProps {\n initialState?: EventModelingState;\n onStateChange?: (state: EventModelingState) => void;\n width?: string;\n height?: string;\n}\n\nexport const EventModeling: React.FC<EventModelingProps> = ({\n initialState,\n onStateChange,\n width = '100%',\n height = '100vh',\n}) => {\n const [state, setState] = useState<EventModelingState>(\n initialState || {\n elements: [],\n connectors: [],\n }\n );\n\n const [selectedTool, setSelectedTool] = useState<ElementType | 'select'>('select');\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n\n const updateState = useCallback((newState: EventModelingState) => {\n setState(newState);\n onStateChange?.(newState);\n }, [onStateChange]);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoom(newZoom);\n }, []);\n\n const handlePanChange = useCallback((newPan: { x: number; y: number }) => {\n setPan(newPan);\n }, []);\n\n const handleAddElement = useCallback((type: ElementType, x: number, y: number) => {\n console.log('Adding element:', type, 'at', x, y); // Debug log\n const size = DEFAULT_ELEMENT_SIZE[type];\n const newElement: ElementData = {\n id: `${type}-${Date.now()}`,\n type,\n position: { x, y },\n size,\n label: `New ${type.charAt(0).toUpperCase() + type.slice(1)}`,\n };\n\n updateState({\n ...state,\n elements: [...state.elements, newElement],\n });\n\n // Auto-switch back to select tool after adding\n setSelectedTool('select');\n }, [state, updateState]);\n\n const handleUpdateElement = useCallback((id: string, updates: Partial<ElementData>) => {\n const updatedElements = state.elements.map(el =>\n el.id === id ? { ...el, ...updates } : el\n );\n\n // If position changed, update affected connectors to use optimal edges\n let updatedConnectors = state.connectors;\n if (updates.position) {\n updatedConnectors = state.connectors.map(connector => {\n // Check if this connector involves the moved element\n if (connector.from.elementId === id || connector.to.elementId === id) {\n const fromElement = updatedElements.find(el => el.id === connector.from.elementId);\n const toElement = updatedElements.find(el => el.id === connector.to.elementId);\n\n if (fromElement && toElement) {\n const optimalEdges = calculateOptimalEdges(fromElement, toElement);\n return {\n ...connector,\n from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },\n to: { elementId: connector.to.elementId, side: optimalEdges.toSide },\n };\n }\n }\n return connector;\n });\n }\n\n updateState({\n ...state,\n elements: updatedElements,\n connectors: updatedConnectors,\n });\n }, [state, updateState]);\n\n const handleDeleteElement = useCallback((id: string) => {\n updateState({\n ...state,\n elements: state.elements.filter(el => el.id !== id),\n connectors: state.connectors.filter(\n conn => conn.from.elementId !== id && conn.to.elementId !== id\n ),\n selectedElementId: state.selectedElementId === id ? undefined : state.selectedElementId,\n });\n }, [state, updateState]);\n\n const handleAddConnector = useCallback((connector: Connector) => {\n // Prevent connecting element to itself\n if (connector.from.elementId === connector.to.elementId) {\n return;\n }\n\n // Find the elements to calculate optimal edges\n const fromElement = state.elements.find(el => el.id === connector.from.elementId);\n const toElement = state.elements.find(el => el.id === connector.to.elementId);\n\n if (!fromElement || !toElement) {\n return;\n }\n\n // Calculate optimal edges based on positions\n const optimalEdges = calculateOptimalEdges(fromElement, toElement);\n\n // Create connector with optimal edges\n const optimizedConnector: Connector = {\n ...connector,\n from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },\n to: { elementId: connector.to.elementId, side: optimalEdges.toSide },\n };\n\n // Prevent duplicate connectors (checking element IDs only, not sides since we auto-adjust)\n const isDuplicate = state.connectors.some(\n c => c.from.elementId === optimizedConnector.from.elementId &&\n c.to.elementId === optimizedConnector.to.elementId\n );\n\n if (isDuplicate) {\n return;\n }\n\n updateState({\n ...state,\n connectors: [...state.connectors, optimizedConnector],\n });\n }, [state, updateState]);\n\n const handleDeleteConnector = useCallback((id: string) => {\n updateState({\n ...state,\n connectors: state.connectors.filter(conn => conn.id !== id),\n selectedConnectorId: state.selectedConnectorId === id ? undefined : state.selectedConnectorId,\n });\n }, [state, updateState]);\n\n const handleSelectElement = useCallback((id: string | undefined) => {\n updateState({\n ...state,\n selectedElementId: id,\n selectedConnectorId: undefined,\n });\n }, [state, updateState]);\n\n const handleSelectConnector = useCallback((id: string | undefined) => {\n updateState({\n ...state,\n selectedConnectorId: id,\n selectedElementId: undefined,\n });\n }, [state, updateState]);\n\n const handleZoomIn = useCallback(() => {\n setZoom(prev => Math.min(5, prev * 1.2));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom(prev => Math.max(0.1, prev / 1.2));\n }, []);\n\n const handleZoomReset = useCallback(() => {\n setZoom(1);\n }, []);\n\n const handleFitToView = useCallback(() => {\n if (state.elements.length === 0) {\n setZoom(1);\n return;\n }\n\n // Calculate bounding box of all elements\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n state.elements.forEach(el => {\n minX = Math.min(minX, el.position.x);\n minY = Math.min(minY, el.position.y);\n maxX = Math.max(maxX, el.position.x + el.size.width);\n maxY = Math.max(maxY, el.position.y + el.size.height);\n });\n\n const padding = 50;\n const contentWidth = maxX - minX + padding * 2;\n const contentHeight = maxY - minY + padding * 2;\n\n // Get canvas size (approximate)\n const canvasWidth = window.innerWidth * 0.8;\n const canvasHeight = window.innerHeight * 0.8;\n\n const scaleX = canvasWidth / contentWidth;\n const scaleY = canvasHeight / contentHeight;\n const newZoom = Math.min(scaleX, scaleY, 1);\n\n setZoom(newZoom);\n }, [state.elements]);\n\n // Keyboard shortcuts\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n return;\n }\n\n switch (e.key.toLowerCase()) {\n case 'v':\n setSelectedTool('select');\n break;\n case 'c':\n setSelectedTool('command');\n break;\n case 'e':\n setSelectedTool('event');\n break;\n case 'r':\n setSelectedTool('readmodel');\n break;\n case 'p':\n setSelectedTool('process');\n break;\n case 'delete':\n case 'backspace':\n if (state.selectedElementId) {\n handleDeleteElement(state.selectedElementId);\n } else if (state.selectedConnectorId) {\n handleDeleteConnector(state.selectedConnectorId);\n }\n break;\n case '+':\n case '=':\n handleZoomIn();\n break;\n case '-':\n case '_':\n handleZoomOut();\n break;\n case '0':\n handleZoomReset();\n break;\n case 'f':\n handleFitToView();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [state, selectedTool, handleDeleteElement, handleDeleteConnector, handleZoomIn, handleZoomOut, handleZoomReset, handleFitToView]);\n\n return (\n <div className=\"event-modeling\" style={{ width, height }}>\n <Toolbox\n selectedTool={selectedTool}\n onToolSelect={setSelectedTool}\n />\n <Canvas\n state={state}\n selectedTool={selectedTool}\n zoom={zoom}\n pan={pan}\n onZoomChange={handleZoomChange}\n onPanChange={handlePanChange}\n onAddElement={handleAddElement}\n onUpdateElement={handleUpdateElement}\n onAddConnector={handleAddConnector}\n onSelectElement={handleSelectElement}\n onSelectConnector={handleSelectConnector}\n />\n <CanvasControls\n zoom={zoom}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomReset={handleZoomReset}\n onFitToView={handleFitToView}\n />\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { EventModeling } from './EventModeling';
|
|
3
|
+
declare const meta: Meta<typeof EventModeling>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof EventModeling>;
|
|
6
|
+
export declare const Empty: Story;
|
|
7
|
+
export declare const SimpleFlow: Story;
|
|
8
|
+
export declare const ComplexEventModel: Story;
|
|
9
|
+
export declare const WithProcessAutomation: Story;
|
|
10
|
+
//# sourceMappingURL=EventModeling.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventModeling.stories.d.ts","sourceRoot":"","sources":["../../../EventModeling/EventModeling.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAE5C,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA6CxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KA+H/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAsEnC,CAAC"}
|