diff --git a/docker-compose.yml b/docker-compose.yml index be49cf8..1db0210 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: - ./src-ssr:/app/src-ssr - ./public:/app/public # - ./node_modules:/app/node_modules:delegated - command: quasar dev # -m ssr + command: quasar dev -m ssr environment: API_URL: "http://127.0.0.1:8000" diff --git a/src/components/flights/FlightBasicInfo.vue b/src/components/flights/FlightBasicInfo.vue index 4ce000b..a9bd532 100644 --- a/src/components/flights/FlightBasicInfo.vue +++ b/src/components/flights/FlightBasicInfo.vue @@ -21,6 +21,11 @@ const props = defineProps({ type: Object, required: false, default: null + }, + eventDetailRoute: { + type: Object, + required: false, + default: null } }) @@ -122,6 +127,18 @@ const props = defineProps({ {{ minutesToHumanReadable(flight.durationMinCalculated) }} + + + + + + + + {{ flight.event.name }} + + + + diff --git a/src/composables/meta.js b/src/composables/meta.js index 5ee5976..ad5b50d 100644 --- a/src/composables/meta.js +++ b/src/composables/meta.js @@ -16,6 +16,15 @@ export const aircraftKeywords = (aircraft) => { return [aircraft.organization?.name, aircraft.callSign, aircraft.manufacturer, aircraft.model] }; +export const flightEventKeywords = (event) => { + if (!event) return []; + return [event.name]; +} + +export const flightKeywords = (flight) => { + return ["let", "výlet", "letadlo"] +} + export const metaData = ({title, description, keywords, image, index = true}) => { const filteredKeywords = (keywords || []).filter(kw => !!kw); const filteredDescription = stripHtml(description); diff --git a/src/graphql/fragments/flight.js b/src/graphql/fragments/flight.js index 4756707..873fa53 100644 --- a/src/graphql/fragments/flight.js +++ b/src/graphql/fragments/flight.js @@ -60,6 +60,8 @@ fragment flightFullInfo on Flight { event { id + isPublic + urlSlug name } diff --git a/src/pages/profile/flight/FlightDetailPage.vue b/src/pages/profile/flight/FlightDetailPage.vue index 63111a8..71cd856 100644 --- a/src/pages/profile/flight/FlightDetailPage.vue +++ b/src/pages/profile/flight/FlightDetailPage.vue @@ -94,6 +94,7 @@ const togglePublicVisibility = (variables) => toggleVisibility({ @@ -108,7 +109,7 @@ const togglePublicVisibility = (variables) => toggleVisibility({
- + Nezapomeň si poznamenat důležité informace pro debriefing. Tyto poznámky slouží jen pro tebe. @@ -123,10 +124,9 @@ const togglePublicVisibility = (variables) => toggleVisibility({ > U tohoto letu nemáš nahrané žádné fotografie. - + + + @@ -140,11 +140,13 @@ const togglePublicVisibility = (variables) => toggleVisibility({ > Nemáš nastavenou žádnou trasu. - + + + + diff --git a/src/pages/public/HelpPage.vue b/src/pages/public/HelpPage.vue index a9802f1..241efb6 100644 --- a/src/pages/public/HelpPage.vue +++ b/src/pages/public/HelpPage.vue @@ -15,31 +15,31 @@ const help = { }, "organizace": { title: "Co jsou to organizace?", - content: "Organizace slouží ke sdílení letadel, např. v rámci aeroklubu. " + content: "Organizace slouží ke sdílení letadel, např. v rámci aeroklubu (nebo jiného provozovatele)." }, "udalosti": { title: "Co jsou to události?", - content: "" + content: "

Události slouží pro sloučení souvisejících letů. Letecké soustředění, výcvik, vícedenní výlet...

" }, "uvodni-fotografie": { title: "K čemu potřebuji úvodní fotografii?", - content: "" + content: "Úvodní fotografie slouží k upoutání pozornosti nejen v prostředí Polétání.cz ale i na sociálních sítích. Pokud pošleš odkaz" }, "url": { title: "Proč k veřejným datům musím uvádět URL část?", - content: "" + content: "Protože všechna veřejná data potřebují unikátní adresu, na které budou k dispozici ostatním uživatelům internetu. Zadáním vlastní URL adresy si můžeš vytvořit přehledné a čitelné adresy, které se snáze pamatují." }, "poi": { title: "Jak funguje databáze zajímavých míst?", - content: "" + content: "Každý uživatel Polétání.cz může zveřejnit nějaké zajímavé místo na mapě. Toto místo pak mohou ostatní použít pro plánování svých letů, organizaci fotek u svých výletů. Všechna tato data se zobrazují na veřejné stránce s detailem tohoto zvoleného místa a mohou tak sloužit i jako inspirace pro ostatní." }, "editor-fotek": { title: "Co umí editor fotek?", - content: "" + content: "Polétání.cz ti dovoluje provádět základní úpravy tvých fotek." }, "debriefing": { title: "Co jsou poznámky k debriefingu?", - content: "Prostě soukromé poznámky. Vidíš je jen ty." + content: "Prostě soukromé poznámky. Vidíš je jen ty. Můžeš si sem poznamenat co bylo dobře, co nebylo úplně ok. Nezapomeň, že debriefing je součást každého letu a pomáhá při zlepšování schopností pilotů!" }, "verejny-profil": { title: "Musím mít veřejný profil?", @@ -50,6 +50,7 @@ const help = { const opened = ref({}); onMounted(() => { opened.value[$route.query.h] = true; + }) useAppStore().setPageTitle("Nápověda"); diff --git a/src/pages/public/pilotProfile/FlightDetailPage.vue b/src/pages/public/pilotProfile/FlightDetailPage.vue index 832611f..d8de554 100644 --- a/src/pages/public/pilotProfile/FlightDetailPage.vue +++ b/src/pages/public/pilotProfile/FlightDetailPage.vue @@ -19,9 +19,10 @@ import PhotoGallery from "components/photos/PhotoGallery.vue"; import {storeToRefs} from "pinia"; import {flightName} from "src/composables/flight"; import {useMeta} from "quasar"; -import {aircraftKeywords, metaData} from "src/composables/meta"; +import {aircraftKeywords, flightEventKeywords, flightKeywords, metaData} from "src/composables/meta"; import ContentCard from "components/ContentCard.vue"; import {usePhotosStore} from "stores/Photos"; +import {computed} from "vue"; const {isQueryRunning, flight} = storeToRefs(useFlightsStore()); @@ -37,15 +38,32 @@ const {isQueryRunning: arePhotosLoading, photos: flightPhotos} = storeToRefs(use const flightNameFormatted = flightName(flight.value); useAppStore().setPageTitle(flightNameFormatted); -useAppStore().setBreadcrumbs([ + +const event = computed(() => flight.value.event); +const breadcrumbs = [ {to: {name: 'homepage'}, label: "Polétání.cz"}, {to: {name: "publicProfileDetail", params: {username: props.pilot.publicUsername}}, label: `@${props.pilot.publicUsername}`}, - {label: flightNameFormatted} -]); +] +if (event.value && event.value.isPublic) { + breadcrumbs.push({to: {name: 'publicEventsList', username: props.pilot.publicUsername}, label: "Události"}); + breadcrumbs.push({ + to: { + name: 'publicEventDetail', + params: {eventSlug: event.value.urlSlug, username: props.pilot.publicUsername} + }, label: event.value.name + }); +} +breadcrumbs.push({label: flightNameFormatted}) +useAppStore().setBreadcrumbs(breadcrumbs); useMeta(() => metaData({ title: `${flightNameFormatted} - ${props.pilot.name}`, - keywords: ["let", "výlet", "letadlo", props.pilot.name, ...aircraftKeywords(flight.value.aircraft)], + keywords: [ + ...flightKeywords(flight.value), + props.pilot.name, + ...aircraftKeywords(flight.value.aircraft), + ...flightEventKeywords(event.value) + ], description: flight.value.description, image: flight.value.titlePhoto?.url } @@ -63,6 +81,7 @@ useMeta(() => metaData({ :flight="flight" :poi-detail-route="{name: 'publicPOIDetail'}" :aircraft-detail-route="{name: 'publicAircraftDetail'}" + :event-detail-route="event.isPublic ? {name: 'publicEventDetail', params: {username: pilot.publicUsername, eventSlug: event.urlSlug}} : null" :copilot-detail-route="{name: 'publicCopilotDetail', params: {username: pilot.publicUsername}}" /> @@ -71,9 +90,8 @@ useMeta(() => metaData({ + - -