Skip to content

Commit

Permalink
Merge pull request #6385 from Ocelot-Social-Community/6379-fix-event-…
Browse files Browse the repository at this point in the history
…teaser-date-from-start-to-end

fix(webapp): fix event teaser date from start to end by new components
  • Loading branch information
Tirokk authored Jun 8, 2023
2 parents 3cfc5e3 + f0c4904 commit 2b7cdaa
Show file tree
Hide file tree
Showing 6 changed files with 204 additions and 88 deletions.
101 changes: 101 additions & 0 deletions webapp/components/DateTimeRange/DateTimeRange.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<template>
<ds-text class="date-time-range" align="left" color="soft" :size="size">
<div>
<div>
<base-icon name="calendar" data-test="calendar" />
{{ getStartDateString }}
</div>
<div>
<base-icon name="clock" data-test="calendar" />
{{
getStartTimeString +
(this.endDateAsDate && isSameDayLocal ? '&mdash;' + getEndTimeString : '')
}}
</div>
</div>
<template v-if="!isSameDayLocal">
&nbsp;&mdash;&nbsp;
<div>
<div>
<base-icon name="calendar" data-test="calendar" />
{{ getEndDateString }}
</div>
<div>
<base-icon name="clock" data-test="calendar" />
{{ getEndTimeString }}
</div>
</div>
</template>
</ds-text>
</template>

<script>
import { format, isSameDay, isSameYear } from 'date-fns'
export default {
name: 'DateTimeRange',
props: {
/**
* The size used for the text.
* @options small|base|large|x-large|xx-large|xxx-large
*/
size: {
type: String,
default: null,
validator: (value) => {
return value.match(/(small|base|large|x-large|xx-large|xxx-large)/)
},
},
startDate: {
type: String,
require: true,
},
endDate: {
type: String,
default: null,
},
},
computed: {
startDateAsDate() {
return new Date(this.startDate)
},
endDateAsDate() {
return this.endDate ? new Date(this.endDate) : null
},
isSameDayLocal() {
return !this.endDateAsDate || isSameDay(this.endDateAsDate, this.startDateAsDate)
},
isSameYearLocal() {
return !this.endDateAsDate || isSameYear(this.endDateAsDate, this.startDateAsDate)
},
getStartDateString() {
let startDateFormat = this.$t('components.dateTimeRange.yearMonthDay')
if (!this.isSameDayLocal && this.isSameYearLocal) {
startDateFormat = this.$t('components.dateTimeRange.monthDay')
}
return format(this.startDateAsDate, startDateFormat)
},
getStartTimeString() {
return format(new Date(this.startDate), this.$t('components.dateTimeRange.hourMinute'))
},
getEndDateString() {
return this.endDate
? format(new Date(this.endDate), this.$t('components.dateTimeRange.yearMonthDay'))
: ''
},
getEndTimeString() {
return this.endDate
? format(new Date(this.endDate), this.$t('components.dateTimeRange.hourMinute'))
: ''
},
},
}
</script>

<style lang="scss">
.date-time-range {
display: flex;
align-items: center;
gap: 2px;
}
</style>
52 changes: 52 additions & 0 deletions webapp/components/LocationTeaser/LocationTeaser.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<template>
<ds-text class="location-teaser" align="left" color="soft" :size="size">
<base-icon name="map-marker" data-test="map-marker" />
<span v-if="venue">{{ venue }}</span>
<span v-if="venue">&nbsp;&mdash;&nbsp;</span>
<span v-if="!isOnline">
{{ locationName }}
</span>
<span v-else>
{{ $t('post.viewEvent.eventIsOnline') }}
</span>
</ds-text>
</template>

<script>
export default {
name: 'LocationTeaser',
props: {
/**
* The size used for the text.
* @options small|base|large|x-large|xx-large|xxx-large
*/
size: {
type: String,
default: null,
validator: (value) => {
return value.match(/(small|base|large|x-large|xx-large|xxx-large)/)
},
},
venue: {
type: String,
default: null,
},
locationName: {
type: String,
default: null,
},
isOnline: {
type: Boolean,
default: false,
},
},
}
</script>

<style lang="scss">
.location-teaser {
display: flex;
align-items: center;
gap: 2px;
}
</style>
48 changes: 18 additions & 30 deletions webapp/components/PostTeaser/PostTeaser.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
}"
:highlight="isPinned"
>
<!-- {{ post }} -->
<template v-if="post.image" #heroImage>
<img :src="post.image | proxyApiUrl" class="image" />
</template>
Expand All @@ -31,25 +30,19 @@
margin-bottom="small"
style="padding: 5px"
>
<ds-flex>
<ds-flex-item>
<ds-text align="left" size="small" color="soft" class="event-info">
<base-icon name="map-marker" data-test="map-marker" />
<span v-if="post.eventIsOnline">
{{ $t('post.viewEvent.eventIsOnline') }}
</span>
<span v-else-if="post.eventLocationName">
{{ post.eventLocationName }}
</span>
</ds-text>
</ds-flex-item>
<ds-flex-item>
<ds-text align="left" color="soft" size="small" class="event-info">
<base-icon name="calendar" data-test="calendar" />
<span>{{ getEventDateString }}</span>
</ds-text>
</ds-flex-item>
</ds-flex>
<location-teaser
class="event-info"
size="small"
:venue="post.eventVenue"
:locationName="post.eventLocationName"
:isOnline="post.eventIsOnline"
/>
<date-time-range
class="event-info"
size="small"
:startDate="post.eventStart"
:endDate="post.eventEnd"
/>
</ds-space>
<!-- TODO: replace editor content with tiptap render view -->
<!-- eslint-disable-next-line vue/no-v-html -->
Expand Down Expand Up @@ -113,20 +106,23 @@
import Category from '~/components/Category'
import ContentMenu from '~/components/ContentMenu/ContentMenu'
import CounterIcon from '~/components/_new/generic/CounterIcon/CounterIcon'
import DateTimeRange from '~/components/DateTimeRange/DateTimeRange'
import HcRibbon from '~/components/Ribbon'
import LocationTeaser from '~/components/LocationTeaser/LocationTeaser'
import UserTeaser from '~/components/UserTeaser/UserTeaser'
import { mapGetters } from 'vuex'
import PostMutations from '~/graphql/PostMutations'
import { postMenuModalsData, deletePostMutation } from '~/components/utils/PostHelpers'
import { format } from 'date-fns'
export default {
name: 'PostTeaser',
components: {
Category,
ContentMenu,
CounterIcon,
DateTimeRange,
HcRibbon,
LocationTeaser,
UserTeaser,
},
props: {
Expand Down Expand Up @@ -185,15 +181,6 @@ export default {
if (this.post.postType[0] === 'Event') return this.$t('post.event')
return this.$t('post.name')
},
getEventDateString() {
if (this.post.eventEnd) {
const eventStart = format(new Date(this.post.eventStart), 'dd.MM.')
const eventEnd = format(new Date(this.post.eventEnd), 'dd.MM.yyyy')
return `${eventStart} - ${eventEnd}`
} else {
return format(new Date(this.post.eventStart), 'dd.MM.yyyy')
}
},
},
methods: {
async deletePostCallback() {
Expand Down Expand Up @@ -228,6 +215,7 @@ export default {
},
}
</script>

<style lang="scss">
.post-teaser,
.post-teaser:hover,
Expand Down
7 changes: 6 additions & 1 deletion webapp/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@
"versus": "Versus"
},
"components": {
"dateTimeRange": {
"hourMinute": "HH:mm",
"monthDay": "dd.MM.",
"yearMonthDay": "dd.MM.yyyy"
},
"password-reset": {
"change-password": {
"error": "Passwort Änderung fehlgeschlagen. Möglicherweise falscher Sicherheitscode?",
Expand Down Expand Up @@ -752,7 +757,7 @@
},
"viewEvent": {
"eventEnd": "Ende",
"eventIsOnline": "Online Veranstaltung",
"eventIsOnline": "Online",
"eventLocationName": "Stadt",
"eventStart": "Beginn",
"eventVenue": "Veranstaltungsort",
Expand Down
7 changes: 6 additions & 1 deletion webapp/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@
"versus": "Versus"
},
"components": {
"dateTimeRange": {
"hourMinute": "HH:mm",
"monthDay": "MM/dd/",
"yearMonthDay": "MM/dd/yyyy"
},
"password-reset": {
"change-password": {
"error": "Changing your password failed. Maybe the security code was not correct?",
Expand Down Expand Up @@ -752,7 +757,7 @@
},
"viewEvent": {
"eventEnd": "End",
"eventIsOnline": "Online Event",
"eventIsOnline": "Online",
"eventLocationName": "City",
"eventStart": "Start",
"eventVenue": "Venue",
Expand Down
Loading

0 comments on commit 2b7cdaa

Please # to comment.