Skip to content

Commit 0b01023

Browse files
authored
Merge pull request #48 from chezmoi-sh/feature/improve-storybook-stories
♻️: cleanup & improve components & storybook
2 parents 4685946 + a8b519e commit 0b01023

23 files changed

+463
-484
lines changed

.storybook/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const config: StorybookConfig = {
2222
},
2323

2424
typescript: {
25-
reactDocgen: 'react-docgen-typescript',
25+
reactDocgen: 'react-docgen',
2626
},
2727
};
2828

.trunk/configs/.prettierrc.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ importOrder:
2020
- '^@xyflow/(.*)$'
2121
- '^[./]'
2222
importOrderGroupNamespaceSpecifiers: true
23+
importOrderSeparation: true
2324
importOrderSortSpecifiers: true

.trunk/trunk.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ lint:
2525
2626
2727
28-
28+
2929
- git-diff-check
3030
3131
3232
packages:
3333
- '@trivago/[email protected]'
3434
35-
35+
3636
ignore:
3737
- linters: [ALL]
3838
paths:
3939
- 'examples/**/*.yaml'
40-
- 'examples/**/*.yml'
41-
- 'examples/**/*.yaml.j2'
40+
- linters: [markdownlint]
41+
paths:
42+
- 'src/**/*.mdx'
4243
actions:
4344
disabled:
4445
- trunk-announce

src/components/.storybook/scenarii.ts

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,26 @@
11
import { DirectedGraph } from 'graphology';
2-
import type { ApplicationGraph, ApplicationGraphNode } from '../../types';
2+
3+
import type { ApplicationGraph } from '../../types';
34
import { HealthStatus, SyncStatus } from '../../types/application';
45
import { createOrUpdateApplicationNode, resourceId, updateApplicationSubResources } from '../../utils';
56

67
/**
7-
* ScenarioGraph utilities for Storybook scenarios.
8-
*
9-
* This file provides the ScenarioGraph class, which is used to programmatically construct and manipulate
10-
* ArgoCD Application and ApplicationSet graphs for use in Storybook stories and tests.
11-
*
12-
* The ScenarioGraph class allows you to:
13-
* - Create Application and ApplicationSet nodes
14-
* - Link nodes to represent relationships
15-
* - Retrieve the resulting ApplicationGraph for use in UI components or tests
8+
* ScenarioGraph provides a fluent API to build and manipulate an ApplicationGraph
9+
* for Storybook scenarios and tests. It supports creating Application and ApplicationSet nodes,
10+
* linking them, and retrieving the resulting graph.
1611
*
1712
* Usage:
18-
* const scenario = new ScenarioGraph();
19-
* scenario.createApplication('my-app');
20-
* scenario.createApplicationSet('my-appset');
21-
* scenario.linkApplication(...);
22-
* const graph = scenario.createScenarioGraph();
13+
*
14+
* ```ts
15+
* const scenario = new ScenarioGraph()
16+
* .createApplication(...)
17+
* .createApplicationSet(...)
18+
* .addParentRef(...)
19+
* .createScenarioGraph()
20+
* ```
2321
*
2422
* This is intended for use in Storybook and test environments only.
2523
*/
26-
27-
/**
28-
* ScenarioGraph provides a fluent API to build and manipulate an ApplicationGraph
29-
* for Storybook scenarios and tests. It supports creating Application and ApplicationSet nodes,
30-
* linking them, and retrieving the resulting graph.
31-
*/
3224
export class ScenarioGraph {
3325
private graph: ApplicationGraph;
3426

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
import { action } from '@storybook/addon-actions';
22
import { Meta, StoryObj } from '@storybook/react';
3+
import { expect, within } from '@storybook/test';
4+
35
import { ReactFlowProvider } from '@xyflow/react';
46
import '@xyflow/react/dist/style.css';
57
import React from 'react';
6-
import { allStatusScenario, denseScenario } from './.storybook/scenarii';
7-
import Map, { RankDirection } from './ApplicationMap';
8+
9+
import '../styles/index.scss';
10+
import { HealthStatus, RankDirection, isApplication } from '../types';
11+
import { allStatusScenario, denseScenario as complexTopology } from './.storybook/scenarii';
12+
import Map from './ApplicationMap';
813

914
const meta: Meta<typeof Map> = {
10-
title: 'ApplicationMap/Map',
15+
title: 'Components/Application Map/ApplicationMap',
1116
component: Map,
1217
tags: ['autodocs'],
1318
decorators: [
1419
(Story: any) => (
1520
<div className="argocd-application-map__container">
1621
<ReactFlowProvider>
17-
<div style={{ width: '100vw', height: '60vh', background: '#f8f9fa' }}>
18-
<Story />
19-
</div>
22+
<Story />
2023
</ReactFlowProvider>
2124
</div>
2225
),
@@ -29,9 +32,7 @@ export const Basic: Story = {
2932
args: {
3033
graph: allStatusScenario,
3134
rankdir: RankDirection.LR,
32-
selectedNodes: [],
33-
selectedEdges: [],
34-
onEdgeClick: action('onEdgeClick'),
35+
selectedApplications: [],
3536
onPaneClick: action('onPaneClick'),
3637
onApplicationClick: action('onApplicationClick'),
3738
onApplicationSetClick: action('onApplicationSetClick'),
@@ -40,11 +41,42 @@ export const Basic: Story = {
4041

4142
export const ComplexTopology: Story = {
4243
args: {
43-
graph: denseScenario,
44+
graph: complexTopology,
4445
rankdir: RankDirection.LR,
45-
selectedNodes: [],
46-
selectedEdges: [],
47-
onEdgeClick: action('onEdgeClick'),
46+
selectedApplications: [],
4847
onPaneClick: action('onPaneClick'),
48+
onApplicationClick: action('onApplicationClick'),
49+
onApplicationSetClick: action('onApplicationSetClick'),
50+
},
51+
play: async ({ canvasElement }) => {
52+
const canvas = within(canvasElement);
53+
54+
const root_app_1 = await canvas.findByTestId('rf__node-Application/default/root-app1');
55+
expect(root_app_1.children[0]).toHaveClass('argocd-application-map__node--default');
56+
57+
const root_app_2 = await canvas.findByTestId('rf__node-Application/default/root-app2');
58+
expect(root_app_2.children[0]).toHaveClass('argocd-application-map__node--default');
59+
},
60+
};
61+
62+
export const ComplexTopologyWithSelection: Story = {
63+
args: {
64+
graph: complexTopology,
65+
rankdir: RankDirection.LR,
66+
selectedApplications: complexTopology.filterNodes(
67+
(_, attributes) => isApplication(attributes.data) && attributes.data.status.health === HealthStatus.Degraded
68+
),
69+
onPaneClick: action('onPaneClick'),
70+
onApplicationClick: action('onApplicationClick'),
71+
onApplicationSetClick: action('onApplicationSetClick'),
72+
},
73+
play: async ({ canvasElement }) => {
74+
const canvas = within(canvasElement);
75+
76+
const root_app_1 = await canvas.findByTestId('rf__node-Application/default/root-app1');
77+
expect(root_app_1.children[0]).toHaveClass('argocd-application-map__node--unselected');
78+
79+
const root_app_2 = await canvas.findByTestId('rf__node-Application/default/root-app2');
80+
expect(root_app_2.children[0]).toHaveClass('argocd-application-map__node--selected');
4981
},
5082
};

0 commit comments

Comments
 (0)