Search code examples
cssreactjsmaterial-uimaterial-design

React-MaterialUI: Horizontally aligning single tab to right and others to left in App Bar ->Tabs -> Tab


In my React application, I have a Navigation bar where in there are multiple Tabs, which are created with the use of Marerial UI's AppBar, Tabs and Tab component (in sequence), as below:

function associatedProps(index) {
    return {
        id: `nav-tab-${index}`,
        'aria-controls': `nav-tabpanel-${index}`
    };
}

function LinkTab(props) {
    const history = useHistory();
    const route = props.route;
    console.log(props);
    return (
        <>
        <Tab
            component="a"
            onClick={(event) => {
                event.preventDefault();
                history.push(route)
            }}
            {...props}
        />
        </>
    );
}

const useStyles = makeStyles((theme) => ({
    root: {
        flexGrow: 1,
        backgroundColor: theme.palette.background.paper,
        height: theme.navBarHeight
    },
    tabIndicator: {
        backgroundColor: PRIMARY_RED.default
    },
    tabBar: {
      top: '80px'
    }
}));

export default function NavTabs() {
    const classes = useStyles();
    const [value, setValue] = React.useState(0);

    const handleChange = (event, newValue) => {
        setValue(newValue);
    };

    return (
        <div className={classes.root}>
            <AppBar position="fixed" className={classes.tabBar}>
                <Tabs
                    variant=""
                    classes={{indicator: classes.tabIndicator}}
                    value={value}
                    onChange={handleChange}
                    aria-label="nav tabs example"
                >
                    <LinkTab {...PRIMARY_NAVIGATION.MY_LIST} {...associatedProps(0)} />
                    <LinkTab {...PRIMARY_NAVIGATION.MY_REQUESTS} {...associatedProps(1)} />
                    <LinkTab {...PRIMARY_NAVIGATION.REPORT} {...associatedProps(2)} />
                </Tabs>
            </AppBar>
        </div>
    );
}

Now herein this setup I wanted my REPORT tab to be aligned right of the App Bar. I do not see any CSS Rule or Prop which in Documentation, which can help me here.

Please suggest how can I achieve this in current setup.


Solution

  • Tabs do not provide a property to align a specific item to the start or end. But you can leverage css to achieve your result.

    Add a className to the item to be right aligned and define a marginLeft property on it

    const useStyles = makeStyles((theme) => ({
        root: {
            flexGrow: 1,
            backgroundColor: theme.palette.background.paper,
            height: theme.navBarHeight
        },
        tabIndicator: {
            backgroundColor: PRIMARY_RED.default
        },
        tabBar: {
          top: '80px'
        },
        rightAlign: {
           marginLeft: 'auto',
        }
    }));
    
    export default function NavTabs() {
        const classes = useStyles();
        const [value, setValue] = React.useState(0);
    
        const handleChange = (event, newValue) => {
            setValue(newValue);
        };
    
        return (
            <div className={classes.root}>
                <AppBar position="fixed" className={classes.tabBar}>
                    <Tabs
                        variant=""
                        classes={{indicator: classes.tabIndicator}}
                        value={value}
                        onChange={handleChange}
                        aria-label="nav tabs example"
                    >
                        <LinkTab {...PRIMARY_NAVIGATION.MY_LIST} {...associatedProps(0)} />
                        <LinkTab {...PRIMARY_NAVIGATION.MY_REQUESTS} {...associatedProps(1)} />
                        <LinkTab {...PRIMARY_NAVIGATION.REPORT} {...associatedProps(2)} className={classes.rightAlign}/>
                    </Tabs>
                </AppBar>
            </div>
        );
    }
    

    Sample working demo