@finos/legend-extension-dsl-data-space 10.4.172 → 10.4.173

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.
Files changed (31) hide show
  1. package/lib/components/DataSpaceWiki.d.ts.map +1 -1
  2. package/lib/components/DataSpaceWiki.js +22 -2
  3. package/lib/components/DataSpaceWiki.js.map +1 -1
  4. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts +2 -8
  5. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts.map +1 -1
  6. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js +0 -6
  7. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js.map +1 -1
  8. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  9. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js +3 -2
  10. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  11. package/lib/index.css +1 -1
  12. package/lib/package.json +1 -1
  13. package/lib/stores/DataSpaceViewerDiagramViewerState.d.ts +2 -21
  14. package/lib/stores/DataSpaceViewerDiagramViewerState.d.ts.map +1 -1
  15. package/lib/stores/DataSpaceViewerDiagramViewerState.js +3 -114
  16. package/lib/stores/DataSpaceViewerDiagramViewerState.js.map +1 -1
  17. package/lib/stores/DataSpaceViewerNavigation.d.ts +3 -2
  18. package/lib/stores/DataSpaceViewerNavigation.d.ts.map +1 -1
  19. package/lib/stores/DataSpaceViewerNavigation.js.map +1 -1
  20. package/package.json +6 -6
  21. package/src/components/DataSpaceWiki.tsx +40 -2
  22. package/src/graph-manager/action/analytics/DataSpaceAnalysis.ts +2 -9
  23. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.ts +2 -2
  24. package/src/stores/DataSpaceViewerDiagramViewerState.ts +9 -150
  25. package/src/stores/DataSpaceViewerNavigation.ts +3 -5
  26. package/tsconfig.json +0 -1
  27. package/lib/components/DataSpaceDiagramViewer.d.ts +0 -22
  28. package/lib/components/DataSpaceDiagramViewer.d.ts.map +0 -1
  29. package/lib/components/DataSpaceDiagramViewer.js +0 -170
  30. package/lib/components/DataSpaceDiagramViewer.js.map +0 -1
  31. package/src/components/DataSpaceDiagramViewer.tsx +0 -622
@@ -1,622 +0,0 @@
1
- /**
2
- * Copyright (c) 2020-present, Goldman Sachs
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
-
17
- import {
18
- AnchorLinkIcon,
19
- CaretDownIcon,
20
- CenterFocusIcon,
21
- CircleIcon,
22
- CloseIcon,
23
- ContextMenu,
24
- CustomSelectorInput,
25
- DescriptionIcon,
26
- ControlledDropdownMenu,
27
- MenuContent,
28
- MenuContentDivider,
29
- MenuContentItem,
30
- MousePointerIcon,
31
- MoveIcon,
32
- ShapesIcon,
33
- ThinChevronDownIcon,
34
- ThinChevronLeftIcon,
35
- ThinChevronRightIcon,
36
- ThinChevronUpIcon,
37
- ZoomInIcon,
38
- ZoomOutIcon,
39
- clsx,
40
- useResizeDetector,
41
- createFilter,
42
- } from '@finos/legend-art';
43
- import { type DataSpaceViewerState } from '../stores/DataSpaceViewerState.js';
44
- import { observer } from 'mobx-react-lite';
45
- import { forwardRef, useEffect, useRef } from 'react';
46
- import { type Diagram } from '@finos/legend-extension-dsl-diagram/graph';
47
- import {
48
- DIAGRAM_INTERACTION_MODE,
49
- DIAGRAM_RELATIONSHIP_EDIT_MODE,
50
- DIAGRAM_ZOOM_LEVELS,
51
- DiagramRenderer,
52
- } from '@finos/legend-extension-dsl-diagram/application';
53
- import { DataSpaceWikiPlaceholder } from './DataSpacePlaceholder.js';
54
- import { at } from '@finos/legend-shared';
55
- import { DataSpaceMarkdownTextViewer } from './DataSpaceMarkdownTextViewer.js';
56
- import { useCommands } from '@finos/legend-application';
57
- import {
58
- DATA_SPACE_VIEWER_ACTIVITY_MODE,
59
- generateAnchorForActivity,
60
- generateAnchorForDiagram,
61
- } from '../stores/DataSpaceViewerNavigation.js';
62
- import type { DataSpaceDiagramAnalysisResult } from '../graph-manager/action/analytics/DataSpaceAnalysis.js';
63
-
64
- const DataSpaceDiagramCanvas = observer(
65
- forwardRef<
66
- HTMLDivElement,
67
- {
68
- dataSpaceViewerState: DataSpaceViewerState;
69
- diagram: Diagram;
70
- }
71
- >(function DataSpaceDiagramCanvas(props, _ref) {
72
- const { dataSpaceViewerState, diagram } = props;
73
- const diagramViewerState = dataSpaceViewerState.diagramViewerState;
74
- const ref = _ref as React.RefObject<HTMLDivElement>;
75
- const descriptionText = diagramViewerState.currentDiagram?.description;
76
-
77
- const { width, height } = useResizeDetector<HTMLDivElement>({
78
- refreshMode: 'debounce',
79
- refreshRate: 50,
80
- targetRef: ref,
81
- });
82
-
83
- useEffect(() => {
84
- diagramViewerState.setExpandDescription(false);
85
- }, [diagramViewerState, diagramViewerState.currentDiagram]);
86
-
87
- useEffect(() => {
88
- const renderer = new DiagramRenderer(ref.current, diagram);
89
- diagramViewerState.setDiagramRenderer(renderer);
90
- diagramViewerState.setupDiagramRenderer();
91
- renderer.render({ initial: true });
92
- }, [ref, diagramViewerState, diagram]);
93
-
94
- useEffect(() => {
95
- if (diagramViewerState.isDiagramRendererInitialized) {
96
- diagramViewerState.diagramRenderer.refresh();
97
- }
98
- }, [diagramViewerState, width, height]);
99
-
100
- // actions
101
- const queryClass = (): void => {
102
- if (diagramViewerState.contextMenuClassView) {
103
- dataSpaceViewerState.queryClass(
104
- diagramViewerState.contextMenuClassView.class.value,
105
- );
106
- }
107
- };
108
- const viewClassDocumentation = (): void => {
109
- if (
110
- diagramViewerState.contextMenuClassView &&
111
- dataSpaceViewerState.modelsDocumentationState.hasClassDocumentation(
112
- diagramViewerState.contextMenuClassView.class.value.path,
113
- )
114
- ) {
115
- dataSpaceViewerState.modelsDocumentationState.viewClassDocumentation(
116
- diagramViewerState.contextMenuClassView.class.value.path,
117
- );
118
- dataSpaceViewerState.changeZone(
119
- generateAnchorForActivity(
120
- DATA_SPACE_VIEWER_ACTIVITY_MODE.MODELS_DOCUMENTATION,
121
- ),
122
- );
123
- }
124
- };
125
-
126
- return (
127
- <ContextMenu
128
- className="data-space__viewer__diagram-viewer__canvas"
129
- content={
130
- <MenuContent>
131
- <MenuContentItem
132
- onClick={queryClass}
133
- disabled={!diagramViewerState.contextMenuClassView}
134
- >
135
- Query
136
- </MenuContentItem>
137
- <MenuContentItem
138
- onClick={viewClassDocumentation}
139
- disabled={
140
- !diagramViewerState.contextMenuClassView ||
141
- !dataSpaceViewerState.modelsDocumentationState.hasClassDocumentation(
142
- diagramViewerState.contextMenuClassView.class.value.path,
143
- )
144
- }
145
- >
146
- See Model Documentation
147
- </MenuContentItem>
148
- </MenuContent>
149
- }
150
- disabled={!diagramViewerState.contextMenuClassView}
151
- menuProps={{ elevation: 7 }}
152
- onClose={(): void =>
153
- diagramViewerState.setContextMenuClassView(undefined)
154
- }
155
- >
156
- {diagramViewerState.showDescription && (
157
- <div
158
- className={clsx('data-space__viewer__diagram-viewer__description', {
159
- 'data-space__viewer__diagram-viewer__description--expanded':
160
- diagramViewerState.expandDescription,
161
- })}
162
- >
163
- <button
164
- className="data-space__viewer__diagram-viewer__description__close-btn"
165
- tabIndex={-1}
166
- title="Hide Description"
167
- onClick={() => diagramViewerState.setShowDescription(false)}
168
- >
169
- <CloseIcon />
170
- </button>
171
- <div className="data-space__viewer__diagram-viewer__description__title">
172
- {diagramViewerState.currentDiagram?.title
173
- ? diagramViewerState.currentDiagram.title
174
- : 'Untitled'}
175
- </div>
176
- <div className="data-space__viewer__diagram-viewer__description__content">
177
- {descriptionText ? (
178
- <DataSpaceMarkdownTextViewer value={descriptionText} />
179
- ) : (
180
- <div className="data-space__viewer__diagram-viewer__description__content__placeholder">
181
- (not specified)
182
- </div>
183
- )}
184
- </div>
185
- <button
186
- className="data-space__viewer__diagram-viewer__description__expand-btn"
187
- tabIndex={-1}
188
- title={
189
- diagramViewerState.expandDescription ? 'Collapse' : 'Expand'
190
- }
191
- onClick={() =>
192
- diagramViewerState.setExpandDescription(
193
- !diagramViewerState.expandDescription,
194
- )
195
- }
196
- >
197
- {diagramViewerState.expandDescription ? (
198
- <ThinChevronUpIcon />
199
- ) : (
200
- <ThinChevronDownIcon />
201
- )}
202
- </button>
203
- </div>
204
- )}
205
- <div
206
- ref={ref}
207
- className={clsx(
208
- 'diagram-canvas',
209
- diagramViewerState.diagramCursorClass,
210
- )}
211
- tabIndex={0}
212
- />
213
- </ContextMenu>
214
- );
215
- }),
216
- );
217
-
218
- type DiagramOption = {
219
- label: React.ReactNode;
220
- value: DataSpaceDiagramAnalysisResult;
221
- };
222
- const buildDiagramOption = (
223
- diagram: DataSpaceDiagramAnalysisResult,
224
- ): DiagramOption => ({
225
- label: (
226
- <div className="data-space__viewer__diagram-viewer__header__navigation__selector__label">
227
- <ShapesIcon className="data-space__viewer__diagram-viewer__header__navigation__selector__icon" />
228
- <div className="data-space__viewer__diagram-viewer__header__navigation__selector__title">
229
- {diagram.title ? diagram.title : 'Untitled'}
230
- </div>
231
- </div>
232
- ),
233
- value: diagram,
234
- });
235
-
236
- const DataSpaceDiagramViewerHeader = observer(
237
- (props: { dataSpaceViewerState: DataSpaceViewerState }) => {
238
- const { dataSpaceViewerState } = props;
239
- const applicationStore = dataSpaceViewerState.applicationStore;
240
- const diagramViewerState = dataSpaceViewerState.diagramViewerState;
241
- const diagramOptions =
242
- dataSpaceViewerState.dataSpaceAnalysisResult.diagrams.map(
243
- buildDiagramOption,
244
- );
245
- const selectedDiagramOption = diagramViewerState.currentDiagram
246
- ? buildDiagramOption(diagramViewerState.currentDiagram)
247
- : null;
248
- const onDiagramOptionChange = (option: DiagramOption): void => {
249
- if (option.value !== diagramViewerState.currentDiagram) {
250
- diagramViewerState.setCurrentDiagram(option.value);
251
- }
252
- };
253
- const diagramFilterOption = createFilter({
254
- ignoreCase: true,
255
- ignoreAccents: false,
256
- stringify: (option: { data: DiagramOption }) => option.data.value.title,
257
- });
258
- const createModeSwitcher =
259
- (
260
- editMode: DIAGRAM_INTERACTION_MODE,
261
- relationshipMode: DIAGRAM_RELATIONSHIP_EDIT_MODE,
262
- ): (() => void) =>
263
- (): void =>
264
- diagramViewerState.diagramRenderer.changeMode(
265
- editMode,
266
- relationshipMode,
267
- );
268
- const createCenterZoomer =
269
- (zoomLevel: number): (() => void) =>
270
- (): void => {
271
- diagramViewerState.diagramRenderer.zoomCenter(zoomLevel / 100);
272
- };
273
- const zoomToFit = (): void =>
274
- diagramViewerState.diagramRenderer.zoomToFit();
275
-
276
- return (
277
- <div className="data-space__viewer__diagram-viewer__header">
278
- <div className="data-space__viewer__diagram-viewer__header__navigation">
279
- <CustomSelectorInput
280
- className="data-space__viewer__diagram-viewer__header__navigation__selector"
281
- options={diagramOptions}
282
- onChange={onDiagramOptionChange}
283
- value={selectedDiagramOption}
284
- placeholder="Search for a diagram"
285
- darkMode={
286
- !applicationStore.layoutService
287
- .TEMPORARY__isLightColorThemeEnabled
288
- }
289
- filterOption={diagramFilterOption}
290
- />
291
- <div className="data-space__viewer__diagram-viewer__header__navigation__pager">
292
- <input
293
- className="data-space__viewer__diagram-viewer__header__navigation__pager__input input--dark"
294
- value={diagramViewerState.currentDiagramIndex}
295
- type="number"
296
- onChange={(event) => {
297
- const value = parseInt(event.target.value, 10);
298
- if (
299
- isNaN(value) ||
300
- value < 1 ||
301
- value >
302
- dataSpaceViewerState.dataSpaceAnalysisResult.diagrams.length
303
- ) {
304
- return;
305
- }
306
- diagramViewerState.setCurrentDiagram(
307
- at(
308
- dataSpaceViewerState.dataSpaceAnalysisResult.diagrams,
309
- value - 1,
310
- ),
311
- );
312
- }}
313
- />
314
- </div>
315
- <div className="data-space__viewer__diagram-viewer__header__navigation__pager__count">
316
- /{dataSpaceViewerState.dataSpaceAnalysisResult.diagrams.length}
317
- </div>
318
- </div>
319
- <div className="data-space__viewer__diagram-viewer__header__actions">
320
- {diagramViewerState.isDiagramRendererInitialized && (
321
- <>
322
- <div className="data-space__viewer__diagram-viewer__header__group">
323
- <button
324
- className="data-space__viewer__diagram-viewer__header__tool"
325
- tabIndex={-1}
326
- onClick={(): void => {
327
- if (diagramViewerState.currentDiagram) {
328
- dataSpaceViewerState.syncZoneWithNavigation(
329
- generateAnchorForDiagram(
330
- diagramViewerState.currentDiagram,
331
- ),
332
- );
333
- }
334
- }}
335
- title="Copy Link"
336
- >
337
- <AnchorLinkIcon />
338
- </button>
339
- <button
340
- className="data-space__viewer__diagram-viewer__header__tool"
341
- tabIndex={-1}
342
- onClick={() => diagramViewerState.diagramRenderer.recenter()}
343
- title="Recenter (R)"
344
- >
345
- <CenterFocusIcon className="data-space__viewer__diagram-viewer__icon--recenter" />
346
- </button>
347
- <button
348
- className={clsx(
349
- 'data-space__viewer__diagram-viewer__header__tool',
350
- {
351
- 'data-space__viewer__diagram-viewer__header__tool--active':
352
- diagramViewerState.showDescription,
353
- },
354
- )}
355
- tabIndex={-1}
356
- onClick={() =>
357
- diagramViewerState.setShowDescription(
358
- !diagramViewerState.showDescription,
359
- )
360
- }
361
- title="Toggle Description (D)"
362
- >
363
- <DescriptionIcon className="data-space__viewer__diagram-viewer__icon--description" />
364
- </button>
365
- </div>
366
- <div className="data-space__viewer__diagram-viewer__header__group__separator" />
367
- <div className="data-space__viewer__diagram-viewer__header__group">
368
- <button
369
- className={clsx(
370
- 'data-space__viewer__diagram-viewer__header__tool',
371
- {
372
- 'data-space__viewer__diagram-viewer__header__tool--active':
373
- diagramViewerState.diagramRenderer.interactionMode ===
374
- DIAGRAM_INTERACTION_MODE.LAYOUT,
375
- },
376
- )}
377
- tabIndex={-1}
378
- onClick={createModeSwitcher(
379
- DIAGRAM_INTERACTION_MODE.LAYOUT,
380
- DIAGRAM_RELATIONSHIP_EDIT_MODE.NONE,
381
- )}
382
- title="View Tool (V)"
383
- >
384
- <MousePointerIcon className="data-space__viewer__diagram-viewer__icon--layout" />
385
- </button>
386
- <button
387
- className={clsx(
388
- 'data-space__viewer__diagram-viewer__header__tool',
389
- {
390
- 'data-space__viewer__diagram-viewer__header__tool--active':
391
- diagramViewerState.diagramRenderer.interactionMode ===
392
- DIAGRAM_INTERACTION_MODE.PAN,
393
- },
394
- )}
395
- tabIndex={-1}
396
- onClick={createModeSwitcher(
397
- DIAGRAM_INTERACTION_MODE.PAN,
398
- DIAGRAM_RELATIONSHIP_EDIT_MODE.NONE,
399
- )}
400
- title="Pan Tool (M)"
401
- >
402
- <MoveIcon className="data-space__viewer__diagram-viewer__icon--pan" />
403
- </button>
404
- <button
405
- className={clsx(
406
- 'data-space__viewer__diagram-viewer__header__tool',
407
- {
408
- 'data-space__viewer__diagram-viewer__header__tool--active':
409
- diagramViewerState.diagramRenderer.interactionMode ===
410
- DIAGRAM_INTERACTION_MODE.ZOOM_IN,
411
- },
412
- )}
413
- tabIndex={-1}
414
- title="Zoom In (Z)"
415
- onClick={createModeSwitcher(
416
- DIAGRAM_INTERACTION_MODE.ZOOM_IN,
417
- DIAGRAM_RELATIONSHIP_EDIT_MODE.NONE,
418
- )}
419
- >
420
- <ZoomInIcon className="data-space__viewer__diagram-viewer__icon--zoom-in" />
421
- </button>
422
- <button
423
- className={clsx(
424
- 'data-space__viewer__diagram-viewer__header__tool',
425
- {
426
- 'data-space__viewer__diagram-viewer__header__tool--active':
427
- diagramViewerState.diagramRenderer.interactionMode ===
428
- DIAGRAM_INTERACTION_MODE.ZOOM_OUT,
429
- },
430
- )}
431
- tabIndex={-1}
432
- title="Zoom Out (Z)"
433
- onClick={createModeSwitcher(
434
- DIAGRAM_INTERACTION_MODE.ZOOM_OUT,
435
- DIAGRAM_RELATIONSHIP_EDIT_MODE.NONE,
436
- )}
437
- >
438
- <ZoomOutIcon className="data-space__viewer__diagram-viewer__icon--zoom-out" />
439
- </button>
440
- </div>
441
- <div className="data-space__viewer__diagram-viewer__header__group__separator" />
442
- <ControlledDropdownMenu
443
- className="data-space__viewer__diagram-viewer__header__group data-space__viewer__diagram-viewer__header__dropdown"
444
- title="Zoom..."
445
- content={
446
- <MenuContent>
447
- <MenuContentItem
448
- className="data-space__viewer__diagram-viewer__header__zoomer__dropdown__menu__item"
449
- onClick={zoomToFit}
450
- >
451
- Fit
452
- </MenuContentItem>
453
- <MenuContentDivider />
454
- {DIAGRAM_ZOOM_LEVELS.map((zoomLevel) => (
455
- <MenuContentItem
456
- key={zoomLevel}
457
- className="data-space__viewer__diagram-viewer__header__zoomer__dropdown__menu__item"
458
- onClick={createCenterZoomer(zoomLevel)}
459
- >
460
- {zoomLevel}%
461
- </MenuContentItem>
462
- ))}
463
- </MenuContent>
464
- }
465
- menuProps={{
466
- anchorOrigin: { vertical: 'bottom', horizontal: 'right' },
467
- transformOrigin: { vertical: 'top', horizontal: 'right' },
468
- elevation: 7,
469
- }}
470
- >
471
- <div className="data-space__viewer__diagram-viewer__header__dropdown__label data-space__viewer__diagram-viewer__header__zoomer__dropdown__label">
472
- {Math.round(diagramViewerState.diagramRenderer.zoom * 100)}%
473
- </div>
474
- <div className="data-space__viewer__diagram-viewer__header__dropdown__trigger data-space__viewer__diagram-viewer__header__zoomer__dropdown__trigger">
475
- <CaretDownIcon />
476
- </div>
477
- </ControlledDropdownMenu>
478
- </>
479
- )}
480
- </div>
481
- </div>
482
- );
483
- },
484
- );
485
-
486
- export const DataSpaceDiagramViewer = observer(
487
- (props: { dataSpaceViewerState: DataSpaceViewerState }) => {
488
- const { dataSpaceViewerState } = props;
489
- const diagramViewerState = dataSpaceViewerState.diagramViewerState;
490
- const analysisResult = dataSpaceViewerState.dataSpaceAnalysisResult;
491
- const sectionRef = useRef<HTMLDivElement>(null);
492
- const anchor = generateAnchorForActivity(
493
- DATA_SPACE_VIEWER_ACTIVITY_MODE.DIAGRAM_VIEWER,
494
- );
495
-
496
- useCommands(diagramViewerState);
497
-
498
- useEffect(() => {
499
- if (sectionRef.current) {
500
- dataSpaceViewerState.layoutState.setWikiPageAnchor(
501
- anchor,
502
- sectionRef.current,
503
- );
504
- }
505
- return () => dataSpaceViewerState.layoutState.unsetWikiPageAnchor(anchor);
506
- }, [dataSpaceViewerState, anchor]);
507
-
508
- const diagramCanvasRef = useRef<HTMLDivElement>(null);
509
- const previousDiagram = diagramViewerState.previousDiagram;
510
- const nextDiagram = diagramViewerState.nextDiagram;
511
-
512
- const showPreviousDiagram = (): void => {
513
- if (previousDiagram) {
514
- diagramViewerState.setCurrentDiagram(previousDiagram);
515
- dataSpaceViewerState.syncZoneWithNavigation(
516
- generateAnchorForDiagram(previousDiagram),
517
- );
518
- }
519
- };
520
- const showNextDiagram = (): void => {
521
- if (nextDiagram) {
522
- diagramViewerState.setCurrentDiagram(nextDiagram);
523
- dataSpaceViewerState.syncZoneWithNavigation(
524
- generateAnchorForDiagram(nextDiagram),
525
- );
526
- }
527
- };
528
-
529
- return (
530
- <div ref={sectionRef} className="data-space__viewer__wiki__section">
531
- <div className="data-space__viewer__wiki__section__header">
532
- <div className="data-space__viewer__wiki__section__header__label">
533
- Diagrams
534
- <button
535
- className="data-space__viewer__wiki__section__header__anchor"
536
- tabIndex={-1}
537
- onClick={() => dataSpaceViewerState.changeZone(anchor, true)}
538
- >
539
- <AnchorLinkIcon />
540
- </button>
541
- </div>
542
- </div>
543
- <div className="data-space__viewer__wiki__section__content">
544
- {analysisResult.diagrams.length > 0 && (
545
- <div className="data-space__viewer__diagram-viewer">
546
- <DataSpaceDiagramViewerHeader
547
- dataSpaceViewerState={dataSpaceViewerState}
548
- />
549
- <div className="data-space__viewer__diagram-viewer__carousel">
550
- <div className="data-space__viewer__diagram-viewer__carousel__frame">
551
- <div className="data-space__viewer__diagram-viewer__carousel__frame__display">
552
- {diagramViewerState.currentDiagram && (
553
- <DataSpaceDiagramCanvas
554
- dataSpaceViewerState={dataSpaceViewerState}
555
- diagram={diagramViewerState.currentDiagram.diagram}
556
- ref={diagramCanvasRef}
557
- />
558
- )}
559
- </div>
560
- <button
561
- className="data-space__viewer__diagram-viewer__carousel__frame__navigator data-space__viewer__diagram-viewer__carousel__frame__navigator--back"
562
- tabIndex={-1}
563
- title={`Previous - ${
564
- previousDiagram?.title
565
- ? previousDiagram.title
566
- : '(untitled)'
567
- } (⇦)`}
568
- disabled={!previousDiagram}
569
- onClick={showPreviousDiagram}
570
- >
571
- <ThinChevronLeftIcon />
572
- </button>
573
- <button
574
- className="data-space__viewer__diagram-viewer__carousel__frame__navigator data-space__viewer__diagram-viewer__carousel__frame__navigator--next"
575
- tabIndex={-1}
576
- title={`Next - ${
577
- nextDiagram?.title ? nextDiagram.title : '(untitled)'
578
- } (⇨)`}
579
- disabled={!nextDiagram}
580
- onClick={showNextDiagram}
581
- >
582
- <ThinChevronRightIcon />
583
- </button>
584
- <div className="data-space__viewer__diagram-viewer__carousel__frame__indicators">
585
- <div className="data-space__viewer__diagram-viewer__carousel__frame__indicators__notch">
586
- {analysisResult.diagrams.map((diagram) => (
587
- <button
588
- key={diagram.uuid}
589
- className={clsx(
590
- 'data-space__viewer__diagram-viewer__carousel__frame__indicator',
591
- {
592
- 'data-space__viewer__diagram-viewer__carousel__frame__indicator--active':
593
- diagramViewerState.currentDiagram === diagram,
594
- },
595
- )}
596
- title={`View Diagram - ${
597
- diagram.title ? diagram.title : '(untitled)'
598
- }`}
599
- onClick={() => {
600
- diagramViewerState.setCurrentDiagram(diagram);
601
- dataSpaceViewerState.syncZoneWithNavigation(
602
- generateAnchorForDiagram(diagram),
603
- );
604
- }}
605
- >
606
- <CircleIcon />
607
- </button>
608
- ))}
609
- </div>
610
- </div>
611
- </div>
612
- </div>
613
- </div>
614
- )}
615
- {!analysisResult.diagrams.length && (
616
- <DataSpaceWikiPlaceholder message="(not specified)" />
617
- )}
618
- </div>
619
- </div>
620
- );
621
- },
622
- );