-
Vzlet
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
+
diff --git a/src/components/flights/form/FlightFormCopilot.vue b/src/components/flights/form/FlightFormCopilot.vue
index b5e5851..abd3056 100644
--- a/src/components/flights/form/FlightFormCopilot.vue
+++ b/src/components/flights/form/FlightFormCopilot.vue
@@ -1,6 +1,7 @@
diff --git a/src/components/flights/form/FlightFormPhotos.vue b/src/components/flights/form/FlightFormPhotos.vue
index 52dc99e..a4bd968 100644
--- a/src/components/flights/form/FlightFormPhotos.vue
+++ b/src/components/flights/form/FlightFormPhotos.vue
@@ -1,5 +1,4 @@
-
+
+
+
+
+
+
+
{{ photo.name }} jmeno
+
{{ photo.description }}nejaky popis
+
+
-
- Test date: {{testDate}} => {{ parseDate(testDate) }}
+
+
+
-
-
+
+
+
+
+
+
+
+
diff --git a/src/components/inputs/AirportLocationInput.vue b/src/components/inputs/AirportLocationInput.vue
new file mode 100644
index 0000000..c62225b
--- /dev/null
+++ b/src/components/inputs/AirportLocationInput.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/inputs/AnotherDatetimePicker.vue b/src/components/inputs/AnotherDatetimePicker.vue
new file mode 100644
index 0000000..eca9977
--- /dev/null
+++ b/src/components/inputs/AnotherDatetimePicker.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zrušit
+
+
+ Nastavit
+
+
+
+
+
+
+
diff --git a/src/composables/datetimeUtils.js b/src/composables/datetimeUtils.js
index e6e64b1..8ab05d3 100644
--- a/src/composables/datetimeUtils.js
+++ b/src/composables/datetimeUtils.js
@@ -1,10 +1,17 @@
+import { date } from "quasar";
+
+export const FORMAT_ISO = "YYYY-MM-DDTHH:mm:ss";
+export const FORMAT_DATETIME_LONG = "DD. MM. YYYY, HH:mm";
+export const FORMAT_DATE = "DD. MM. YYYY";
+export const FORMAT_TIME = "HH:mm"
+
export const minutesToHumanReadable = (totalMinutes) => {
const hours = Math.round(totalMinutes / 60);
const minutes = totalMinutes % 60;
return `${hours}h ${minutes}min`
}
-export const formatDate = (date, format = "DD. MM. YYYY") => {
+export const formatDatetimeNative = (date, format = "DD. MM. YYYY") => {
if (typeof date === 'string') {
date = parseDate(date);
}
@@ -12,27 +19,37 @@ export const formatDate = (date, format = "DD. MM. YYYY") => {
return format
.replace("DD", date.getDate().toString())
.replace("MM", (date.getMonth() + 1).toString())
- .replace("YYYY", date.getFullYear().toString());
+ .replace("YYYY", date.getFullYear().toString())
+
+ // todo: doplnit pocatecni nuly
+ .replace("hh", date.getHours().toString())
+ .replace("mm", date.getMinutes().toString())
+ .replace("ss", date.getSeconds().toString());
}
-
-export const parseDate = (datetime) => {
+export const parseDateNative = (datetime) => {
// const [date, time] = datetime.split("T");
// const [year, month, day] = date.split("-");
// const [hour, minute] = time.split(":");
- //
// const dateObject = new Date(year, month, day, hour, minute, 0);
// ^ tohle funguje ok
-
const timestamp = Date.parse(datetime);
- const now = new Date();
- const dateObject = new Date(timestamp);
- // dateObject.setHours(dateObject.getHours() + now.getTimezoneOffset());
- // console.log("date", date);
- // console.log("time", time);
- // console.log("month", month, dateObject.getMonth(), dateObject.getUTCMonth());
- // console.log("day", day, dateObject.getDate(), dateObject.getUTCDate());
-
- return dateObject;
+ return new Date(timestamp);
+}
+
+
+export const parseDate = (datetimeStr, format = FORMAT_ISO) => {
+ return date.extractDate(datetimeStr, format)
+}
+
+export const formatDatetime = (datetime, format = FORMAT_DATETIME_LONG) => {
+ console.log("orignal ", datetime);
+ if (typeof datetime === 'string') {
+ datetime = parseDate(datetime);
+ }
+
+ console.log(datetime);
+
+ return date.formatDate(datetime, format);
}
diff --git a/src/composables/flight.js b/src/composables/flight.js
index 717e15b..fc5e747 100644
--- a/src/composables/flight.js
+++ b/src/composables/flight.js
@@ -1,7 +1,9 @@
+import {FORMAT_DATE, formatDatetime} from "src/composables/datetimeUtils";
+
export const flightName = (flight) => {
- const date = flight.takeoffDatetime;//.getDay() + ". " + flight.takeoffDatetime.getMonth() + ". " + flight.takeoffDatetime.getFullYear();
+ const date = formatDatetime(flight.takeoffDatetime, FORMAT_DATE);
if (flight.name !== '') {
- return `${flight.name} (${date}})`
+ return `${flight.name} (${date})`
} else {
return `${flight.takeoffAirport.icaoCode} - ${flight.takeoffAirport.icaoCode} (${date})`;
}
diff --git a/src/graphql/fragments/aircraft.js b/src/graphql/fragments/aircraft.js
index 91742c3..45728b5 100644
--- a/src/graphql/fragments/aircraft.js
+++ b/src/graphql/fragments/aircraft.js
@@ -3,7 +3,7 @@ import gql from "graphql-tag";
export const FRAGMENT_AIRCRAFT_FULL_INFO = gql`
fragment aircraftFullInfo on Aircraft {
id
- name
+ callSign
model
description
manufacturer
diff --git a/src/graphql/fragments/airport.js b/src/graphql/fragments/airport.js
new file mode 100644
index 0000000..397615b
--- /dev/null
+++ b/src/graphql/fragments/airport.js
@@ -0,0 +1,8 @@
+import gql from "graphql-tag";
+
+export const FRAGMENT_AIRPORT_INFO = gql`
+ fragment airportInfo on Airport {
+ name
+ icaoCode
+ }
+`;
diff --git a/src/graphql/fragments/flight.js b/src/graphql/fragments/flight.js
index f81ee78..c5ab156 100644
--- a/src/graphql/fragments/flight.js
+++ b/src/graphql/fragments/flight.js
@@ -1,4 +1,6 @@
import gql from "graphql-tag";
+import {FRAGMENT_AIRCRAFT_FULL_INFO} from "src/graphql/fragments/aircraft";
+import {FRAGMENT_AIRPORT_INFO} from "src/graphql/fragments/airport";
export const FRAGMENT_FLIGHT_FULL_INFO = gql`
fragment flightFullInfo on Flight {
@@ -9,25 +11,62 @@ fragment flightFullInfo on Flight {
landingDatetime
durationMinCalculated
solo
+ withInstructor
takeoffAirport {
- name
- icaoCode
+ ...airportInfo
}
landingAirport {
- name
- icaoCode
+ ...airportInfo
}
aircraft {
- id
+ ...aircraftFullInfo
+ }
+
+
+ photos {
+ url
+ thumbnailUrl
name
- photoUrl
+ description
}
}
+
+${FRAGMENT_AIRCRAFT_FULL_INFO}
+${FRAGMENT_AIRPORT_INFO}
`;
+export const FRAGMENT_FLIGHT_LIST_INFO = gql`
+fragment flightListInfo on Flight {
+ id
+ name
+ takeoffDatetime
+ landingDatetime
+ durationMinCalculated
+
+ coverPhoto {
+ thumbnailUrl
+ }
+
+ takeoffAirport {
+ ...airportInfo
+ }
+
+ landingAirport {
+ ...airportInfo
+ }
+
+ aircraft {
+ ...aircraftFullInfo
+ }
+}
+
+${FRAGMENT_AIRCRAFT_FULL_INFO}
+${FRAGMENT_AIRPORT_INFO}
+`
+
export const FRAGMENT_FLIGHT_EDIT_IDS = gql`
fragment flightEditIds on Flight {
landingAirportId
diff --git a/src/graphql/mutations/photo.js b/src/graphql/mutations/photo.js
new file mode 100644
index 0000000..747642c
--- /dev/null
+++ b/src/graphql/mutations/photo.js
@@ -0,0 +1,24 @@
+import gql from "graphql-tag";
+import {FRAGMENT_FLIGHT_FULL_INFO} from "src/graphql/fragments/flight";
+
+export const UPLOAD_PHOTO = gql`
+mutation uploadPhoto($input: UploadPhotoInput!) {
+ uploadPhoto(input: $input) {
+ url
+ thumbnailUrl
+ filename
+ name
+ description
+ }
+ }
+`
+
+export const EDIT_FLIGHT = gql`
+mutation editFlight($id: Int!, $input: EditFlightInput!) {
+ editFlight(id: $id, input: $input) {
+ ...flightFullInfo
+ }
+ }
+
+ ${FRAGMENT_FLIGHT_FULL_INFO}
+`;
diff --git a/src/graphql/queries/flights.js b/src/graphql/queries/flights.js
index aa4908d..4d870bd 100644
--- a/src/graphql/queries/flights.js
+++ b/src/graphql/queries/flights.js
@@ -1,13 +1,13 @@
import gql from "graphql-tag";
-import {FRAGMENT_FLIGHT_EDIT_IDS, FRAGMENT_FLIGHT_FULL_INFO} from "src/graphql/fragments/flight";
+import {FRAGMENT_FLIGHT_EDIT_IDS, FRAGMENT_FLIGHT_FULL_INFO, FRAGMENT_FLIGHT_LIST_INFO} from "src/graphql/fragments/flight";
export const FLIGHTS_LIST = gql`
query FlightsList {
flights {
- ...flightFullInfo
+ ...flightListInfo
}
}
-${FRAGMENT_FLIGHT_FULL_INFO}
+${FRAGMENT_FLIGHT_LIST_INFO}
`;
export const FLIGHT_DETAIL = gql`
diff --git a/src/pages/profile/details/AircraftDetailPage.vue b/src/pages/profile/details/AircraftDetailPage.vue
index 356f26b..bf04103 100644
--- a/src/pages/profile/details/AircraftDetailPage.vue
+++ b/src/pages/profile/details/AircraftDetailPage.vue
@@ -42,10 +42,10 @@ const confirmDelete = (id) => {
Letadla
- {{ aircraft.name }}
+ {{ aircraft.callSign }}
- {{ aircraft.name }}
+ {{ aircraft.callSign }}
{{ aircraft.photoUrl }}
diff --git a/src/pages/profile/details/FlightDetailPage.vue b/src/pages/profile/details/FlightDetailPage.vue
index 5417240..63f587e 100644
--- a/src/pages/profile/details/FlightDetailPage.vue
+++ b/src/pages/profile/details/FlightDetailPage.vue
@@ -2,7 +2,7 @@
import {useFlightsStore} from "stores/Flights";
import {useRoute} from "vue-router";
import {onMounted, reactive, ref} from "vue";
-import {formatDate, minutesToHumanReadable} from "src/composables/datetimeUtils";
+import {formatDatetime, minutesToHumanReadable} from "src/composables/datetimeUtils";
import FlightDetailSkeleton from "components/flights/FlightDetailSkeleton.vue";
import AddFAB from "components/AddFAB.vue";
@@ -27,13 +27,13 @@ onMounted(() => {
- {{ formatDate(flight.takeoffDatetime) }}
+ {{ formatDatetime(flight.takeoffDatetime) }}
{{ minutesToHumanReadable(flight.durationMinCalculated) }}
-
-
-
-
+
+
+
+
diff --git a/src/pages/profile/forms/EditAircraftPage.vue b/src/pages/profile/forms/EditAircraftPage.vue
index 668f4d0..d8be22c 100644
--- a/src/pages/profile/forms/EditAircraftPage.vue
+++ b/src/pages/profile/forms/EditAircraftPage.vue
@@ -38,7 +38,7 @@ onMounted(() => {
- Editace letadla {{ loadedAircraft.name }}
+ Editace letadla {{ loadedAircraft.callSign }}
diff --git a/src/pages/profile/forms/FlightEditPage.vue b/src/pages/profile/forms/FlightEditPage.vue
index 12069ef..47d3c4c 100644
--- a/src/pages/profile/forms/FlightEditPage.vue
+++ b/src/pages/profile/forms/FlightEditPage.vue
@@ -14,6 +14,7 @@ import FlightFormCopilot from "components/flights/form/FlightFormCopilot.vue";
import {useSecondPilotsStore} from "stores/SecondPilots";
import FlightFormNotes from "components/flights/form/FlightFormNotes.vue";
import FlightFormPhotos from "components/flights/form/FlightFormPhotos.vue";
+import {usePhotosStore} from "stores/Photo";
useMeta({title: "Editace letu"});
@@ -45,7 +46,6 @@ onMounted(() => {
useAircraftsStore().fetch();
usePointsOfInterestStore().fetch();
- useFlightsStore().fetch();
useAirportsStore().fetch();
useSecondPilotsStore().fetch();
@@ -59,6 +59,22 @@ const handleFlightEdit = (data) => {
fetchFlight(flightId);
})
}
+
+const handlePhotosUpload = (data) => {
+
+ console.log(data);
+
+ const promises = [];
+ for (const photo of data.photos) {
+ promises.push(usePhotosStore().upload(flightId, {photo}));
+ }
+
+ Promise.all(promises).then(() => {
+ $q.notify({message: "Uspesne nahrano", position: "top", color: "positive"});
+
+ fetchFlight(flightId);
+ });
+}
@@ -90,8 +106,9 @@ const handleFlightEdit = (data) => {
+ :flight="flight"
+ @save="handlePhotosUpload"
+ />
diff --git a/src/pages/profile/forms/FlightLogPage.vue b/src/pages/profile/forms/FlightLogPage.vue
index 0508130..f74616e 100644
--- a/src/pages/profile/forms/FlightLogPage.vue
+++ b/src/pages/profile/forms/FlightLogPage.vue
@@ -6,7 +6,6 @@ import {useRouter} from "vue-router";
import {usePointsOfInterestStore} from "stores/PointsOfInterest";
import {storeToRefs} from "pinia";
import {useMeta} from "quasar";
-import FlightForm from "components/flights/__FlightForm.vue";
import {useAirportsStore} from "stores/Airports";
import FlightFormSteps from "components/flights/form/FlightFormSteps.vue";
import FlightFormBasic from "components/flights/form/FlightFormBasic.vue";
diff --git a/src/stores/Aircrafts.js b/src/stores/Aircrafts.js
index ca9ef9b..6431755 100644
--- a/src/stores/Aircrafts.js
+++ b/src/stores/Aircrafts.js
@@ -2,7 +2,6 @@ import {defineStore} from 'pinia'
import {apolloWrapper} from "src/graphql/apollo";
import {AIRCRAFT_DETAIL, AIRCRAFTS_LIST} from "src/graphql/queries/aircrafts";
import {CREATE_AIRCRAFT, DELETE_AIRCRAFT, EDIT_AIRCRAFT} from "src/graphql/mutations/aircrafts";
-import {reactive} from "vue";
export const useAircraftsStore = defineStore('Aircrafts', {
state: () => ({
diff --git a/src/stores/Flights.js b/src/stores/Flights.js
index e4b2141..935dab5 100644
--- a/src/stores/Flights.js
+++ b/src/stores/Flights.js
@@ -36,6 +36,7 @@ export const useFlightsStore = defineStore('Flights', {
return apolloWrapper.query(FLIGHT_DETAIL, {id}).then(result => result.data.flight);
},
fetch() {
+ console.log("flights fetch");
return apolloWrapper
.query(FLIGHTS_LIST)
.then((result) => {
diff --git a/src/stores/Photo.js b/src/stores/Photo.js
new file mode 100644
index 0000000..d1146da
--- /dev/null
+++ b/src/stores/Photo.js
@@ -0,0 +1,28 @@
+import {defineStore} from "pinia";
+import {apolloWrapper} from "src/graphql/apollo";
+import {UPLOAD_PHOTO} from "src/graphql/mutations/photo";
+
+export const usePhotosStore = defineStore('photos', {
+
+ actions: {
+ upload(flightId, formData) {
+ if (!flightId) {
+ console.error("No flightId specified for photo upload! Aborting");
+ return;
+ }
+
+ formData.flightId = flightId;
+
+ if (!formData.name) {
+ formData.name = "";
+ }
+
+ if (!formData.description) {
+ formData.description = "";
+ }
+ return apolloWrapper.mutate(UPLOAD_PHOTO, {input: formData}).then(({data}) => {
+ return data.uploadPhoto;
+ })
+ },
+ }
+});