| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588 |
- /* argus-disable unPkgSensitiveInfo */
- import React, { useState } from 'react';
- import { Button, CheckboxGroup, Upload, Table, Collapse, Tabs } from '../../index';
- import Collapsible from '..';
- import NestedDemo from './Nested';
- import { IconChevronDown, IconChevronRight, IconUpload } from '@douyinfe/semi-icons';
- const TabPane = Tabs.TabPane;
- export default {
- title: 'Collapsible',
- }
- class Demo extends React.Component {
- state = {
- isOpen: false,
- };
- toggle = () => {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- };
- render() {
- const { isOpen } = this.state;
- const collapsed = (
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- );
- return (
- <div>
- <Button onClick={() => this.toggle()}>显示更多</Button>
- <Collapsible isOpen={isOpen}>{collapsed}</Collapsible>
- </div>
- );
- }
- }
- export const RegularCollapsible = () => <Demo />;
- class DemoDOM extends React.Component {
- state = {
- isOpen: false,
- };
- toggle = () => {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- };
- render() {
- const { isOpen } = this.state;
- const collapsed = (
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- );
- return (
- <div>
- <Button onClick={() => this.toggle()}>显示更多</Button>
- <Collapsible keepDOM isOpen={isOpen}>
- {collapsed}
- </Collapsible>
- </div>
- );
- }
- }
- export const KeepDom = () => <DemoDOM />;
- class DefaultOpen extends React.Component {
- state = {
- isOpen: true,
- };
- toggle = () => {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- };
- render() {
- const { isOpen } = this.state;
- const collapsed = (
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- );
- return (
- <div>
- <Button onClick={() => this.toggle()}>toggle</Button>
- <Collapsible isOpen={isOpen}>{collapsed}</Collapsible>
- </div>
- );
- }
- }
- export const DefaultOpenDemo = () => <DefaultOpen />;
- export const NestedCollapsible = () => <NestedDemo />;
- class Wrap extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isOpen: props.isOpen,
- options: [
- {
- label: '抖音',
- value: 'dy',
- },
- {
- label: '火山',
- value: 'hotsoon',
- },
- {
- label: '皮皮虾',
- value: 'pipixia',
- },
- {
- label: '今日头条',
- value: 'toutiao',
- },
- ],
- values: [],
- };
- this.toggle = this.toggle.bind(this);
- this.onChange = this.onChange.bind(this);
- }
- toggle() {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- }
- onChange(values) {
- this.setState({
- values,
- });
- }
- render() {
- const { isOpen, options, values } = this.state;
- return (
- <>
- <div onClick={this.toggle}>
- {isOpen ? <IconChevronDown /> : <IconChevronRight />}
- 权限点
- <span>
- {values.length}/{options.length}
- </span>
- </div>
- <Collapse defaultActiveKey="1" motion={false}>
- <Collapse.Panel header="This is panel header 1" itemKey="1">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- <Collapse.Panel header="This is panel header 2" itemKey="2">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- <Collapse.Panel header="This is panel header 3" itemKey="3">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- </Collapse>
- {/* <Collapsible isOpen={isOpen}>
- <div style={{ height: '40px' }}>
- <CheckboxGroup options={options} direction="horizontal" onChange={this.onChange} value={values} />
- </div>
- </Collapsible> */}
- </>
- );
- }
- }
- export const CollapsibleTest = () => <Wrap />;
- class App extends React.Component {
- render() {
- const expandColumns = [
- {
- title: 'Name',
- dataIndex: 'name',
- key: 'name',
- },
- {
- title: 'Age',
- dataIndex: 'age',
- key: 'age',
- },
- {
- title: 'Address',
- dataIndex: 'address',
- key: 'address',
- },
- {
- title: 'Action',
- dataIndex: '',
- key: 'x',
- render: () => <a>Delete</a>,
- },
- ];
- const rowSelection = {
- onChange: (selectedRowKeys, selectedRows) => {
- // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
- },
- getCheckboxProps: record => ({
- disabled: record.name === 'Michael James',
- // Column configuration not to be checked
- name: record.name,
- }),
- };
- const expandData = [
- {
- name: 'John Brown',
- age: 32,
- address: 'New York No. 1 Lake Park',
- description:
- 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.',
- },
- {
- name: 'Jim Green',
- age: 42,
- address: 'London No. 1 Lake Park',
- description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.',
- },
- {
- name: 'Joe Black',
- age: 32,
- address: (
- <Collapse defaultActiveKey="1" motion={false}>
- <Collapse.Panel header="This is panel header 1" itemKey="1">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- <Collapse.Panel header="This is panel header 2" itemKey="2">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- <Collapse.Panel header="This is panel header 3" itemKey="3">
- <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
- </Collapse.Panel>
- </Collapse>
- ),
- description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.',
- },
- ];
- const expandRowRender = (record, index) => <Wrap isOpen={true} />;
- return (
- <Table
- rowKey={'name'}
- columns={expandColumns}
- rowSelection={rowSelection}
- expandedRowRender={expandRowRender}
- dataSource={expandData}
- />
- );
- }
- }
- export const CollapsibleInTable = () => <App />;
- class InTab extends React.Component {
- constructor() {
- super();
- this.state = {
- isOpenFirst: false,
- isOpenSecond: false,
- };
- }
- render() {
- const { isOpenFirst, isOpenSecond } = this.state;
- return (
- <div>
- <Tabs
- onTabClick={e =>
- this.setState({
- active: e,
- })
- }
- >
- <TabPane tab="第一" itemKey="1">
- <h3>第一个tabpane</h3>
- <Button
- onClick={() => {
- this.setState({
- isOpenFirst: !isOpenFirst,
- });
- }}
- >
- 开关
- </Button>
- <Collapsible isOpen={isOpenFirst}>
- 第一个tabpane下的collapsible的open状态正常
- </Collapsible>
- </TabPane>
- <TabPane tab="第二" itemKey="2">
- <h3>第二个tabpane</h3>
- <Button
- onClick={() => {
- this.setState({
- isOpenSecond: !isOpenSecond,
- });
- }}
- >
- 开关
- </Button>
- <Collapsible isOpen={isOpenSecond}>
- 第二个tabpane下的collapsibleopen状态异常
- </Collapsible>
- </TabPane>
- </Tabs>
- </div>
- );
- }
- }
- export const CollapsibleInTab = () => <InTab />;
- CollapsibleInTab.story = {
- name: 'collapsible in tab',
- };
- class WithUpload extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isOpen: true,
- };
- this.toggle = this.toggle.bind(this);
- this.action = '//semi.design/api/upload/';
- this.defaultFileList = [
- {
- preview: false,
- name: '2D (2).ecpj',
- status: 'success',
- uid: 'd116a179410eb0ca18e66074509bde93-0',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- {
- preview: false,
- name: '2D-sticker-temp.psd',
- status: 'success',
- uid: 'b7d579069320590ba4b128672eedbae2-1',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- {
- preview: false,
- name: '2D-sticker-temp (1).psd',
- status: 'success',
- uid: 'b7d579069320590ba4b128672eedbae2-2',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- ];
- }
- toggle() {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- }
- render() {
- const { isOpen } = this.state;
- return (
- <div>
- <Collapsible isOpen={isOpen} collapseHeight={120}>
- <Upload
- dragable={true}
- name="file" // accept={ALLOW_FILE}
- defaultFileList={[
- {
- preview: false,
- name: '2D (2).ecpj',
- status: 'success',
- uid: 'd116a179410eb0ca18e66074509bde93-0',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- {
- preview: false,
- name: '2D-sticker-temp.psd',
- status: 'success',
- uid: 'b7d579069320590ba4b128672eedbae2-1',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- {
- preview: false,
- name: '2D-sticker-temp (1).psd',
- status: 'success',
- uid: 'b7d579069320590ba4b128672eedbae2-2',
- url:
- 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
- },
- ]}
- dragMainText="点击上传文件或拖拽文件到这里"
- dragSubText="图片、PDF、PPT、Word、视频等"
- onError={this.uploadError}
- onSuccess={(...args) => this.uploadSuccess(i, ...args)}
- onRemove={(...args) => this.onRemoveFile(i, ...args)}
- onProgress={() =>
- this.setState({
- fileLoading: true,
- })
- }
- >
- <Button icon={<IconUpload />} theme="light">
- 点击上传
- </Button>
- </Upload>
- </Collapsible>
- <Button onClick={this.toggle}>{isOpen ? '剩余1项' : '展开'}</Button>
- </div>
- );
- }
- }
- export const CollapsibleWithUpload = () => <WithUpload />;
- class CusHeight extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isOpen: false,
- };
- this.toggle = this.toggle.bind(this);
- }
- toggle() {
- this.setState({
- isOpen: !this.state.isOpen,
- });
- }
- render() {
- const { isOpen } = this.state;
- const maskStyle = isOpen
- ? {}
- : {
- WebkitMaskImage:
- 'linear-gradient(to bottom, black 0%, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 0.2) 80%, transparent 100%)',
- };
- const collapsed = (
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- );
- const linkStyle = {
- position: 'absolute',
- left: 0,
- right: 0,
- textAlign: 'center',
- bottom: -10,
- fontWeight: 700,
- cursor: 'pointer',
- };
- console.log('out state', isOpen);
- return (
- <>
- <Button onClick={this.toggle}>Toggle</Button>
- <div
- style={{
- position: 'relative',
- }}
- >
- <Collapsible
- isOpen={isOpen}
- collapseHeight={40}
- style={{ ...maskStyle }}
- onInnerStateOpen={bool => {
- if (isOpen !== bool) {
- this.setState({
- isOpen: bool,
- });
- }
- }}
- >
- {collapsed}
- </Collapsible>
- {isOpen ? null : (
- <a onClick={this.toggle} style={{ ...linkStyle }}>
- + Show More
- </a>
- )}
- </div>
- </>
- );
- }
- }
- export const CollapseHeight = () => <CusHeight />;
- const Child = ({ onClick }) => {
- const [isCOpen, setIsCOpen] = useState(false);
- return (
- <div>
- <div
- style={{
- display: isCOpen ? 'block' : 'none',
- height: 200,
- background: 'green',
- }}
- >
- child
- </div>
- <Button
- onClick={() => {
- setIsCOpen(!isCOpen);
- onClick();
- }}
- >
- Toggle
- </Button>
- </div>
- );
- }; // dynamic update content, children comp need to separate from parent to avoid rerender of entire comp
- const DynamDemo = () => {
- const [isOpen, setIsOpen] = useState(true);
- const [reCalcKey, setReCalcKey] = useState(0);
- return (
- <div>
- <Button onClick={() => setIsOpen(!isOpen)}>折叠</Button>
- <Collapsible isOpen={isOpen}>
- <div>
- <div
- style={{
- height: 200,
- background: 'blue',
- }}
- >
- father
- </div>
- <Child onClick={() => setReCalcKey(reCalcKey + 1)} />
- </div>
- </Collapsible>
- </div>
- );
- };
- export const DynamicCollapsible = () => <DynamDemo />;
|