diff --git a/.github/workflows/test-webapp.yml b/.github/workflows/test-webapp.yml
index 9ca3023cc..c1aee47cf 100644
--- a/.github/workflows/test-webapp.yml
+++ b/.github/workflows/test-webapp.yml
@@ -23,7 +23,7 @@ jobs:
prepare:
name: Prepare
- if: needs.files-changed.outputs.webapp
+ if: needs.files-changed.outputs.webapp == 'true'
needs: files-changed
runs-on: ubuntu-latest
steps:
@@ -37,7 +37,7 @@ jobs:
build_test_webapp:
name: Docker Build Test - Webapp
- if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp
+ if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true'
needs: [files-changed, prepare]
runs-on: ubuntu-latest
steps:
@@ -57,7 +57,7 @@ jobs:
lint_webapp:
name: Lint Webapp
- if: needs.files-changed.outputs.webapp
+ if: needs.files-changed.outputs.webapp == 'true'
needs: files-changed
runs-on: ubuntu-latest
steps:
@@ -69,7 +69,7 @@ jobs:
unit_test_webapp:
name: Unit Tests - Webapp
- if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp
+ if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true'
needs: [files-changed, build_test_webapp]
runs-on: ubuntu-latest
permissions:
diff --git a/backend/src/schema/resolvers/rooms.spec.ts b/backend/src/schema/resolvers/rooms.spec.ts
index d27c64e57..03c3d4456 100644
--- a/backend/src/schema/resolvers/rooms.spec.ts
+++ b/backend/src/schema/resolvers/rooms.spec.ts
@@ -92,6 +92,21 @@ describe('Room', () => {
})
})
+ describe('user id is self', () => {
+ it('throws error', async () => {
+ await expect(
+ mutate({
+ mutation: createRoomMutation(),
+ variables: {
+ userId: 'chatting-user',
+ },
+ }),
+ ).resolves.toMatchObject({
+ errors: [{ message: 'Cannot create a room with self' }],
+ })
+ })
+ })
+
describe('user id exists', () => {
it('returns the id of the room', async () => {
const result = await mutate({
diff --git a/backend/src/schema/resolvers/rooms.ts b/backend/src/schema/resolvers/rooms.ts
index 02309e172..d5015a03b 100644
--- a/backend/src/schema/resolvers/rooms.ts
+++ b/backend/src/schema/resolvers/rooms.ts
@@ -32,6 +32,9 @@ export default {
const {
user: { id: currentUserId },
} = context
+ if (userId === currentUserId) {
+ throw new Error('Cannot create a room with self')
+ }
const session = context.driver.session()
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
const createRoomCypher = `
diff --git a/backend/src/schema/types/type/Location.gql b/backend/src/schema/types/type/Location.gql
index fad24cc26..9cb5c970a 100644
--- a/backend/src/schema/types/type/Location.gql
+++ b/backend/src/schema/types/type/Location.gql
@@ -25,4 +25,3 @@ type LocationMapBox {
type Query {
queryLocations(place: String!, lang: String!): [LocationMapBox]!
}
-
diff --git a/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql
index 0a7277515..7e6d1d0e7 100644
--- a/backend/src/schema/types/type/Post.gql
+++ b/backend/src/schema/types/type/Post.gql
@@ -84,8 +84,8 @@ input _PostFilter {
group: _GroupFilter
postsInMyGroups: Boolean
postType_in: [PostType]
- eventStart_gte: String
- eventEnd_gte: String
+ eventStart_gte: String
+ eventEnd_gte: String
}
enum _PostOrdering {
diff --git a/cypress/cypress.config.js b/cypress/cypress.config.js
index 2d2cefc47..b169c0ce0 100644
--- a/cypress/cypress.config.js
+++ b/cypress/cypress.config.js
@@ -42,10 +42,7 @@ module.exports = defineConfig({
baseUrl: "http://localhost:3000",
specPattern: "cypress/e2e/**/*.feature",
supportFile: "cypress/support/e2e.js",
- retries: {
- runMode: 2,
- openMode: 0,
- },
+ retries: 0,
video: false,
setupNodeEvents,
},
diff --git a/deployment/TODO-next-update.md b/deployment/TODO-next-update.md
index 8630275b7..8e30d1f47 100644
--- a/deployment/TODO-next-update.md
+++ b/deployment/TODO-next-update.md
@@ -2,6 +2,10 @@
When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings:
+## Version >= 2.7.0 with 'ocelotDockerVersionTag' 2.7.0-470
+
+- You have to rename all `.js` files to `.ts` in `branding/constants`
+
## Version >= 2.4.0 with 'ocelotDockerVersionTag' 2.4.0-298
- You have to set `SHOW_CONTENT_FILTER_HEADER_MENU` and `SHOW_CONTENT_FILTER_MASONRY_GRID` in `branding/constants/filter.js` originally in main code file `webapp/constants/filter.js` to your preferred value.
diff --git a/deployment/configurations/stage.ocelot.social b/deployment/configurations/stage.ocelot.social
index 350237c62..fdc2e52fa 160000
--- a/deployment/configurations/stage.ocelot.social
+++ b/deployment/configurations/stage.ocelot.social
@@ -1 +1 @@
-Subproject commit 350237c62dcff1a5c34f1e8d718f89b05ce3d33f
+Subproject commit fdc2e52fa444b300e1c4736600bc0e9ae3314222
diff --git a/webapp/assets/_new/icons/svgs/chat-bubble.svg b/webapp/assets/_new/icons/svgs/chat-bubble.svg
new file mode 100644
index 000000000..377b52f2f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/chat-bubble.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/webapp/assets/_new/styles/export.scss b/webapp/assets/_new/styles/export.scss
new file mode 100644
index 000000000..88b42bfc9
--- /dev/null
+++ b/webapp/assets/_new/styles/export.scss
@@ -0,0 +1,30 @@
+
+:export {
+ colorPrimary: $color-primary;
+ colorPrimaryActive: $color-primary-active;
+ colorPrimaryLight: $color-primary-light;
+
+ borderColorSoft: $border-color-soft;
+
+ borderRadiusBase: $border-radius-base;
+
+ textColorBase: $text-color-base;
+ textColorSoft: $text-color-soft;
+ textColorInverse: $text-color-inverse;
+
+ boxShadowBase: $box-shadow-base;
+
+ backgroundColorBase: $background-color-base;
+ backgroundColorSoft: $background-color-soft;
+ backgroundColorSoftest: $background-color-softest;
+ backgroundColorPrimary: $background-color-primary;
+
+ colorNeutral30: $color-neutral-30;
+
+ chatMessageColor: $chat-message-color;
+
+ chatMessageBgMe: $chat-message-bg-me;
+ chatMessageBgOthers: $chat-message-bg-others;
+
+ chatNewMessageColor: $chat-new-message-color;
+ }
\ No newline at end of file
diff --git a/webapp/assets/_new/styles/tokens.scss b/webapp/assets/_new/styles/tokens.scss
index 22e0214ff..e001ffa84 100644
--- a/webapp/assets/_new/styles/tokens.scss
+++ b/webapp/assets/_new/styles/tokens.scss
@@ -406,4 +406,14 @@ $color-toast-green: $color-success;
$color-ribbon-event: $background-color-third;
$color-ribbon-event-active: $background-color-third-active;
$color-ribbon-article: $background-color-secondary;
-$color-ribbon-article-active: $background-color-secondary-active;
\ No newline at end of file
+$color-ribbon-article-active: $background-color-secondary-active;
+
+/**
+ * @tokens Chat Color
+ */
+
+$chat-message-bg-me: $color-primary-light;
+$chat-message-color: $text-color-base;
+$chat-message-bg-others: $color-neutral-80;
+$chat-sidemenu-bg: $color-secondary-active;
+$chat-new-message-color: $color-secondary-active;
diff --git a/webapp/components/Chat/Chat.vue b/webapp/components/Chat/Chat.vue
index 2b9514bf3..cca6c4319 100644
--- a/webapp/components/Chat/Chat.vue
+++ b/webapp/components/Chat/Chat.vue
@@ -15,13 +15,42 @@
:rooms-loaded="true"
show-files="false"
show-audio="false"
+ :styles="JSON.stringify(computedChatStyle)"
:show-footer="true"
@send-message="sendMessage($event.detail[0])"
@fetch-messages="fetchMessages($event.detail[0])"
:responsive-breakpoint="responsiveBreakpoint"
:single-room="singleRoom"
@show-demo-options="showDemoOptions = $event"
- />
+ >
+
+
+
+
+
+ {{ getInitialsName(selectedRoom.roomName) }}
+
+
+
+
+
+
+ {{ getInitialsName(room.roomName) }}
+
+
+
@@ -29,6 +58,7 @@
-
diff --git a/webapp/components/HeaderMenu/HeaderMenu.vue b/webapp/components/HeaderMenu/HeaderMenu.vue
index bef73186b..f4d48220e 100644
--- a/webapp/components/HeaderMenu/HeaderMenu.vue
+++ b/webapp/components/HeaderMenu/HeaderMenu.vue
@@ -74,6 +74,10 @@
+
+
+
+
@@ -92,10 +96,6 @@
-
-
-
-
@@ -131,10 +131,16 @@
@@ -257,10 +263,11 @@ import isEmpty from 'lodash/isEmpty'
import { SHOW_GROUP_BUTTON_IN_HEADER } from '~/constants/groups.js'
import { SHOW_CONTENT_FILTER_HEADER_MENU } from '~/constants/filter.js'
import LOGOS from '~/constants/logos.js'
-import headerMenu from '~/constants/headerMenu.js'
import AvatarMenu from '~/components/AvatarMenu/AvatarMenu'
+import ChatNotificationMenu from '~/components/ChatNotificationMenu/ChatNotificationMenu'
import FilterMenu from '~/components/FilterMenu/FilterMenu.vue'
import GroupButton from '~/components/Group/GroupButton'
+import headerMenu from '~/constants/headerMenu.js'
import InviteButton from '~/components/InviteButton/InviteButton'
import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch'
import Logo from '~/components/Logo/Logo'
@@ -269,7 +276,6 @@ import SearchField from '~/components/features/SearchField/SearchField.vue'
import NotificationMenu from '~/components/NotificationMenu/NotificationMenu'
import links from '~/constants/links.js'
import PageParamsLink from '~/components/_new/features/PageParamsLink/PageParamsLink.vue'
-import ChatNotificationMenu from '~/components/ChatNotificationMenu/ChatNotificationMenu'
export default {
components: {
diff --git a/webapp/constants/chat.js b/webapp/constants/chat.js
new file mode 100644
index 000000000..a183a3922
--- /dev/null
+++ b/webapp/constants/chat.js
@@ -0,0 +1,299 @@
+import tokens from './../assets/_new/styles/tokens.scss'
+// import branding from './../assets/styles/imports/_branding.scss'
+
+const styleData = tokens
+
+const STYLE = {
+ light: {
+ general: {
+ color: styleData.textColorBase,
+ colorButtonClear: '#1976d2',
+ colorButton: '#fff',
+ backgroundColorButton: '#1976d2',
+ backgroundInput: '#fff',
+ colorPlaceholder: styleData.textColorSoft,
+ colorCaret: '#1976d2',
+ colorSpinner: styleData.colorPrimary,
+ borderStyle: '1px solid #e1e4e8',
+ backgroundScrollIcon: '#fff',
+ },
+
+ container: {
+ border: 'none',
+ borderRadius: styleData.borderRadiusBase,
+ boxShadow: styleData.boxShadowBase,
+ },
+
+ header: {
+ background: styleData.backgroundColorSoft,
+ colorRoomName: styleData.textColorBase,
+ colorRoomInfo: styleData.textColorSoft,
+ },
+
+ footer: {
+ background: styleData.backgroundColorSoft,
+ borderStyleInput: '1px solid #e1e4e8',
+ borderInputSelected: '#1976d2',
+ backgroundReply: styleData.backgroundColorSoft,
+ backgroundTagActive: styleData.backgroundColorSoft,
+ backgroundTag: styleData.backgroundColorBase,
+ },
+
+ content: {
+ background: styleData.backgroundColorBase,
+ },
+
+ sidemenu: {
+ background: '#fff',
+ backgroundHover: '#f6f6f6',
+ backgroundActive: styleData.colorPrimaryLight,
+ colorActive: '#1976d2',
+ borderColorSearch: '#e1e5e8',
+ },
+
+ dropdown: {
+ background: '#fff',
+ backgroundHover: '#f6f6f6',
+ },
+
+ message: {
+ background: styleData.chatMessageBgOthers,
+ backgroundMe: styleData.chatMessageBgMe,
+ color: styleData.chatMessageColor,
+ colorStarted: '#9ca6af',
+ backgroundDeleted: '#dadfe2',
+ backgroundSelected: '#c2dcf2',
+ colorDeleted: '#757e85',
+ colorUsername: '#9ca6af',
+ colorTimestamp: '#828c94',
+ backgroundDate: '#e5effa',
+ colorDate: '#505a62',
+ backgroundSystem: '#e5effa',
+ colorSystem: '#505a62',
+ backgroundMedia: 'rgba(0, 0, 0, 0.15)',
+ backgroundReply: 'rgba(0, 0, 0, 0.08)',
+ colorReplyUsername: '#0a0a0a',
+ colorReply: '#6e6e6e',
+ colorTag: '#0d579c',
+ backgroundImage: '#ddd',
+ colorNewMessages: styleData.chatNewMessageColor,
+ backgroundScrollCounter: '#0696c7',
+ colorScrollCounter: '#fff',
+ backgroundReaction: '#eee',
+ borderStyleReaction: '1px solid #eee',
+ backgroundReactionHover: '#fff',
+ borderStyleReactionHover: '1px solid #ddd',
+ colorReactionCounter: '#0a0a0a',
+ backgroundReactionMe: '#cfecf5',
+ borderStyleReactionMe: '1px solid #3b98b8',
+ backgroundReactionHoverMe: '#cfecf5',
+ borderStyleReactionHoverMe: '1px solid #3b98b8',
+ colorReactionCounterMe: '#0b59b3',
+ backgroundAudioRecord: '#eb4034',
+ backgroundAudioLine: 'rgba(0, 0, 0, 0.15)',
+ backgroundAudioProgress: '#455247',
+ backgroundAudioProgressSelector: '#455247',
+ colorFileExtension: '#757e85',
+ },
+
+ markdown: {
+ background: 'rgba(239, 239, 239, 0.7)',
+ border: 'rgba(212, 212, 212, 0.9)',
+ color: '#e01e5a',
+ colorMulti: '#0a0a0a',
+ },
+
+ room: {
+ colorUsername: '#0a0a0a',
+ colorMessage: '#67717a',
+ colorTimestamp: '#a2aeb8',
+ colorStateOnline: '#4caf50',
+ colorStateOffline: '#9ca6af',
+ backgroundCounterBadge: '#0696c7',
+ colorCounterBadge: '#fff',
+ },
+
+ emoji: {
+ background: '#fff',
+ },
+
+ icons: {
+ search: '#9ca6af',
+ add: styleData.colorPrimary,
+ toggle: styleData.colorNeutral30,
+ menu: styleData.colorNeutral30,
+ close: '#9ca6af',
+ closeImage: '#fff',
+ file: styleData.colorPrimary,
+ paperclip: styleData.colorPrimary,
+ closeOutline: '#000',
+ closePreview: '#fff',
+ send: styleData.colorPrimary,
+ sendDisabled: '#9ca6af',
+ emoji: styleData.colorPrimary,
+ emojiReaction: 'rgba(0, 0, 0, 0.3)',
+ document: styleData.colorPrimary,
+ pencil: '#9e9e9e',
+ checkmark: '#9e9e9e',
+ checkmarkSeen: '#0696c7',
+ eye: '#fff',
+ dropdownMessage: '#fff',
+ dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)',
+ dropdownRoom: '#9e9e9e',
+ dropdownScroll: '#0a0a0a',
+ microphone: styleData.colorPrimary,
+ audioPlay: '#455247',
+ audioPause: '#455247',
+ audioCancel: '#eb4034',
+ audioConfirm: '#1ba65b',
+ },
+ },
+ dark: {
+ general: {
+ color: '#fff',
+ colorButtonClear: '#fff',
+ colorButton: '#fff',
+ backgroundColorButton: '#1976d2',
+ backgroundInput: '#202223',
+ colorPlaceholder: '#596269',
+ colorCaret: '#fff',
+ colorSpinner: '#fff',
+ borderStyle: 'none',
+ backgroundScrollIcon: '#fff',
+ },
+
+ container: {
+ border: 'none',
+ borderRadius: '4px',
+ boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)',
+ },
+
+ header: {
+ background: '#181a1b',
+ colorRoomName: '#fff',
+ colorRoomInfo: '#9ca6af',
+ },
+
+ footer: {
+ background: '#131415',
+ borderStyleInput: 'none',
+ borderInputSelected: '#1976d2',
+ backgroundReply: '#1b1c1c',
+ backgroundTagActive: '#1b1c1c',
+ backgroundTag: '#131415',
+ },
+
+ content: {
+ background: '#131415',
+ },
+
+ sidemenu: {
+ background: '#181a1b',
+ backgroundHover: '#202224',
+ backgroundActive: '#151617',
+ colorActive: '#fff',
+ borderColorSearch: '#181a1b',
+ },
+
+ dropdown: {
+ background: '#2a2c33',
+ backgroundHover: '#26282e',
+ },
+
+ message: {
+ background: '#22242a',
+ backgroundMe: '#1f7e80',
+ color: '#fff',
+ colorStarted: '#9ca6af',
+ backgroundDeleted: '#1b1c21',
+ backgroundSelected: '#c2dcf2',
+ colorDeleted: '#a2a5a8',
+ colorUsername: '#b3bac9',
+ colorTimestamp: '#ebedf2',
+ backgroundDate: 'rgba(0, 0, 0, 0.3)',
+ colorDate: '#bec5cc',
+ backgroundSystem: 'rgba(0, 0, 0, 0.3)',
+ colorSystem: '#bec5cc',
+ backgroundMedia: 'rgba(0, 0, 0, 0.18)',
+ backgroundReply: 'rgba(0, 0, 0, 0.18)',
+ colorReplyUsername: '#fff',
+ colorReply: '#d6d6d6',
+ colorTag: '#f0c60a',
+ backgroundImage: '#ddd',
+ colorNewMessages: '#fff',
+ backgroundScrollCounter: '#1976d2',
+ colorScrollCounter: '#fff',
+ backgroundReaction: 'none',
+ borderStyleReaction: 'none',
+ backgroundReactionHover: '#202223',
+ borderStyleReactionHover: 'none',
+ colorReactionCounter: '#fff',
+ backgroundReactionMe: '#4e9ad1',
+ borderStyleReactionMe: 'none',
+ backgroundReactionHoverMe: '#4e9ad1',
+ borderStyleReactionHoverMe: 'none',
+ colorReactionCounterMe: '#fff',
+ backgroundAudioRecord: '#eb4034',
+ backgroundAudioLine: 'rgba(255, 255, 255, 0.15)',
+ backgroundAudioProgress: '#b7d4d3',
+ backgroundAudioProgressSelector: '#b7d4d3',
+ colorFileExtension: '#a2a5a8',
+ },
+
+ markdown: {
+ background: 'rgba(239, 239, 239, 0.7)',
+ border: 'rgba(212, 212, 212, 0.9)',
+ color: '#e01e5a',
+ colorMulti: '#0a0a0a',
+ },
+
+ room: {
+ colorUsername: '#fff',
+ colorMessage: '#6c7278',
+ colorTimestamp: '#6c7278',
+ colorStateOnline: '#4caf50',
+ colorStateOffline: '#596269',
+ backgroundCounterBadge: '#1976d2',
+ colorCounterBadge: '#fff',
+ },
+
+ emoji: {
+ background: '#343740',
+ },
+
+ icons: {
+ search: '#596269',
+ add: '#fff',
+ toggle: '#fff',
+ menu: '#fff',
+ close: '#9ca6af',
+ closeImage: '#fff',
+ file: '#1976d2',
+ paperclip: '#fff',
+ closeOutline: '#fff',
+ closePreview: '#fff',
+ send: '#fff',
+ sendDisabled: '#646a70',
+ emoji: '#fff',
+ emojiReaction: '#fff',
+ document: '#1976d2',
+ pencil: '#ebedf2',
+ checkmark: '#ebedf2',
+ checkmarkSeen: '#f0d90a',
+ eye: '#fff',
+ dropdownMessage: '#fff',
+ dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)',
+ dropdownRoom: '#fff',
+ dropdownScroll: '#0a0a0a',
+ microphone: '#fff',
+ audioPlay: '#b7d4d3',
+ audioPause: '#b7d4d3',
+ audioCancel: '#eb4034',
+ audioConfirm: '#1ba65b',
+ },
+ },
+}
+
+export default {
+ STYLE,
+}
diff --git a/webapp/graphql/PostQuery.js b/webapp/graphql/PostQuery.js
index 83eec2a30..29b7a1f07 100644
--- a/webapp/graphql/PostQuery.js
+++ b/webapp/graphql/PostQuery.js
@@ -77,6 +77,10 @@ export const filterPosts = (i18n) => {
eventEnd
eventVenue
eventLocationName
+ eventLocation {
+ lng
+ lat
+ }
eventIsOnline
...post
...postCounts
diff --git a/webapp/layouts/default.spec.js b/webapp/layouts/default.spec.js
index 1b83491d7..cce8c2eca 100644
--- a/webapp/layouts/default.spec.js
+++ b/webapp/layouts/default.spec.js
@@ -37,7 +37,7 @@ describe('default.vue', () => {
getters: {
'auth/isLoggedIn': () => true,
'chat/showChat': () => {
- return { showChat: false, roomID: 'u0' }
+ return { showChat: false, roomID: null }
},
},
})
diff --git a/webapp/layouts/default.vue b/webapp/layouts/default.vue
index 8b6b80604..bd518b976 100644
--- a/webapp/layouts/default.vue
+++ b/webapp/layouts/default.vue
@@ -14,15 +14,11 @@
-
- RoomID: {{ $store.getters['chat/showChat'].roomID }}
-
- x
-
-
-
+
- >
@@ -55,7 +59,6 @@ export default {
.chat-modul {
background-color: rgb(233, 228, 228);
- height: 667px;
width: 355px;
position: fixed;
bottom: 45px;
diff --git a/webapp/locales/de.json b/webapp/locales/de.json
index febb8898c..e1137deb7 100644
--- a/webapp/locales/de.json
+++ b/webapp/locales/de.json
@@ -77,6 +77,24 @@
}
}
},
+ "chat": {
+ "cancelSelectMessage": "Abbrechen",
+ "conversationStarted": "Unterhaltung startete am:",
+ "isOnline": "online",
+ "isTyping": "tippt...",
+ "lastSeen": "zuletzt gesehen ",
+ "messageDeleted": "Diese Nachricht wuerde gelöscht",
+ "messagesEmpty": "Keine Nachrichten",
+ "newMessages": "Neue Nachrichten",
+ "roomEmpty": "Keinen Raum selektiert",
+ "roomsEmpty": "Keine Räume",
+ "search": "Suche",
+ "typeMessage": "Nachricht schreiben",
+ "userProfileButton": {
+ "label": "Chat",
+ "tooltip": "Chatte mit „{name}“"
+ }
+ },
"client-only": {
"loading": "Lade …"
},
@@ -552,6 +570,9 @@
},
"groups": "Gruppen",
"myProfile": "Mein Profil"
+ },
+ "chat": {
+ "tooltip": "Meine Chats"
}
},
"index": {
@@ -580,7 +601,7 @@
"moreInfo": "Was ist {APPLICATION_NAME}?",
"moreInfoHint": "zur Präsentationsseite",
"no-account": "Du hast noch kein Nutzerkonto?",
- "no-cookie": "Es kann kein Cookie angelegt werden. Du must Cookies akzeptieren.",
+ "no-cookie": "Es kann kein Cookie angelegt werden. Du musst Cookies akzeptieren.",
"password": "Dein Passwort",
"register": "Nutzerkonto erstellen",
"success": "Du bist eingeloggt!"
@@ -595,9 +616,16 @@
"button": {
"tooltip": "Landkarte anzeigen"
},
- "markerTypes": {
+ "legend": {
+ "event": "Veranstaltung",
"group": "Gruppe",
- "theUser": "deine Position",
+ "theUser": "Meine Position",
+ "user": "Nutzer"
+ },
+ "markerTypes": {
+ "event": "Veranstaltung",
+ "group": "Gruppe",
+ "theUser": "meine Position",
"user": "Nutzer"
},
"pageTitle": "Landkarte",
@@ -691,10 +719,6 @@
"unread": "Ungelesen"
},
"group": "Beschreibung",
- "headerMenuButton": {
- "chat": "Meine Chat",
- "tooltip": "Meine Benachrichtigungen"
- },
"markAllAsRead": "Markiere alle als gelesen",
"pageLink": "Alle Benachrichtigungen",
"post": "Beitrag oder Gruppe",
@@ -710,11 +734,6 @@
"title": "Benachrichtigungen",
"user": "Nutzer"
},
- "position": {
- "group": "Gruppe",
- "my": "Meine Position",
- "user": "Nutzer"
- },
"post": {
"comment": {
"reply": "Antworten",
@@ -759,9 +778,9 @@
"viewEvent": {
"eventEnd": "Ende",
"eventIsOnline": "Online",
- "eventLocationName": "Stadt",
+ "eventLocationName": "Stadt - z.B. Musterstraße 1, 12345 Musterstadt",
"eventStart": "Beginn",
- "eventVenue": "Veranstaltungsort",
+ "eventVenue": "Veranstaltungsort - z.B. Hinterhof, 1. OG, ...",
"title": "Veranstaltung"
},
"viewPost": {
diff --git a/webapp/locales/en.json b/webapp/locales/en.json
index c0fb5c2f6..2e1e361ab 100644
--- a/webapp/locales/en.json
+++ b/webapp/locales/en.json
@@ -77,6 +77,24 @@
}
}
},
+ "chat": {
+ "cancelSelectMessage": "Cancel",
+ "conversationStarted": "Conversation started on:",
+ "isOnline": "is online",
+ "isTyping": "is writing...",
+ "lastSeen": "last seen ",
+ "messageDeleted": "This message was deleted",
+ "messagesEmpty": "No messages",
+ "newMessages": "New Messages",
+ "roomEmpty": "No room selected",
+ "roomsEmpty": "No rooms",
+ "search": "Search",
+ "typeMessage": "Type message",
+ "userProfileButton": {
+ "label": "Chat",
+ "tooltip": "Chat with “{name}”"
+ }
+ },
"client-only": {
"loading": "Loading …"
},
@@ -552,6 +570,9 @@
},
"groups": "Groups",
"myProfile": "My profile"
+ },
+ "chat": {
+ "tooltip": "My chats"
}
},
"index": {
@@ -595,9 +616,16 @@
"button": {
"tooltip": "Show map"
},
+ "legend": {
+ "event": "Event",
+ "group": "Group",
+ "theUser": "My position",
+ "user": "User"
+ },
"markerTypes": {
+ "event": "event",
"group": "group",
- "theUser": "your position",
+ "theUser": "my position",
"user": "user"
},
"pageTitle": "Map",
@@ -691,10 +719,6 @@
"unread": "Unread"
},
"group": "Description",
- "headerMenuButton": {
- "chat": "My Chat",
- "tooltip": "My notifications"
- },
"markAllAsRead": "Mark all as read",
"pageLink": "All notifications",
"post": "Post or Group",
@@ -710,11 +734,6 @@
"title": "Notifications",
"user": "User"
},
- "position": {
- "group": "Group",
- "my": "My position",
- "user": "User"
- },
"post": {
"comment": {
"reply": "Reply",
@@ -759,9 +778,9 @@
"viewEvent": {
"eventEnd": "End",
"eventIsOnline": "Online",
- "eventLocationName": "City",
+ "eventLocationName": "City - e.g. Example street 1, 12345 City",
"eventStart": "Start",
- "eventVenue": "Venue",
+ "eventVenue": "Venue - e.g. Backyard, 1st Floor, ...",
"title": "Event"
},
"viewPost": {
diff --git a/webapp/nuxt.config.js b/webapp/nuxt.config.js
index 66a23c191..c9b4db317 100644
--- a/webapp/nuxt.config.js
+++ b/webapp/nuxt.config.js
@@ -105,6 +105,7 @@ export default {
styleguideStyles,
'~assets/_new/styles/tokens.scss',
'~assets/styles/imports/_branding.scss',
+ '~assets/_new/styles/export.scss',
],
},
diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue
index 1a34cbda1..2bf1817f7 100644
--- a/webapp/pages/map.vue
+++ b/webapp/pages/map.vue
@@ -5,16 +5,15 @@
{{ $t('map.pageTitle') }}
-

- {{ $t('position.my') }}
-

- {{ $t('position.user') }}
-

- {{ $t('position.group') }}
+
+
+ {{ $t('map.legend.' + type.id) }}
+
+
@@ -66,6 +65,7 @@ import '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css'
import { mapGetters } from 'vuex'
import { profileUserQuery, mapUserQuery } from '~/graphql/User'
import { groupQuery } from '~/graphql/groups'
+import { filterPosts } from '~/graphql/PostQuery.js'
import mobile from '~/mixins/mobile'
import Empty from '~/components/Empty/Empty'
import MapStylesButtons from '~/components/Map/MapStylesButtons'
@@ -95,19 +95,40 @@ export default {
currentUserCoordinates: null,
users: null,
groups: null,
+ posts: null,
markers: {
- icons: [
+ types: [
{
- id: 'marker-blue',
- name: 'mapbox-marker-icon-20px-blue.png',
+ id: 'theUser',
+ icon: {
+ id: 'marker-orange',
+ legendName: 'mapbox-marker-icon-orange.svg',
+ mapName: 'mapbox-marker-icon-20px-orange.png',
+ },
},
{
- id: 'marker-orange',
- name: 'mapbox-marker-icon-20px-orange.png',
+ id: 'user',
+ icon: {
+ id: 'marker-green',
+ legendName: 'mapbox-marker-icon-green.svg',
+ mapName: 'mapbox-marker-icon-20px-green.png',
+ },
},
{
- id: 'marker-green',
- name: 'mapbox-marker-icon-20px-green.png',
+ id: 'group',
+ icon: {
+ id: 'marker-red',
+ legendName: 'mapbox-marker-icon-red.svg',
+ mapName: 'mapbox-marker-icon-20px-red.png',
+ },
+ },
+ {
+ id: 'event',
+ icon: {
+ id: 'marker-purple',
+ legendName: 'mapbox-marker-icon-purple.svg',
+ mapName: 'mapbox-marker-icon-20px-purple.png',
+ },
},
],
isImagesLoaded: false,
@@ -137,7 +158,8 @@ export default {
this.markers.isImagesLoaded &&
this.currentUser &&
this.users &&
- this.groups
+ this.groups &&
+ this.posts
)
},
styles() {
@@ -236,17 +258,27 @@ export default {
// Copy coordinates array.
const coordinates = e.features[0].geometry.coordinates.slice()
- const markerTypeLabel =
- e.features[0].properties.type === 'group'
- ? this.$t('map.markerTypes.group')
- : e.features[0].properties.type === 'user'
- ? this.$t('map.markerTypes.user')
- : this.$t('map.markerTypes.theUser')
- const markerProfileLinkTitle =
- (e.features[0].properties.type === 'group' ? '&' : '@') + e.features[0].properties.slug
- const markerProfileLink =
- (e.features[0].properties.type === 'group' ? '/group' : '/profile') +
- `/${e.features[0].properties.id}/${e.features[0].properties.slug}`
+ const markerTypeLabel = this.$t(`map.markerTypes.${e.features[0].properties.type}`)
+ const markerProfile = {
+ theUser: {
+ linkTitle: '@' + e.features[0].properties.slug,
+ link: `/profile/${e.features[0].properties.id}/${e.features[0].properties.slug}`,
+ },
+ user: {
+ linkTitle: '@' + e.features[0].properties.slug,
+ link: `/profile/${e.features[0].properties.id}/${e.features[0].properties.slug}`,
+ },
+ group: {
+ linkTitle: '&' + e.features[0].properties.slug,
+ link: `/group/${e.features[0].properties.id}/${e.features[0].properties.slug}`,
+ },
+ event: {
+ linkTitle: e.features[0].properties.slug,
+ link: `/post/${e.features[0].properties.id}/${e.features[0].properties.slug}`,
+ },
+ }
+ const markerProfileLinkTitle = markerProfile[e.features[0].properties.type].linkTitle
+ const markerProfileLink = markerProfile[e.features[0].properties.type].link
let description = `
@@ -258,11 +290,11 @@ export default {
`
description +=
- e.features[0].properties.about && e.features[0].properties.about.length > 0
+ e.features[0].properties.description && e.features[0].properties.description.length > 0
? `
- ${e.features[0].properties.about}
+ ${e.features[0].properties.description}
`
: ''
@@ -305,15 +337,18 @@ export default {
},
loadMarkersIconsAndAddMarkers() {
Promise.all(
- this.markers.icons.map(
+ this.markers.types.map(
(marker) =>
new Promise((resolve, reject) => {
// our images have to be in the 'static/img/*' folder otherwise they are not reachable via URL
- this.map.loadImage('img/mapbox/marker-icons/' + marker.name, (error, image) => {
- if (error) throw error
- this.map.addImage(marker.id, image)
- resolve()
- })
+ this.map.loadImage(
+ 'img/mapbox/marker-icons/' + marker.icon.mapName,
+ (error, image) => {
+ if (error) throw error
+ this.map.addImage(marker.icon.id, image)
+ resolve()
+ },
+ )
}),
),
).then(() => {
@@ -337,7 +372,7 @@ export default {
id: user.id,
slug: user.slug,
name: user.name,
- about: user.about ? user.about : undefined,
+ description: user.about ? user.about : undefined,
},
geometry: {
type: 'Point',
@@ -346,27 +381,6 @@ export default {
})
}
})
- // add markers for "groups"
- this.groups.forEach((group) => {
- if (group.location) {
- this.markers.geoJSON.push({
- type: 'Feature',
- properties: {
- type: 'group',
- iconName: 'marker-blue',
- iconRotate: 0.0,
- id: group.id,
- slug: group.slug,
- name: group.name,
- about: group.about ? group.about : undefined,
- },
- geometry: {
- type: 'Point',
- coordinates: this.getCoordinates(group.location),
- },
- })
- }
- })
// add marker for "currentUser"
if (this.currentUserCoordinates) {
this.markers.geoJSON.push({
@@ -378,7 +392,7 @@ export default {
id: this.currentUser.id,
slug: this.currentUser.slug,
name: this.currentUser.name,
- about: this.currentUser.about ? this.currentUser.about : undefined,
+ description: this.currentUser.about ? this.currentUser.about : undefined,
},
geometry: {
type: 'Point',
@@ -386,6 +400,48 @@ export default {
},
})
}
+ // add markers for "groups"
+ this.groups.forEach((group) => {
+ if (group.location) {
+ this.markers.geoJSON.push({
+ type: 'Feature',
+ properties: {
+ type: 'group',
+ iconName: 'marker-red',
+ iconRotate: 0.0,
+ id: group.id,
+ slug: group.slug,
+ name: group.name,
+ description: group.about ? group.about : undefined,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: this.getCoordinates(group.location),
+ },
+ })
+ }
+ })
+ // add markers for "posts", post type "Event" with location coordinates
+ this.posts.forEach((post) => {
+ if (post.postType.includes('Event') && post.eventLocation) {
+ this.markers.geoJSON.push({
+ type: 'Feature',
+ properties: {
+ type: 'event',
+ iconName: 'marker-purple',
+ iconRotate: 0.0,
+ id: post.id,
+ slug: post.slug,
+ name: post.title,
+ description: post.contentExcerpt,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: this.getCoordinates(post.eventLocation),
+ },
+ })
+ }
+ })
this.markers.isGeoJSON = true
}
@@ -483,6 +539,24 @@ export default {
},
fetchPolicy: 'cache-and-network',
},
+ Post: {
+ query() {
+ return filterPosts(this.$i18n)
+ },
+ variables() {
+ return {
+ filter: {
+ postType_in: ['Event'],
+ eventStart_gte: new Date(),
+ // would be good to just query for events with defined "eventLocation". couldn't get it working
+ },
+ }
+ },
+ update({ Post }) {
+ this.posts = Post
+ },
+ fetchPolicy: 'cache-and-network',
+ },
},
}
diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue
index 62d2f1be7..ce97cd53a 100644
--- a/webapp/pages/profile/_id/_slug.vue
+++ b/webapp/pages/profile/_id/_slug.vue
@@ -80,13 +80,14 @@
@update="updateFollow"
/>
-
+ {{ $t('chat.userProfileButton.label') }}
@@ -181,6 +182,7 @@