diff --git a/src/components/AvatarsGroup.vue b/src/components/AvatarsGroup.vue
new file mode 100644
index 0000000..42d8624
--- /dev/null
+++ b/src/components/AvatarsGroup.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/copilots/CopilotDetailSkeleton.vue b/src/components/copilots/CopilotDetailSkeleton.vue
index 2d3855b..a58eca0 100644
--- a/src/components/copilots/CopilotDetailSkeleton.vue
+++ b/src/components/copilots/CopilotDetailSkeleton.vue
@@ -3,7 +3,6 @@ import BasicListSkeleton from "components/basicSkeletons/BasicListSkeleton.vue";
-
+
-
diff --git a/src/components/copilots/CopilotEditSkeleton.vue b/src/components/copilots/CopilotEditSkeleton.vue
index ad40fc1..29e2b95 100644
--- a/src/components/copilots/CopilotEditSkeleton.vue
+++ b/src/components/copilots/CopilotEditSkeleton.vue
@@ -1,5 +1,5 @@
- Copilot skeleton
+
diff --git a/src/components/event/EventDetailSkeleton.vue b/src/components/event/EventDetailSkeleton.vue
new file mode 100644
index 0000000..2d3855b
--- /dev/null
+++ b/src/components/event/EventDetailSkeleton.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/components/event/EventEditSkeleton.vue b/src/components/event/EventEditSkeleton.vue
new file mode 100644
index 0000000..ad40fc1
--- /dev/null
+++ b/src/components/event/EventEditSkeleton.vue
@@ -0,0 +1,5 @@
+
+
+
+ Copilot skeleton
+
diff --git a/src/components/event/EventForm.vue b/src/components/event/EventForm.vue
new file mode 100644
index 0000000..53facff
--- /dev/null
+++ b/src/components/event/EventForm.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/event/EventsList.vue b/src/components/event/EventsList.vue
new file mode 100644
index 0000000..9caa61e
--- /dev/null
+++ b/src/components/event/EventsList.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ event.name }}
+
+
+
+
+
+
+
+
diff --git a/src/components/flights/FlightEditSkeleton.vue b/src/components/flights/FlightEditSkeleton.vue
index 7823d40..4ccb57e 100644
--- a/src/components/flights/FlightEditSkeleton.vue
+++ b/src/components/flights/FlightEditSkeleton.vue
@@ -1,5 +1,6 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/flights/form/FlightFormNotes.vue b/src/components/flights/form/FlightFormNotes.vue
index adfbe58..6ad3832 100644
--- a/src/components/flights/form/FlightFormNotes.vue
+++ b/src/components/flights/form/FlightFormNotes.vue
@@ -1,35 +1,45 @@
-
-
-
+
+
+
+
diff --git a/src/components/inputs/ComboboxInput.vue b/src/components/inputs/ComboboxInput.vue
index 55caf4c..afba985 100644
--- a/src/components/inputs/ComboboxInput.vue
+++ b/src/components/inputs/ComboboxInput.vue
@@ -110,5 +110,9 @@ const filterFn = (val, update, abort) => {
+
+
+
+
diff --git a/src/composables/objects/event.js b/src/composables/objects/event.js
new file mode 100644
index 0000000..360b85b
--- /dev/null
+++ b/src/composables/objects/event.js
@@ -0,0 +1,37 @@
+import {FORMAT_DATE, formatDatetime} from "src/composables/datetimeUtils";
+import {useEventsStore} from "stores/Events";
+import {ref} from "vue";
+import {storeToRefs} from "pinia";
+import {confirmObject} from "src/composables/dialog";
+import {useAppStore} from "stores/App";
+export const loading = ref(true);
+export const event = ref(null);
+export const fetchEvent = (eventId, username) => {
+ loading.value = true;
+ return useEventsStore().fetchDetail(parseInt(eventId), username)
+ .then(respEvent => {
+ event.value = respEvent;
+ return respEvent;
+ })
+ .finally(() => loading.value = false);
+};
+
+export const events = storeToRefs(useEventsStore()).items;
+
+export const fetchEvents = (username = null) => {
+ loading.value = true;
+ useEventsStore().fetch(username).finally(() => {
+ loading.value = false;
+ });
+};
+
+
+export const handleDeleteEvent = ($q, eventId, onOkCallback = () => {
+}) => {
+ $q.dialog(confirmObject(`Opravdu chceš smazat tento let?`))
+ .onOk(() => {
+ useEventsStore().delete(eventId).then(onOkCallback);
+ });
+};
+
+export const isRequestPending = storeToRefs(useEventsStore()).isRequestPending;
diff --git a/src/graphql/fragments/event.js b/src/graphql/fragments/event.js
new file mode 100644
index 0000000..36c9c49
--- /dev/null
+++ b/src/graphql/fragments/event.js
@@ -0,0 +1,19 @@
+import gql from "graphql-tag";
+
+export const FRAGMENT_EVENT_LIST_INFO = gql`
+fragment eventListInfo on Event {
+ id
+ name
+ description
+ isPublic
+}
+`;
+
+export const FRAGMENT_EVENT_FULL_INFO = gql`
+fragment eventFullInfo on Event {
+ id
+ name
+ description
+ isPublic
+}
+`;
diff --git a/src/graphql/fragments/flight.js b/src/graphql/fragments/flight.js
index 3ac82fc..06d34ea 100644
--- a/src/graphql/fragments/flight.js
+++ b/src/graphql/fragments/flight.js
@@ -41,6 +41,12 @@ fragment flightFullInfo on Flight {
id
name
}
+
+ event {
+ id
+ name
+ }
+
gpxTrackUrl
gpxTrack {
coordinates {
diff --git a/src/graphql/mutations/event.js b/src/graphql/mutations/event.js
new file mode 100644
index 0000000..674696c
--- /dev/null
+++ b/src/graphql/mutations/event.js
@@ -0,0 +1,29 @@
+import gql from "graphql-tag";
+import {FRAGMENT_EVENT_FULL_INFO} from "src/graphql/fragments/event";
+
+export const CREATE_EVENT = gql`
+ mutation createEvent($input: CreateEventInput!) {
+ createEvent(input: $input) {
+ ...eventFullInfo
+ }
+ }
+
+ ${FRAGMENT_EVENT_FULL_INFO}
+`;
+
+export const EDIT_EVENT = gql`
+mutation editEvent($id: Int!, $input: EditEventInput!) {
+ editEvent(id: $id, input: $input) {
+ ...eventFullInfo
+ }
+}
+
+ ${FRAGMENT_EVENT_FULL_INFO}
+`;
+export const DELETE_EVENT = gql`
+mutation deleteEvent($id: Int!) {
+ deleteEvent(id: $id) {
+ id
+ }
+}
+`;
diff --git a/src/graphql/queries/event.js b/src/graphql/queries/event.js
new file mode 100644
index 0000000..a53443e
--- /dev/null
+++ b/src/graphql/queries/event.js
@@ -0,0 +1,34 @@
+import gql from "graphql-tag";
+import {FRAGMENT_FLIGHT_LIST_INFO} from "src/graphql/fragments/flight_list";
+import {FRAGMENT_EVENT_FULL_INFO, FRAGMENT_EVENT_LIST_INFO} from "src/graphql/fragments/event";
+
+export const EVENTS_LIST = gql`
+query eventsList {
+ events {
+ ...eventListInfo
+
+ flights {
+ coverPhoto {
+ thumbnailUrl
+ }
+ }
+ }
+}
+
+${FRAGMENT_EVENT_LIST_INFO}
+`;
+
+export const EVENT_DETAIL = gql`
+query event($id: Int!) {
+ event(id: $id) {
+ ...eventFullInfo
+
+ flights {
+ ...flightListInfo
+ }
+ }
+}
+
+${FRAGMENT_EVENT_FULL_INFO}
+${FRAGMENT_FLIGHT_LIST_INFO}
+`;
diff --git a/src/layouts/ProfileLayout.vue b/src/layouts/ProfileLayout.vue
index ee4e693..24858b4 100644
--- a/src/layouts/ProfileLayout.vue
+++ b/src/layouts/ProfileLayout.vue
@@ -28,7 +28,7 @@
Osobní nastavení
-
+
@@ -103,23 +103,32 @@ const linksList = [
to: {name: "myFlights"}
},
{separator: true},
+ {
+ title: 'Události',
+ icon: 'event',
+ to: {name: "events"}
+ },
{
title: 'Letadla',
icon: "connecting_airports",
to: {name: "aircrafts"}
},
- {separator: true},
{
title: 'Zajímavá místa',
icon: "place",
to: {name: "poi"}
},
- {separator: true},
{
title: 'Spolucestující',
icon: "people",
to: {name: "copilots"}
},
+ {separator: true},
+ {
+ title: 'Organizace',
+ icon: "groups",
+ to: {name: "organizations"}
+ },
]
const leftDrawerOpen = ref(false)
diff --git a/src/pages/profile/event/EditEventPage.vue b/src/pages/profile/event/EditEventPage.vue
new file mode 100644
index 0000000..65cd74d
--- /dev/null
+++ b/src/pages/profile/event/EditEventPage.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/src/pages/profile/event/EventDetailPage.vue b/src/pages/profile/event/EventDetailPage.vue
new file mode 100644
index 0000000..554af50
--- /dev/null
+++ b/src/pages/profile/event/EventDetailPage.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+ Lety
+
+
+ Zatím tu nemáš uložené žádné lety.
+
+
+
+
+
+
+
diff --git a/src/pages/profile/event/EventsPage.vue b/src/pages/profile/event/EventsPage.vue
new file mode 100644
index 0000000..67f3753
--- /dev/null
+++ b/src/pages/profile/event/EventsPage.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Nemáš tu uloženou žádnou událost. Události slouží ke sloučení letů z jedné akce/výletu do přehledné skupiny.
+
+
+
+
+
+
diff --git a/src/pages/profile/event/NewEventPage.vue b/src/pages/profile/event/NewEventPage.vue
new file mode 100644
index 0000000..e59fc08
--- /dev/null
+++ b/src/pages/profile/event/NewEventPage.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/src/pages/profile/flight/EditFlightPage.vue b/src/pages/profile/flight/EditFlightPage.vue
index 4e96d25..2e33661 100644
--- a/src/pages/profile/flight/EditFlightPage.vue
+++ b/src/pages/profile/flight/EditFlightPage.vue
@@ -25,6 +25,7 @@ import BatchPhotoFormDialog from "components/photos/BatchPhotoFormDialog.vue";
import {useAppStore} from "stores/App";
import {editBatchPhotos, handleBatchPhotoEdit, openBatchEdit, openBatchPhotoForm} from "src/composables/photos/batchEdit";
import {editPhoto, handlePhotoUpdate, openEdit, openPhotoEdit} from "src/composables/photos/simpleEdit";
+import {fetchEvents, events} from "src/composables/objects/event";
const $q = useQuasar();
const $route = useRoute();
@@ -35,6 +36,7 @@ const locations = storeToRefs(usePointsOfInterestStore()).items;
const airports = storeToRefs(useAirportsStore()).items;
const copilots = storeToRefs(useCopilotsStore()).items;
+
const formStep = ref("");
watch(() => $route.params.step, (val) => formStep.value = val);
@@ -46,6 +48,8 @@ onMounted(() => {
useAirportsStore().fetch();
useCopilotsStore().fetch();
+ fetchEvents();
+
fetchFlight(flightId).then(() => {
const flightNameFormatted = flightName(flight.value);
@@ -98,8 +102,6 @@ const deletePhoto = (id) => {
flight.value.photos.splice(_findPhotoIndex(data.id), 1);
});
}
-
-
@@ -164,7 +166,7 @@ const deletePhoto = (id) => {
-
+
diff --git a/src/pages/profile/flight/FlightDetailPage.vue b/src/pages/profile/flight/FlightDetailPage.vue
index 994361a..bf87d67 100644
--- a/src/pages/profile/flight/FlightDetailPage.vue
+++ b/src/pages/profile/flight/FlightDetailPage.vue
@@ -16,7 +16,6 @@ import {storeToRefs} from "pinia";
const $q = useQuasar();
const $router = useRouter();
const flightId = parseInt(useRoute().params.id);
-
const loggedUser = storeToRefs(useUserStore()).user;
onMounted(() => {
diff --git a/src/pages/profile/organization/OrganizationsPage.vue b/src/pages/profile/organization/OrganizationsPage.vue
new file mode 100644
index 0000000..2d32bbf
--- /dev/null
+++ b/src/pages/profile/organization/OrganizationsPage.vue
@@ -0,0 +1,7 @@
+
+
+
+ organizace
+
diff --git a/src/router/routes.js b/src/router/routes.js
index c1a53c1..29d18cb 100644
--- a/src/router/routes.js
+++ b/src/router/routes.js
@@ -40,6 +40,12 @@ const routes = [
{path: 'aircrafts/new', name: "addAircraft", component: () => import('pages/profile/aircraft/NewAircraftsPage.vue')},
{path: 'aircrafts/:id', name: "aircraftDetail", component: () => import('pages/profile/aircraft/AircraftDetailPage.vue')},
{path: 'aircrafts/:id/edit', name: "aircraftEdit", component: () => import('pages/profile/aircraft/EditAircraftPage.vue')},
+
+ {path: 'events', name: "events", component: () => import('pages/profile/event/EventsPage.vue')},
+ {path: 'events/add', name: "addEvent", component: () => import('pages/profile/event/NewEventPage.vue')},
+ {path: 'events/:id', name: "eventDetail", component: () => import('pages/profile/event/EventDetailPage.vue')},
+ {path: 'events/:id/edit', name: "eventEdit", component: () => import('pages/profile/event/EditEventPage.vue')},
+ {path: 'organizations', name: "organizations", component: () => import('pages/profile/organization/OrganizationsPage.vue')},
]
},
diff --git a/src/stores/Events.js b/src/stores/Events.js
new file mode 100644
index 0000000..ba89967
--- /dev/null
+++ b/src/stores/Events.js
@@ -0,0 +1,41 @@
+import {defineStore} from 'pinia'
+import {apolloWrapper} from "src/graphql/apollo";
+import {CREATE_EVENT, EDIT_EVENT} from "src/graphql/mutations/event";
+import {updateInItems} from "stores/helpers";
+import {EVENT_DETAIL, EVENTS_LIST} from "src/graphql/queries/event";
+
+export const useEventsStore = defineStore('SecondPilots', {
+ state: () => ({
+ items: [],
+ isMutationRunning: false,
+ }),
+
+ actions: {
+ fetchDetail(eventId) {
+ return apolloWrapper.query(EVENT_DETAIL, {id: eventId}).then(({data}) => data.event);
+ },
+ fetch() {
+ return apolloWrapper.query(EVENTS_LIST).then(result => {
+ this.items = result.data.events;
+ return result.data.events;
+ });
+ },
+ create(formData) {
+ delete formData['id'];
+
+ this.isMutationRunning = true;
+ return apolloWrapper.mutate(CREATE_EVENT, {input: formData}).then(({data}) => {
+ const event = data.createEvent;
+ this.items.push(event);
+ return event;
+ }).finally(() => this.isMutationRunning = false);
+ },
+ update(id, formData) {
+ return apolloWrapper.mutate(EDIT_EVENT, {id: id, input: formData}).then(({data}) => {
+ const event = data.editEvent;
+ updateInItems(this.items, "id", event);
+ return event;
+ }).finally(() => this.isMutationRunning = false);
+ },
+ }
+})