Prvni naznak verejne casti, sprava profilu

This commit is contained in:
Michal Kváček
2023-08-09 00:26:59 +02:00
parent c4603cf090
commit 25250ae00e
31 changed files with 6505 additions and 786 deletions
+22 -6
View File
@@ -9,6 +9,16 @@ const props = defineProps({
items: {
type: Array,
required: true
},
routeDetail: {
type: Object,
required: false,
default: () => ({name: 'flightDetail', params: {}})
},
displayVisibilityInfo: {
type: Boolean,
required: false,
default: false
}
});
@@ -16,14 +26,16 @@ const props = defineProps({
<template>
<q-list bordered separator class="q-mx-md q-my-md">
<q-item v-for="flight of items" :key="flight" ripple clickable :to="{name: 'flightDetail', params:{id: flight.id}}">
<q-item
v-for="flight of items" :key="flight"
ripple
clickable
:to="{name: routeDetail.name, params:{...routeDetail.params, id: flight.id}}"
>
<q-item-section avatar>
<q-avatar size="100px">
<div v-if="flight.coverPhoto" :style="`width: 100px; height: 100px; background-image: url('${flight.coverPhoto.thumbnailUrl}'); background-size: cover`"></div>
</q-avatar>
</q-item-section>
<q-item-section>
{{ flightName(flight) }}
@@ -32,8 +44,8 @@ const props = defineProps({
{{ formatDatetime(flight.takeoffDatetime) }}
</div>
<div class="text-secondary">
<q-icon name="schedule" />
{{ minutesToHumanReadable(flight.durationMinCalculated) }}
<q-icon name="schedule"/>
{{ minutesToHumanReadable(flight.durationMinCalculated) }}
</div>
<div class="text-secondary">
@@ -41,6 +53,10 @@ const props = defineProps({
{{ flight.aircraft.callSign }}
</div>
</q-item-section>
<q-item-section side top v-if="flight.isPublic && displayVisibilityInfo">
<q-icon name="visibility"></q-icon>
</q-item-section>
</q-item>
</q-list>
</template>
@@ -26,8 +26,13 @@ const formData = reactive({
outlined
standout
multiple
accept=".jpg, .jpeg"
v-model="formData.photos"
label="Vybert fotky k nahrání"
/>
>
<template #prepend>
<q-icon name="upload" />
</template>
</q-file>
</FormWrapper>
</template>
@@ -51,7 +51,17 @@ onMounted(() => {
<template>
<FormWrapper v-model="formData">
<q-file v-model="formData.gpxTrack" v-bind="commonProps" label="Trasa v GPX" hint="Slouží pro vykreslení kompletní a detailní trasy"/>
<q-file
accept=".gpx"
v-model="formData.gpxTrack"
v-bind="commonProps"
label="Nahrát trasu v GPX"
hint="Slouží pro vykreslení kompletní a detailní trasy"
>
<template #prepend>
<q-icon name="upload" />
</template>
</q-file>
<template v-if="flight.gpxTrackUrl">
<q-icon name="check" color="green" /> Trasa nahrána
@@ -64,7 +74,7 @@ onMounted(() => {
:options="locations"
@select="addTrackItem"
clearable
label="Otočný bod"
label="Přidat otočný bod"
hint="Nastav významné otočné body"
/>
+3 -3
View File
@@ -1,5 +1,5 @@
<script setup>
import {onMounted, ref, watch} from "vue";
import {ref, watch} from "vue";
const props = defineProps({
modelValue: {
@@ -26,9 +26,9 @@ const props = defineProps({
const emit = defineEmits(["update:modelValue"]);
const content = ref("");
onMounted(() => {
watch(() => props.modelValue, (newVal) => {
content.value = props.modelValue;
})
}, {immediate: true})
watch(content, () => emit("update:modelValue", content.value));
+59 -14
View File
@@ -48,29 +48,74 @@ const prevPhoto = () => {
if (photoIndex.value > 0) photoIndex.value--;
}
const showExtra = ref(false);
</script>
<template>
<q-dialog v-model="open" full-width @keyup.left="prevPhoto" @keyup.right="nextPhoto">
<q-card>
<q-dialog
v-model="open"
full-width
>
<q-card
v-touch-swipe.mouse.left="prevPhoto"
v-touch-swipe.mouse.right="nextPhoto"
@keyup.left="prevPhoto"
@keyup.right="nextPhoto"
>
<q-card-section>
<div class="row">
<div class="col-12 col-sm-12 col-md-9">
<q-img :src="photo.url"/>
<div class="col-12">
<q-img
:draggable="false"
style="max-height: 90vh"
fit="contain"
:src="photo.url"
>
<q-btn
class="absolute all-pointer-events"
round
flat
icon="info"
:text-color="showExtra ? 'primary' : 'white'"
style="background: rgba(0, 0, 0, 0.25); top: 8px; right: 8px"
@click="showExtra = !showExtra"
/>
<q-btn
class="absolute all-pointer-events"
style="background: rgba(0, 0, 0, 0.25); top: 50%; left: 8px;"
@click="prevPhoto"
v-if="photoIndex > 0"
icon="chevron_left"
text-color="white"
flat
rounded
>
</q-btn>
<q-btn
class="absolute all-pointer-events"
style="background: rgba(0, 0, 0, 0.25); top: 50%; right: 8px;"
@click="nextPhoto"
v-if="photoIndex < photos.length - 1"
icon-right="chevron_right"
text-color="white"
flat
rounded
>
</q-btn>
</q-img>
<strong v-if="photo.name !== ''">{{ photo.name }}</strong>
<p v-if="photo.description !== ''">{{ photo.description }}</p>
<div class="text-center q-my-sm">
<q-btn @click="prevPhoto" v-if="photoIndex > 0" icon="chevron_left" flat rounded>Předchozí</q-btn>
<q-btn @click="nextPhoto" v-if="photoIndex < photos.length - 1" icon-right="chevron_right" flat rounded>Další</q-btn>
</div>
</div>
<div class="col-12 col-sm-12 col-md-3">
<EmbeddedMap class="q-mx-sm" v-if="photo.gpsLatitude && photo.gpsLongitude" :gps-latitude="photo.gpsLatitude" :gps-longitude="photo.gpsLongitude"/>
<q-list>
<div class="col-12 q-my-md" v-if="showExtra">
<EmbeddedMap
v-if="photo.gpsLatitude && photo.gpsLongitude"
class="q-mx-sm"
:gps-latitude="photo.gpsLatitude"
:gps-longitude="photo.gpsLongitude"
/>
<q-list dense>
<q-item v-if="photo.pointOfInterest">
<q-item-section avatar>
<q-avatar icon="marker"></q-avatar>
@@ -0,0 +1,40 @@
<script setup>
import {reactive, ref} from "vue";
import FormWrapper from "components/FormWrapper.vue";
import {commonProps} from "src/composables/inputs";
const formData = reactive({
oldPassword: null,
newPassword: null,
});
const visiblePassword = ref(false);
</script>
<template>
<FormWrapper v-model="formData">
<q-input
v-model="formData.oldPassword"
type="password"
label="Staré heslo"
v-bind="commonProps"
/>
<q-input
v-model="formData.newPassword"
:type="visiblePassword ? 'text' : 'password'"
label="Nové heslo"
v-bind="commonProps"
>
<template #append>
<q-btn
flat
round
:icon="visiblePassword ? 'visibility' : 'visibility_off'"
@click="visiblePassword = !visiblePassword"
/>
</template>
</q-input>
</FormWrapper>
</template>
+74
View File
@@ -0,0 +1,74 @@
<script setup>
import FormWrapper from "components/FormWrapper.vue";
import {commonProps} from "src/composables/inputs";
import {reactive, watch} from "vue";
import {setDefaultData} from "src/composables/form/formHandling";
import RichTextEditor from "components/inputs/RichTextEditor.vue";
const props = defineProps({
user: {
type: Object,
required: false,
default: null
}
});
const formData = reactive({
name: null,
publicUsername: null,
description: null,
avatarImage: null,
titleImage: null,
});
watch(() => props.user, (newVal) => {
setDefaultData(formData, props.user)
}, {immediate: true});
</script>
<template>
<FormWrapper v-model="formData">
<div class="text-center">
<q-avatar size="200px">
<img :src="user.avatarImageUrl" alt="Profilový obrázek"/>
</q-avatar>
</div>
<q-file
v-model="formData.avatarImage"
accept="image/jpeg"
v-bind="commonProps"
label="Nahrát avatar"
>
<template #prepend>
<q-icon name="upload"/>
</template>
</q-file>
<div class="text-center">
<q-img :src="user.titleImageUrl" width="50%"/>
</div>
<q-file
v-model="formData.titleImage"
accept="image/jpeg"
v-bind="commonProps" label="Nahrát titulní fotku"
>
<template #prepend>
<q-icon name="upload"/>
</template>
</q-file>
<q-input v-model="formData.name" label="Jméno" v-bind="commonProps"/>
<q-input
v-model="formData.publicUsername"
label="Veřejné uživatelské jméno"
hint="Vyplň jméno pro zpřístupnění záznamů ve veřejné části aplikace"
v-bind="commonProps"
/>
<RichTextEditor v-model="formData.description" label="Veřejný podpis" />
</FormWrapper>
</template>
@@ -0,0 +1,32 @@
<script setup>
import {onMounted} from "vue";
import {useRoute} from "vue-router";
import {useUserStore} from "stores/User";
const props = defineProps({
user: {
type: Object,
required: false,
default: null
}
})
const username = useRoute().params.username;
onMounted(() => {
useUserStore().fetchByUsername(username);
});
</script>
<template>
<q-list>
<q-item v-if="user.publicUsername">
<router-link target="_blank" :to="{name: 'publicProfileDetail', params: {username: user.publicUsername}}">
@{{user.publicUsername}}
</router-link>
</q-item>
<q-item v-else>
<q-icon name="" color="red" /> Nastav si veřejné uživatelské jméno pro zpřístupnění profilu a sdílení záznamů s ostatními
</q-item>
</q-list>
</template>