Projekt

Obecné

Profil

Stáhnout (2.21 KB) Statistiky
| Větev: | Tag: | Revize:
1 91fd3fa6 Vaclav Honzik
// Business logic for tracking tool
2
3 812b9f90 Vaclav Honzik
import { CatalogItemDto, PathDto } from '../../../swagger/data-contracts'
4
import generateUuid from '../../../utils/id/uuidGenerator'
5 91fd3fa6 Vaclav Honzik
6
// For more comprehensive code alias CatalogItemDto[] as path variant
7 de12c6be Vaclav Honzik
export type PathVariant = MapPoint[]
8 91fd3fa6 Vaclav Honzik
9 812b9f90 Vaclav Honzik
export enum MapPointType {
10
    LocalCatalog, // Fetched from local catalog
11
    ExternalCatalog, // Fetched from external catalog
12
    GeoJson, // From GeoJSON file
13
    FromCoordinates, // From coordinates
14
}
15
16
// Represents a point on the map - wrapper for CatalogItemDto to make it easier to work with
17 a7ae217f Vaclav Honzik
export interface MapPoint {
18 812b9f90 Vaclav Honzik
    id: string // unique id for react
19 a7ae217f Vaclav Honzik
    idx: number,
20 f41a4cd3 Vaclav Honzik
    addToPath: boolean, // whether to add the point to the path
21 a7ae217f Vaclav Honzik
    catalogItem: CatalogItemDto,
22 812b9f90 Vaclav Honzik
    type: MapPointType
23 f41a4cd3 Vaclav Honzik
    hidden?: boolean // if true the point will not be displayed on the map
24 de12c6be Vaclav Honzik
}
25
26 a7ae217f Vaclav Honzik
export const isMapPointDisplayable = (mapPoint: MapPoint): boolean =>
27 f41a4cd3 Vaclav Honzik
    !!mapPoint.catalogItem.latitude && !!mapPoint.catalogItem.longitude && !mapPoint.hidden
28 a7ae217f Vaclav Honzik
29 de12c6be Vaclav Honzik
/**
30
 * Cartesian product of two arrays
31
 * @param sets
32
 * @returns
33
 */
34 91fd3fa6 Vaclav Honzik
const cartesianProduct = (sets: CatalogItemDto[][]): CatalogItemDto[][] =>
35
    sets.reduce<CatalogItemDto[][]>(
36
        (results, ids) =>
37
            results
38
                .map((result) => ids.map((id) => [...result, id]))
39
                .reduce((nested, result) => [...nested, ...result]),
40
        [[]]
41
    )
42
43 de12c6be Vaclav Honzik
/**
44
 * Builds a list of all possible path variants from pathDto
45
 * @param pathDto
46
 * @returns
47
 */
48 812b9f90 Vaclav Honzik
export const buildPathVariants = (pathDto: PathDto, mapPointType: MapPointType = MapPointType.LocalCatalog): PathVariant[] => {
49 91fd3fa6 Vaclav Honzik
    if (!pathDto.foundCatalogItems) {
50
        return []
51
    }
52
53 de12c6be Vaclav Honzik
    return (
54
        pathDto.foundCatalogItems.length === 1
55
            ? pathDto.foundCatalogItems
56
            : cartesianProduct(pathDto.foundCatalogItems)
57
    ).map((variant, _) =>
58
        variant.map(
59 a7ae217f Vaclav Honzik
            (catalogItem, idx) => (
60
                {
61 812b9f90 Vaclav Honzik
                    id: generateUuid(),
62 de12c6be Vaclav Honzik
                    idx,
63 f41a4cd3 Vaclav Honzik
                    addToPath: !!catalogItem.latitude && !!catalogItem.longitude,
64 812b9f90 Vaclav Honzik
                    catalogItem,
65
                    type: mapPointType,
66 f41a4cd3 Vaclav Honzik
                } as MapPoint)
67 de12c6be Vaclav Honzik
        )
68
    )
69 91fd3fa6 Vaclav Honzik
}
70
71
export default buildPathVariants