-
+
+
-
@@ -109,3 +126,14 @@ const cancelSelection = () => {
+
+
+
diff --git a/src/components/photos/PhotosList.vue b/src/components/photos/PhotosList.vue
new file mode 100644
index 0000000..993b8f8
--- /dev/null
+++ b/src/components/photos/PhotosList.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+ {{ photo.name }}
+
+
+ {{ photo.description }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/composables/datetimeUtils.js b/src/composables/datetimeUtils.js
index 8ab05d3..f43a5a2 100644
--- a/src/composables/datetimeUtils.js
+++ b/src/composables/datetimeUtils.js
@@ -44,12 +44,8 @@ export const parseDate = (datetimeStr, format = FORMAT_ISO) => {
}
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/dialog.js b/src/composables/dialog.js
new file mode 100644
index 0000000..c80e6f8
--- /dev/null
+++ b/src/composables/dialog.js
@@ -0,0 +1,12 @@
+export const confirmObject = (message, title) => ({
+ title: title || "Opravdu?",
+ message: message || "",
+ cancel: true,
+ persistent: true
+});
+
+export const successObject = (message) => ({
+ message,
+ position: "top",
+ color: "positive"
+});
diff --git a/src/graphql/fragments/flight.js b/src/graphql/fragments/flight.js
index c5ab156..a3cdbfb 100644
--- a/src/graphql/fragments/flight.js
+++ b/src/graphql/fragments/flight.js
@@ -1,6 +1,7 @@
import gql from "graphql-tag";
import {FRAGMENT_AIRCRAFT_FULL_INFO} from "src/graphql/fragments/aircraft";
import {FRAGMENT_AIRPORT_INFO} from "src/graphql/fragments/airport";
+import {FRAGMENT_PHOTO_FULL_INFO} from "src/graphql/fragments/photo";
export const FRAGMENT_FLIGHT_FULL_INFO = gql`
fragment flightFullInfo on Flight {
@@ -25,15 +26,12 @@ fragment flightFullInfo on Flight {
...aircraftFullInfo
}
-
photos {
- url
- thumbnailUrl
- name
- description
+ ...photoFullInfo
}
}
+${FRAGMENT_PHOTO_FULL_INFO}
${FRAGMENT_AIRCRAFT_FULL_INFO}
${FRAGMENT_AIRPORT_INFO}
`;
diff --git a/src/graphql/fragments/photo.js b/src/graphql/fragments/photo.js
new file mode 100644
index 0000000..d5fde16
--- /dev/null
+++ b/src/graphql/fragments/photo.js
@@ -0,0 +1,11 @@
+import gql from "graphql-tag";
+
+export const FRAGMENT_PHOTO_FULL_INFO = gql`
+ fragment photoFullInfo on Photo {
+ id
+ url
+ thumbnailUrl
+ filename
+ name
+ description
+}`;
diff --git a/src/graphql/mutations/photo.js b/src/graphql/mutations/photo.js
index 747642c..226c7b1 100644
--- a/src/graphql/mutations/photo.js
+++ b/src/graphql/mutations/photo.js
@@ -1,24 +1,30 @@
import gql from "graphql-tag";
-import {FRAGMENT_FLIGHT_FULL_INFO} from "src/graphql/fragments/flight";
+import {FRAGMENT_PHOTO_FULL_INFO} from "src/graphql/fragments/photo";
export const UPLOAD_PHOTO = gql`
mutation uploadPhoto($input: UploadPhotoInput!) {
uploadPhoto(input: $input) {
- url
- thumbnailUrl
- filename
- name
- description
+ ...photoFullInfo
}
}
+
+ ${FRAGMENT_PHOTO_FULL_INFO}
`
-export const EDIT_FLIGHT = gql`
-mutation editFlight($id: Int!, $input: EditFlightInput!) {
- editFlight(id: $id, input: $input) {
- ...flightFullInfo
+export const EDIT_PHOTO = gql`
+mutation editPhoto($id: Int!, $input: EditPhotoInput!) {
+ editPhoto(id: $id, input: $input) {
+ ...photoFullInfo
}
}
- ${FRAGMENT_FLIGHT_FULL_INFO}
+ ${FRAGMENT_PHOTO_FULL_INFO}
+`;
+
+export const DELETE_PHOTO = gql`
+mutation deletePhoto($id: Int!) {
+ deletePhoto(id: $id) {
+ id
+ }
+}
`;
diff --git a/src/pages/profile/details/AircraftDetailPage.vue b/src/pages/profile/details/AircraftDetailPage.vue
index bf04103..c393603 100644
--- a/src/pages/profile/details/AircraftDetailPage.vue
+++ b/src/pages/profile/details/AircraftDetailPage.vue
@@ -4,6 +4,7 @@ import {useAircraftsStore} from "stores/Aircrafts";
import {useRoute, useRouter} from "vue-router";
import {useQuasar} from "quasar";
import AircraftDetailSkeleton from "components/aircrafts/AircraftDetailSkeleton.vue";
+import {confirmObject} from "src/composables/dialog";
const aircraftStore = useAircraftsStore();
const route = useRoute();
@@ -17,23 +18,19 @@ onMounted(() => {
aircraftStore.fetchDetail(aircraftId.value)
.then(respAircraft => aircraft = respAircraft)
.finally(() => {
- loading.value = false;
- });
+ loading.value = false;
+ });
})
const $q = useQuasar();
const confirmDelete = (id) => {
- $q.dialog({
- title: 'Potvrzení',
- message: 'Opravdu chceš smazat toto letadlo?',
- cancel: true,
- persistent: true
- }).onOk(() => {
- aircraftStore.delete(id).then(() => {
- router.push({name: "aircrafts"});
- $q.notify({message: "Letadlo uspesne odstraneno", position: "top", color: "positive"});
- });
- })
+ $q.dialog(confirmObject('Opravdu chceš smazat toto letadlo?'))
+ .onOk(() => {
+ aircraftStore.delete(id).then(() => {
+ router.push({name: "aircrafts"});
+ $q.notify({message: "Letadlo uspesne odstraneno", position: "top", color: "positive"});
+ });
+ })
};
diff --git a/src/pages/profile/forms/EditAircraftPage.vue b/src/pages/profile/forms/EditAircraftPage.vue
index d8be22c..188043c 100644
--- a/src/pages/profile/forms/EditAircraftPage.vue
+++ b/src/pages/profile/forms/EditAircraftPage.vue
@@ -27,7 +27,6 @@ let loadedAircraft = ref(null);
onMounted(() => {
useAircraftsStore().fetchDetail(aircraftId).then((data) => {
loadedAircraft.value = data;
-
}).catch(err => {
console.error(err);
})
@@ -40,6 +39,10 @@ onMounted(() => {
Editace letadla {{ loadedAircraft.callSign }}
-
+
diff --git a/src/pages/profile/forms/FlightEditPage.vue b/src/pages/profile/forms/FlightEditPage.vue
index 47d3c4c..c0e0717 100644
--- a/src/pages/profile/forms/FlightEditPage.vue
+++ b/src/pages/profile/forms/FlightEditPage.vue
@@ -15,6 +15,9 @@ 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";
+import PhotosList from "components/photos/PhotosList.vue";
+import {confirmObject, successObject} from "src/composables/dialog";
+import PhotoForm from "components/flights/PhotoForm.vue";
useMeta({title: "Editace letu"});
@@ -54,27 +57,49 @@ onMounted(() => {
const handleFlightEdit = (data) => {
useFlightsStore().update(flightId, data).then(() => {
- $q.notify({message: "Uspesne upraveno", position: "top", color: "positive"});
-
+ $q.notify(successObject("Úspěšně upraveno"));
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);
+ $q.notify(successObject("Úspěšně nahráno"));
+ fetchFlight(flightId);
});
}
+
+const _findPhotoIndex = (photoId) => flight.value.photos.findIndex((object) => object.id === photoId);
+const confirmPhotoDelete = (id) => {
+ $q.dialog(confirmObject("Opravdu chces smazat tuto fotku?"))
+ .onOk(() => {
+ usePhotosStore().delete(id).then((data) => {
+ flight.value.photos.splice(_findPhotoIndex(data.id), 1);
+ });
+ });
+}
+
+const handlePhotoUpdate = (formData) => {
+ const photoId = formData.id;
+ delete formData.id;
+
+ usePhotosStore().update(photoId, formData).then((data) => {
+ const idx = _findPhotoIndex(data.id);
+ flight.value.photos[idx] = data;
+ })
+}
+
+const openEdit = ref(false);
+const editPhoto = ref(null);
+const openPhotoEdit = (photo) => {
+ openEdit.value = true;
+ editPhoto.value = photo;
+}
@@ -105,6 +130,13 @@ const handlePhotosUpload = (data) => {
+
+
+
({
@@ -6,8 +7,7 @@ export const useAppStore = defineStore('App', {
fabButton: {icon: null, label: null, action: {}}
}),
- getters: {
- },
+ getters: {},
actions: {
}
diff --git a/src/stores/Photo.js b/src/stores/Photo.js
index d1146da..e45e126 100644
--- a/src/stores/Photo.js
+++ b/src/stores/Photo.js
@@ -1,6 +1,6 @@
import {defineStore} from "pinia";
import {apolloWrapper} from "src/graphql/apollo";
-import {UPLOAD_PHOTO} from "src/graphql/mutations/photo";
+import {DELETE_PHOTO, EDIT_PHOTO, UPLOAD_PHOTO} from "src/graphql/mutations/photo";
export const usePhotosStore = defineStore('photos', {
@@ -24,5 +24,16 @@ export const usePhotosStore = defineStore('photos', {
return data.uploadPhoto;
})
},
+ update(id, formData) {
+
+ return apolloWrapper.mutate(EDIT_PHOTO, {id, input: formData}).then(({data}) => {
+ return data.editPhoto;
+ })
+ },
+ delete(photoId) {
+ return apolloWrapper.mutate(DELETE_PHOTO, {id: photoId}).then(({data}) => {
+ return data.deletePhoto;
+ });
+ }
}
});