Jiew Meng
Jiew Meng

Reputation: 88317

Nested drawer/layout in react toolbox

How can I implement a nested drawer layout?

 LOGO | Nav-Items-Here
-------------------------
Page Header
-------------------------
Drawer  | Content
/Sidebar|
        |
        |

I tried using a nested layout but it does not work. The drawer is always pinned to the top of the window. My code looks like this (simplified to remove complexity like react router):

      <Layout>
        <Panel>
          <DomainPage /> 
        </Panel>
      </Layout>

DomainPage

  <div>
    <header styleName="pageHeader.header pageHeader.headerNoBorder">
      <h1 styleName="pageHeader.headerText">{this.props.domain.get("name")}</h1>
    </header>

    <Tabs theme={theme} index={this.state.index} onChange={this.handleTabChange}>
      <Tab label="Intents">
        <DomainIntentsTab />
      </Tab>
      <!-- ... -->
    </Tabs>
  </div>

DomainIntentsTab

  <Layout>
    <Panel>
      <NavDrawer pinned active>
        Test
      </NavDrawer>
    </Panel>
  </Layout>

Upvotes: 1

Views: 778

Answers (1)

Venugopal
Venugopal

Reputation: 1896

Test the below code in react-toolbox playground

class LayoutTest extends React.Component {
state = {
    drawerActive: false
};

toggleDrawerActive = () => {
    this.setState({ drawerActive: !this.state.drawerActive });
};

render() {
    return (
       <Layout>
        <Panel>
          {/* DomainPage */}
          <div>
            <header>
              <h1>Header</h1>
            </header>
            <Tabs>
              <Tab label="Intents">
               {/* DomainIntentsTab */}
                <Layout>
                  <Panel>
                    <NavDrawer active={this.state.drawerActive} onOverlayClick={ this.toggleDrawerActive }>
                      <p>Navigation, account switcher, etc. go here.</p>
                    </NavDrawer>
                    <div style={{ flex: 1, overflowY: 'auto', padding: '1.8rem' }}>
                      <Button label="toggle drawer" onClick={ this.toggleDrawerActive } primary raised/>
                      <h1>Main Content</h1>
                      <p>Main content goes here.</p>
                    </div>
                  </Panel>
                </Layout>
              </Tab>
            </Tabs>
          </div>
        </Panel>
      </Layout>
    );
  }
}

return <LayoutTest />;

You may find the box-shadow of NavDrawer visible in navdrawer-closed state. You can correct this with CSS

EDIT

pinned side menu:

as per this, NavDrawer and Panel are siblings; so you can modify DomainIntentsTab section as below.

Note: don't forget to add pinned on NavDrawer

<Tab label="Intents">
    {/* DomainIntentsTab */}
    <Layout>
        <NavDrawer pinned active={this.state.drawerActive} onOverlayClick={ this.toggleDrawerActive }>
            <p>Navigation, account switcher, etc. go here.</p>
        </NavDrawer>
        <Panel>
            <div style={{ flex: 1, overflowY: 'auto', padding: '1.8rem' }}>
                <Button label="toggle drawer" onClick={ this.toggleDrawerActive } primary raised/>
                <h1>Main Content</h1>
                <p>Main content goes here.</p>
            </div>
        </Panel>
    </Layout>
</Tab>

Upvotes: 0

Related Questions