Passed
Push — development ( 8e8ffd...1af938 )
by Peter
18:46 queued 06:25
created

frontend/src/pages/admin/AllZones.tsx   A

Complexity

Total Complexity 11
Complexity/F 11

Size

Lines of Code 116
Function Count 1

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 37.93%

Importance

Changes 0
Metric Value
eloc 80
dl 0
loc 116
ccs 11
cts 29
cp 0.3793
rs 10
c 0
b 0
f 0
wmc 11
mnd 10
bc 10
fnc 1
bpm 10
cpm 11
noi 0

1 Function

Rating   Name   Duplication   Size   Complexity  
D AllZones.tsx ➔ AllZones 0 103 11
1
2
import { useState } from 'react';
3
4
import { API_URL } from '../../helpers/config';
5
import axios from 'axios';
6
import { Zone, Scooter } from '../../helpers/map/leaflet-types'
7
8
import { Label, Select, Button, Badge } from "flowbite-react";
9
import Map from '../../components/Map';
10
import ZoneTables from '../../components/ZoneTables';
11
import AdminGate from '../../components/AdminGate';
12
13
export default function AllZones() {
14 1
    const [city, setCity] = useState("Välj stad");
15 1
    const [zoneDataParking, setZoneDataParking] = useState<Zone[]>();
16 1
    const [zoneDataLoading, setZoneDataLoading] = useState<Zone[]>();
17 1
    const [zoneDataTotal, setZoneDataTotal] = useState<Zone[]>();
18 1
    const [bikeTotal, setBikeTotal] = useState<Scooter[]>();
19 1
    const [stadTitel, setStadTitel] = useState("");
20
21 1
    const changeCity = (e: React.ChangeEvent<HTMLSelectElement>)=> {
22
        const selectedCity = e.target.value as "Göteborg" | "Jönköping" | "Karlshamn";
23 5
        if (selectedCity === "Göteborg" || selectedCity === "Jönköping" || selectedCity === "Karlshamn") {
24
            setCity(selectedCity);
25
        }
26
    }
27
28 1
    const loadZoneData = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
29
        e.preventDefault();
30
        try
31
        {
32
            const responseParking = await axios.get(`${API_URL}/zone?type=parking&includes=bikes&city=${city}`);
33
            const responseLoading = await axios.get(`${API_URL}/zone?type=charging&includes=bikes&city=${city}`);
34
            setZoneDataLoading(responseLoading.data.zones);
35
            setZoneDataParking(responseParking.data.zones);
36
            const totalZones = responseLoading.data?.zones?.concat(responseParking.data?.zones);
37
            setZoneDataTotal(totalZones);
38
            let bikes: Scooter[] = [];
39
            totalZones.map((zone: Zone) => {
40 2
                if (zone.bikes) {
41
                    bikes = bikes.concat(zone.bikes); // Lägg till bikes om de finns
42
                }
43
            });
44
            setBikeTotal(bikes);
45
            setStadTitel(city);
46
47
        } catch (error)
48
        {
49
            console.log(error);
50
        }
51
52
    }
53
54 1
    return (
55
            <div data-testid="allzones">
56
                <AdminGate/>
57
                <div className="flex justify-center items-center space-x-4">
58
                    <div className="mb-2 block">
59
                        <Label htmlFor="stad" value="Välj stad" />
60
                    </div>
61
                    <div className="mb-2 block">
62
                        <Select id="stad" value={city} onChange={(e) => changeCity(e)} required>
63
                        {city === "Välj stad" && <option value="Välj stad">Välj stad</option>}
64
                        <option>Göteborg</option>
65
                        <option>Jönköping</option>
66
                        <option>Karlshamn</option>
67
                        </Select>
68
                    </div>
69
70
                    <div className="mb-2 block">
71
                        <Button disabled={city === "Välj stad"} onClick={(e) => loadZoneData(e)}>
72
                        Tryck för att ladda zoner/cyklar
73
                        </Button>
74
                    </div>
75
                </div>
76
                <Map city={city} zoneData={zoneDataTotal ?? []} scooterData={bikeTotal ?? []}/>
77
                <div className="w-full text-center my-4">
78
                    <h1 className="text-3xl font-bold">Parkeringszoner i {stadTitel}</h1>
79
                    <ZoneTables zoneData={zoneDataParking}/>
80
                    {/* {
81
                        zoneDataParking?.map((zone: Zone) => (
82
                            <div key={zone.id}>
83
84
                            <div  className="flex flex-wrap items-center gap-4 p-4 mb-4 bg-gray-50 rounded-lg shadow">
85
                                <Badge color="info"><span className="font-bold text-xl">Name: {zone.name}</span></Badge>
86
                                <Badge color="success"><span className="font-bold text-xl">id: {zone.id}</span></Badge>
87
                                <Badge color="info"><span className="font-bold text-xl">Type: {zone.type}</span></Badge>
88
                                <Badge color="warning"><span className="font-bold text-xl">Number of bikes: {zone.bikes?.length}</span></Badge>
89
90
                            </div>
91
                            <ZoneTable zone={zone}/>
92
                        </div>))
93
                    } */}
94
                </div>
95
                <div className="w-full text-center my-4">
96
                    <h1 className="text-3xl font-bold">Laddzoner i {stadTitel}</h1>
97
                    <ZoneTables zoneData={zoneDataLoading}/>
98
                    {/* {
99
                        zoneDataLoading?.map((zone: Zone) => (
100
                            <div key={zone.id}>
101
102
                            <div className="flex flex-wrap items-center gap-4 p-4 mb-4 bg-gray-50 rounded-lg shadow">
103
                                <Badge color="info"><span className="font-bold text-xl">Name: {zone.name}</span></Badge>
104
                                <Badge color="success"><span className="font-bold text-xl">id: {zone.id}</span></Badge>
105
                                <Badge color="info"><span className="font-bold text-xl">Type: {zone.type}</span></Badge>
106
                                <Badge color="warning"><span className="font-bold text-xl">Number of bikes: {zone.bikes?.length}</span></Badge>
107
                            </div>
108
                            <ZoneTable zone={zone}/>
109
                        </div>))
110
                        } */}
111
                </div>
112
113
114
            </div>
115
    );
116
};
117