main component
This commit is contained in:
parent
0461ef6f93
commit
cc3e592d25
92
src/components/header.jsx
Normal file
92
src/components/header.jsx
Normal file
@ -0,0 +1,92 @@
|
||||
import Logo from '../assets/logo.png';
|
||||
import { Avatar, createStyles, Header, Group, rem, UnstyledButton, Title, ActionIcon, Tooltip } from '@mantine/core';
|
||||
import SwitchToggle from './toggle-colorscheme';
|
||||
import { IconUserCheck, IconUserEdit, IconUserOff } from '@tabler/icons-react';
|
||||
import { logout, useAuth } from '../tools/auth-provider';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
const useStyles = createStyles((theme) => ({
|
||||
header: {
|
||||
paddingLeft: theme.spacing.md,
|
||||
paddingRight: theme.spacing.md,
|
||||
},
|
||||
|
||||
inner: {
|
||||
height: rem(56),
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
},
|
||||
|
||||
links: {
|
||||
[theme.fn.smallerThan('md')]: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
|
||||
search: {
|
||||
[theme.fn.smallerThan('xs')]: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
|
||||
link: {
|
||||
display: 'block',
|
||||
lineHeight: 1,
|
||||
padding: `${rem(8)} ${rem(12)}`,
|
||||
borderRadius: theme.radius.sm,
|
||||
textDecoration: 'none',
|
||||
color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.colors.gray[7],
|
||||
fontSize: theme.fontSizes.sm,
|
||||
fontWeight: 500,
|
||||
|
||||
'&:hover': {
|
||||
backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],
|
||||
},
|
||||
},
|
||||
}));
|
||||
|
||||
const links = [
|
||||
{ label: 'Playlists', link: '/playlists' },
|
||||
{ label: 'Files', link: '/files' },
|
||||
{ label: 'Planning', link: '/planning' },
|
||||
];
|
||||
|
||||
const HeaderSearch = () => {
|
||||
const { classes } = useStyles();
|
||||
const { role } = useAuth();
|
||||
const navigate = useNavigate();
|
||||
|
||||
const items = links.map((link) => (
|
||||
<UnstyledButton key={link.label} className={classes.link} onClick={() => navigate(link.link)}>
|
||||
<Title order={4}>{link.label}</Title>
|
||||
</UnstyledButton>
|
||||
));
|
||||
|
||||
return (
|
||||
<Header height={56} className={classes.header}>
|
||||
<div className={classes.inner}>
|
||||
<Group>
|
||||
<Avatar src={Logo} size={30} />
|
||||
<UnstyledButton onClick={() => navigate('/')} className={classes.link}>
|
||||
<Title order={1}>Signage</Title>
|
||||
</UnstyledButton>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<Group ml={50} spacing={5} className={classes.links}>
|
||||
{items}
|
||||
</Group>
|
||||
<SwitchToggle />
|
||||
<Tooltip label={'Connect'} withArrow color={color}>
|
||||
<ActionIcon variant="light" size="lg" onClick={logout} color={color}>
|
||||
<IconUserOff size="1.2rem" stroke={1.5} />
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
</Group>
|
||||
</div>
|
||||
</Header>
|
||||
);
|
||||
};
|
||||
|
||||
export default HeaderSearch;
|
25
src/components/navbar.jsx
Normal file
25
src/components/navbar.jsx
Normal file
@ -0,0 +1,25 @@
|
||||
import { Title, Button, Group, Input, Paper } from '@mantine/core';
|
||||
import { IconSearch } from '@tabler/icons-react';
|
||||
|
||||
const NavbarSignage = ({ data }) => {
|
||||
return (
|
||||
<Paper shadow="sm" p="md" withBorder mb="md">
|
||||
<Group position="apart">
|
||||
<Title order={1}>{data.title}</Title>
|
||||
<Group>
|
||||
<Input
|
||||
placeholder="Search"
|
||||
value={data.search}
|
||||
onChange={(event) => data.handlerChange(event)}
|
||||
icon={<IconSearch size="1rem" stroke={1.5} />}
|
||||
/>
|
||||
{data?.buttonCreate && (
|
||||
<Button onClick={data.buttonCreate.handler}>{data.buttonCreate.text}</Button>
|
||||
)}
|
||||
</Group>
|
||||
</Group>
|
||||
</Paper>
|
||||
);
|
||||
};
|
||||
|
||||
export default NavbarSignage;
|
37
src/components/select-item.jsx
Normal file
37
src/components/select-item.jsx
Normal file
@ -0,0 +1,37 @@
|
||||
import { Card, Grid, Text, Image, Button, Center } from '@mantine/core';
|
||||
import { useState } from 'react';
|
||||
|
||||
const SelectorItem = ({ file, clickHandler }) => {
|
||||
const [selected, setSelected] = useState(false);
|
||||
const handleClick = () => {
|
||||
setSelected(!selected);
|
||||
clickHandler(file);
|
||||
};
|
||||
|
||||
return (
|
||||
<Grid.Col span={1} key={file.id}>
|
||||
<Card shadow="sm">
|
||||
<Card.Section>
|
||||
<Image
|
||||
src={"/api/file/"+file.id}
|
||||
alt={file.name}
|
||||
height={100}
|
||||
fit="cover"
|
||||
radius="md"
|
||||
withPlaceholder
|
||||
/>
|
||||
</Card.Section>
|
||||
<Center>
|
||||
<Text order={4} mt="md">
|
||||
{file.name}
|
||||
</Text>
|
||||
</Center>
|
||||
<Button mt="sm" color={selected ? 'red' : 'blue'} fullWidth variant="light" onClick={handleClick}>
|
||||
{selected ? 'Unselect' : 'Select'}
|
||||
</Button>
|
||||
</Card>
|
||||
</Grid.Col>
|
||||
);
|
||||
};
|
||||
|
||||
export default SelectorItem;
|
14
src/pages/errors/error-notification.jsx
Normal file
14
src/pages/errors/error-notification.jsx
Normal file
@ -0,0 +1,14 @@
|
||||
import { notifications } from '@mantine/notifications';
|
||||
import { IconCheck, IconX } from '@tabler/icons-react';
|
||||
|
||||
const setNotification = (fail, message) => {
|
||||
notifications.show({
|
||||
title: fail ? 'Error' : 'Success',
|
||||
message: message ?? 'Something went wrong',
|
||||
color: fail ? 'red' : 'green',
|
||||
icon: fail ? <IconX size="1.1rem" /> : <IconCheck size="1.1rem" />,
|
||||
autoClose: 5000,
|
||||
});
|
||||
};
|
||||
|
||||
export default setNotification;
|
Loading…
Reference in New Issue
Block a user