@principal-ai/principal-view-react 0.13.19 → 0.13.21
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/dist/components/NodeTooltip.d.ts +4 -1
- package/dist/components/NodeTooltip.d.ts.map +1 -1
- package/dist/components/NodeTooltip.js +20 -13
- package/dist/components/NodeTooltip.js.map +1 -1
- package/dist/nodes/CustomNode.d.ts.map +1 -1
- package/dist/nodes/CustomNode.js +100 -20
- package/dist/nodes/CustomNode.js.map +1 -1
- package/package.json +2 -2
- package/src/components/NodeTooltip.tsx +40 -21
- package/src/nodes/CustomNode.tsx +130 -19
- package/src/stories/DiamondBadges.stories.tsx +629 -0
- package/src/stories/GraphRenderer.stories.tsx +0 -4
- package/src/stories/NodeDefinitionComparison.stories.tsx +2 -4
- package/src/stories/OtelComponents.stories.tsx +1 -4
- package/src/stories/data/graph-converter-test-execution.json +48 -48
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { GraphRenderer } from '../components/GraphRenderer';
|
|
4
|
+
import type { ExtendedCanvas } from '@principal-ai/principal-view-core';
|
|
5
|
+
import { ThemeProvider, defaultEditorTheme } from '@principal-ade/industry-theme';
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Audit/DiamondBadges',
|
|
9
|
+
component: GraphRenderer,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'centered',
|
|
12
|
+
},
|
|
13
|
+
tags: ['autodocs'],
|
|
14
|
+
decorators: [
|
|
15
|
+
(Story) => (
|
|
16
|
+
<ThemeProvider theme={defaultEditorTheme}>
|
|
17
|
+
<Story />
|
|
18
|
+
</ThemeProvider>
|
|
19
|
+
),
|
|
20
|
+
],
|
|
21
|
+
} satisfies Meta<typeof GraphRenderer>;
|
|
22
|
+
|
|
23
|
+
export default meta;
|
|
24
|
+
type Story = StoryObj<typeof meta>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Canvas showing diamond badge positioning at diamond corners
|
|
28
|
+
*/
|
|
29
|
+
const diamondBadgesCanvas: ExtendedCanvas = {
|
|
30
|
+
nodes: [
|
|
31
|
+
// Diamond with status badge (top point)
|
|
32
|
+
{
|
|
33
|
+
id: 'diamond-status',
|
|
34
|
+
type: 'text',
|
|
35
|
+
x: 100,
|
|
36
|
+
y: 100,
|
|
37
|
+
width: 100,
|
|
38
|
+
height: 100,
|
|
39
|
+
text: 'Status',
|
|
40
|
+
color: 2, // orange
|
|
41
|
+
pv: {
|
|
42
|
+
nodeType: 'decision',
|
|
43
|
+
shape: 'diamond',
|
|
44
|
+
icon: 'GitBranch',
|
|
45
|
+
status: 'draft',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
// Diamond with sources badge (right point)
|
|
49
|
+
{
|
|
50
|
+
id: 'diamond-sources',
|
|
51
|
+
type: 'text',
|
|
52
|
+
x: 280,
|
|
53
|
+
y: 100,
|
|
54
|
+
width: 100,
|
|
55
|
+
height: 100,
|
|
56
|
+
text: 'Sources',
|
|
57
|
+
color: 4, // green
|
|
58
|
+
pv: {
|
|
59
|
+
nodeType: 'decision',
|
|
60
|
+
shape: 'diamond',
|
|
61
|
+
icon: 'FileCode',
|
|
62
|
+
sources: ['src/decisions/router.ts'],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
// Diamond with boundary outbound badge (right point)
|
|
66
|
+
{
|
|
67
|
+
id: 'diamond-boundary-out',
|
|
68
|
+
type: 'text',
|
|
69
|
+
x: 460,
|
|
70
|
+
y: 100,
|
|
71
|
+
width: 100,
|
|
72
|
+
height: 100,
|
|
73
|
+
text: 'Out',
|
|
74
|
+
color: 5, // cyan
|
|
75
|
+
pv: {
|
|
76
|
+
nodeType: 'boundary',
|
|
77
|
+
shape: 'diamond',
|
|
78
|
+
icon: 'ArrowUpRight',
|
|
79
|
+
boundary: {
|
|
80
|
+
direction: 'outbound',
|
|
81
|
+
node: { 'pv.event.name': 'external.call' },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
// Diamond with boundary inbound badge (left point)
|
|
86
|
+
{
|
|
87
|
+
id: 'diamond-boundary-in',
|
|
88
|
+
type: 'text',
|
|
89
|
+
x: 640,
|
|
90
|
+
y: 100,
|
|
91
|
+
width: 100,
|
|
92
|
+
height: 100,
|
|
93
|
+
text: 'In',
|
|
94
|
+
color: 5, // cyan
|
|
95
|
+
pv: {
|
|
96
|
+
nodeType: 'boundary',
|
|
97
|
+
shape: 'diamond',
|
|
98
|
+
icon: 'ArrowDownLeft',
|
|
99
|
+
boundary: {
|
|
100
|
+
direction: 'inbound',
|
|
101
|
+
node: { 'pv.event.name': 'webhook.received' },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
// Diamond with both status and sources badges
|
|
106
|
+
{
|
|
107
|
+
id: 'diamond-both',
|
|
108
|
+
type: 'text',
|
|
109
|
+
x: 100,
|
|
110
|
+
y: 280,
|
|
111
|
+
width: 100,
|
|
112
|
+
height: 100,
|
|
113
|
+
text: 'Both',
|
|
114
|
+
color: 6, // purple
|
|
115
|
+
pv: {
|
|
116
|
+
nodeType: 'decision',
|
|
117
|
+
shape: 'diamond',
|
|
118
|
+
icon: 'Layers',
|
|
119
|
+
status: 'approved',
|
|
120
|
+
sources: ['src/core/decision.ts'],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
// Larger diamond with badges
|
|
124
|
+
{
|
|
125
|
+
id: 'diamond-large',
|
|
126
|
+
type: 'text',
|
|
127
|
+
x: 280,
|
|
128
|
+
y: 250,
|
|
129
|
+
width: 150,
|
|
130
|
+
height: 150,
|
|
131
|
+
text: 'Large',
|
|
132
|
+
color: 2,
|
|
133
|
+
pv: {
|
|
134
|
+
nodeType: 'decision',
|
|
135
|
+
shape: 'diamond',
|
|
136
|
+
icon: 'Maximize',
|
|
137
|
+
status: 'implemented',
|
|
138
|
+
sources: ['src/large.ts'],
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
// Small diamond with badges
|
|
142
|
+
{
|
|
143
|
+
id: 'diamond-small',
|
|
144
|
+
type: 'text',
|
|
145
|
+
x: 500,
|
|
146
|
+
y: 290,
|
|
147
|
+
width: 70,
|
|
148
|
+
height: 70,
|
|
149
|
+
text: 'S',
|
|
150
|
+
color: 4,
|
|
151
|
+
pv: {
|
|
152
|
+
nodeType: 'decision',
|
|
153
|
+
shape: 'diamond',
|
|
154
|
+
icon: 'Minimize',
|
|
155
|
+
status: 'draft',
|
|
156
|
+
sources: ['src/small.ts'],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
edges: [],
|
|
161
|
+
pv: {
|
|
162
|
+
version: '1.0.0',
|
|
163
|
+
name: 'Diamond Badge Positioning',
|
|
164
|
+
description: 'Demonstrates badge placement at diamond corners',
|
|
165
|
+
edgeTypes: {},
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
export const BadgePositioning: Story = {
|
|
170
|
+
args: {
|
|
171
|
+
canvas: diamondBadgesCanvas,
|
|
172
|
+
width: 850,
|
|
173
|
+
height: 500,
|
|
174
|
+
},
|
|
175
|
+
parameters: {
|
|
176
|
+
docs: {
|
|
177
|
+
description: {
|
|
178
|
+
story: `
|
|
179
|
+
**Diamond Badge Positioning**
|
|
180
|
+
|
|
181
|
+
Badges on diamond shapes are positioned at the actual diamond corners (points), not at the rectangular bounding box corners:
|
|
182
|
+
|
|
183
|
+
- **Status badge** (D/A/I): Positioned at the **LEFT point** of the diamond
|
|
184
|
+
- **Sources badge** (S): Positioned at the **RIGHT point** of the diamond
|
|
185
|
+
- **Boundary outbound** (↗): Positioned at the **RIGHT point**
|
|
186
|
+
- **Boundary inbound** (↙): Positioned at the **LEFT point**
|
|
187
|
+
|
|
188
|
+
This ensures badges sit directly on the visible shape rather than floating in empty space.
|
|
189
|
+
|
|
190
|
+
**Row 1**: Individual badge types
|
|
191
|
+
**Row 2**: Combined badges and size variations
|
|
192
|
+
`,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Compare badge positioning across all shapes
|
|
200
|
+
*/
|
|
201
|
+
const shapeComparisonCanvas: ExtendedCanvas = {
|
|
202
|
+
nodes: [
|
|
203
|
+
// Rectangle with badges
|
|
204
|
+
{
|
|
205
|
+
id: 'rect-badges',
|
|
206
|
+
type: 'text',
|
|
207
|
+
x: 100,
|
|
208
|
+
y: 100,
|
|
209
|
+
width: 120,
|
|
210
|
+
height: 80,
|
|
211
|
+
text: 'Rectangle',
|
|
212
|
+
color: 6,
|
|
213
|
+
pv: {
|
|
214
|
+
nodeType: 'event',
|
|
215
|
+
shape: 'rectangle',
|
|
216
|
+
icon: 'Square',
|
|
217
|
+
status: 'draft',
|
|
218
|
+
sources: ['src/rect.ts'],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
// Circle with badges
|
|
222
|
+
{
|
|
223
|
+
id: 'circle-badges',
|
|
224
|
+
type: 'text',
|
|
225
|
+
x: 280,
|
|
226
|
+
y: 100,
|
|
227
|
+
width: 100,
|
|
228
|
+
height: 100,
|
|
229
|
+
text: 'Circle',
|
|
230
|
+
color: 5,
|
|
231
|
+
pv: {
|
|
232
|
+
nodeType: 'event',
|
|
233
|
+
shape: 'circle',
|
|
234
|
+
icon: 'Circle',
|
|
235
|
+
status: 'approved',
|
|
236
|
+
sources: ['src/circle.ts'],
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
// Hexagon with badges
|
|
240
|
+
{
|
|
241
|
+
id: 'hex-badges',
|
|
242
|
+
type: 'text',
|
|
243
|
+
x: 440,
|
|
244
|
+
y: 100,
|
|
245
|
+
width: 120,
|
|
246
|
+
height: 100,
|
|
247
|
+
text: 'Hexagon',
|
|
248
|
+
color: 4,
|
|
249
|
+
pv: {
|
|
250
|
+
nodeType: 'event',
|
|
251
|
+
shape: 'hexagon',
|
|
252
|
+
icon: 'Hexagon',
|
|
253
|
+
status: 'implemented',
|
|
254
|
+
sources: ['src/hex.ts'],
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
// Diamond with badges
|
|
258
|
+
{
|
|
259
|
+
id: 'diamond-badges',
|
|
260
|
+
type: 'text',
|
|
261
|
+
x: 620,
|
|
262
|
+
y: 100,
|
|
263
|
+
width: 100,
|
|
264
|
+
height: 100,
|
|
265
|
+
text: 'Diamond',
|
|
266
|
+
color: 2,
|
|
267
|
+
pv: {
|
|
268
|
+
nodeType: 'event',
|
|
269
|
+
shape: 'diamond',
|
|
270
|
+
icon: 'Diamond',
|
|
271
|
+
status: 'draft',
|
|
272
|
+
sources: ['src/diamond.ts'],
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
edges: [],
|
|
277
|
+
pv: {
|
|
278
|
+
version: '1.0.0',
|
|
279
|
+
name: 'Shape Badge Comparison',
|
|
280
|
+
description: 'Compare badge positioning across all shapes',
|
|
281
|
+
edgeTypes: {},
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
export const ShapeComparison: Story = {
|
|
286
|
+
args: {
|
|
287
|
+
canvas: shapeComparisonCanvas,
|
|
288
|
+
width: 850,
|
|
289
|
+
height: 300,
|
|
290
|
+
},
|
|
291
|
+
parameters: {
|
|
292
|
+
docs: {
|
|
293
|
+
description: {
|
|
294
|
+
story: `
|
|
295
|
+
**Badge Positioning Across Shapes**
|
|
296
|
+
|
|
297
|
+
Compare how badges are positioned on different shapes:
|
|
298
|
+
|
|
299
|
+
- **Rectangle**: Badges at top-left and top-right corners of the bounding box
|
|
300
|
+
- **Circle**: Badges at top-left and top-right corners of the bounding box
|
|
301
|
+
- **Hexagon**: Badges at top-left and top-right corners of the bounding box
|
|
302
|
+
- **Diamond**: Badges at the LEFT point (status) and RIGHT point (sources) of the diamond shape
|
|
303
|
+
|
|
304
|
+
The diamond positioning ensures badges appear on the visible shape rather than floating in the empty corners of the bounding box.
|
|
305
|
+
`,
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Diamond boundary nodes in workflow
|
|
313
|
+
*/
|
|
314
|
+
const diamondWorkflowCanvas: ExtendedCanvas = {
|
|
315
|
+
nodes: [
|
|
316
|
+
{
|
|
317
|
+
id: 'start',
|
|
318
|
+
type: 'text',
|
|
319
|
+
x: 100,
|
|
320
|
+
y: 150,
|
|
321
|
+
width: 100,
|
|
322
|
+
height: 60,
|
|
323
|
+
text: 'Request',
|
|
324
|
+
color: 4,
|
|
325
|
+
pv: {
|
|
326
|
+
nodeType: 'event',
|
|
327
|
+
shape: 'rectangle',
|
|
328
|
+
icon: 'Play',
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
id: 'decision',
|
|
333
|
+
type: 'text',
|
|
334
|
+
x: 280,
|
|
335
|
+
y: 130,
|
|
336
|
+
width: 100,
|
|
337
|
+
height: 100,
|
|
338
|
+
text: 'Route?',
|
|
339
|
+
color: 2,
|
|
340
|
+
pv: {
|
|
341
|
+
nodeType: 'decision',
|
|
342
|
+
shape: 'diamond',
|
|
343
|
+
icon: 'GitBranch',
|
|
344
|
+
status: 'implemented',
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
id: 'external-call',
|
|
349
|
+
type: 'text',
|
|
350
|
+
x: 460,
|
|
351
|
+
y: 50,
|
|
352
|
+
width: 100,
|
|
353
|
+
height: 100,
|
|
354
|
+
text: 'API',
|
|
355
|
+
color: 5,
|
|
356
|
+
pv: {
|
|
357
|
+
nodeType: 'boundary',
|
|
358
|
+
shape: 'diamond',
|
|
359
|
+
icon: 'Cloud',
|
|
360
|
+
boundary: {
|
|
361
|
+
direction: 'outbound',
|
|
362
|
+
node: { 'pv.event.name': 'api.call' },
|
|
363
|
+
},
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
id: 'internal',
|
|
368
|
+
type: 'text',
|
|
369
|
+
x: 460,
|
|
370
|
+
y: 200,
|
|
371
|
+
width: 100,
|
|
372
|
+
height: 60,
|
|
373
|
+
text: 'Cache',
|
|
374
|
+
color: 4,
|
|
375
|
+
pv: {
|
|
376
|
+
nodeType: 'event',
|
|
377
|
+
shape: 'rectangle',
|
|
378
|
+
icon: 'Database',
|
|
379
|
+
sources: ['src/cache.ts'],
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
id: 'end',
|
|
384
|
+
type: 'text',
|
|
385
|
+
x: 640,
|
|
386
|
+
y: 130,
|
|
387
|
+
width: 100,
|
|
388
|
+
height: 100,
|
|
389
|
+
text: 'Done',
|
|
390
|
+
color: 4,
|
|
391
|
+
pv: {
|
|
392
|
+
nodeType: 'decision',
|
|
393
|
+
shape: 'diamond',
|
|
394
|
+
icon: 'CheckCircle',
|
|
395
|
+
status: 'approved',
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
edges: [
|
|
400
|
+
{ id: 'e1', fromNode: 'start', toNode: 'decision', fromSide: 'right', toSide: 'left' },
|
|
401
|
+
{ id: 'e2', fromNode: 'decision', toNode: 'external-call', fromSide: 'top', toSide: 'left' },
|
|
402
|
+
{ id: 'e3', fromNode: 'decision', toNode: 'internal', fromSide: 'bottom', toSide: 'left' },
|
|
403
|
+
{ id: 'e4', fromNode: 'external-call', toNode: 'end', fromSide: 'right', toSide: 'top' },
|
|
404
|
+
{ id: 'e5', fromNode: 'internal', toNode: 'end', fromSide: 'right', toSide: 'bottom' },
|
|
405
|
+
],
|
|
406
|
+
pv: {
|
|
407
|
+
version: '1.0.0',
|
|
408
|
+
name: 'Diamond Workflow',
|
|
409
|
+
description: 'Workflow with diamond decision and boundary nodes',
|
|
410
|
+
edgeTypes: {
|
|
411
|
+
default: {
|
|
412
|
+
style: 'solid',
|
|
413
|
+
color: '#888',
|
|
414
|
+
directed: true,
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
export const WorkflowWithDiamonds: Story = {
|
|
421
|
+
args: {
|
|
422
|
+
canvas: diamondWorkflowCanvas,
|
|
423
|
+
width: 850,
|
|
424
|
+
height: 400,
|
|
425
|
+
},
|
|
426
|
+
parameters: {
|
|
427
|
+
docs: {
|
|
428
|
+
description: {
|
|
429
|
+
story: `
|
|
430
|
+
**Diamond Nodes in Workflow Context**
|
|
431
|
+
|
|
432
|
+
Shows diamond-shaped decision and boundary nodes in a realistic workflow:
|
|
433
|
+
|
|
434
|
+
1. **Request** starts the flow
|
|
435
|
+
2. **Route?** diamond decision point with status badge at left point
|
|
436
|
+
3. **API** diamond boundary node with outbound badge at right point
|
|
437
|
+
4. **Cache** rectangle for internal operation
|
|
438
|
+
5. **Done** diamond with status badge at left point
|
|
439
|
+
|
|
440
|
+
The badges on diamond nodes are positioned at the actual points of the diamond shape.
|
|
441
|
+
`,
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Canvas demonstrating the new files (S) and references (R) badges
|
|
449
|
+
*/
|
|
450
|
+
const filesAndReferencesCanvas: ExtendedCanvas = {
|
|
451
|
+
nodes: [
|
|
452
|
+
// Node with otel.files only (S badge)
|
|
453
|
+
{
|
|
454
|
+
id: 'files-only',
|
|
455
|
+
type: 'text',
|
|
456
|
+
x: 100,
|
|
457
|
+
y: 100,
|
|
458
|
+
width: 140,
|
|
459
|
+
height: 80,
|
|
460
|
+
text: 'Files Only',
|
|
461
|
+
color: 4, // green
|
|
462
|
+
pv: {
|
|
463
|
+
nodeType: 'event',
|
|
464
|
+
shape: 'rectangle',
|
|
465
|
+
icon: 'FileCode',
|
|
466
|
+
otel: {
|
|
467
|
+
kind: 'type',
|
|
468
|
+
files: ['src/auth/login.ts', 'src/auth/logout.ts'],
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
// Node with references only (R badge)
|
|
473
|
+
{
|
|
474
|
+
id: 'refs-only',
|
|
475
|
+
type: 'text',
|
|
476
|
+
x: 300,
|
|
477
|
+
y: 100,
|
|
478
|
+
width: 140,
|
|
479
|
+
height: 80,
|
|
480
|
+
text: 'Refs Only',
|
|
481
|
+
color: 6, // purple
|
|
482
|
+
pv: {
|
|
483
|
+
nodeType: 'event',
|
|
484
|
+
shape: 'rectangle',
|
|
485
|
+
icon: 'ExternalLink',
|
|
486
|
+
references: ['@opentelemetry/api', 'https://opentelemetry.io/docs'],
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
// Node with both files and references (S + R badges)
|
|
490
|
+
{
|
|
491
|
+
id: 'both-badges',
|
|
492
|
+
type: 'text',
|
|
493
|
+
x: 500,
|
|
494
|
+
y: 100,
|
|
495
|
+
width: 140,
|
|
496
|
+
height: 80,
|
|
497
|
+
text: 'Both Badges',
|
|
498
|
+
color: 2, // orange
|
|
499
|
+
pv: {
|
|
500
|
+
nodeType: 'event',
|
|
501
|
+
shape: 'rectangle',
|
|
502
|
+
icon: 'Layers',
|
|
503
|
+
otel: {
|
|
504
|
+
kind: 'service',
|
|
505
|
+
files: ['src/api/handler.ts'],
|
|
506
|
+
},
|
|
507
|
+
references: ['@principal-ai/core'],
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
// Diamond with files
|
|
511
|
+
{
|
|
512
|
+
id: 'diamond-files',
|
|
513
|
+
type: 'text',
|
|
514
|
+
x: 100,
|
|
515
|
+
y: 250,
|
|
516
|
+
width: 100,
|
|
517
|
+
height: 100,
|
|
518
|
+
text: 'Files',
|
|
519
|
+
color: 4,
|
|
520
|
+
pv: {
|
|
521
|
+
nodeType: 'decision',
|
|
522
|
+
shape: 'diamond',
|
|
523
|
+
icon: 'FileCode',
|
|
524
|
+
otel: {
|
|
525
|
+
kind: 'type',
|
|
526
|
+
files: ['src/router.ts'],
|
|
527
|
+
},
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
// Diamond with references
|
|
531
|
+
{
|
|
532
|
+
id: 'diamond-refs',
|
|
533
|
+
type: 'text',
|
|
534
|
+
x: 280,
|
|
535
|
+
y: 250,
|
|
536
|
+
width: 100,
|
|
537
|
+
height: 100,
|
|
538
|
+
text: 'Refs',
|
|
539
|
+
color: 6,
|
|
540
|
+
pv: {
|
|
541
|
+
nodeType: 'decision',
|
|
542
|
+
shape: 'diamond',
|
|
543
|
+
icon: 'ExternalLink',
|
|
544
|
+
references: ['https://docs.example.com'],
|
|
545
|
+
},
|
|
546
|
+
},
|
|
547
|
+
// Diamond with both
|
|
548
|
+
{
|
|
549
|
+
id: 'diamond-both',
|
|
550
|
+
type: 'text',
|
|
551
|
+
x: 460,
|
|
552
|
+
y: 250,
|
|
553
|
+
width: 100,
|
|
554
|
+
height: 100,
|
|
555
|
+
text: 'Both',
|
|
556
|
+
color: 2,
|
|
557
|
+
pv: {
|
|
558
|
+
nodeType: 'decision',
|
|
559
|
+
shape: 'diamond',
|
|
560
|
+
icon: 'Layers',
|
|
561
|
+
otel: {
|
|
562
|
+
kind: 'instance',
|
|
563
|
+
files: ['src/decision.ts'],
|
|
564
|
+
},
|
|
565
|
+
references: ['@some/package'],
|
|
566
|
+
},
|
|
567
|
+
},
|
|
568
|
+
// Circle with both badges
|
|
569
|
+
{
|
|
570
|
+
id: 'circle-both',
|
|
571
|
+
type: 'text',
|
|
572
|
+
x: 640,
|
|
573
|
+
y: 250,
|
|
574
|
+
width: 100,
|
|
575
|
+
height: 100,
|
|
576
|
+
text: 'Circle',
|
|
577
|
+
color: 5,
|
|
578
|
+
pv: {
|
|
579
|
+
nodeType: 'event',
|
|
580
|
+
shape: 'circle',
|
|
581
|
+
icon: 'Circle',
|
|
582
|
+
otel: {
|
|
583
|
+
kind: 'service',
|
|
584
|
+
files: ['src/service.ts'],
|
|
585
|
+
},
|
|
586
|
+
references: ['https://api.docs.com'],
|
|
587
|
+
},
|
|
588
|
+
},
|
|
589
|
+
],
|
|
590
|
+
edges: [],
|
|
591
|
+
pv: {
|
|
592
|
+
version: '1.0.0',
|
|
593
|
+
name: 'Files and References Badges',
|
|
594
|
+
description: 'Demonstrates otel.files (S) and references (R) badges',
|
|
595
|
+
edgeTypes: {},
|
|
596
|
+
},
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
export const FilesAndReferences: Story = {
|
|
600
|
+
args: {
|
|
601
|
+
canvas: filesAndReferencesCanvas,
|
|
602
|
+
width: 850,
|
|
603
|
+
height: 450,
|
|
604
|
+
},
|
|
605
|
+
parameters: {
|
|
606
|
+
docs: {
|
|
607
|
+
description: {
|
|
608
|
+
story: `
|
|
609
|
+
**Files (S) and References (R) Badges**
|
|
610
|
+
|
|
611
|
+
Two types of badges indicate different metadata:
|
|
612
|
+
|
|
613
|
+
- **S badge** (green): Shows source files where the event is instrumented (\`pv.otel.files\`)
|
|
614
|
+
- **R badge** (purple): Shows external references like packages or documentation (\`pv.references\`)
|
|
615
|
+
|
|
616
|
+
**Row 1 - Rectangles:**
|
|
617
|
+
- Files Only: Has \`otel.files\` → shows S badge
|
|
618
|
+
- Refs Only: Has \`references\` → shows R badge
|
|
619
|
+
- Both Badges: Has both → shows S and R badges side by side
|
|
620
|
+
|
|
621
|
+
**Row 2 - Other Shapes:**
|
|
622
|
+
- Diamond, Circle shapes with various badge combinations
|
|
623
|
+
|
|
624
|
+
Hover over nodes to see the full file paths and reference URLs in the tooltip.
|
|
625
|
+
`,
|
|
626
|
+
},
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
};
|
|
@@ -676,7 +676,6 @@ const otelLogAssociationCanvas: ExtendedCanvas = {
|
|
|
676
676
|
otel: {
|
|
677
677
|
kind: 'type',
|
|
678
678
|
category: 'log',
|
|
679
|
-
isNew: true,
|
|
680
679
|
},
|
|
681
680
|
shape: 'rectangle',
|
|
682
681
|
icon: 'FileText',
|
|
@@ -737,7 +736,6 @@ const otelLogAssociationCanvas: ExtendedCanvas = {
|
|
|
737
736
|
otel: {
|
|
738
737
|
kind: 'service',
|
|
739
738
|
category: 'router',
|
|
740
|
-
isNew: true,
|
|
741
739
|
},
|
|
742
740
|
shape: 'hexagon',
|
|
743
741
|
icon: 'GitBranch',
|
|
@@ -861,7 +859,6 @@ const otelLogAssociationCanvas: ExtendedCanvas = {
|
|
|
861
859
|
otel: {
|
|
862
860
|
kind: 'service',
|
|
863
861
|
category: 'collector',
|
|
864
|
-
isNew: true,
|
|
865
862
|
},
|
|
866
863
|
shape: 'hexagon',
|
|
867
864
|
icon: 'BarChart2',
|
|
@@ -884,7 +881,6 @@ const otelLogAssociationCanvas: ExtendedCanvas = {
|
|
|
884
881
|
otel: {
|
|
885
882
|
kind: 'type',
|
|
886
883
|
category: 'audit',
|
|
887
|
-
isNew: true,
|
|
888
884
|
},
|
|
889
885
|
shape: 'rectangle',
|
|
890
886
|
icon: 'AlertTriangle',
|
|
@@ -149,8 +149,7 @@ export const BasicOtelEventNode: Story = {
|
|
|
149
149
|
icon: "Play",
|
|
150
150
|
otel: {
|
|
151
151
|
kind: "event",
|
|
152
|
-
category: "lifecycle"
|
|
153
|
-
isNew: true
|
|
152
|
+
category: "lifecycle"
|
|
154
153
|
},
|
|
155
154
|
event: {
|
|
156
155
|
name: "analysis.started",
|
|
@@ -343,8 +342,7 @@ export const NodeWithStateAndViolations: Story = {
|
|
|
343
342
|
icon: "XCircle",
|
|
344
343
|
otel: {
|
|
345
344
|
kind: "event",
|
|
346
|
-
category: "error"
|
|
347
|
-
isNew: false
|
|
345
|
+
category: "error"
|
|
348
346
|
},
|
|
349
347
|
event: {
|
|
350
348
|
name: "validation.error",
|
|
@@ -37,7 +37,6 @@ interface OtelLog {
|
|
|
37
37
|
otel: {
|
|
38
38
|
kind: 'type',
|
|
39
39
|
category: 'log',
|
|
40
|
-
isNew: true,
|
|
41
40
|
},
|
|
42
41
|
shape: 'rectangle',
|
|
43
42
|
icon: 'FileText',
|
|
@@ -69,7 +68,6 @@ Routes incoming OTEL logs to canvas nodes based on matching criteria.
|
|
|
69
68
|
otel: {
|
|
70
69
|
kind: 'service',
|
|
71
70
|
category: 'router',
|
|
72
|
-
isNew: true,
|
|
73
71
|
},
|
|
74
72
|
shape: 'hexagon',
|
|
75
73
|
icon: 'GitBranch',
|
|
@@ -92,7 +90,6 @@ Routes incoming OTEL logs to canvas nodes based on matching criteria.
|
|
|
92
90
|
otel: {
|
|
93
91
|
kind: 'type',
|
|
94
92
|
category: 'audit',
|
|
95
|
-
isNew: true,
|
|
96
93
|
},
|
|
97
94
|
shape: 'rectangle',
|
|
98
95
|
icon: 'AlertTriangle',
|
|
@@ -210,7 +207,7 @@ export const TooltipVariants: StoryObj = {
|
|
|
210
207
|
</div>
|
|
211
208
|
<NodeTooltip
|
|
212
209
|
description="OpenTelemetry log record with timestamp, severity, body"
|
|
213
|
-
otel={{ kind: 'type', category: 'log'
|
|
210
|
+
otel={{ kind: 'type', category: 'log' }}
|
|
214
211
|
visible={true}
|
|
215
212
|
/>
|
|
216
213
|
</div>
|