Begining to implement a GPX Dialog component
This commit is contained in:
1 parent
31bec02496
commit
59faede004
11 files changed
+742
-108
No files matched your search
@@ -0,0 +1,7 @@
|
||||
.control {
|
||||
opacity: 1;
|
||||
position: fixed !important;
|
||||
top: 0px;
|
||||
margin-left: calc(100% - 150px) !important;
|
||||
z-index: 1;
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
import { useI18n } from '@solid-primitives/i18n';
|
||||
import { OpenInBrowserTwoTone } from '@suid/icons-material';
|
||||
import {
|
||||
Box,
|
||||
FormControl,
|
||||
IconButton,
|
||||
InputLabel,
|
||||
MenuItem,
|
||||
NativeSelect,
|
||||
SvgIcon,
|
||||
TextField,
|
||||
} from '@suid/material';
|
||||
import { Component, createSignal, For } from 'solid-js';
|
||||
import dispatch from '../../workers/dispatcher-main';
|
||||
import Dialog from '../dialog';
|
||||
//import GpxesIcon from '../../icons/adventure-journey-location-svgrepo-com.svg';
|
||||
import style from './GpxDialog.module.css';
|
||||
|
||||
const GpxChooser: Component<{}> = (props) => {
|
||||
const [t] = useI18n();
|
||||
const [open, setOpen] = createSignal(false);
|
||||
const [allGpxes, setAllGpxes] = createSignal<any[]>([]);
|
||||
|
||||
const handleClickOpen = async () => {
|
||||
setOpen(true);
|
||||
const newAllGpxes: any[] = await dispatch({
|
||||
action: 'getAllGpxesWithSummary',
|
||||
});
|
||||
setAllGpxes(newAllGpxes);
|
||||
};
|
||||
const handleClose = () => {
|
||||
setOpen(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div class={style.control}>
|
||||
<IconButton onClick={handleClickOpen}>
|
||||
<SvgIcon>
|
||||
<svg
|
||||
viewBox='0 0 170 170'
|
||||
width='64px'
|
||||
height='64px'
|
||||
version='1.1'
|
||||
style='stroke-width: 1%; stroke:black'
|
||||
xml:space='preserve'
|
||||
xmlns='http://www.w3.org/2000/svg'
|
||||
xmlns:xlink='http://www.w3.org/1999/xlink'
|
||||
>
|
||||
<g>
|
||||
<path d='M63.5,16c-0.3-0.2-0.7-0.3-1-0.1l-20.4,7.3l-14.3-5.2c0.8-2,1.2-3.8,1.2-5.3c0-2.7-1-5.1-2.9-7c-1.9-1.9-4.4-2.9-7-2.9 c-5.5,0-9.9,4.4-9.9,9.9c0,1.9,0.7,4.2,1.9,7L0.7,23.2c-0.4,0.2-0.7,0.6-0.7,1v36c0,0.4,0.2,0.7,0.5,0.9c0.2,0.1,0.4,0.2,0.6,0.2 c0.1,0,0.3,0,0.4-0.1L21.9,54l19.8,7.3c0.2,0.1,0.5,0.1,0.7,0l20.8-7.4c0.4-0.2,0.7-0.6,0.7-1v-36C64,16.5,63.8,16.2,63.5,16z M19.1,4.8c2.1,0,4,0.8,5.4,2.3c0,0,0,0,0,0c1.5,1.4,2.3,3.4,2.3,5.4c0,1.4-0.5,3.3-1.5,5.5c-1.8,4-4.8,8.2-6.2,10.1 c-0.2-0.2-0.3-0.4-0.5-0.7c-1.3-1.8-3.4-4.8-4.9-7.9c-1.5-2.9-2.2-5.3-2.2-7.1C11.4,8.3,14.9,4.8,19.1,4.8z M61.8,52.1l-19.7,7 l-19.8-7.3c-0.1,0-0.3-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1L2.2,58.7V25l10-3.5c0,0,0,0,0,0.1c0.1,0.1,0.1,0.2,0.2,0.3 c0.1,0.2,0.2,0.4,0.3,0.6c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.4,0.3,0.6c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.4,0.3,0.5 c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3 c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.2c0.1,0.2,0.2,0.3,0.3,0.4 c0,0.1,0.1,0.1,0.1,0.2c0.1,0.2,0.2,0.3,0.3,0.4c0,0,0.1,0.1,0.1,0.1c0.1,0.1,0.2,0.3,0.3,0.4c0,0,0.1,0.1,0.1,0.1 c0.1,0.1,0.2,0.3,0.3,0.4c0,0,0,0,0,0c0.1,0.1,0.2,0.2,0.3,0.3c0,0,0,0,0,0c0.2,0.3,0.4,0.5,0.4,0.6c0.2,0.3,0.5,0.4,0.9,0.4 c0.3,0,0.6-0.2,0.9-0.4c0,0,0.1-0.1,0.3-0.3c0,0,0.1-0.1,0.1-0.1c0.1-0.1,0.1-0.1,0.2-0.2c0,0,0.1-0.1,0.1-0.1 c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.1,0.1-0.2c0.1-0.1,0.2-0.2,0.2-0.3c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.4 c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.4c0.1-0.1,0.2-0.2,0.2-0.3c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.1,0.2-0.3,0.3-0.4 c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.2-0.3,0.3-0.5 c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5 c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.4,0.3-0.5c0.1-0.2,0.2-0.3,0.2-0.5c0,0,0,0,0-0.1l14.8,5.4 c0.2,0.1,0.5,0.1,0.7,0l19.3-6.9V52.1z' />
|
||||
<path d='M52.5,42.4c0.2,0.1,0.5,0.1,0.7,0.1c0.6,0,1.2-0.2,1.7-0.5c0.7-0.5,1.2-1.2,1.4-2c0.2-0.8,0-1.7-0.4-2.4 c-0.5-0.7-1.2-1.2-2-1.4c-1.7-0.4-3.5,0.7-3.9,2.4v0c-0.2,0.8,0,1.7,0.4,2.4C51,41.7,51.7,42.2,52.5,42.4z M52.2,39 c0.1-0.6,0.7-0.9,1.2-0.8c0.3,0.1,0.5,0.2,0.6,0.5c0.1,0.2,0.2,0.5,0.1,0.8c-0.1,0.3-0.2,0.5-0.5,0.6c-0.2,0.1-0.5,0.2-0.8,0.1 c-0.3-0.1-0.5-0.2-0.6-0.5C52.2,39.5,52.2,39.3,52.2,39z' />
|
||||
<path d='M11,39.1l-0.7,0.4l-0.4-0.7c-0.3-0.5-1-0.7-1.5-0.3c-0.5,0.3-0.7,1-0.3,1.5l0.4,0.7l-0.7,0.4c-0.5,0.3-0.7,1-0.3,1.5 C7.6,43,8,43.1,8.3,43.1c0.2,0,0.4-0.1,0.6-0.2l0.7-0.4l0.4,0.7c0.2,0.3,0.6,0.5,0.9,0.5c0.2,0,0.4-0.1,0.6-0.2 c0.5-0.3,0.7-1,0.3-1.5l-0.4-0.7l0.7-0.4c0.5-0.3,0.7-1,0.3-1.5C12.2,38.9,11.5,38.8,11,39.1z' />
|
||||
<path d='M21.3,42.1c-1.3,0-3-0.2-4.1-0.5c-0.6-0.1-1.2,0.3-1.3,0.9c-0.1,0.6,0.3,1.2,0.9,1.3c1.1,0.2,2.9,0.5,4.5,0.5c0,0,0,0,0,0 c0.6,0,1.1-0.5,1.1-1.1C22.4,42.6,21.9,42.1,21.3,42.1z' />
|
||||
<path d='M29.5,38.3c-0.7,1-1.5,1.8-2.5,2.4c-0.3,0.2-0.7,0.4-1.1,0.6c-0.6,0.2-0.8,0.9-0.6,1.5c0.2,0.4,0.6,0.7,1,0.7 c0.1,0,0.3,0,0.4-0.1c0.5-0.2,0.9-0.4,1.3-0.7c1.2-0.8,2.2-1.7,3.1-2.9c0.4-0.5,0.3-1.2-0.2-1.5C30.6,37.7,29.9,37.8,29.5,38.3z' />
|
||||
<path d='M37.5,31.1c-1.1,0-1.7,0.3-2.3,0.5c-1.4,0.6-2.6,1.9-2.9,2.3c-0.4,0.5-0.3,1.2,0.1,1.6c0.2,0.2,0.5,0.3,0.7,0.3 c0.3,0,0.6-0.1,0.8-0.4c0.5-0.6,1.3-1.3,2.1-1.7c0.6-0.2,0.8-0.3,1.5-0.4c0.6,0,1.1-0.5,1.1-1.1C38.6,31.6,38.1,31.1,37.5,31.1z' />
|
||||
<path d='M41.6,32.8c-0.2,0.6,0,1.2,0.6,1.5c1.1,0.5,2.7,1.3,3.9,2.2c0.2,0.1,0.4,0.2,0.6,0.2c0.4,0,0.7-0.2,0.9-0.5 c0.3-0.5,0.2-1.2-0.3-1.5c-1.4-0.9-3-1.8-4.3-2.3C42.5,32,41.9,32.3,41.6,32.8z' />
|
||||
<path d='M19.1,15.2c1.9,0,3.4-1.5,3.4-3.4S21,8.4,19.1,8.4c-1.9,0-3.4,1.5-3.4,3.4S17.3,15.2,19.1,15.2z M19.1,10.6 c0.6,0,1.2,0.5,1.2,1.2c0,0.6-0.5,1.2-1.2,1.2c-0.6,0-1.2-0.5-1.2-1.2C18,11.2,18.5,10.6,19.1,10.6z' />
|
||||
</g>
|
||||
</svg>
|
||||
</SvgIcon>
|
||||
</IconButton>
|
||||
</div>
|
||||
<Dialog open={open()} title={t('gpxDialog')} closeHandler={handleClose}>
|
||||
<Box
|
||||
component='form'
|
||||
sx={{
|
||||
width: '100%',
|
||||
'& .MuiTextField-root': { m: 1, width: '25ch' },
|
||||
paddingTop: '5px',
|
||||
}}
|
||||
>
|
||||
<FormControl fullWidth>
|
||||
<InputLabel variant='normal' htmlFor='gpx-chooser'>
|
||||
{t('gpxChooser')}
|
||||
</InputLabel>
|
||||
<NativeSelect
|
||||
defaultValue={30}
|
||||
inputProps={{
|
||||
name: 'gpx-chooser',
|
||||
id: 'gpx-chooser',
|
||||
}}
|
||||
>
|
||||
<For each={allGpxes()}>
|
||||
{(gpx) => (
|
||||
<option value={gpx.id}>{`${gpx.name || ''} (${
|
||||
gpx.creator
|
||||
})`}</option>
|
||||
)}
|
||||
</For>
|
||||
</NativeSelect>
|
||||
</FormControl>
|
||||
</Box>
|
||||
</Dialog>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default GpxChooser;
|
||||
@@ -0,0 +1 @@
|
||||
export { default } from './GpxDialog';
|
||||
@@ -1,6 +1,17 @@
|
||||
import { useI18n } from '@solid-primitives/i18n';
|
||||
import { Grid, Typography } from '@suid/material';
|
||||
import { Component, createSignal, Show } from 'solid-js';
|
||||
import {
|
||||
FormControlLabel,
|
||||
Grid,
|
||||
Typography,
|
||||
Switch,
|
||||
FormGroup,
|
||||
RadioGroup,
|
||||
Radio,
|
||||
Divider,
|
||||
FormControl,
|
||||
FormLabel,
|
||||
} from '@suid/material';
|
||||
import { Component, createEffect, createSignal, Show } from 'solid-js';
|
||||
import { findStartTime } from '../../lib/gpx';
|
||||
import GPX from '../../lib/gpx-parser-builder/src/gpx';
|
||||
|
||||
@@ -8,6 +19,11 @@ interface Props {
|
||||
gpxFile: File;
|
||||
}
|
||||
|
||||
interface StatsAndGpx {
|
||||
gpx: Gpx;
|
||||
stats: any;
|
||||
}
|
||||
|
||||
const analyzeGpx = (gpx: Gpx | undefined) => {
|
||||
if (gpx === undefined) {
|
||||
return {};
|
||||
@@ -17,13 +33,21 @@ const analyzeGpx = (gpx: Gpx | undefined) => {
|
||||
nbWpts: gpx.wpt ? gpx.wpt?.length : 0,
|
||||
nbRtes: gpx.rte ? gpx.rte?.length : 0,
|
||||
nbTrks: gpx.trk ? gpx.trk?.length : 0,
|
||||
trkMaybeRte:
|
||||
gpx.trk &&
|
||||
gpx.trk[0].trkseg &&
|
||||
gpx.trk[0].trkseg[0] &&
|
||||
gpx.trk[0].trkseg[0].trkpt &&
|
||||
!gpx.trk[0].trkseg[0].trkpt[0].time,
|
||||
startTime: findStartTime(gpx),
|
||||
};
|
||||
|
||||
return stats;
|
||||
};
|
||||
|
||||
const GpxImportSingleFile: Component<Props> = ({ gpxFile }) => {
|
||||
const [t] = useI18n();
|
||||
const [gpx, setGpx] = createSignal<Gpx>();
|
||||
const [statsAndGpx, setStatsAndGpx] = createSignal<StatsAndGpx>();
|
||||
|
||||
const gpxReader = new FileReader();
|
||||
gpxReader.readAsText(gpxFile);
|
||||
@@ -39,7 +63,7 @@ const GpxImportSingleFile: Component<Props> = ({ gpxFile }) => {
|
||||
});
|
||||
const gpx = GPX.parse(gpxReader.result);
|
||||
console.log({ caller: 'GpxImportSingleFile / JSON', gpxFile, gpx });
|
||||
setGpx(gpx);
|
||||
setStatsAndGpx({ gpx, stats: analyzeGpx(gpx) });
|
||||
// if (gpx) {
|
||||
// const startTime = new Date(findStartTime(gpx)!);
|
||||
// }
|
||||
@@ -47,7 +71,22 @@ const GpxImportSingleFile: Component<Props> = ({ gpxFile }) => {
|
||||
false
|
||||
);
|
||||
|
||||
const stats = analyzeGpx(gpx());
|
||||
const [selectedTrkTransform, setSelectedTrkTransform] = createSignal(
|
||||
'importNonTimedTrksAsRtes'
|
||||
);
|
||||
|
||||
const handleTrkTransformChange = (event: any) => {
|
||||
setSelectedTrkTransform(event.target.value);
|
||||
};
|
||||
|
||||
const controlTrkTransformProps = (item: string) => ({
|
||||
checked: selectedTrkTransform() === item,
|
||||
onChange: handleTrkTransformChange,
|
||||
value: item,
|
||||
name: 'trkTransform',
|
||||
label: t(item),
|
||||
inputProps: { 'aria-label': item },
|
||||
});
|
||||
|
||||
return (
|
||||
<Grid container spacing={2}>
|
||||
@@ -57,12 +96,41 @@ const GpxImportSingleFile: Component<Props> = ({ gpxFile }) => {
|
||||
{gpxFile.name}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Show when={gpx() !== undefined}>
|
||||
<Show when={statsAndGpx() !== undefined}>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant='body1'>
|
||||
{t('gpxStats', analyzeGpx(gpx()))}
|
||||
{t('gpxStats', statsAndGpx().stats)}{' '}
|
||||
{statsAndGpx()?.stats.startTime
|
||||
? t('gpxStartTime', statsAndGpx().stats)
|
||||
: t('gpxNoStartTime')}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Show when={statsAndGpx().stats.trkMaybeRte}>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant='body1'>{t('trkMaybeRte')}</Typography>
|
||||
</Grid>
|
||||
</Show>
|
||||
<Show when={statsAndGpx().stats.nbTrks > 0}>
|
||||
<Grid item xs={12}>
|
||||
<FormControl>
|
||||
<FormLabel>{t('importTrk')}</FormLabel>
|
||||
<RadioGroup>
|
||||
<FormControlLabel
|
||||
control={<Radio color='success' />}
|
||||
{...controlTrkTransformProps('importNonTimedTrksAsRtes')}
|
||||
/>
|
||||
<FormControlLabel
|
||||
control={<Radio color='secondary' />}
|
||||
{...controlTrkTransformProps('importAllTrksAsRtes')}
|
||||
/>
|
||||
<FormControlLabel
|
||||
control={<Radio color='error' />}
|
||||
{...controlTrkTransformProps('importTrksAsTrks')}
|
||||
/>
|
||||
</RadioGroup>
|
||||
</FormControl>
|
||||
</Grid>
|
||||
</Show>
|
||||
</Show>
|
||||
</Grid>
|
||||
);
|
||||
|
||||
@@ -35,6 +35,7 @@ import KeyboardZoom from 'ol/interaction/KeyboardZoom';
|
||||
import MouseWheelZoom from 'ol/interaction/MouseWheelZoom';
|
||||
import DragZoom from 'ol/interaction/DragZoom';
|
||||
import Infos, { clickHandler } from '../infos';
|
||||
import GpxDialog from '../gpx-dialog';
|
||||
|
||||
const [getState, setState] = createSignal({
|
||||
lon: 0,
|
||||
@@ -204,6 +205,7 @@ const Map: Component = () => {
|
||||
<Back />
|
||||
<GpxImport />
|
||||
<MapTileProvider />
|
||||
<GpxDialog />
|
||||
<AllGpxes map={getMap} />
|
||||
<Infos />
|
||||
</div>
|
||||
|
||||
@@ -214,6 +214,23 @@ export const getAllGpxes = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
export const getAllGpxesWithSummary = async () => {
|
||||
const allGpxes = await getAllGpxes();
|
||||
const result = await Promise.all(
|
||||
allGpxes.map(async (id: string) => {
|
||||
const gpxDoc = await get(id);
|
||||
// console.log({ caller: 'getAllGpxesWithSummary', gpx: gpxDoc });
|
||||
return {
|
||||
id,
|
||||
name: gpxDoc.doc.metadata?.name,
|
||||
creator: gpxDoc.doc.$?.creator,
|
||||
};
|
||||
})
|
||||
);
|
||||
console.log({ caller: 'getAllGpxesWithSummary', result });
|
||||
return result;
|
||||
};
|
||||
|
||||
export const appendToArray = (target: any, key: string, value: any) => {
|
||||
if (!(key in target)) {
|
||||
target[key] = <any>[];
|
||||
|
||||
@@ -25,6 +25,17 @@ const dict = {
|
||||
file: 'File: ',
|
||||
gpxStats:
|
||||
'This file has been created with "{{creator}}" and includes {{nbWpts}} place(s), {{nbRte}} routes(s) et {{nbTrks}} track(s).',
|
||||
gpxStartTime: 'It starts on {{startTime}}.',
|
||||
gpxNoStartTime: 'It contains no date.',
|
||||
trkMaybeRte:
|
||||
'The first point of the first track has no timestamp which means that it is most likely a route saved as a track. ',
|
||||
importTrk: 'Track import',
|
||||
importAllTrksAsRtes: 'Import all tracks as routes',
|
||||
importNonTimedTrksAsRtes: 'Import non timestamped tracks as routes',
|
||||
importTrksAsTrks: 'Import all tracks (even non timestamped) as tracks',
|
||||
|
||||
gpxDialog: 'Current journey',
|
||||
gpxChooser: 'Journey',
|
||||
};
|
||||
|
||||
export default dict;
|
||||
@@ -27,6 +27,19 @@ const dict = {
|
||||
file: 'Fichier\u00a0: ',
|
||||
gpxStats:
|
||||
'Ce fichier a été créé avec "{{creator}}" et contient {{nbWpts}} lieu(x), {{nbRtes}} itineraire(s) et {{nbTrks}} trace(s).',
|
||||
gpxStartTime: 'Il débute le {{startTime}}.',
|
||||
gpxNoStartTime: 'Il ne contient pas de date.',
|
||||
trkMaybeRte:
|
||||
"Le premier point de la première trace n'est pas horodaté ce qui signifie que c'est sans doute un itinéraire sauvegardé sous forme de trace.",
|
||||
importTrk: 'Import des traces',
|
||||
importAllTrksAsRtes: 'Importer toutes les traces comme des itinéraires',
|
||||
importNonTimedTrksAsRtes:
|
||||
'Importer les traces non horodatées comme des itinéraires',
|
||||
importTrksAsTrks:
|
||||
'Importer toutes les traces (même non horodatées) comme des traces',
|
||||
|
||||
gpxDialog: 'Voyage en cours',
|
||||
gpxChooser: 'Voyage',
|
||||
};
|
||||
|
||||
export default dict;
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" ?><svg width="64px" height="64px" viewBox="0 0 256 256" style="enable-background:new 0 0 64 64; stroke-width: 5; stroke:black;" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_2"/><g id="Layer_3"/><g id="Layer_4"/><g id="Layer_5"/><g id="Layer_6"/><g id="Layer_7"/><g id="Layer_8"/><g id="Layer_9"/><g id="Layer_10"/><g id="Layer_11"/><g id="Layer_12"/><g id="Layer_13"/><g id="Layer_15"/><g id="Layer_16"/><g id="Layer_17"><g><path d="M63.5,16c-0.3-0.2-0.7-0.3-1-0.1l-20.4,7.3l-14.3-5.2c0.8-2,1.2-3.8,1.2-5.3c0-2.7-1-5.1-2.9-7c-1.9-1.9-4.4-2.9-7-2.9 c-5.5,0-9.9,4.4-9.9,9.9c0,1.9,0.7,4.2,1.9,7L0.7,23.2c-0.4,0.2-0.7,0.6-0.7,1v36c0,0.4,0.2,0.7,0.5,0.9c0.2,0.1,0.4,0.2,0.6,0.2 c0.1,0,0.3,0,0.4-0.1L21.9,54l19.8,7.3c0.2,0.1,0.5,0.1,0.7,0l20.8-7.4c0.4-0.2,0.7-0.6,0.7-1v-36C64,16.5,63.8,16.2,63.5,16z M19.1,4.8c2.1,0,4,0.8,5.4,2.3c0,0,0,0,0,0c1.5,1.4,2.3,3.4,2.3,5.4c0,1.4-0.5,3.3-1.5,5.5c-1.8,4-4.8,8.2-6.2,10.1 c-0.2-0.2-0.3-0.4-0.5-0.7c-1.3-1.8-3.4-4.8-4.9-7.9c-1.5-2.9-2.2-5.3-2.2-7.1C11.4,8.3,14.9,4.8,19.1,4.8z M61.8,52.1l-19.7,7 l-19.8-7.3c-0.1,0-0.3-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1L2.2,58.7V25l10-3.5c0,0,0,0,0,0.1c0.1,0.1,0.1,0.2,0.2,0.3 c0.1,0.2,0.2,0.4,0.3,0.6c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.4,0.3,0.6c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.4,0.3,0.5 c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3 c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.1,0.1,0.2,0.2,0.2c0.1,0.2,0.2,0.3,0.3,0.4 c0,0.1,0.1,0.1,0.1,0.2c0.1,0.2,0.2,0.3,0.3,0.4c0,0,0.1,0.1,0.1,0.1c0.1,0.1,0.2,0.3,0.3,0.4c0,0,0.1,0.1,0.1,0.1 c0.1,0.1,0.2,0.3,0.3,0.4c0,0,0,0,0,0c0.1,0.1,0.2,0.2,0.3,0.3c0,0,0,0,0,0c0.2,0.3,0.4,0.5,0.4,0.6c0.2,0.3,0.5,0.4,0.9,0.4 c0.3,0,0.6-0.2,0.9-0.4c0,0,0.1-0.1,0.3-0.3c0,0,0.1-0.1,0.1-0.1c0.1-0.1,0.1-0.1,0.2-0.2c0,0,0.1-0.1,0.1-0.1 c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.1,0.1-0.2c0.1-0.1,0.2-0.2,0.2-0.3c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.4 c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.4c0.1-0.1,0.2-0.2,0.2-0.3c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.1,0.2-0.3,0.3-0.4 c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.2-0.3,0.3-0.5 c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5 c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.4,0.3-0.5c0.1-0.2,0.2-0.3,0.2-0.5c0,0,0,0,0-0.1l14.8,5.4 c0.2,0.1,0.5,0.1,0.7,0l19.3-6.9V52.1z"/><path d="M52.5,42.4c0.2,0.1,0.5,0.1,0.7,0.1c0.6,0,1.2-0.2,1.7-0.5c0.7-0.5,1.2-1.2,1.4-2c0.2-0.8,0-1.7-0.4-2.4 c-0.5-0.7-1.2-1.2-2-1.4c-1.7-0.4-3.5,0.7-3.9,2.4v0c-0.2,0.8,0,1.7,0.4,2.4C51,41.7,51.7,42.2,52.5,42.4z M52.2,39 c0.1-0.6,0.7-0.9,1.2-0.8c0.3,0.1,0.5,0.2,0.6,0.5c0.1,0.2,0.2,0.5,0.1,0.8c-0.1,0.3-0.2,0.5-0.5,0.6c-0.2,0.1-0.5,0.2-0.8,0.1 c-0.3-0.1-0.5-0.2-0.6-0.5C52.2,39.5,52.2,39.3,52.2,39z"/><path d="M11,39.1l-0.7,0.4l-0.4-0.7c-0.3-0.5-1-0.7-1.5-0.3c-0.5,0.3-0.7,1-0.3,1.5l0.4,0.7l-0.7,0.4c-0.5,0.3-0.7,1-0.3,1.5 C7.6,43,8,43.1,8.3,43.1c0.2,0,0.4-0.1,0.6-0.2l0.7-0.4l0.4,0.7c0.2,0.3,0.6,0.5,0.9,0.5c0.2,0,0.4-0.1,0.6-0.2 c0.5-0.3,0.7-1,0.3-1.5l-0.4-0.7l0.7-0.4c0.5-0.3,0.7-1,0.3-1.5C12.2,38.9,11.5,38.8,11,39.1z"/><path d="M21.3,42.1c-1.3,0-3-0.2-4.1-0.5c-0.6-0.1-1.2,0.3-1.3,0.9c-0.1,0.6,0.3,1.2,0.9,1.3c1.1,0.2,2.9,0.5,4.5,0.5c0,0,0,0,0,0 c0.6,0,1.1-0.5,1.1-1.1C22.4,42.6,21.9,42.1,21.3,42.1z"/><path d="M29.5,38.3c-0.7,1-1.5,1.8-2.5,2.4c-0.3,0.2-0.7,0.4-1.1,0.6c-0.6,0.2-0.8,0.9-0.6,1.5c0.2,0.4,0.6,0.7,1,0.7 c0.1,0,0.3,0,0.4-0.1c0.5-0.2,0.9-0.4,1.3-0.7c1.2-0.8,2.2-1.7,3.1-2.9c0.4-0.5,0.3-1.2-0.2-1.5C30.6,37.7,29.9,37.8,29.5,38.3z"/><path d="M37.5,31.1c-1.1,0-1.7,0.3-2.3,0.5c-1.4,0.6-2.6,1.9-2.9,2.3c-0.4,0.5-0.3,1.2,0.1,1.6c0.2,0.2,0.5,0.3,0.7,0.3 c0.3,0,0.6-0.1,0.8-0.4c0.5-0.6,1.3-1.3,2.1-1.7c0.6-0.2,0.8-0.3,1.5-0.4c0.6,0,1.1-0.5,1.1-1.1C38.6,31.6,38.1,31.1,37.5,31.1z"/><path d="M41.6,32.8c-0.2,0.6,0,1.2,0.6,1.5c1.1,0.5,2.7,1.3,3.9,2.2c0.2,0.1,0.4,0.2,0.6,0.2c0.4,0,0.7-0.2,0.9-0.5 c0.3-0.5,0.2-1.2-0.3-1.5c-1.4-0.9-3-1.8-4.3-2.3C42.5,32,41.9,32.3,41.6,32.8z"/><path d="M19.1,15.2c1.9,0,3.4-1.5,3.4-3.4S21,8.4,19.1,8.4c-1.9,0-3.4,1.5-3.4,3.4S17.3,15.2,19.1,15.2z M19.1,10.6 c0.6,0,1.2,0.5,1.2,1.2c0,0.6-0.5,1.2-1.2,1.2c-0.6,0-1.2-0.5-1.2-1.2C18,11.2,18.5,10.6,19.1,10.6z"/></g></g><g id="Layer_18"/><g id="Layer_19"/><g id="Layer_20"/><g id="Layer_21"/><g id="Layer_22"/><g id="Layer_23"/><g id="Layer_24"/><g id="Layer_25"/><g id="Layer_26"/><g id="Layer_27"/></svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
@@ -7,6 +7,7 @@ import {
|
||||
pruneAndSaveImportedGpx,
|
||||
getGpx,
|
||||
getAllGpxes,
|
||||
getAllGpxesWithSummary,
|
||||
} from '../db/gpx';
|
||||
import { getTrk, putNewTrk } from '../db/trk';
|
||||
import { getTrkseg } from '../db/trkseg';
|
||||
@@ -24,6 +25,7 @@ onmessage = async function (e) {
|
||||
existsGpx,
|
||||
pruneAndSaveImportedGpx,
|
||||
getAllGpxes,
|
||||
getAllGpxesWithSummary,
|
||||
getGpx,
|
||||
getTrk,
|
||||
getTrkseg,
|
||||
|
||||
Reference in new issue
Block a user