Merge branch 'master' into 6636-search-trigger-after-3-chars

This commit is contained in:
Wolfgang Huß 2023-07-26 13:21:21 +02:00 committed by GitHub
commit 6f02a87355
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 241 additions and 222 deletions

View File

@ -1,185 +1,190 @@
<template> <template>
<ds-form <div>
class="contribution-form" <ds-form
ref="contributionForm" class="contribution-form"
v-model="formData" ref="contributionForm"
:schema="formSchema" v-model="formData"
@submit="submit" :schema="formSchema"
> @submit="submit"
<template #default="{ errors }"> >
<base-card> <template #default="{ errors }">
<template #heroImage> <base-card>
<img <template #heroImage>
v-if="formData.image" <img
:src="formData.image | proxyApiUrl" v-if="formData.image"
:class="['image', formData.imageBlurred && '--blur-image']" :src="formData.image | proxyApiUrl"
:class="['image', formData.imageBlurred && '--blur-image']"
/>
<image-uploader
:hasImage="!!formData.image"
:class="[formData.imageBlurred && '--blur-image']"
@addHeroImage="addHeroImage"
@addImageAspectRatio="addImageAspectRatio"
@addImageType="addImageType"
/>
</template>
<div v-if="formData.image" class="blur-toggle">
<label for="blur-img">{{ $t('contribution.inappropriatePicture') }}</label>
<input type="checkbox" id="blur-img" v-model="formData.imageBlurred" />
<page-params-link class="link" :pageParams="links.FAQ">
{{ $t('contribution.inappropriatePicture') }}
<base-icon name="question-circle" />
</page-params-link>
</div>
<ds-space margin-top="base" />
<ds-input
model="title"
:placeholder="$t('contribution.title')"
name="title"
autofocus
size="large"
/> />
<image-uploader <ds-chip size="base" :color="errors && errors.title && 'danger'">
:hasImage="!!formData.image" {{ formData.title.length }}/{{ formSchema.title.max }}
:class="[formData.imageBlurred && '--blur-image']" <base-icon v-if="errors && errors.title" name="warning" />
@addHeroImage="addHeroImage" </ds-chip>
@addImageAspectRatio="addImageAspectRatio" <editor
@addImageType="addImageType" :users="users"
:value="formData.content"
:hashtags="hashtags"
@input="updateEditorContent"
/> />
</template> <ds-chip size="base" :color="errors && errors.content && 'danger'">
<div v-if="formData.image" class="blur-toggle"> {{ contentLength }}
<label for="blur-img">{{ $t('contribution.inappropriatePicture') }}</label> <base-icon v-if="errors && errors.content" name="warning" />
<input type="checkbox" id="blur-img" v-model="formData.imageBlurred" /> </ds-chip>
<page-params-link class="link" :pageParams="links.FAQ">
{{ $t('contribution.inappropriatePicture') }} <!-- Eventdata -->
<base-icon name="question-circle" /> <div v-if="createEvent" class="eventDatas">
</page-params-link> <hr />
</div> <ds-space margin-top="x-small" />
<ds-space margin-top="base" /> <ds-grid>
<ds-input <ds-grid-item class="event-grid-item">
model="title" <!-- <label>Beginn</label> -->
:placeholder="$t('contribution.title')" <div class="event-grid-item-z-helper">
name="title" <date-picker
autofocus name="eventStart"
size="large" v-model="formData.eventStart"
/> type="datetime"
<ds-chip size="base" :color="errors && errors.title && 'danger'"> value-type="format"
{{ formData.title.length }}/{{ formSchema.title.max }} :minute-step="15"
<base-icon v-if="errors && errors.title" name="warning" /> Xformat="DD-MM-YYYY HH:mm"
</ds-chip> class="event-grid-item-z-helper"
<editor :placeholder="$t('post.viewEvent.eventStart')"
:users="users" :disabled-date="notBeforeToday"
:value="formData.content" :disabled-time="notBeforeNow"
:hashtags="hashtags" :show-second="false"
@input="updateEditorContent" @change="changeEventStart($event)"
/> ></date-picker>
<ds-chip size="base" :color="errors && errors.content && 'danger'"> </div>
{{ contentLength }} <div
<base-icon v-if="errors && errors.content" name="warning" /> v-if="errors && errors.eventStart"
</ds-chip> class="chipbox event-grid-item-margin-helper"
>
<ds-chip size="base" :color="errors && errors.eventStart && 'danger'">
<base-icon name="warning" />
</ds-chip>
</div>
</ds-grid-item>
<ds-grid-item class="event-grid-item">
<!-- <label>Ende (optional)</label> -->
<!-- Eventdata -->
<div v-if="createEvent" class="eventDatas">
<hr />
<ds-space margin-top="x-small" />
<ds-grid>
<ds-grid-item class="event-grid-item">
<!-- <label>Beginn</label> -->
<div class="event-grid-item-z-helper">
<date-picker <date-picker
name="eventStart" v-model="formData.eventEnd"
v-model="formData.eventStart" name="eventEnd"
type="datetime" type="datetime"
value-type="format" value-type="format"
:minute-step="15" :minute-step="15"
:seconds-step="0"
Xformat="DD-MM-YYYY HH:mm" Xformat="DD-MM-YYYY HH:mm"
class="event-grid-item-z-helper" :placeholder="$t('post.viewEvent.eventEnd')"
:placeholder="$t('post.viewEvent.eventStart')" class="event-grid-item-font-helper"
:disabled-date="notBeforeToday" :disabled-date="notBeforeEventDay"
:disabled-time="notBeforeNow" :disabled-time="notBeforeEvent"
:show-second="false" :show-second="false"
@change="changeEventStart($event)" @change="changeEventEnd($event)"
></date-picker> ></date-picker>
</div> </ds-grid-item>
<div v-if="errors && errors.eventStart" class="chipbox event-grid-item-margin-helper"> </ds-grid>
<ds-chip size="base" :color="errors && errors.eventStart && 'danger'"> <ds-grid class="event-location-grid">
<base-icon name="warning" /> <ds-grid-item class="event-grid-item">
</ds-chip> <ds-input
</div> model="eventVenue"
</ds-grid-item> name="eventVenue"
<ds-grid-item class="event-grid-item"> :placeholder="$t('post.viewEvent.eventVenue')"
<!-- <label>Ende (optional)</label> --> />
<div class="chipbox">
<ds-chip size="base" :color="errors && errors.eventVenue && 'danger'">
{{ formData.eventVenue.length }}/{{ formSchema.eventVenue.max }}
<base-icon v-if="errors && errors.eventVenue" name="warning" />
</ds-chip>
</div>
</ds-grid-item>
<ds-grid-item v-if="showEventLocationName" class="event-grid-item">
<ds-input
model="eventLocationName"
name="eventLocationName"
:placeholder="$t('post.viewEvent.eventLocationName')"
/>
<div class="chipbox">
<ds-chip size="base" :color="errors && errors.eventLocationName && 'danger'">
{{ formData.eventLocationName.length }}/{{ formSchema.eventLocationName.max }}
<base-icon v-if="errors && errors.eventLocationName" name="warning" />
</ds-chip>
</div>
</ds-grid-item>
</ds-grid>
<date-picker <div>
v-model="formData.eventEnd" <input
name="eventEnd" type="checkbox"
type="datetime" v-model="formData.eventIsOnline"
value-type="format" model="eventIsOnline"
:minute-step="15" name="eventIsOnline"
:seconds-step="0"
Xformat="DD-MM-YYYY HH:mm"
:placeholder="$t('post.viewEvent.eventEnd')"
class="event-grid-item-font-helper" class="event-grid-item-font-helper"
:disabled-date="notBeforeEventDay" @change="changeEventIsOnline($event)"
:disabled-time="notBeforeEvent"
:show-second="false"
@change="changeEventEnd($event)"
></date-picker>
</ds-grid-item>
</ds-grid>
<ds-grid class="event-location-grid">
<ds-grid-item class="event-grid-item">
<ds-input
model="eventVenue"
name="eventVenue"
:placeholder="$t('post.viewEvent.eventVenue')"
/> />
<div class="chipbox"> {{ $t('post.viewEvent.eventIsOnline') }}
<ds-chip size="base" :color="errors && errors.eventVenue && 'danger'"> </div>
{{ formData.eventVenue.length }}/{{ formSchema.eventVenue.max }}
<base-icon v-if="errors && errors.eventVenue" name="warning" />
</ds-chip>
</div>
</ds-grid-item>
<ds-grid-item v-if="showEventLocationName" class="event-grid-item">
<ds-input
model="eventLocationName"
name="eventLocationName"
:placeholder="$t('post.viewEvent.eventLocationName')"
/>
<div class="chipbox">
<ds-chip size="base" :color="errors && errors.eventLocationName && 'danger'">
{{ formData.eventLocationName.length }}/{{ formSchema.eventLocationName.max }}
<base-icon v-if="errors && errors.eventLocationName" name="warning" />
</ds-chip>
</div>
</ds-grid-item>
</ds-grid>
<div>
<input
type="checkbox"
v-model="formData.eventIsOnline"
model="eventIsOnline"
name="eventIsOnline"
class="event-grid-item-font-helper"
@change="changeEventIsOnline($event)"
/>
{{ $t('post.viewEvent.eventIsOnline') }}
</div> </div>
</div> <ds-space margin-top="x-small" />
<ds-space margin-top="x-small" /> <categories-select
<categories-select v-if="categoriesActive"
v-if="categoriesActive" model="categoryIds"
model="categoryIds" :existingCategoryIds="formData.categoryIds"
:existingCategoryIds="formData.categoryIds" />
/> <ds-chip
<ds-chip v-if="categoriesActive"
v-if="categoriesActive" size="base"
size="base" :color="errors && errors.categoryIds && 'danger'"
:color="errors && errors.categoryIds && 'danger'" >
> {{ formData.categoryIds.length }} / 3
{{ formData.categoryIds.length }} / 3 <base-icon v-if="errors && errors.categoryIds" name="warning" />
<base-icon v-if="errors && errors.categoryIds" name="warning" /> </ds-chip>
</ds-chip> <ds-flex class="buttons-footer" gutter="xxx-small">
<ds-flex class="buttons-footer" gutter="xxx-small"> <ds-flex-item width="3.5" class="buttons-footer-helper">
<ds-flex-item width="3.5" class="buttons-footer-helper"> <!-- eslint-disable vue/no-v-text-v-html-on-component -->
<!-- eslint-disable vue/no-v-text-v-html-on-component --> <!-- TODO => remove v-html! only text ! no html! security first! -->
<!-- TODO => remove v-html! only text ! no html! security first! --> <ds-text
<ds-text v-if="showGroupHint"
v-if="showGroupHint" v-html="$t('contribution.visibleOnlyForMembersOfGroup', { name: groupName })"
v-html="$t('contribution.visibleOnlyForMembersOfGroup', { name: groupName })" />
/> <!-- eslint-enable vue/no-v-text-v-html-on-component -->
<!-- eslint-enable vue/no-v-text-v-html-on-component --> </ds-flex-item>
</ds-flex-item> <ds-flex-item width="0.15" />
<ds-flex-item width="0.15" /> <ds-flex-item class="action-buttons-group" width="2">
<ds-flex-item class="action-buttons-group" width="2"> <base-button data-test="cancel-button" :disabled="loading" @click="$router.back()">
<base-button data-test="cancel-button" :disabled="loading" @click="$router.back()"> {{ $t('actions.cancel') }}
{{ $t('actions.cancel') }} </base-button>
</base-button> <base-button type="submit" icon="check" :loading="loading" :disabled="errors" filled>
<base-button type="submit" icon="check" :loading="loading" :disabled="errors" filled> {{ $t('actions.save') }}
{{ $t('actions.save') }} </base-button>
</base-button> </ds-flex-item>
</ds-flex-item> </ds-flex>
</ds-flex> </base-card>
</base-card> </template>
</template> </ds-form>
</ds-form> </div>
</template> </template>
<script> <script>
import gql from 'graphql-tag' import gql from 'graphql-tag'

View File

@ -749,13 +749,13 @@
"forGroup": { "forGroup": {
"title": "Für die Gruppe „{name}“" "title": "Für die Gruppe „{name}“"
}, },
"title": "Erstelle ein neues Event" "title": "Erstelle eine Veranstaltung"
}, },
"createNewPost": { "createNewPost": {
"forGroup": { "forGroup": {
"title": "Für die Gruppe „{name}“" "title": "Für die Gruppe „{name}“"
}, },
"title": "Erstelle einen neuen Beitrag" "title": "Erstelle einen Beitrag"
}, },
"edited": "bearbeitet", "edited": "bearbeitet",
"editPost": { "editPost": {

View File

@ -749,13 +749,13 @@
"forGroup": { "forGroup": {
"title": "For The Group “{name}”" "title": "For The Group “{name}”"
}, },
"title": "Create A New Event" "title": "Create an Event"
}, },
"createNewPost": { "createNewPost": {
"forGroup": { "forGroup": {
"title": "For The Group “{name}”" "title": "For The Group “{name}”"
}, },
"title": "Create A New Article" "title": "Create an Article"
}, },
"edited": "edited", "edited": "edited",
"editPost": { "editPost": {

View File

@ -1,55 +1,33 @@
<template> <template>
<div> <div>
<ds-flex :width="{ base: '100%' }"> <ds-flex gutter="small">
<ds-flex-item :width="{ base: '100%' }"> <ds-flex-item :width="{ base: '100%', md: '200px' }">
<ds-flex gutter="base" :width="{ base: '100%', sm: 1 }"> <ds-menu class="post-type-menu" :routes="routes">
<ds-flex-item> <ds-menu-item
<ds-card class="create-form-btn" :primary="!createEvent" centered> @click.prevent="switchPostType($event, item)"
<div> slot="menuitem"
<ds-button slot-scope="item"
v-if="!createEvent" :route="item.route"
ghost class="post-type-menu-item"
fullwidth >
size="x-large" {{ item.route.name }}
class="inactive-tab-button" </ds-menu-item>
> </ds-menu>
{{ $t('post.createNewPost.title') }}
</ds-button>
<ds-button v-else ghost fullwidth size="x-large" @click="switchPostType()">
{{ $t('post.createNewPost.title') }}
</ds-button>
</div>
</ds-card>
</ds-flex-item>
<ds-flex-item>
<ds-card class="create-form-btn" :primary="!!createEvent" centered>
<div>
<ds-button
ghost
fullwidth
size="x-large"
v-if="createEvent"
hover
class="inactive-tab-button"
>
{{ $t('post.createNewEvent.title') }}
</ds-button>
<ds-button ghost fullwidth size="x-large" v-else @click="switchPostType()">
{{ $t('post.createNewEvent.title') }}
</ds-button>
</div>
</ds-card>
</ds-flex-item>
</ds-flex>
<div v-if="group" class="group-create-title">
{{ $t('post.createNewPost.forGroup.title', { name: group.name }) }}
</div>
</ds-flex-item> </ds-flex-item>
</ds-flex> <ds-flex-item :width="{ base: '100%', md: 1 }">
<transition name="slide-up" appear>
<ds-flex :width="{ base: '100%' }" gutter="base"> <div>
<ds-flex-item :width="{ base: '100%' }"> <div>
<contribution-form :group="group" :createEvent="createEvent" /> <h1 v-if="!createEvent" class="title">
{{ $t('post.createNewPost.title') }}
</h1>
<h1 v-else class="title">
{{ $t('post.createNewEvent.title') }}
</h1>
</div>
<contribution-form :group="group" :createEvent="createEvent" />
</div>
</transition>
</ds-flex-item> </ds-flex-item>
</ds-flex> </ds-flex>
</div> </div>
@ -74,6 +52,20 @@ export default {
group() { group() {
return this.Group && this.Group[0] ? this.Group[0] : null return this.Group && this.Group[0] ? this.Group[0] : null
}, },
routes() {
return [
{
name: this.$t('post.name'),
path: `/post/create`,
type: 'post',
},
{
name: this.$t('post.event'),
path: `/`,
type: 'event',
},
]
},
}, },
apollo: { apollo: {
Group: { Group: {
@ -97,8 +89,18 @@ export default {
}, },
}, },
methods: { methods: {
switchPostType() { switchPostType(event, route) {
this.createEvent = !this.createEvent if (route.route.type.toLowerCase() === 'event') {
this.createEvent = true
} else {
this.createEvent = false
}
// hacky way to set active element
const menuItems = document.querySelectorAll('.post-type-menu-item')
menuItems.forEach((menuItem) => {
menuItem.firstChild.classList.remove('router-link-exact-active', 'router-link-active')
})
event.target.classList.add('router-link-exact-active')
}, },
}, },
} }
@ -120,4 +122,16 @@ export default {
.create-form-btn .ds-button-ghost:hover { .create-form-btn .ds-button-ghost:hover {
background-color: transparent; background-color: transparent;
} }
.menu-item-active {
color: $color-primary;
border-left: 2px solid $color-primary;
background-color: #faf9fa;
}
@media screen and (min-width: 768px) {
.post-type-menu {
margin-top: 39px;
}
}
</style> </style>