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
|