Ignore:
Timestamp:
02/14/22 01:41:41 (2 years ago)
Author:
Tasevski2 <39170279+Tasevski2@…>
Branches:
master
Children:
747e0ab
Parents:
e8b1076
Message:

Push before video

Location:
sources/client/src/components/admin/ParkingZones
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • sources/client/src/components/admin/ParkingZones/ParkingZoneCard/index.js

    re8b1076 rbc20307  
    22
    33import {
    4   ParkingZoneWrapper,
    5   Container,
    6   ZoneName,
    7   InfoWrapper,
    8   Label,
    9   Value,
    10   ProgressBar,
    11   ProgressBarLabel,
     4    ParkingZoneWrapper,
     5    Container,
     6    ZoneName,
     7    InfoWrapper,
     8    Label,
     9    Value,
     10    ProgressBar,
     11    ProgressBarLabel,
    1212} from './styles';
    1313
     14import DropdownViewer from '../../../DropdownViewer';
     15
    1416const ParkingZoneCard = ({ info }) => {
    15   let history = useHistory();
     17    let history = useHistory();
     18    const takenDividedByTotal = info.takenSpaces / info.capacity;
    1619
    17   return (
    18     <ParkingZoneWrapper item xs={11} sm={6} md={3}>
    19       <Container onClick={() => history.push(`/zone/${info.id}`)}>
    20         <ZoneName>{info.zoneName}</ZoneName>
    21         <InfoWrapper>
    22           <Label>Одговорни лица:</Label>
    23           {info.responsiblePersons.slice(0, 1).map((person, index) => (
    24             <Value key={index}>{person}</Value>
    25           ))}
    26           {info.responsiblePersons.length > 1 ? <Value>...</Value> : null}
    27         </InfoWrapper>
    28         <InfoWrapper>
    29           <Label>Број на паркинг места:</Label>
    30           <Value>{info.parkingSpaces}</Value>
    31         </InfoWrapper>
    32         <ProgressBar
    33           percent={Math.floor(
    34             (info.takenParkingSpaces / info.parkingSpaces) * 100
    35           )}
    36           label={() => (
    37             <ProgressBarLabel>
    38               {info.takenParkingSpaces}/{info.parkingSpaces}
    39             </ProgressBarLabel>
    40           )}
    41         />
    42       </Container>
    43     </ParkingZoneWrapper>
    44   );
     20    return (
     21        <ParkingZoneWrapper item xs={11} sm={6} md={3}>
     22            <Container onClick={() => history.push(`/zone/${info.id}`)}>
     23                <ZoneName>{info.pzName}</ZoneName>
     24                <InfoWrapper>
     25                    <Label>Одговорни лица:</Label>
     26                    <DropdownViewer data={info?.responsibleWorkers ?? [] } />
     27                </InfoWrapper>
     28                <InfoWrapper style={{ marginTop: '30px' }}>
     29                    <Label>Број на паркинг места:</Label>
     30                    <Value>{info.capacity}</Value>
     31                </InfoWrapper>
     32                <ProgressBar
     33                    percent={Math.floor(
     34                        (isNaN(takenDividedByTotal) ? 0 : takenDividedByTotal) *
     35                            100
     36                    )}
     37                    label={() => (
     38                        <ProgressBarLabel>
     39                            {info.takenSpaces}/{info.capacity}
     40                        </ProgressBarLabel>
     41                    )}
     42                />
     43            </Container>
     44        </ParkingZoneWrapper>
     45    );
    4546};
    4647
  • sources/client/src/components/admin/ParkingZones/ParkingZoneCard/styles.js

    re8b1076 rbc20307  
    22import Grid from '@mui/material/Grid';
    33import { Typography } from '@mui/material';
    4 
    5 import { LineProgressBar } from '@frogress/line'
    6 
     4import { LineProgressBar } from '@frogress/line';
     5import { mobile_max_width } from '../../../../config/utilities';
    76
    87export const ParkingZoneWrapper = styled(Grid)`
    9     height: 350px;
     8  height: 350px;
     9
     10  @media (max-width: ${mobile_max_width}px) {
     11    padding-left: 15px !important;
     12    padding-right: 15px;
     13  }
    1014`;
    1115
    1216export const Container = styled.div`
    13     display: flex;
    14     flex-direction: column;
    15     align-items: center;
    16     width: 100%;
    17     height: 100%;
    18     box-shadow: 15px 15px 10px ${props => props.theme.palette.background.shadow};
    19     background-color: ${props => props.theme.palette.background.white};
    20     :hover {
    21         opacity: 0.8;
    22         cursor: pointer;
    23     }
    24     position: relative;
     17  display: flex;
     18  flex-direction: column;
     19  align-items: center;
     20  width: 100%;
     21  height: 100%;
     22  box-shadow: 15px 15px 10px ${(props) => props.theme.palette.background.shadow};
     23  background-color: ${(props) => props.theme.palette.background.white};
     24  :hover {
     25    opacity: 0.8;
     26    cursor: pointer;
     27  }
     28  position: relative;
    2529`;
    2630
    2731export const ZoneName = styled(Typography).attrs({
    28     variant: 'h2'
     32  variant: 'h2',
    2933})`
    30     font-size: 2rem;
    31     font-weight: 600;
    32     margin-top: 30px;
    33     text-align: center;
     34  font-size: 2rem;
     35  font-weight: 600;
     36  margin-top: 30px;
     37  text-align: center;
    3438`;
    3539
    3640export const InfoWrapper = styled.div`
    37     margin-top: 20px;
    38     display: flex;
    39     flex-direction: column;
    40     align-items: center;
    41 
     41  width: 100%;
     42  margin-top: 20px;
     43  display: flex;
     44  flex-direction: column;
     45  align-items: center;
    4246`;
    4347
    4448export const Label = styled(Typography).attrs({
    45     variant: 'h4'
     49  variant: 'h4',
    4650})`
    47     font-size: 1rem;
    48     margin-bottom: 5px;
     51  font-size: 1rem;
     52  margin-bottom: 5px;
    4953`;
    5054
    5155export const Value = styled(Typography).attrs({
    52     variant: 'h3'
     56  variant: 'h3',
    5357})`
    54     font-size: 1.25rem;
    55     font-weight: 600;
    56     margin-top: 5px;
     58  font-size: 1.25rem;
     59  font-weight: 600;
     60  margin-top: 5px;
    5761`;
    5862
    59 export const ProgressBar = styled(LineProgressBar).attrs(props => ({
    60     stripe: true,
    61     progressColor: props.theme.palette.primary.main,
    62     height: '30px',
     63export const ProgressBar = styled(LineProgressBar).attrs((props) => ({
     64  stripe: true,
     65  progressColor: props.theme.palette.primary.main,
     66  height: '30px',
    6367}))`
    64     position: absolute;
    65     bottom: 5px;
     68  position: absolute;
     69  bottom: 5px;
    6670`;
    6771
    6872export const ProgressBarLabel = styled.p`
    69     margin: 0 0 0 42.5%;
    70     line-height: 30px;
    71     position: absolute;
    72     font-weight: 500;
     73  margin: 0 0 0 42.5%;
     74  line-height: 30px;
     75  position: absolute;
     76  font-weight: 500;
    7377`;
  • sources/client/src/components/admin/ParkingZones/index.js

    re8b1076 rbc20307  
    1 import { useState } from 'react';
     1import { useState, useContext } from 'react';
    22import {
    3   FiltersWrapper,
    4   SortingArrowsWrapper,
    5   SortByTitle,
    6   ArrowDown,
    7   ArrowUp,
    8   ClearSortIcon,
    9   ParkingZonesWrapper,
    10   AddParkingZoneCard,
    11   AddIcon,
    12   AddItem,
    13   ParkingName,
    14   DividerUnderFilters,
     3    FiltersWrapper,
     4    SortingArrowsWrapper,
     5    SortByTitle,
     6    ArrowDown,
     7    ArrowUp,
     8    ClearSortIcon,
     9    ParkingZonesWrapper,
     10    AddParkingZoneCard,
     11    AddIcon,
     12    AddItem,
     13    ParkingName,
     14    DividerUnderFilters,
     15    ModalContainer,
     16    ModalTitle,
     17    ModalInputAndLabelWrapper,
     18    ModalInput,
     19    ModalInputLabel,
     20    ModalButton,
     21    ButtonWrapper,
     22    CloseIcon,
    1523} from './styles';
    1624
     25import AbsoluteLoader from '../../Loaders/AbsoluteLoader';
     26import Modal from '@mui/material/Modal';
     27import Backdrop from '@mui/material/Backdrop';
     28import { IconButton, Slide } from '@mui/material';
    1729import ParkingZoneCard from './ParkingZoneCard';
    1830
    1931import { roles } from '../../../config/enums';
     32import { UserContext } from '../../../context/UserContext';
     33import useGetData from '../../../hooks/useGetData';
     34import useCreateZone from '../../../hooks/useCreateZone';
    2035
    2136import { parkingZones } from './mockData';
    2237
    2338const sortDownUp = (a, b) => {
    24   const aPercent = a.takenParkingSpaces / a.parkingSpaces;
    25   const bPercent = b.takenParkingSpaces / b.parkingSpaces;
    26   if (aPercent > bPercent) {
    27     return 1;
    28   } else {
    29     if (aPercent < bPercent) {
    30       return -1;
     39    const aPercent = a.takenParkingSpaces / a.parkingSpacesNumber;
     40    const bPercent = b.takenParkingSpaces / b.parkingSpacesNumber;
     41    if (aPercent > bPercent) {
     42        return 1;
     43    } else {
     44        if (aPercent < bPercent) {
     45            return -1;
     46        }
     47        return a.zoneName - b.zoneName;
    3148    }
    32     return a.zoneName - b.zoneName;
    33   }
    3449};
    3550
    3651const sortUpDown = (a, b) => {
    37   const aPercent = a.takenParkingSpaces / a.parkingSpaces;
    38   const bPercent = b.takenParkingSpaces / b.parkingSpaces;
    39   if (aPercent > bPercent) {
     52    const aPercent = a.takenParkingSpaces / a.parkingSpacesNumber;
     53    const bPercent = b.takenParkingSpaces / b.parkingSpacesNumber;
     54    if (aPercent > bPercent) {
     55        return -1;
     56    } else {
     57        if (aPercent < bPercent) {
     58            return 1;
     59        }
     60        return a.zoneName - b.zoneName;
     61    }
     62};
     63
     64const sortByName = (a, b) => {
     65    if (a.zoneName >= b.zoneName) {
     66        return 1;
     67    }
    4068    return -1;
    41   } else {
    42     if (aPercent < bPercent) {
    43       return 1;
    44     }
    45     return a.zoneName - b.zoneName;
    46   }
    47 };
    48 
    49 const sortByName = (a, b) => {
    50   if (a.zoneName >= b.zoneName) {
    51     return 1;
    52   }
    53   return -1;
    5469};
    5570
    5671const ParkingZones = () => {
    57   const [isArrowUpUp, setIsArrowUpUp] = useState(false);
    58   const [isArrowDownUp, setIsArrowDownUp] = useState(false);
    59 
    60   const user = {
    61     role: 'ROLE_ADMIN',
    62   };
    63   const sortFunc = isArrowUpUp
    64     ? sortDownUp
    65     : isArrowDownUp
    66     ? sortUpDown
    67     : sortByName;
    68 
    69   return (
    70     <>
    71       <FiltersWrapper>
    72         <ParkingName>Паркинг - Дебар Маало</ParkingName>
    73         <SortingArrowsWrapper>
    74           <SortByTitle>Сортирај:</SortByTitle>
    75           <ArrowUp
    76             onClick={() => {
    77               if (!isArrowUpUp) {
    78                 setIsArrowUpUp(true);
    79                 setIsArrowDownUp(false);
    80               }
    81             }}
    82             selected={isArrowUpUp}
    83           />
    84           <ArrowDown
    85             onClick={() => {
    86               if (!isArrowDownUp) {
    87                 setIsArrowDownUp(true);
    88                 setIsArrowUpUp(false);
    89               }
    90             }}
    91             selected={isArrowDownUp}
    92           />
    93           {isArrowUpUp || isArrowDownUp ? (
    94             <ClearSortIcon
    95               onClick={() => {
    96                 setIsArrowUpUp(false);
    97                 setIsArrowDownUp(false);
    98               }}
    99             />
    100           ) : null}
    101         </SortingArrowsWrapper>
    102       </FiltersWrapper>
    103 
    104       <DividerUnderFilters />
    105 
    106       <ParkingZonesWrapper container spacing={{ xs: 3, md: 5 }}>
    107         {user.role === roles.admin ? (
    108           <AddParkingZoneCard item xs={11} sm={6} md={3}>
    109             <AddItem>
    110               <AddIcon />
    111             </AddItem>
    112           </AddParkingZoneCard>
    113         ) : null}
    114 
    115         {parkingZones.sort(sortFunc).map((parkingZone) => (
    116           <ParkingZoneCard key={parkingZone.id} info={parkingZone} />
    117         ))}
    118       </ParkingZonesWrapper>
    119     </>
    120   );
     72    const { user } = useContext(UserContext);
     73    const {
     74        data: zones,
     75        setData: setZones,
     76        isLoading: isLoadingZones,
     77    } = useGetData({
     78        url: '/parkingZone',
     79    });
     80    const { createZone, isLoading: isCreateZoneLoading } = useCreateZone();
     81    const [isArrowUpUp, setIsArrowUpUp] = useState(false);
     82    const [isArrowDownUp, setIsArrowDownUp] = useState(false);
     83    const [isModalOpen, setModalOpen] = useState(false);
     84    const [modalInput, setModalInput] = useState('');
     85    const sortFunc = isArrowUpUp
     86        ? sortDownUp
     87        : isArrowDownUp
     88        ? sortUpDown
     89        : sortByName;
     90
     91    const addNewZoneToData = (newZone) => {
     92        setZones([...zones, newZone]);
     93    };
     94    const handleCreateZone = () => {
     95        createZone({
     96            zoneName: modalInput,
     97            setModalInput,
     98            setModalOpen,
     99            addNewZoneToData,
     100        });
     101    };
     102
     103    return (
     104        <>
     105            <Modal
     106                open={isModalOpen}
     107                onClose={() => {
     108                    setModalInput('');
     109                    setModalOpen(false);
     110                }}
     111                closeAfterTransition
     112                BackdropComponent={Backdrop}
     113                BackdropProps={{
     114                    timeout: 500,
     115                }}
     116                style={{
     117                    display: 'flex',
     118                    alignItems: 'center',
     119                    justifyContent: 'center',
     120                }}
     121            >
     122                <Slide in={isModalOpen}>
     123                    <ModalContainer>
     124                        <IconButton
     125                            style={{
     126                                marginLeft: 345,
     127                            }}
     128                            onClick={() => {
     129                                setModalInput('');
     130                                setModalOpen(false);
     131                            }}
     132                        >
     133                            <CloseIcon />
     134                        </IconButton>
     135                        {isCreateZoneLoading ? (
     136                            <AbsoluteLoader
     137                                containerStyle={{
     138                                    width: '200px',
     139                                    height: '200px',
     140                                    margin: 'auto',
     141                                    marginTop: '30px',
     142                                }}
     143                            />
     144                        ) : (
     145                            <>
     146                                <ModalTitle>НОВА ЗОНА</ModalTitle>
     147                                <ModalInputAndLabelWrapper>
     148                                    <ModalInputLabel>
     149                                        Назив на Зона
     150                                    </ModalInputLabel>
     151                                    <ModalInput
     152                                        value={modalInput}
     153                                        onChange={(event) =>
     154                                            setModalInput(event.target.value)
     155                                        }
     156                                    />
     157                                </ModalInputAndLabelWrapper>
     158                                <ButtonWrapper>
     159                                    <ModalButton onClick={handleCreateZone}>
     160                                        Креирај Зона
     161                                    </ModalButton>
     162                                </ButtonWrapper>
     163                            </>
     164                        )}
     165                    </ModalContainer>
     166                </Slide>
     167            </Modal>
     168            <FiltersWrapper>
     169                <ParkingName>Паркинг - Дебар Маало</ParkingName>
     170                <SortingArrowsWrapper>
     171                    <SortByTitle>Сортирај:</SortByTitle>
     172                    <ArrowUp
     173                        onClick={() => {
     174                            if (!isArrowUpUp) {
     175                                setIsArrowUpUp(true);
     176                                setIsArrowDownUp(false);
     177                            }
     178                        }}
     179                        selected={isArrowUpUp}
     180                    />
     181                    <ArrowDown
     182                        onClick={() => {
     183                            if (!isArrowDownUp) {
     184                                setIsArrowDownUp(true);
     185                                setIsArrowUpUp(false);
     186                            }
     187                        }}
     188                        selected={isArrowDownUp}
     189                    />
     190                    {isArrowUpUp || isArrowDownUp ? (
     191                        <ClearSortIcon
     192                            onClick={() => {
     193                                setIsArrowUpUp(false);
     194                                setIsArrowDownUp(false);
     195                            }}
     196                        />
     197                    ) : null}
     198                </SortingArrowsWrapper>
     199            </FiltersWrapper>
     200
     201            <DividerUnderFilters />
     202
     203            <ParkingZonesWrapper container spacing={{ xs: 3, md: 5 }}>
     204                {isLoadingZones ? (
     205                    <AbsoluteLoader
     206                        containerStyle={{
     207                            width: '250px',
     208                            height: '250px',
     209                            margin: 'auto',
     210                            marginTop: '12vw',
     211                        }}
     212                    />
     213                ) : (
     214                    <>
     215                        {user.role === roles.admin ? (
     216                            <AddParkingZoneCard
     217                                item
     218                                xs={11}
     219                                sm={6}
     220                                md={3}
     221                                onClick={() => setModalOpen(true)}
     222                            >
     223                                <AddItem>
     224                                    <AddIcon />
     225                                </AddItem>
     226                            </AddParkingZoneCard>
     227                        ) : null}
     228
     229                        {zones.sort(sortFunc).map((parkingZone) => (
     230                            <ParkingZoneCard
     231                                key={parkingZone.id}
     232                                info={parkingZone}
     233                            />
     234                        ))}
     235                    </>
     236                )}
     237            </ParkingZonesWrapper>
     238        </>
     239    );
    121240};
    122241
  • sources/client/src/components/admin/ParkingZones/mockData.js

    re8b1076 rbc20307  
    11export const parkingZones = [
    2   {
    3     id: 1,
    4     zoneName: 'Zona 1',
    5     responsiblePersons: ['Viktor Tasevski', 'Dracevcanec'],
    6     parkingSpaces: 69,
    7     takenParkingSpaces: 34,
    8     areaColor: '#FFD700',
    9     location: {
    10       center: {
    11         lat: 41.937907,
    12         lng: 21.51213,
    13       },
    14       coords: [
    15         { lat: 41.937749, lng: 21.511095 },
    16         { lat: 41.936971, lng: 21.511534 },
    17         { lat: 41.93834, lng: 21.51407 },
    18         { lat: 41.939031, lng: 21.511914 },
    19       ],
     2    {
     3        id: 1,
     4        zoneName: 'Zona 1',
     5        responsiblePersons: ['Viktor Tasevski', 'David Trajkovski'], // THIS SHOULD BE IN THE ParkingZones Call Only for the Card. For the ZoneInfo We need More Data for The Employees. This should be array of employee objects.
     6        parkingSpacesNumber: 79,
     7        takenParkingSpaces: 34,
     8        hourlyRate: 30,
     9        workingHours: {
     10            from: 5,
     11            to: 24,
     12        },
     13        zoneColor: '#FFD700',
     14        location: {
     15            center: {
     16                lat: 42.000389,
     17                lng: 21.423084,
     18            },
     19            coords: [
     20                { lat: 42.00060867305611, lng: 21.424473984198578 },
     21                { lat: 42.001509615969574, lng: 21.421609384939654 },
     22                { lat: 41.99886654813535, lng: 21.42293439620515 },
     23            ],
     24        },
     25        parkingSpaces: [
     26            {
     27                lat: '42.00043725326595',
     28                lng: '21.42263398879119',
     29                parkingSpaceNumber: 'A21',
     30                isTaken: true,
     31            },
     32            {
     33                lat: '42.00028576562848',
     34                lng: '21.423680050318325',
     35                parkingSpaceNumber: 'A1',
     36                isTaken: false,
     37            },
     38            {
     39                lat: '41.99959609366812',
     40                lng: '21.423374278487316',
     41                parkingSpaceNumber: 'B55',
     42                isTaken: true,
     43            },
     44            {
     45                lat: '41.99962798617793',
     46                lng: '21.42275200598912',
     47                parkingSpaceNumber: 'C20',
     48                isTaken: false,
     49            },
     50        ],
    2051    },
    21     parkingSpacesLocation: [
    22       {
    23         lat: '41.938271',
    24         lng: '21.512380',
    25         parkingSpaceNumber: 'A21',
    26         free: true,
    27       },
    28       {
    29         lat: '41.938284',
    30         lng: '21.512387',
    31         parkingSpaceNumber: 'A1',
    32         free: false,
    33       },
    34       {
    35         lat: '41.938292',
    36         lng: '21.512365',
    37         parkingSpaceNumber: 'B55',
    38         free: true,
    39       },
    40       {
    41         lat: '41.938279',
    42         lng: '21.512359',
    43         parkingSpaceNumber: 'C20',
    44         free: false,
    45       },
    46     ],
    47   },
    48   {
    49     id: 2,
    50     zoneName: 'Zona 2',
    51     responsiblePersons: ['Andrej Tavcioski', 'Vlaevec', 'Skopjaniste'],
    52     parkingSpaces: 100,
    53     takenParkingSpaces: 99,
    54   },
    55   {
    56     id: 3,
    57     zoneName: 'Zona 3',
    58     responsiblePersons: ['David Trajkovski', 'Kumanovecot'],
    59     parkingSpaces: 36,
    60     takenParkingSpaces: 5,
    61   },
    62   {
    63     id: 4,
    64     zoneName: 'Zona 4',
    65     responsiblePersons: [
    66       'Nekoj od POC',
    67       'Nekoj drug od POC',
    68       'Nekoj tret od POC',
    69       'Nekoj cetvrt od POC',
    70     ],
    71     parkingSpaces: 150,
    72     takenParkingSpaces: 130,
    73   },
    74   {
    75     id: 5,
    76     zoneName: 'Zona 5',
    77     responsiblePersons: ['Nekoj od Silbo'],
    78     parkingSpaces: 360,
    79     takenParkingSpaces: 250,
    80   },
     52    {
     53        id: 2,
     54        zoneName: 'Zona 2',
     55        responsiblePersons: ['Andrej Tavcioski', 'David Trajkovski'], // THIS SHOULD BE IN THE ParkingZones Call Only for the Card. For the ZoneInfo We need More Data for The Employees. This should be array of employee objects.
     56        parkingSpacesNumber: 29,
     57        takenParkingSpaces: 14,
     58        hourlyRate: 30,
     59        workingHours: {
     60            from: 5,
     61            to: 24,
     62        },
     63        zoneColor: '#FF0000',
     64        location: {
     65            center: {
     66                lat: 42.001097017606455,
     67                lng: 21.421317024169447,
     68            },
     69            coords: [
     70                { lat: 42.00048708466677, lng: 21.42135993951415 },
     71                { lat: 42.0006784368066, lng: 21.421837372723967 },
     72                { lat: 42.00149765665009, lng: 21.42148332113017 },
     73                { lat: 42.00134218508192, lng: 21.42078862898779 },
     74            ],
     75        },
     76        parkingSpaces: [
     77            {
     78                lat: '42.00043725326595',
     79                lng: '21.42263398879119',
     80                parkingSpaceNumber: 'A21',
     81                isTaken: true,
     82            },
     83            {
     84                lat: '42.00028576562848',
     85                lng: '21.423680050318325',
     86                parkingSpaceNumber: 'A1',
     87                isTaken: false,
     88            },
     89            {
     90                lat: '41.99959609366812',
     91                lng: '21.423374278487316',
     92                parkingSpaceNumber: 'B55',
     93                isTaken: true,
     94            },
     95            {
     96                lat: '41.99962798617793',
     97                lng: '21.42275200598912',
     98                parkingSpaceNumber: 'C20',
     99                isTaken: false,
     100            },
     101        ],
     102    },
     103    {
     104        id: 3,
     105        zoneName: 'Zona 3',
     106        responsiblePersons: ['David Trajkovski', 'Kumanovecot'],
     107        parkingSpacesNumber: 36,
     108        takenParkingSpaces: 5,
     109        hourlyRate: 10,
     110        workingHours: '12:00 - 17:00',
     111    },
     112    {
     113        id: 4,
     114        zoneName: 'Zona 4',
     115        responsiblePersons: ['Nekoj od POC'],
     116        parkingSpacesNumber: 150,
     117        takenParkingSpaces: 130,
     118        hourlyRate: 100,
     119        workingHours: {
     120            from: '5',
     121            to: '24',
     122        },
     123    },
     124    {
     125        id: 5,
     126        zoneName: 'Zona 5',
     127        responsiblePersons: [],
     128        parkingSpacesNumber: 360,
     129        takenParkingSpaces: 250,
     130        hourlyRate: 30,
     131        workingHours: {
     132            from: '5',
     133            to: '24',
     134        },
     135    },
    81136];
  • sources/client/src/components/admin/ParkingZones/styles.js

    re8b1076 rbc20307  
    77import ClearIcon from '@mui/icons-material/Clear';
    88import { ParkingZoneWrapper, Container } from './ParkingZoneCard/styles';
     9import Box from '@mui/material/Box';
     10import Button from '@mui/material/Button';
     11import TextField from '@mui/material/TextField';
     12import CIcon from '@mui/icons-material/Close';
     13import { mobile_max_width } from '../../../config/utilities';
    914
    1015export const FiltersWrapper = styled.div`
    11   margin-bottom: 10px;
    12   text-align: center;
    13   display: flex;
    14   flex-direction: row;
    15   justify-content: space-between;
    16   align-items: center;
    17   padding: 10px 175px;
     16    margin-bottom: 10px;
     17    text-align: center;
     18    display: flex;
     19    flex-direction: row;
     20    justify-content: space-between;
     21    align-items: center;
     22    padding: 10px 10%;
     23
     24    @media (max-width: ${mobile_max_width}px) {
     25        flex-direction: column;
     26    }
    1827`;
    1928
    2029export const SortingArrowsWrapper = styled.div`
    21   display: flex;
    22   flex-direction: row;
    23   align-items: center;
    24   position: relative;
     30    display: flex;
     31    flex-direction: row;
     32    align-items: center;
     33    position: relative;
     34
     35    @media (max-width: ${mobile_max_width}px) {
     36        margin-top: 30px;
     37    }
    2538`;
    2639
    2740export const ArrowDown = styled(ArrowDownwardIcon).attrs({})`
    28   font-size: 2rem;
    29   color: ${(props) => (props.selected ? props.theme.palette.primary.main : '')};
    30   :hover {
    31     cursor: pointer;
    32     color: ${(props) => props.theme.palette.primary.main};
    33   }
     41    font-size: 2rem;
     42    color: ${(props) =>
     43        props.selected ? props.theme.palette.primary.main : ''};
     44    :hover {
     45        cursor: pointer;
     46        color: ${(props) => props.theme.palette.primary.main};
     47    }
    3448`;
    3549
    3650export const ArrowUp = styled(ArrowUpwardIcon).attrs({})`
    37   margin: 0 10px 0 15px;
    38   font-size: 2rem;
    39   color: ${(props) => (props.selected ? props.theme.palette.primary.main : '')};
    40   :hover {
    41     cursor: pointer;
    42     color: ${(props) => props.theme.palette.primary.main};
    43   }
     51    margin: 0 10px 0 15px;
     52    font-size: 2rem;
     53    color: ${(props) =>
     54        props.selected ? props.theme.palette.primary.main : ''};
     55    :hover {
     56        cursor: pointer;
     57        color: ${(props) => props.theme.palette.primary.main};
     58    }
    4459`;
    4560
    4661export const ClearSortIcon = styled(ClearIcon).attrs({})`
    47   color: ${(props) => props.theme.palette.error.main};
    48   position: absolute;
    49   right: 0;
    50   font-size: 2rem;
    51   right: -50px;
    52   :hover {
    53     cursor: pointer;
    54   }
     62    color: ${(props) => props.theme.palette.error.main};
     63    position: absolute;
     64    right: 0;
     65    font-size: 2rem;
     66    right: -50px;
     67    :hover {
     68        cursor: pointer;
     69    }
    5570`;
    5671
    5772export const DividerUnderFilters = styled(Divider).attrs({
    58   variant: 'middle',
    59   sx: {
    60     margin: '0 160px',
    61     borderWidth: '2px',
    62     borderBottomWidth: 'thin',
    63   },
     73    variant: 'middle',
     74    sx: {
     75        margin: '0 9%',
     76        borderWidth: '2px',
     77        borderBottomWidth: 'thin',
     78    },
    6479})``;
    6580
    6681export const SortByTitle = styled(Typography).attrs((props) => ({
    67   fontSize: '1rem',
    68   fontWeight: '600',
    69   margin: 0,
    70   color: `${props.theme.palette.primary.main}`,
     82    fontSize: '1rem',
     83    fontWeight: '600',
     84    margin: 0,
     85    color: `${props.theme.palette.primary.main}`,
    7186}))``;
    7287
    7388export const ParkingName = styled(Typography).attrs((props) => ({
    74   fontSize: '2rem',
    75   fontWeight: '600',
    76   margin: 0,
    77   color: `${props.theme.palette.primary.main}`,
     89    fontSize: '2rem',
     90    fontWeight: '600',
     91    margin: 0,
     92    color: `${props.theme.palette.primary.main}`,
    7893}))``;
    7994
    8095export const ParkingZonesWrapper = styled(Grid)`
    81   margin: 0;
    82   height: 100%;
    83   width: 100%;
    84   padding: 0 40px 0 0;
     96    margin: 0;
     97    height: 100%;
     98    width: 100%;
     99    padding: 0 40px 30px 0;
     100
     101    @media (max-width: ${mobile_max_width}px) {
     102        padding-right: 0;
     103        justify-content: center;
     104    }
    85105`;
    86106
     
    88108
    89109export const AddItem = styled(Container)`
    90   display: flex;
    91   align-items: center;
    92   justify-content: middle;
     110    display: flex;
     111    align-items: center;
     112    justify-content: middle;
    93113`;
    94114
    95115export const AddIcon = styled(Add).attrs({
    96   sx: {
    97     fontWeight: 500,
    98   },
     116    sx: {
     117        fontWeight: 500,
     118    },
    99119})`
    100   width: 100%;
    101   height: 100%;
    102   color: ${(props) => props.theme.palette.primary.main};
     120    width: 100%;
     121    height: 100%;
     122    color: ${(props) => props.theme.palette.primary.main};
    103123`;
     124
     125export const ModalContainer = styled(Box).attrs({
     126    width: 400,
     127    height: 366,
     128    bgcolor: 'background.paper',
     129    boxShadow: 24,
     130    zIndex: 1000,
     131    marginBottom: '10%',
     132})`
     133    padding-bottom: 16px;
     134`;
     135
     136export const ModalTitle = styled(Typography).attrs({
     137    variant: 'h4',
     138    fontWeight: 600,
     139    textAlign: 'center',
     140})``;
     141
     142export const ModalInputAndLabelWrapper = styled.div`
     143    text-align: center;
     144    padding: 0 20px;
     145    margin-top: 40px;
     146    margin-bottom: 70px;
     147`;
     148
     149export const ModalInputLabel = styled(Typography).attrs({
     150    variant: 'h6',
     151})``;
     152
     153export const ModalInput = styled(TextField).attrs({
     154    fullWidth: true,
     155    sx: {
     156        marginTop: '10px',
     157    },
     158})`
     159    fieldset {
     160        border: 0;
     161    }
     162    input {
     163        text-align: center;
     164        font-size: 1.1rem;
     165        font-weight: 500;
     166        padding: 15px 10px;
     167        border: 2px solid ${(props) => props.theme.palette.primary.main};
     168
     169        :focus {
     170            border: 2px dashed ${(props) => props.theme.palette.primary.main};
     171        }
     172    }
     173`;
     174
     175export const ButtonWrapper = styled.div`
     176    width: 100%;
     177    text-align: center;
     178`;
     179
     180export const ModalButton = styled(Button).attrs((props) => ({
     181    variant: 'contained',
     182    size: 'large',
     183    sx: {
     184        backgroundColor: `${props.theme.palette.primary.main}`,
     185    },
     186}))`
     187    :hover {
     188        background-color: ${(props) => props.theme.palette.primary.dark};
     189    }
     190`;
     191
     192export const CloseIcon = styled(CIcon).attrs({
     193    sx: {
     194        color: 'red',
     195        fontSize: '2.5rem',
     196    },
     197})``;
Note: See TracChangeset for help on using the changeset viewer.