overflowList.stories.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. import React, { useState } from 'react';
  2. import { Icon, Tag, Table, Slider } from '../../index';
  3. import OverflowList from '..';
  4. import {
  5. IconAlarm,
  6. IconCamera,
  7. IconBookmark,
  8. IconDuration,
  9. IconEdit,
  10. IconFolder,
  11. IconFolderOpen,
  12. IconBolt,
  13. } from '@douyinfe/semi-icons';
  14. export default {
  15. title: 'OverflowList'
  16. }
  17. const ITEMS = [
  18. { icon: <IconFolderOpen />, key: 'All' },
  19. { icon: <IconFolderOpen />, key: 'Users' },
  20. { icon: <IconFolderOpen />, key: 'Janet' },
  21. { href: '#', icon: <IconFolderOpen />, key: 'Photos' },
  22. { href: '#', icon: <IconFolderOpen />, key: 'Wednesday' },
  23. { icon: <IconBolt />, key: 'image', current: true },
  24. { icon: <IconFolderOpen />, key: 'Users2' },
  25. { icon: <IconFolderOpen />, key: 'Users3' },
  26. { icon: <IconFolderOpen />, key: 'Users4' },
  27. { icon: <IconFolderOpen />, key: 'Users5' },
  28. { icon: <IconFolderOpen />, key: 'Users6' },
  29. { icon: <IconFolderOpen />, key: 'Users7' },
  30. ];
  31. const createItems = (length = 10) => {
  32. return Array(length).fill().map(()=>({ key: Math.random() }))
  33. }
  34. class Demo extends React.Component {
  35. renderOverflow = items => {
  36. // console.log('overflow items: ', items);
  37. return <Tag>{items.length}</Tag>;
  38. };
  39. renderItem = (item, ind) => {
  40. // console.log('visible item: ', item);
  41. return (
  42. <span key={item.key} style={{ marginRight: 8 }}>
  43. {item.key}
  44. </span>
  45. );
  46. };
  47. render() {
  48. return (
  49. <div style={{ width: '500px' }}>
  50. <OverflowList
  51. items={createItems(80)}
  52. overflowRenderer={this.renderOverflow}
  53. visibleItemRenderer={this.renderItem}
  54. />
  55. </div>
  56. );
  57. }
  58. }
  59. export const ASimpleOverflowList = () => {
  60. const [width, setWidth] = useState(100)
  61. const renderOverflow = (items) => {
  62. // console.log('overflow items: ', items);
  63. return (items.length ? <Tag style={{ flex: '0 0 auto' }}>+{items.length}</Tag> : null)
  64. }
  65. const renderItem = (item, ind) => {
  66. // console.log('visible item: ', item);
  67. return (
  68. <Tag color='blue' key={item.key} style={{ flex: '0 0 auto' }}>
  69. <Icon type={item.icon} style={{ }}/>
  70. {item.key}
  71. </Tag>
  72. )
  73. }
  74. const items = Array.from(new Array(100)).map((i, ind) => ({ icon: "alarm", key: `${ind}-alarm` }))
  75. return (
  76. <div style={{width:'800px'}}>
  77. <Slider step={1} value={width} onChange={(value) => setWidth(value)} />
  78. <div><span>.</span></div>
  79. <br/>
  80. <br/>
  81. <div style={{ maxWidth: `${width}%` }}>
  82. <OverflowList
  83. items={items}
  84. onOverflow={e=>{
  85. console.log('🚀 ~~~~~~ ASimpleOverflowList ~~~~~~ object', e)
  86. }}
  87. // minVisibleItems={3}
  88. overflowRenderer={renderOverflow}
  89. visibleItemRenderer={renderItem}
  90. />
  91. </div>
  92. </div>
  93. );
  94. };
  95. ASimpleOverflowList.story = {
  96. name: 'a simple semi overflow list',
  97. };
  98. class StartCollapse extends React.Component {
  99. renderOverflow = items => {
  100. // console.log('overflow items: ', items);
  101. return <Tag>{items.length}</Tag>;
  102. };
  103. renderItem = (item, ind) => {
  104. // console.log('visible item: ', item);
  105. return (
  106. <span key={item.key} style={{ marginRight: 8 }}>
  107. {item.key}
  108. </span>
  109. );
  110. };
  111. render() {
  112. return (
  113. <div style={{ width: '30%' }}>
  114. <OverflowList
  115. items={ITEMS}
  116. collapseFrom="start"
  117. overflowRenderer={this.renderOverflow}
  118. visibleItemRenderer={this.renderItem}
  119. />
  120. </div>
  121. );
  122. }
  123. }
  124. export const CollapseFromStart = () => <StartCollapse />;
  125. CollapseFromStart.story = {
  126. name: 'collapse from start',
  127. };
  128. class MinCollapse extends React.Component {
  129. renderOverflow = items => {
  130. // console.log('overflow items: ', items);
  131. return <Tag>{items.length}</Tag>;
  132. };
  133. renderItem = (item, ind) => {
  134. // console.log('visible item: ', item);
  135. return (
  136. <span key={item.key} style={{ marginRight: 8 }}>
  137. {item.key}
  138. </span>
  139. );
  140. };
  141. render() {
  142. return (
  143. <div style={{ width: '30%' }}>
  144. <OverflowList
  145. items={ITEMS}
  146. minVisibleItems={3}
  147. overflowRenderer={this.renderOverflow}
  148. visibleItemRenderer={this.renderItem}
  149. onOverflow={item => console.log(item)}
  150. />
  151. </div>
  152. );
  153. }
  154. }
  155. export const MinVisibleItems = () => <MinCollapse />;
  156. MinVisibleItems.story = {
  157. name: 'minVisibleItems',
  158. };
  159. class OverlapDemo extends React.Component {
  160. renderOverflow = items => {
  161. return items.map(item => <Tag>{item.length}</Tag>);
  162. };
  163. renderItem = (item, ind) => {
  164. return (
  165. <div key={item.key} style={{ marginRight: 8 }}>
  166. {item.key}
  167. </div>
  168. );
  169. };
  170. render() {
  171. return (
  172. <div style={{ width: '40%' }}>
  173. <OverflowList
  174. items={ITEMS}
  175. overflowRenderer={this.renderOverflow}
  176. visibleItemRenderer={this.renderItem}
  177. renderMode="scroll"
  178. />
  179. </div>
  180. );
  181. }
  182. }
  183. export const OverlapOverflowList = () => <OverlapDemo />;
  184. OverlapOverflowList.story = {
  185. name: 'overlap overflow list',
  186. };
  187. class OverlapDemo2 extends React.Component {
  188. renderOverflow = items => {
  189. return items.map(item => <Tag>{item.length}</Tag>);
  190. };
  191. renderItem = (item, ind) => {
  192. return (
  193. <div key={item.key} style={{ marginRight: 8 }}>
  194. {item.key}
  195. </div>
  196. );
  197. };
  198. render() {
  199. return (
  200. <div style={{ width: '40%' }}>
  201. <OverflowList
  202. items={ITEMS}
  203. threshold={0.2}
  204. onIntersect={item => console.log(item)}
  205. overflowRenderer={this.renderOverflow}
  206. visibleItemRenderer={this.renderItem}
  207. renderMode="scroll"
  208. />
  209. </div>
  210. );
  211. }
  212. }
  213. export const OverlapOverflowThreshold = () => <OverlapDemo2 />;
  214. OverlapOverflowThreshold.story = {
  215. name: 'overlap overflow threshold',
  216. };
  217. const data = [
  218. {
  219. key: '1',
  220. name: 'John Brown',
  221. age: 32,
  222. age1: 23,
  223. age2: 11,
  224. address: [1, 2, 3, 4, 5],
  225. },
  226. {
  227. key: '2',
  228. name: 'Jim Green',
  229. age: 42,
  230. age1: 23,
  231. age2: 11,
  232. address: [1, 2, 3, 4, 5],
  233. },
  234. {
  235. key: '3',
  236. name: 'Joe Black',
  237. age: 32,
  238. age1: 23,
  239. age2: 11,
  240. address: [1, 2, 3, 4, 5],
  241. },
  242. {
  243. key: '4',
  244. name: 'Disabled User',
  245. age: 99,
  246. age1: 23,
  247. age2: 11,
  248. address: [1, 2, 3, 4, 5],
  249. },
  250. ];
  251. class TableDemo extends React.Component {
  252. renderOverflow = items => {
  253. return <Tag>{items.length}</Tag>;
  254. };
  255. renderItem = (item, ind) => {
  256. return (
  257. <div key={`${ind}-item`} style={{ marginRight: 8 }}>
  258. {item}
  259. </div>
  260. );
  261. };
  262. renderColumn(items) {
  263. return (
  264. <div
  265. // style={{ width: '99%' }}
  266. >
  267. <OverflowList
  268. items={items.concat(items)}
  269. // observeAll={true}
  270. style={{ width: 88 }}
  271. overflowRenderer={items => <Tag>{items.length}</Tag>}
  272. visibleItemRenderer={(item, ind) => (
  273. <div key={`${ind}-item`} style={{ marginRight: 8 }}>
  274. {item}
  275. </div>
  276. )}
  277. />
  278. </div>
  279. );
  280. // return (
  281. // <div>
  282. // <OverflowList
  283. // items={items.concat(items)}
  284. // style={{ width: 88 }}
  285. // overflowRenderer={this.renderOverflow}
  286. // visibleItemRenderer={this.renderItem}
  287. // />
  288. // </div>
  289. // );
  290. }
  291. render() {
  292. const columns = [
  293. {
  294. title: 'Name',
  295. dataIndex: 'name',
  296. width: '30%',
  297. },
  298. {
  299. title: 'combine',
  300. dataIndex: 'test',
  301. children: [
  302. {
  303. title: 'Age',
  304. children: [
  305. {
  306. title: 'Age1',
  307. dataIndex: 'age1',
  308. },
  309. {
  310. title: 'Age2',
  311. dataIndex: 'age2',
  312. },
  313. ],
  314. },
  315. {
  316. title: 'Key',
  317. dataIndex: 'key',
  318. },
  319. ],
  320. },
  321. {
  322. title: 'Address',
  323. width: '20%',
  324. dataIndex: 'address',
  325. render: item => this.renderColumn(item),
  326. className: 'table-width-test',
  327. },
  328. ];
  329. return <Table columns={columns} dataSource={data} />;
  330. }
  331. }
  332. export const OverflowInTable = () => <TableDemo />;
  333. OverflowInTable.story = {
  334. name: 'overflow in table',
  335. };
  336. const LargeData = () => {
  337. const [width, setWidth] = useState(100);
  338. const renderOverflow = items => {
  339. // console.log('overflow items: ', items);
  340. return items.length ? <Tag style={{ flex: '0 0 auto' }}>+{items.length}</Tag> : null;
  341. };
  342. const renderItem = (item, ind) => {
  343. // console.log('visible item: ', item);
  344. return (
  345. <Tag color="blue" key={item.key} style={{ marginRight: 8, flex: '0 0 auto' }}>
  346. {item.icon}
  347. {item.key}
  348. </Tag>
  349. );
  350. };
  351. const items = [
  352. { icon: <IconAlarm style={{ marginRight: 4 }} />, key: 'alarm' },
  353. { icon: <IconBookmark style={{ marginRight: 4 }} />, key: 'bookmark' },
  354. { icon: <IconCamera style={{ marginRight: 4 }} />, key: 'camera' },
  355. { icon: <IconDuration style={{ marginRight: 4 }} />, key: 'duration' },
  356. { icon: <IconEdit style={{ marginRight: 4 }} />, key: 'edit' },
  357. { icon: <IconFolder style={{ marginRight: 4 }} />, key: 'folder' },
  358. ];
  359. return (
  360. <div>
  361. <Slider step={1} value={width} onChange={value => setWidth(value)} />
  362. <br />
  363. <br />
  364. <div style={{ width: `${width}%` }}>
  365. <OverflowList
  366. items={items}
  367. minVisibleItems={3}
  368. overflowRenderer={renderOverflow}
  369. visibleItemRenderer={renderItem}
  370. />
  371. </div>
  372. </div>
  373. );
  374. };
  375. export const OverflowListWithSlide = () =>{
  376. const [width, setWidth] = useState(100);
  377. const renderOverflow = items => {
  378. return items.length ? <Tag style={{ flex: '0 0 auto' }}>+{items.length}</Tag> : null;
  379. };
  380. const renderItem = (item, ind) => {
  381. return (
  382. <Tag color="blue" key={item.key} style={{ marginRight: 8, flex: '0 0 auto' }}>
  383. {item.icon}
  384. {item.key}
  385. </Tag>
  386. );
  387. };
  388. const items = [
  389. { icon: <IconAlarm style={{ marginRight: 4 }} />, key: 'alarm' },
  390. { icon: <IconBookmark style={{ marginRight: 4 }} />, key: 'bookmark' },
  391. { icon: <IconCamera style={{ marginRight: 4 }} />, key: 'camera' },
  392. { icon: <IconDuration style={{ marginRight: 4 }} />, key: 'duration' },
  393. { icon: <IconEdit style={{ marginRight: 4 }} />, key: 'edit' },
  394. { icon: <IconFolder style={{ marginRight: 4 }} />, key: 'folder' },
  395. ];
  396. return (
  397. <div>
  398. <Slider step={1} value={width} onChange={value => setWidth(value)} />
  399. <br />
  400. <br />
  401. <div style={{ width: `${width}%` }}>
  402. <OverflowList
  403. items={items}
  404. // minVisibleItems={3}
  405. overflowRenderer={renderOverflow}
  406. visibleItemRenderer={renderItem}
  407. />
  408. </div>
  409. </div>
  410. );
  411. }
  412. OverflowListWithSlide.story = {
  413. name: 'overflowList with slide',
  414. };
  415. // TODO large data will cause memory heap
  416. // stories.add('large amount of data', () => <LargeData />);