• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mendersoftware / gui / 913068613

pending completion
913068613

Pull #3803

gitlab-ci

web-flow
Merge pull request #3801 from mzedel/men-6383

MEN-6383 - device check in time
Pull Request #3803: staging alignment

4418 of 6435 branches covered (68.66%)

178 of 246 new or added lines in 27 files covered. (72.36%)

8352 of 10138 relevant lines covered (82.38%)

160.95 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.0
/src/js/components/dashboard/widgets/mapwidget.js
1
// Copyright 2023 Northern.tech AS
2
//
3
//    Licensed under the Apache License, Version 2.0 (the "License");
4
//    you may not use this file except in compliance with the License.
5
//    You may obtain a copy of the License at
6
//
7
//        http://www.apache.org/licenses/LICENSE-2.0
8
//
9
//    Unless required by applicable law or agreed to in writing, software
10
//    distributed under the License is distributed on an "AS IS" BASIS,
11
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//    See the License for the specific language governing permissions and
13
//    limitations under the License.
14
import React, { useEffect, useMemo, useState } from 'react';
15

16
import { MenuItem, Select } from '@mui/material';
17

18
import Leaflet from 'leaflet';
19

20
import { geoAttributes } from '../../../actions/deviceActions';
21
import { MAX_PAGE_SIZE } from '../../../api/general-api';
22
import { ALL_DEVICES } from '../../../constants/deviceConstants';
23
import Map from './map';
24

25
const fallbackCenter = [59.913333, 10.738889];
5✔
26

27
const MapWrapper = ({ groups, groupNames, devicesById, getGroupDevices, getDevicesInBounds }) => {
5✔
28
  const [group, setGroup] = useState(ALL_DEVICES);
2✔
29
  const [bounds, setBounds] = useState();
2✔
30
  const [items, setItems] = useState([]);
2✔
31

32
  useEffect(() => {
2✔
33
    if (groupNames.length && !groupNames.includes(ALL_DEVICES)) {
1!
NEW
34
      setGroup(groupNames[0]);
×
35
    }
36
  }, [groupNames.join('')]);
37

38
  useEffect(() => {
2✔
39
    if (!bounds) {
1!
40
      getGroupDevices(group, { perPage: MAX_PAGE_SIZE, selectedAttributes: geoAttributes });
1✔
41
      return;
1✔
42
    }
NEW
43
    getDevicesInBounds(bounds, group);
×
44
  }, [group, JSON.stringify(bounds)]);
45

46
  const deviceIds = group !== ALL_DEVICES ? groups[group].deviceIds : Object.keys(devicesById);
2!
47
  useEffect(() => {
2✔
48
    const items = deviceIds.reduce((accu, id) => {
1✔
49
      const device = devicesById[id];
3✔
50
      const { attributes = {} } = device;
3!
51
      if (attributes['geo-lat']) {
3!
NEW
52
        accu.push({ device, position: [attributes['geo-lat'], attributes['geo-lon']] });
×
53
      }
54
      return accu;
3✔
55
    }, []);
56
    setItems(items);
1✔
57
  }, [deviceIds.join('')]);
58

59
  const boundaries = useMemo(() => {
2✔
60
    if (!items.length) {
1!
61
      return;
1✔
62
    }
NEW
63
    const boundaries = items.reduce((accu, { position }) => {
×
NEW
64
      accu.push(position);
×
NEW
65
      return accu;
×
66
    }, []);
NEW
67
    return Leaflet.latLngBounds(boundaries);
×
68
  }, [JSON.stringify(items)]);
69

70
  const onGroupSelect = ({ target: { value } }) => {
2✔
NEW
71
    setBounds();
×
NEW
72
    setGroup(value);
×
73
  };
74

75
  const mapProps = boundaries ? { bounds: boundaries } : { center: fallbackCenter, zoom: 10 };
2!
76

77
  return (
2✔
78
    <span>
79
      <div className="flexbox center-aligned space-between">
80
        <h4>Device locations</h4>
81
        <Select labelId="group-selection-label" onChange={onGroupSelect} value={group}>
82
          {groupNames.map(item => (
83
            <MenuItem key={item} value={item}>
6✔
84
              {item}
85
            </MenuItem>
86
          ))}
87
        </Select>
88
      </div>
89
      <Map items={items} mapProps={mapProps} onMapMoved={setBounds} />
90
    </span>
91
  );
92
};
93

94
export default MapWrapper;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc