overflowList.stories.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. import React, { useState } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import { Icon, Tag, Table, Slider } from '../../index';
  4. import OverflowList from '..';
  5. import { IconAlarm, IconCamera, IconBookmark, IconDuration, IconEdit, IconFolder, IconFolderOpen, IconBolt } from '@douyinfe/semi-icons';
  6. const stories = storiesOf('OverflowList', module);
  7. // stories.addDecorator(withKnobs);;
  8. const ITEMS = [
  9. { icon: <IconFolderOpen />, key: "All" },
  10. { icon: <IconFolderOpen />, key: "Users" },
  11. { icon: <IconFolderOpen />, key: "Janet" },
  12. { href: "#", icon: <IconFolderOpen />, key: "Photos" },
  13. { href: "#", icon: <IconFolderOpen />, key: "Wednesday" },
  14. { icon: <IconBolt />, key: "image", current: true },
  15. ];
  16. class Demo extends React.Component {
  17. renderOverflow = (items) => {
  18. // console.log('overflow items: ', items);
  19. return (<Tag>{items.length}</Tag>)
  20. }
  21. renderItem = (item, ind) => {
  22. // console.log('visible item: ', item);
  23. return (<span key={item.key} style={{ marginRight: 8 }}>{item.key}</span>)
  24. }
  25. render() {
  26. return (
  27. <div style={{ width: '30%' }}>
  28. <OverflowList
  29. items={ITEMS}
  30. overflowRenderer={this.renderOverflow}
  31. visibleItemRenderer={this.renderItem}
  32. />
  33. </div>
  34. );
  35. }
  36. }
  37. stories.add('a simple overflow list', () => <Demo />);
  38. class StartCollapse extends React.Component {
  39. renderOverflow = (items) => {
  40. // console.log('overflow items: ', items);
  41. return (<Tag>{items.length}</Tag>)
  42. }
  43. renderItem = (item, ind) => {
  44. // console.log('visible item: ', item);
  45. return (<span key={item.key} style={{ marginRight: 8 }}>{item.key}</span>)
  46. }
  47. render() {
  48. return (
  49. <div style={{ width: '30%' }}>
  50. <OverflowList
  51. items={ITEMS}
  52. collapseFrom="start"
  53. overflowRenderer={this.renderOverflow}
  54. visibleItemRenderer={this.renderItem}
  55. />
  56. </div>
  57. );
  58. }
  59. }
  60. stories.add('collapse from start', () => <StartCollapse />);
  61. class MinCollapse extends React.Component {
  62. renderOverflow = (items) => {
  63. // console.log('overflow items: ', items);
  64. return (<Tag>{items.length}</Tag>)
  65. }
  66. renderItem = (item, ind) => {
  67. // console.log('visible item: ', item);
  68. return (<span key={item.key} style={{ marginRight: 8 }}>{item.key}</span>)
  69. }
  70. render() {
  71. return (
  72. <div style={{ width: '30%' }}>
  73. <OverflowList
  74. items={ITEMS}
  75. minVisibleItems={3}
  76. overflowRenderer={this.renderOverflow}
  77. visibleItemRenderer={this.renderItem}
  78. onOverflow={(item) => console.log(item)}
  79. />
  80. </div>
  81. );
  82. }
  83. }
  84. stories.add('minVisibleItems', () => <MinCollapse />);
  85. class OverlapDemo extends React.Component {
  86. renderOverflow = (items) => {
  87. return items.map(item => <Tag>{item.length}</Tag>)
  88. }
  89. renderItem = (item, ind) => {
  90. return (<div key={item.key} style={{ marginRight: 8 }}>{item.key}</div>)
  91. }
  92. render() {
  93. return (
  94. <div style={{ width: '40%' }}>
  95. <OverflowList
  96. items={ITEMS}
  97. overflowRenderer={this.renderOverflow}
  98. visibleItemRenderer={this.renderItem}
  99. renderMode="scroll"
  100. />
  101. </div>
  102. );
  103. }
  104. }
  105. stories.add('overlap overflow list', () => <OverlapDemo />);
  106. class OverlapDemo2 extends React.Component {
  107. renderOverflow = (items) => {
  108. return items.map(item => <Tag>{item.length}</Tag>)
  109. }
  110. renderItem = (item, ind) => {
  111. return (<div key={item.key} style={{ marginRight: 8 }}>{item.key}</div>)
  112. }
  113. render() {
  114. return (
  115. <div style={{ width: '40%' }}>
  116. <OverflowList
  117. items={ITEMS}
  118. threshold={0.2}
  119. onIntersect={(item) => console.log(item)}
  120. overflowRenderer={this.renderOverflow}
  121. visibleItemRenderer={this.renderItem}
  122. renderMode="scroll"
  123. />
  124. </div>
  125. );
  126. }
  127. }
  128. stories.add('overlap overflow threshold', () => <OverlapDemo2 />);
  129. const data = [
  130. {
  131. key: '1',
  132. name: 'John Brown',
  133. age: 32,
  134. age1: 23,
  135. age2: 11,
  136. address: [1, 2, 3, 4, 5],
  137. },
  138. {
  139. key: '2',
  140. name: 'Jim Green',
  141. age: 42,
  142. age1: 23,
  143. age2: 11,
  144. address: [1, 2, 3, 4, 5],
  145. },
  146. {
  147. key: '3',
  148. name: 'Joe Black',
  149. age: 32,
  150. age1: 23,
  151. age2: 11,
  152. address: [1, 2, 3, 4, 5],
  153. },
  154. {
  155. key: '4',
  156. name: 'Disabled User',
  157. age: 99,
  158. age1: 23,
  159. age2: 11,
  160. address: [1, 2, 3, 4, 5],
  161. },
  162. ];
  163. class TableDemo extends React.Component {
  164. renderOverflow = (items) => {
  165. return <Tag>{items.length}</Tag>
  166. }
  167. renderItem = (item, ind) => {
  168. return (<div key={`${ind}-item`} style={{ marginRight: 8 }}>{item}</div>)
  169. }
  170. renderColumn(items) {
  171. return (
  172. <div
  173. // style={{ width: '99%' }}
  174. >
  175. <OverflowList
  176. items={items.concat(items)}
  177. // observeAll={true}
  178. style={{ width: 88 }}
  179. overflowRenderer={items => <Tag>{items.length}</Tag>}
  180. visibleItemRenderer={(item, ind) => <div key={`${ind}-item`} style={{ marginRight: 8 }}>{item}</div>}
  181. />
  182. </div>
  183. );
  184. // return (
  185. // <div>
  186. // <OverflowList
  187. // items={items.concat(items)}
  188. // style={{ width: 88 }}
  189. // overflowRenderer={this.renderOverflow}
  190. // visibleItemRenderer={this.renderItem}
  191. // />
  192. // </div>
  193. // );
  194. }
  195. render() {
  196. const columns = [
  197. {
  198. title: 'Name',
  199. dataIndex: 'name',
  200. width: '30%',
  201. },
  202. {
  203. title: 'combine',
  204. dataIndex: 'test',
  205. children: [
  206. {
  207. title: 'Age',
  208. children: [
  209. {
  210. title: 'Age1',
  211. dataIndex: 'age1',
  212. },
  213. {
  214. title: 'Age2',
  215. dataIndex: 'age2',
  216. },
  217. ],
  218. },
  219. {
  220. title: 'Key',
  221. dataIndex: 'key',
  222. },
  223. ],
  224. },
  225. {
  226. title: 'Address',
  227. width: '20%',
  228. dataIndex: 'address',
  229. render: item => this.renderColumn(item),
  230. className: 'table-width-test'
  231. },
  232. ];
  233. return <Table columns={columns} dataSource={data} />
  234. }
  235. }
  236. stories.add('overflow in table', () => <TableDemo />);
  237. const LargeData = () => {
  238. const [width, setWidth] = useState(100)
  239. const renderOverflow = (items) => {
  240. // console.log('overflow items: ', items);
  241. return (items.length ? <Tag style={{ flex: '0 0 auto' }}>+{items.length}</Tag> : null)
  242. }
  243. const renderItem = (item, ind) => {
  244. // console.log('visible item: ', item);
  245. return (
  246. <Tag color='blue' key={item.key} style={{ marginRight: 8, flex: '0 0 auto' }}>
  247. {item.icon}
  248. {item.key}
  249. </Tag>
  250. )
  251. }
  252. const items = [
  253. { icon: <IconAlarm style={{ marginRight: 4 }} />, key: "alarm" },
  254. { icon: <IconBookmark style={{ marginRight: 4 }} />, key: "bookmark" },
  255. { icon: <IconCamera style={{ marginRight: 4 }} />, key: "camera" },
  256. { icon: <IconDuration style={{ marginRight: 4 }} />, key: "duration" },
  257. { icon: <IconEdit style={{ marginRight: 4 }} />, key: "edit" },
  258. { icon: <IconFolder style={{ marginRight: 4 }} />, key: "folder" },
  259. ];
  260. return (
  261. <div>
  262. <Slider step={1} value={width} onChange={(value) => setWidth(value)} />
  263. <br/>
  264. <br/>
  265. <div style={{ width: `${width}%` }}>
  266. <OverflowList
  267. items={items}
  268. minVisibleItems={3}
  269. overflowRenderer={renderOverflow}
  270. visibleItemRenderer={renderItem}
  271. />
  272. </div>
  273. </div>
  274. );
  275. }
  276. // TODO large data will cause memory heap
  277. // stories.add('large amount of data', () => <LargeData />);