Skip to content

Commit 14ee2b5

Browse files
authored
docs(Tokenizer): add story (SAP#6565)
1 parent 6aef779 commit 14ee2b5

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { ControlsWithNote, DocsHeader, Footer, ArgTypesWithNote } from '@sb/components';
2+
import { Canvas, Description, Markdown, Meta } from '@storybook/blocks';
3+
import * as ComponentStories from './Tokenizer.stories';
4+
import { Token } from '../Token/index.tsx';
5+
import SubcomponentsSection from '@sb/docs/SubcomponentsSection.md?raw';
6+
7+
<Meta of={ComponentStories} />
8+
9+
[//]: # 'todo: check why subcomponents are not displayed via CEM'
10+
11+
<DocsHeader subComponents={['Token']} />
12+
13+
<br />
14+
15+
## Example
16+
17+
<Canvas of={ComponentStories.Default} />
18+
19+
## Properties
20+
21+
<ControlsWithNote of={ComponentStories.Default} />
22+
23+
## More examples
24+
25+
## Tokenizer with selection & delete logic
26+
27+
<Canvas of={ComponentStories.WithLogic} />
28+
29+
<details>
30+
31+
<summary>Show Code</summary>
32+
33+
```tsx
34+
function TokenizerComponent(props) {
35+
const [countries, setCountries] = useState([
36+
'Andorra',
37+
'Bulgaria',
38+
'Canada',
39+
'Denmark',
40+
'Estonia',
41+
'Fiji',
42+
'Ghana',
43+
'India',
44+
'Japan',
45+
'Kenya',
46+
'Luxembourg',
47+
'Mexico',
48+
'Nepal',
49+
'Qatar',
50+
'Uganda'
51+
]);
52+
const [selectedCountries, setSelectedCountries] = useState<string[]>([]);
53+
const handleTokenDelete: TokenizerPropTypes['onTokenDelete'] = (e) => {
54+
const { tokens } = e.detail;
55+
if (tokens) {
56+
const tokensToDelete = tokens.map((token) => token.text);
57+
setCountries((prev) => prev.filter((country) => !tokensToDelete.includes(country)));
58+
setSelectedCountries([]);
59+
}
60+
};
61+
const handleSelectionChange: TokenizerPropTypes['onSelectionChange'] = (e) => {
62+
const { tokens } = e.detail;
63+
if (tokens) {
64+
const selectedTokens = tokens.map((token) => token.text);
65+
setSelectedCountries(selectedTokens);
66+
}
67+
};
68+
return (
69+
<>
70+
<Tokenizer {...props} onTokenDelete={handleTokenDelete} onSelectionChange={handleSelectionChange}>
71+
{countries.map((country) => (
72+
<Token key={country} text={country} />
73+
))}
74+
</Tokenizer>
75+
<br />
76+
<div style={{ display: 'flex', gap: '0.2rem' }}>
77+
<Label showColon>Selected countries</Label>
78+
<Text>{selectedCountries.join(', ')}</Text>
79+
</div>
80+
</>
81+
);
82+
}
83+
```
84+
85+
</details>
86+
87+
<Markdown>{SubcomponentsSection}</Markdown>
88+
89+
## Token
90+
91+
<Description of={Token} />
92+
<ArgTypesWithNote of={Token} />
93+
94+
<Footer />
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import type { Meta, StoryObj } from '@storybook/react';
2+
import { useState } from 'react';
3+
import { Label } from '../Label/index.js';
4+
import { Text } from '../Text/index.js';
5+
import { Token } from '../Token/index.js';
6+
import type { TokenizerPropTypes } from './index.js';
7+
import { Tokenizer } from './index.js';
8+
9+
const meta = {
10+
title: 'Inputs / Tokenizer',
11+
component: Tokenizer,
12+
args: { style: { width: '250px' } },
13+
tags: ['package:@ui5/webcomponents']
14+
} satisfies Meta<typeof Tokenizer>;
15+
16+
export default meta;
17+
type Story = StoryObj<typeof meta>;
18+
19+
export const Default: Story = {
20+
render(args) {
21+
return (
22+
<Tokenizer {...args}>
23+
<Token text="Andorra" />
24+
<Token text="Bulgaria" />
25+
<Token text="Canada" />
26+
<Token text="Denmark" />
27+
<Token text="Estonia" />
28+
<Token text="Fiji" />
29+
<Token text="Ghana" />
30+
<Token text="India" />
31+
<Token text="Japan" />
32+
<Token text="Kenya" />
33+
<Token text="Luxembourg" />
34+
<Token text="Mexico" />
35+
<Token text="Nepal" />
36+
<Token text="Qatar" />
37+
<Token text="Uganda" />
38+
</Tokenizer>
39+
);
40+
}
41+
};
42+
43+
export const WithLogic = {
44+
render(args) {
45+
const [countries, setCountries] = useState([
46+
'Andorra',
47+
'Bulgaria',
48+
'Canada',
49+
'Denmark',
50+
'Estonia',
51+
'Fiji',
52+
'Ghana',
53+
'India',
54+
'Japan',
55+
'Kenya',
56+
'Luxembourg',
57+
'Mexico',
58+
'Nepal',
59+
'Qatar',
60+
'Uganda'
61+
]);
62+
const [selectedCountries, setSelectedCountries] = useState<string[]>([]);
63+
const handleTokenDelete: TokenizerPropTypes['onTokenDelete'] = (e) => {
64+
args.onTokenDelete(e);
65+
const { tokens } = e.detail;
66+
if (tokens) {
67+
const tokensToDelete = tokens.map((token) => token.text);
68+
setCountries((prev) => prev.filter((country) => !tokensToDelete.includes(country)));
69+
setSelectedCountries([]);
70+
}
71+
};
72+
const handleSelectionChange: TokenizerPropTypes['onSelectionChange'] = (e) => {
73+
args.onSelectionChange(e);
74+
const { tokens } = e.detail;
75+
if (tokens) {
76+
const selectedTokens = tokens.map((token) => token.text);
77+
setSelectedCountries(selectedTokens);
78+
}
79+
};
80+
return (
81+
<>
82+
<Tokenizer {...args} onTokenDelete={handleTokenDelete} onSelectionChange={handleSelectionChange}>
83+
{countries.map((country) => (
84+
<Token key={country} text={country} />
85+
))}
86+
</Tokenizer>
87+
<br />
88+
<div style={{ display: 'flex', gap: '0.2rem' }}>
89+
<Label showColon>Selected countries</Label>
90+
<Text>{selectedCountries.join(', ')}</Text>
91+
</div>
92+
</>
93+
);
94+
}
95+
};

0 commit comments

Comments
 (0)