diff --git a/api/package.json b/api/package.json
index 2608c99..41a601c 100644
--- a/api/package.json
+++ b/api/package.json
@@ -1,6 +1,6 @@
{
"name": "api",
- "version": "1.2.0",
+ "version": "1.3.0",
"description": "",
"author": "",
"private": true,
diff --git a/app/.gitignore b/app/.gitignore
index a547bf3..019e1dc 100644
--- a/app/.gitignore
+++ b/app/.gitignore
@@ -1,5 +1,4 @@
# Logs
-logs
*.log
npm-debug.log*
yarn-debug.log*
diff --git a/app/package.json b/app/package.json
index fabb051..c92386e 100644
--- a/app/package.json
+++ b/app/package.json
@@ -1,7 +1,7 @@
{
"name": "app",
"private": true,
- "version": "1.2.0",
+ "version": "1.3.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/app/src/App.tsx b/app/src/App.tsx
index d9607ea..bb2fac4 100644
--- a/app/src/App.tsx
+++ b/app/src/App.tsx
@@ -1,6 +1,7 @@
import { Navigate, Route, Routes } from 'react-router-dom';
-import Pilots from './components/pilots/Pilots';
+import Flights from './components/flights/Flights';
import Logbook from './components/logbook/Logbook';
+import Pilots from './components/pilots/Pilots';
import SiteNav from './components/siteNav/SiteNav';
import { useIsAuthenticated } from '@azure/msal-react';
@@ -19,8 +20,10 @@ const App = () => {
<>
+ } />
+ } />
} />
- } />
+
>
);
diff --git a/app/src/components/flights/Flights.tsx b/app/src/components/flights/Flights.tsx
new file mode 100644
index 0000000..2ceee39
--- /dev/null
+++ b/app/src/components/flights/Flights.tsx
@@ -0,0 +1,32 @@
+import { Box, Container } from "@noahspan/noahspan-components";
+import LogbookCard from "../logbookCard/LogbookCard";
+import { useEffect, useState } from "react";
+import { useLogs } from "../../hooks/logs/UseLogs";
+import { ILogbookEntry } from "../logbook/ILogbookEntry";
+
+const Flights = () => {
+ const [flights, setFlights] = useState([])
+ const { logs } = useLogs();
+
+ useEffect(() => {
+ const flights: ILogbookEntry[] | undefined = logs?.filter((log: ILogbookEntry) => {
+ if (log.tracks && JSON.parse(log.tracks).length > 0) {
+ return log;
+ }
+ })
+
+ if (flights && flights.length > 0) {
+ setFlights(flights)
+ }
+ }, [logs])
+
+ return (
+
+
+
+
+
+ )
+}
+
+export default Flights;
\ No newline at end of file
diff --git a/app/src/components/logTrackMaps/LogTrackMaps.tsx b/app/src/components/logTrackMaps/LogTrackMaps.tsx
index e10ea56..f50be45 100644
--- a/app/src/components/logTrackMaps/LogTrackMaps.tsx
+++ b/app/src/components/logTrackMaps/LogTrackMaps.tsx
@@ -35,10 +35,7 @@ const LogTrackMaps = ({ rowKey, trackUrls }: LogTrackMapsProps) => {
config
);
const kml = new DOMParser().parseFromString(response.data, 'text/xml')
- // const converted = toGeoJSON.kml(dom);
-
- // rewind(converted, false);
-
+
convertedTracks.push(kml);
}
diff --git a/app/src/components/logTracks/LogTracks.tsx b/app/src/components/logTracks/LogTracks.tsx
index 91a2b9b..c00b3c0 100644
--- a/app/src/components/logTracks/LogTracks.tsx
+++ b/app/src/components/logTracks/LogTracks.tsx
@@ -1,5 +1,5 @@
import { useEffect, useReducer } from "react";
-import { Button, Drawer, Grid, Icon, IconButton, IconName, TextField, theme, Typography, useMediaQuery } from "@noahspan/noahspan-components";
+import { Button, Drawer, Grid, Icon, IconButton, IconName, Spinner, TextField, theme, Typography, useMediaQuery } from "@noahspan/noahspan-components";
import { useHttpClient } from "../../hooks/httpClient/UseHttpClient";
import { AxiosInstance, AxiosResponse } from "axios";
import { useAccessToken } from "../../hooks/accessToken/UseAcessToken";
@@ -132,13 +132,23 @@ const LogTracks = ({ isDrawerOpen, mode, onOpenClose, selectedRowKey }: LogTrack
{`${mode.toString().toLowerCase().charAt(0).toUpperCase() + mode.toString().slice(1).toLowerCase()} Tracks`}
-
+
{mode === FormMode.EDIT &&
<>
- {state.tracks.length > 0 && state.tracks.map((track, index) => {
+ {state.isLoading &&
+ <>
+
+
+
+
+ Loading...
+
+ >
+ }
+ {!state.isLoading && state.tracks.length > 0 && state.tracks.map((track, index) => {
const trackSplit = track.split('/')
const filename = trackSplit[trackSplit.length - 1];
@@ -155,6 +165,7 @@ const LogTracks = ({ isDrawerOpen, mode, onOpenClose, selectedRowKey }: LogTrack
})}
}
variant="outlined"
onClick={onCancel}
@@ -165,7 +176,7 @@ const LogTracks = ({ isDrawerOpen, mode, onOpenClose, selectedRowKey }: LogTrack
{mode.toString() !== FormMode.VIEW && (
}
variant='contained'
>
diff --git a/app/src/components/logbook/Logbook.tsx b/app/src/components/logbook/Logbook.tsx
index 03e7d03..9764945 100644
--- a/app/src/components/logbook/Logbook.tsx
+++ b/app/src/components/logbook/Logbook.tsx
@@ -53,7 +53,7 @@ const Logbook: React.FC = () => {
accessorKey: 'tracks',
header: 'Tracks',
cell: (info: any) => {
- if (info.row.original.tracks && info.row.original.tracks.length > 0) {
+ if (info.row.original.tracks && JSON.parse(info.row.original.tracks).length > 0) {
return (
onOpenCloseTracks(FormMode.VIEW, info.row.original.rowKey)}>
)
@@ -261,7 +261,7 @@ const Logbook: React.FC = () => {
)}
{!isMedium && state.entries.length > 0 &&
-
+
}
)}
diff --git a/app/src/components/logbookCard/LogbookCard.tsx b/app/src/components/logbookCard/LogbookCard.tsx
index a8b9c07..3cbea20 100644
--- a/app/src/components/logbookCard/LogbookCard.tsx
+++ b/app/src/components/logbookCard/LogbookCard.tsx
@@ -1,18 +1,19 @@
import { Card, CardContent, CardHeader, Grid, Typography } from "@noahspan/noahspan-components";
import { LogbookCardProps } from "./LogbookCardProps.interface";
-import { useEffect } from "react";
import ActionMenu from "../actionMenu/ActionMenu";
+import LogTrackMaps from "../logTrackMaps/LogTrackMaps";
-const LogbookCard = ({ logs, onDelete, onOpenCloseForm }: LogbookCardProps) => {
+const LogbookCard = ({ logs, mode, onDelete, onOpenCloseForm }: LogbookCardProps) => {
return (
{logs.map((log) => {
+ console.log(log)
return (
}
+ action={mode === 'logbook' ? : null}
subheader={log.pilotName}
title={log.date}
slotProps={{
@@ -26,6 +27,14 @@ const LogbookCard = ({ logs, onDelete, onOpenCloseForm }: LogbookCardProps) => {
/>
+ {mode === 'flights' && log.tracks && JSON.parse(log.tracks).length > 0 &&
+
+
+
+ }
Aircraft Make and Model
@@ -50,6 +59,24 @@ const LogbookCard = ({ logs, onDelete, onOpenCloseForm }: LogbookCardProps) => {
{log.durationOfFlight}
+ {mode === 'logbook' && log.tracks && JSON.parse(log.tracks).length > 0 &&
+ <>
+
+ Tracks
+
+ {JSON.parse(log.tracks).map((track: string) => {
+ const trackSplit = track.split('/')
+ const filename = trackSplit[trackSplit.length - 1];
+
+ return (
+
+ {filename}
+
+ )
+
+ })}
+ >
+ }
{log.notes &&
<>
diff --git a/app/src/components/logbookCard/LogbookCardProps.interface.ts b/app/src/components/logbookCard/LogbookCardProps.interface.ts
index 5f57c21..1797638 100644
--- a/app/src/components/logbookCard/LogbookCardProps.interface.ts
+++ b/app/src/components/logbookCard/LogbookCardProps.interface.ts
@@ -3,6 +3,7 @@ import { ILogbookEntry } from "../logbook/ILogbookEntry";
export interface LogbookCardProps {
logs: ILogbookEntry[];
- onDelete: (entryId: string) => void;
- onOpenCloseForm: (formMode: FormMode, id: string) => void;
+ mode: 'flights' | 'logbook';
+ onDelete?: (entryId: string) => void;
+ onOpenCloseForm?: (formMode: FormMode, id: string) => void;
}
\ No newline at end of file
diff --git a/app/src/components/siteNav/SiteNav.tsx b/app/src/components/siteNav/SiteNav.tsx
index 629953c..a447015 100644
--- a/app/src/components/siteNav/SiteNav.tsx
+++ b/app/src/components/siteNav/SiteNav.tsx
@@ -32,9 +32,13 @@ const SiteNav = () => {
const getPages = () => {
const pages = [
{
- name: 'Logbook',
+ name: 'Flights',
url: '/'
},
+ {
+ name: 'Logbook',
+ url: '/logbook'
+ },
{
name: 'Pilots',
url: '/pilots'
@@ -79,7 +83,6 @@ const SiteNav = () => {
return imageUrl;
} catch (error) {
- console.log(error);
throw new Error();
}
};
diff --git a/app/src/hooks/logs/UseLogs.tsx b/app/src/hooks/logs/UseLogs.tsx
new file mode 100644
index 0000000..65ebc84
--- /dev/null
+++ b/app/src/hooks/logs/UseLogs.tsx
@@ -0,0 +1,40 @@
+import { useEffect, useState } from "react";
+import { useHttpClient } from "../httpClient/UseHttpClient";
+import { useAccessToken } from "../accessToken/UseAcessToken";
+import { useIsAuthenticated } from "@azure/msal-react";
+import { AxiosInstance, AxiosResponse } from "axios";
+import { ILogbookEntry } from "../../components/logbook/ILogbookEntry";
+
+export const useLogs = () => {
+ const [logs, setLogs] = useState();
+ const httpClient: AxiosInstance = useHttpClient();
+ const { getAccessToken } = useAccessToken();
+ const isAuthenticated = useIsAuthenticated();
+
+ useEffect(() => {
+ const getLogs = async () => {
+ try {
+ const config = isAuthenticated
+ ? { headers: { Authorization: await getAccessToken() } }
+ : {};
+ const response: AxiosResponse = await httpClient.get(
+ `api/logs`,
+ config
+ );
+ const logs: ILogbookEntry[] = response.data;
+
+ logs.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())
+
+ setLogs(logs)
+ } catch (error) {
+ return error;
+ }
+ }
+
+ getLogs();
+ }, [])
+
+ return {
+ logs
+ }
+}
\ No newline at end of file
diff --git a/app/src/index.css b/app/src/index.css
index 690f168..26e49ae 100644
--- a/app/src/index.css
+++ b/app/src/index.css
@@ -1,3 +1,4 @@
body {
background-color: #f2f2f2;
+ margin: 8px;
}
diff --git a/package.json b/package.json
index 0e3ad57..567b9ca 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@noahspan/flying",
- "version": "1.2.0",
+ "version": "1.3.0",
"scripts": {
"start": "concurrently 'npm run start:azure -w api' 'wait-on tcp:0.0.0.0:7071 && npm run dev -w app'",
"format": "prettier --write \"**/src/**/*.ts\" \"**/test/**/*.ts\"",