@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
package/README.md
CHANGED
|
@@ -1 +1,84 @@
|
|
|
1
1
|
# Cratis Components
|
|
2
|
+
|
|
3
|
+
A collection of React components for building modern applications with Cratis.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
### Minimum Versions
|
|
8
|
+
|
|
9
|
+
- TypeScript: 4.7+
|
|
10
|
+
- React: 18.0+ or 19.0+
|
|
11
|
+
- Node.js: 16+ (for development)
|
|
12
|
+
|
|
13
|
+
### TypeScript Configuration
|
|
14
|
+
|
|
15
|
+
This package is compatible with all modern TypeScript `moduleResolution` strategies:
|
|
16
|
+
|
|
17
|
+
- ✅ `"bundler"` (recommended for Vite, esbuild, webpack 5+)
|
|
18
|
+
- ✅ `"node16"` / `"nodenext"` (for Node.js projects)
|
|
19
|
+
- ✅ `"node"` (legacy, but supported)
|
|
20
|
+
|
|
21
|
+
The package provides dual CommonJS and ES Module builds with proper conditional exports for optimal module resolution and tree-shaking.
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @cratis/components
|
|
27
|
+
# or
|
|
28
|
+
yarn add @cratis/components
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
### Importing Components
|
|
34
|
+
|
|
35
|
+
You can import components using subpath imports for better tree-shaking:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Import specific component modules
|
|
39
|
+
import { TimeMachine } from '@cratis/components/TimeMachine';
|
|
40
|
+
import { DataPage } from '@cratis/components/DataPage';
|
|
41
|
+
import { CommandForm } from '@cratis/components/CommandForm';
|
|
42
|
+
|
|
43
|
+
// Or import from the main entry point
|
|
44
|
+
import { TimeMachine, DataPage } from '@cratis/components';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Available Subpath Exports
|
|
48
|
+
|
|
49
|
+
- `@cratis/components/CommandDialog`
|
|
50
|
+
- `@cratis/components/CommandForm`
|
|
51
|
+
- `@cratis/components/Common`
|
|
52
|
+
- `@cratis/components/DataPage`
|
|
53
|
+
- `@cratis/components/DataTables`
|
|
54
|
+
- `@cratis/components/Dialogs`
|
|
55
|
+
- `@cratis/components/Dropdown`
|
|
56
|
+
- `@cratis/components/EventModeling`
|
|
57
|
+
- `@cratis/components/PivotViewer`
|
|
58
|
+
- `@cratis/components/TimeMachine`
|
|
59
|
+
|
|
60
|
+
## Troubleshooting
|
|
61
|
+
|
|
62
|
+
### Module Resolution Errors
|
|
63
|
+
|
|
64
|
+
If you encounter errors like:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Cannot find module '@cratis/components/TimeMachine' or its corresponding type declarations.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Solution:** Ensure you're using the correct case-sensitive import paths (e.g., `TimeMachine`, not `timeMachine`).
|
|
71
|
+
|
|
72
|
+
If using TypeScript 4.7+, try updating your `tsconfig.json`:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"compilerOptions": {
|
|
77
|
+
"moduleResolution": "bundler" // or "node16" / "nodenext"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Import Errors
|
|
83
|
+
|
|
84
|
+
Ensure you're using the correct import paths. The package uses case-sensitive paths that match the actual component names.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
|
|
6
|
+
class ErrorBoundary extends React.Component {
|
|
7
|
+
state = {
|
|
8
|
+
hasError: false,
|
|
9
|
+
error: new Error(),
|
|
10
|
+
};
|
|
11
|
+
static getDerivedStateFromError(error) {
|
|
12
|
+
return { hasError: true, error: error };
|
|
13
|
+
}
|
|
14
|
+
componentDidCatch(error, errorInfo) {
|
|
15
|
+
console.error('Uncaught error:', error, errorInfo);
|
|
16
|
+
}
|
|
17
|
+
render() {
|
|
18
|
+
if (this.state.hasError) {
|
|
19
|
+
return (jsxRuntime.jsxs("div", { className: 'p-4', children: [jsxRuntime.jsx("h1", { className: 'text-3xl m-3', children: "Error" }), jsxRuntime.jsx("p", { children: this.state.error.message }), jsxRuntime.jsx("p", { children: this.state.error.stack })] }));
|
|
20
|
+
}
|
|
21
|
+
return this.props.children;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.ErrorBoundary = ErrorBoundary;
|
|
26
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":["Component","_jsxs","_jsx"],"mappings":";;;;;AAaM,MAAO,aAAc,SAAQA,eAAuB,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,QACIC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,KAAK,EAAA,QAAA,EAAA,CAChBC,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,OAAA,EAAA,CAAW,EACvCA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAA,CAAK,EACjCA,gCAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAA,CAAK,CAAA,EAAA,CAC7B;QAEd;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;IAC9B;AACH;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
const FormElement = (props) => {
|
|
6
|
+
return (jsxRuntime.jsx("div", { className: "card flex flex-column md:flex-row gap-3", children: jsxRuntime.jsxs("div", { className: "p-inputgroup flex-1", children: [jsxRuntime.jsx("span", { className: "p-inputgroup-addon", children: props.icon }), props.children] }) }));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
exports.FormElement = FormElement;
|
|
10
|
+
//# sourceMappingURL=FormElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yCAAyC,EAAA,QAAA,EACpDC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAChCD,cAAA,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;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ErrorBoundary = require('./ErrorBoundary.js');
|
|
4
|
+
var Page = require('./Page.js');
|
|
5
|
+
var FormElement = require('./FormElement.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.ErrorBoundary = ErrorBoundary.ErrorBoundary;
|
|
10
|
+
exports.Page = Page.Page;
|
|
11
|
+
exports.FormElement = FormElement.FormElement;
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,209 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var types = require('./types.js');
|
|
6
|
+
var Toolbox = require('./components/Toolbox.js');
|
|
7
|
+
var Canvas = require('./components/Canvas.js');
|
|
8
|
+
var CanvasControls = require('./components/CanvasControls.js');
|
|
9
|
+
require('./EventModeling.css');
|
|
10
|
+
|
|
11
|
+
const EventModeling = ({ initialState, onStateChange, width = '100%', height = '100vh', }) => {
|
|
12
|
+
const [state, setState] = React.useState(initialState || {
|
|
13
|
+
elements: [],
|
|
14
|
+
connectors: [],
|
|
15
|
+
});
|
|
16
|
+
const [selectedTool, setSelectedTool] = React.useState('select');
|
|
17
|
+
const [zoom, setZoom] = React.useState(1);
|
|
18
|
+
const [pan, setPan] = React.useState({ x: 0, y: 0 });
|
|
19
|
+
const updateState = React.useCallback((newState) => {
|
|
20
|
+
setState(newState);
|
|
21
|
+
onStateChange?.(newState);
|
|
22
|
+
}, [onStateChange]);
|
|
23
|
+
const handleZoomChange = React.useCallback((newZoom) => {
|
|
24
|
+
setZoom(newZoom);
|
|
25
|
+
}, []);
|
|
26
|
+
const handlePanChange = React.useCallback((newPan) => {
|
|
27
|
+
setPan(newPan);
|
|
28
|
+
}, []);
|
|
29
|
+
const handleAddElement = React.useCallback((type, x, y) => {
|
|
30
|
+
console.log('Adding element:', type, 'at', x, y);
|
|
31
|
+
const size = types.DEFAULT_ELEMENT_SIZE[type];
|
|
32
|
+
const newElement = {
|
|
33
|
+
id: `${type}-${Date.now()}`,
|
|
34
|
+
type,
|
|
35
|
+
position: { x, y },
|
|
36
|
+
size,
|
|
37
|
+
label: `New ${type.charAt(0).toUpperCase() + type.slice(1)}`,
|
|
38
|
+
};
|
|
39
|
+
updateState({
|
|
40
|
+
...state,
|
|
41
|
+
elements: [...state.elements, newElement],
|
|
42
|
+
});
|
|
43
|
+
setSelectedTool('select');
|
|
44
|
+
}, [state, updateState]);
|
|
45
|
+
const handleUpdateElement = React.useCallback((id, updates) => {
|
|
46
|
+
const updatedElements = state.elements.map(el => el.id === id ? { ...el, ...updates } : el);
|
|
47
|
+
let updatedConnectors = state.connectors;
|
|
48
|
+
if (updates.position) {
|
|
49
|
+
updatedConnectors = state.connectors.map(connector => {
|
|
50
|
+
if (connector.from.elementId === id || connector.to.elementId === id) {
|
|
51
|
+
const fromElement = updatedElements.find(el => el.id === connector.from.elementId);
|
|
52
|
+
const toElement = updatedElements.find(el => el.id === connector.to.elementId);
|
|
53
|
+
if (fromElement && toElement) {
|
|
54
|
+
const optimalEdges = types.calculateOptimalEdges(fromElement, toElement);
|
|
55
|
+
return {
|
|
56
|
+
...connector,
|
|
57
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
58
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return connector;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
updateState({
|
|
66
|
+
...state,
|
|
67
|
+
elements: updatedElements,
|
|
68
|
+
connectors: updatedConnectors,
|
|
69
|
+
});
|
|
70
|
+
}, [state, updateState]);
|
|
71
|
+
const handleDeleteElement = React.useCallback((id) => {
|
|
72
|
+
updateState({
|
|
73
|
+
...state,
|
|
74
|
+
elements: state.elements.filter(el => el.id !== id),
|
|
75
|
+
connectors: state.connectors.filter(conn => conn.from.elementId !== id && conn.to.elementId !== id),
|
|
76
|
+
selectedElementId: state.selectedElementId === id ? undefined : state.selectedElementId,
|
|
77
|
+
});
|
|
78
|
+
}, [state, updateState]);
|
|
79
|
+
const handleAddConnector = React.useCallback((connector) => {
|
|
80
|
+
if (connector.from.elementId === connector.to.elementId) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const fromElement = state.elements.find(el => el.id === connector.from.elementId);
|
|
84
|
+
const toElement = state.elements.find(el => el.id === connector.to.elementId);
|
|
85
|
+
if (!fromElement || !toElement) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const optimalEdges = types.calculateOptimalEdges(fromElement, toElement);
|
|
89
|
+
const optimizedConnector = {
|
|
90
|
+
...connector,
|
|
91
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
92
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
93
|
+
};
|
|
94
|
+
const isDuplicate = state.connectors.some(c => c.from.elementId === optimizedConnector.from.elementId &&
|
|
95
|
+
c.to.elementId === optimizedConnector.to.elementId);
|
|
96
|
+
if (isDuplicate) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
updateState({
|
|
100
|
+
...state,
|
|
101
|
+
connectors: [...state.connectors, optimizedConnector],
|
|
102
|
+
});
|
|
103
|
+
}, [state, updateState]);
|
|
104
|
+
const handleDeleteConnector = React.useCallback((id) => {
|
|
105
|
+
updateState({
|
|
106
|
+
...state,
|
|
107
|
+
connectors: state.connectors.filter(conn => conn.id !== id),
|
|
108
|
+
selectedConnectorId: state.selectedConnectorId === id ? undefined : state.selectedConnectorId,
|
|
109
|
+
});
|
|
110
|
+
}, [state, updateState]);
|
|
111
|
+
const handleSelectElement = React.useCallback((id) => {
|
|
112
|
+
updateState({
|
|
113
|
+
...state,
|
|
114
|
+
selectedElementId: id,
|
|
115
|
+
selectedConnectorId: undefined,
|
|
116
|
+
});
|
|
117
|
+
}, [state, updateState]);
|
|
118
|
+
const handleSelectConnector = React.useCallback((id) => {
|
|
119
|
+
updateState({
|
|
120
|
+
...state,
|
|
121
|
+
selectedConnectorId: id,
|
|
122
|
+
selectedElementId: undefined,
|
|
123
|
+
});
|
|
124
|
+
}, [state, updateState]);
|
|
125
|
+
const handleZoomIn = React.useCallback(() => {
|
|
126
|
+
setZoom(prev => Math.min(5, prev * 1.2));
|
|
127
|
+
}, []);
|
|
128
|
+
const handleZoomOut = React.useCallback(() => {
|
|
129
|
+
setZoom(prev => Math.max(0.1, prev / 1.2));
|
|
130
|
+
}, []);
|
|
131
|
+
const handleZoomReset = React.useCallback(() => {
|
|
132
|
+
setZoom(1);
|
|
133
|
+
}, []);
|
|
134
|
+
const handleFitToView = React.useCallback(() => {
|
|
135
|
+
if (state.elements.length === 0) {
|
|
136
|
+
setZoom(1);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
140
|
+
state.elements.forEach(el => {
|
|
141
|
+
minX = Math.min(minX, el.position.x);
|
|
142
|
+
minY = Math.min(minY, el.position.y);
|
|
143
|
+
maxX = Math.max(maxX, el.position.x + el.size.width);
|
|
144
|
+
maxY = Math.max(maxY, el.position.y + el.size.height);
|
|
145
|
+
});
|
|
146
|
+
const padding = 50;
|
|
147
|
+
const contentWidth = maxX - minX + padding * 2;
|
|
148
|
+
const contentHeight = maxY - minY + padding * 2;
|
|
149
|
+
const canvasWidth = window.innerWidth * 0.8;
|
|
150
|
+
const canvasHeight = window.innerHeight * 0.8;
|
|
151
|
+
const scaleX = canvasWidth / contentWidth;
|
|
152
|
+
const scaleY = canvasHeight / contentHeight;
|
|
153
|
+
const newZoom = Math.min(scaleX, scaleY, 1);
|
|
154
|
+
setZoom(newZoom);
|
|
155
|
+
}, [state.elements]);
|
|
156
|
+
React.useEffect(() => {
|
|
157
|
+
const handleKeyDown = (e) => {
|
|
158
|
+
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
switch (e.key.toLowerCase()) {
|
|
162
|
+
case 'v':
|
|
163
|
+
setSelectedTool('select');
|
|
164
|
+
break;
|
|
165
|
+
case 'c':
|
|
166
|
+
setSelectedTool('command');
|
|
167
|
+
break;
|
|
168
|
+
case 'e':
|
|
169
|
+
setSelectedTool('event');
|
|
170
|
+
break;
|
|
171
|
+
case 'r':
|
|
172
|
+
setSelectedTool('readmodel');
|
|
173
|
+
break;
|
|
174
|
+
case 'p':
|
|
175
|
+
setSelectedTool('process');
|
|
176
|
+
break;
|
|
177
|
+
case 'delete':
|
|
178
|
+
case 'backspace':
|
|
179
|
+
if (state.selectedElementId) {
|
|
180
|
+
handleDeleteElement(state.selectedElementId);
|
|
181
|
+
}
|
|
182
|
+
else if (state.selectedConnectorId) {
|
|
183
|
+
handleDeleteConnector(state.selectedConnectorId);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
case '+':
|
|
187
|
+
case '=':
|
|
188
|
+
handleZoomIn();
|
|
189
|
+
break;
|
|
190
|
+
case '-':
|
|
191
|
+
case '_':
|
|
192
|
+
handleZoomOut();
|
|
193
|
+
break;
|
|
194
|
+
case '0':
|
|
195
|
+
handleZoomReset();
|
|
196
|
+
break;
|
|
197
|
+
case 'f':
|
|
198
|
+
handleFitToView();
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
203
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
204
|
+
}, [state, selectedTool, handleDeleteElement, handleDeleteConnector, handleZoomIn, handleZoomOut, handleZoomReset, handleFitToView]);
|
|
205
|
+
return (jsxRuntime.jsxs("div", { className: "event-modeling", style: { width, height }, children: [jsxRuntime.jsx(Toolbox.Toolbox, { selectedTool: selectedTool, onToolSelect: setSelectedTool }), jsxRuntime.jsx(Canvas.Canvas, { state: state, selectedTool: selectedTool, zoom: zoom, pan: pan, onZoomChange: handleZoomChange, onPanChange: handlePanChange, onAddElement: handleAddElement, onUpdateElement: handleUpdateElement, onAddConnector: handleAddConnector, onSelectElement: handleSelectElement, onSelectConnector: handleSelectConnector }), jsxRuntime.jsx(CanvasControls.CanvasControls, { zoom: zoom, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onZoomReset: handleZoomReset, onFitToView: handleFitToView })] }));
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
exports.EventModeling = EventModeling;
|
|
209
|
+
//# 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":["useState","useCallback","DEFAULT_ELEMENT_SIZE","calculateOptimalEdges","_jsxs","_jsx","Toolbox","Canvas","CanvasControls"],"mappings":"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"}
|