diff --git a/admin/src/components/Federation/CommunityVisualizeItem.vue b/admin/src/components/Federation/CommunityVisualizeItem.vue index 25847b08c..ed7df4f9b 100644 --- a/admin/src/components/Federation/CommunityVisualizeItem.vue +++ b/admin/src/components/Federation/CommunityVisualizeItem.vue @@ -35,7 +35,10 @@ @reset="resetHomeCommunityEditable" > diff --git a/frontend/src/components/GddSend/TransactionForm.vue b/frontend/src/components/GddSend/TransactionForm.vue index 34b9953e6..cda52a49d 100644 --- a/frontend/src/components/GddSend/TransactionForm.vue +++ b/frontend/src/components/GddSend/TransactionForm.vue @@ -11,27 +11,19 @@ > - - + + {{ $t('send_gdd') }} - - + + {{ $t('send_per_link') }} @@ -287,7 +279,7 @@ label { display: flex !important; justify-content: space-between; - > input { + > div > input { position: absolute; right: 35px; top: 50%; diff --git a/frontend/src/components/GddSend/TransactionResultSendSuccess.vue b/frontend/src/components/GddSend/TransactionResultSendSuccess.vue index e70550878..89215d356 100644 --- a/frontend/src/components/GddSend/TransactionResultSendSuccess.vue +++ b/frontend/src/components/GddSend/TransactionResultSendSuccess.vue @@ -6,7 +6,9 @@ {{ $t('form.send_transaction_success') }}
- {{ $t('form.close') }} + + {{ $t('form.close') }} +
diff --git a/frontend/src/components/GddTransactionList.vue b/frontend/src/components/GddTransactionList.vue index b0cd1bd5e..8396f8d52 100644 --- a/frontend/src/components/GddTransactionList.vue +++ b/frontend/src/components/GddTransactionList.vue @@ -24,27 +24,18 @@
-
+
- - + + diff --git a/frontend/src/components/Transaction.spec.js b/frontend/src/components/Transaction.spec.js index 764be7894..6467151f3 100644 --- a/frontend/src/components/Transaction.spec.js +++ b/frontend/src/components/Transaction.spec.js @@ -245,6 +245,7 @@ import { BAvatar, BCol, BCollapse, BRow } from 'bootstrap-vue-next' import TransactionCollapse from '@/components/TransactionCollapse.vue' import { GdtEntryType } from '@/graphql/enums' import VariantIcon from '@/components/VariantIcon.vue' +import { createStore } from 'vuex' const mockToastError = vi.fn() vi.mock('@/composables/useToast', () => ({ @@ -268,6 +269,13 @@ describe('Transaction', () => { const Wrapper = () => { return mount(Transaction, { global: { + plugins: [ + createStore({ + state: { + transactionToHighlightId: '', + }, + }), + ], mocks: { $d: (value) => value?.toString() ?? '', $n: (value) => value?.toString() ?? '', diff --git a/frontend/src/components/Transaction.vue b/frontend/src/components/Transaction.vue index eb005da8d..09e721401 100644 --- a/frontend/src/components/Transaction.vue +++ b/frontend/src/components/Transaction.vue @@ -49,11 +49,12 @@ diff --git a/frontend/src/components/TransactionRows/Name.spec.js b/frontend/src/components/TransactionRows/Name.spec.js index 90bec127f..1504120b4 100644 --- a/frontend/src/components/TransactionRows/Name.spec.js +++ b/frontend/src/components/TransactionRows/Name.spec.js @@ -1,4 +1,4 @@ -import { mount } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import { describe, it, expect, beforeEach, vi } from 'vitest' import Name from './Name' import { BLink } from 'bootstrap-vue-next' @@ -44,7 +44,7 @@ describe('Name', () => { global: { mocks, stubs: { - BLink, + RouterLink: RouterLinkStub, }, }, props: propsData, @@ -88,31 +88,18 @@ describe('Name', () => { it('has a link', () => { expect( - wrapper - .find('div.gdd-transaction-list-item-name') - .findComponent({ name: 'BLink' }) - .exists(), + wrapper.find('div.gdd-transaction-list-item-name').findComponent(RouterLinkStub).exists(), ).toBe(true) }) - describe('click link', () => { - beforeEach(async () => { - await wrapper.findComponent({ name: 'BLink' }).trigger('click') - }) - - it('pushes router to send', () => { - expect(routerPushMock).toHaveBeenCalledWith({ - path: '/send', - }) - }) - - it('pushes params for gradidoID and community UUID', () => { - expect(routerPushMock).toHaveBeenCalledWith({ - params: { - communityIdentifier: 'community UUID', - userIdentifier: 'gradido-ID', - }, - }) + it('RouterLink has correct to prop', () => { + const routerLink = wrapper.findComponent(RouterLinkStub) + expect(routerLink.props().to).toEqual({ + name: 'Send', + params: { + communityIdentifier: 'community UUID', + userIdentifier: 'gradido-ID', + }, }) }) }) diff --git a/frontend/src/components/TransactionRows/Name.vue b/frontend/src/components/TransactionRows/Name.vue index 1eb94319b..246fbf933 100644 --- a/frontend/src/components/TransactionRows/Name.vue +++ b/frontend/src/components/TransactionRows/Name.vue @@ -2,9 +2,9 @@
- + {{ itemText }} - +
{{ itemText }}
@@ -45,6 +45,15 @@ export default { (this.linkedUser.communityName ? ' / ' + this.linkedUser.communityName : '') : this.text }, + pushTo() { + return { + name: 'Send', + params: { + userIdentifier: this.linkedUser.gradidoID, + communityIdentifier: this.linkedUser.communityUuid, + }, + } + }, }, methods: { async tunnelEmail() { diff --git a/frontend/src/components/Transactions/GddTransaction.vue b/frontend/src/components/Transactions/GddTransaction.vue new file mode 100644 index 000000000..4e0983d9a --- /dev/null +++ b/frontend/src/components/Transactions/GddTransaction.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/frontend/src/components/Transactions/TransactionReceive.spec.js b/frontend/src/components/Transactions/TransactionReceive.spec.js index c7d2c7314..7d1d5d1cd 100644 --- a/frontend/src/components/Transactions/TransactionReceive.spec.js +++ b/frontend/src/components/Transactions/TransactionReceive.spec.js @@ -1,16 +1,16 @@ import { mount } from '@vue/test-utils' import { describe, it, expect, beforeEach, vi } from 'vitest' import TransactionReceive from './TransactionReceive' -import Avatar from 'vue-avatar' import CollapseIcon from '../TransactionRows/CollapseIcon' import Name from '../TransactionRows/Name' import DecayInformation from '../DecayInformations/DecayInformation' import { BCol, BCollapse, BRow } from 'bootstrap-vue-next' +import AppAvatar from '@/components/AppAvatar.vue' // Mock child components -vi.mock('vue-avatar', () => ({ +vi.mock('app-avatar', () => ({ default: { - name: 'Avatar', + name: 'AppAvatar', render: () => null, }, })) @@ -86,7 +86,7 @@ describe('TransactionReceive', () => { $d: (date, format) => `Mocked ${format} date for ${date}`, }, components: { - Avatar, + AppAvatar, CollapseIcon, Name, DecayInformation, diff --git a/frontend/src/components/Transactions/TransactionReceive.vue b/frontend/src/components/Transactions/TransactionReceive.vue index 0c24bcce0..3d974a141 100644 --- a/frontend/src/components/Transactions/TransactionReceive.vue +++ b/frontend/src/components/Transactions/TransactionReceive.vue @@ -3,12 +3,14 @@ - + :border="false" + />
@@ -46,7 +48,6 @@
+ + diff --git a/frontend/src/components/UserSettings/UserCard.spec.js b/frontend/src/components/UserSettings/UserCard.spec.js index 057e0fd20..3fd48488e 100644 --- a/frontend/src/components/UserSettings/UserCard.spec.js +++ b/frontend/src/components/UserSettings/UserCard.spec.js @@ -2,6 +2,7 @@ import { mount } from '@vue/test-utils' import { describe, it, expect, beforeEach, vi } from 'vitest' import UserCard from './UserCard.vue' import { BCol, BRow } from 'bootstrap-vue-next' +import AppAvatar from '@/components/AppAvatar.vue' vi.mock('vue-avatar', () => ({ default: { @@ -39,6 +40,7 @@ describe('UserCard', () => { components: { BRow, BCol, + AppAvatar, }, mocks, }, @@ -53,12 +55,12 @@ describe('UserCard', () => { expect(wrapper.find('.userdata-card').exists()).toBe(true) }) - it('renders the SPAN Element ".vue-avatar--wrapper"', () => { - expect(wrapper.find('.vue-avatar--wrapper').exists()).toBe(true) + it('renders the DIV Element ".app-avatar"', () => { + expect(wrapper.find('.app-avatar').exists()).toBe(true) }) it('displays the first letters of the firstName and lastName', () => { - expect(wrapper.find('.vue-avatar--wrapper span').text()).toBe('BB') + expect(wrapper.find('.app-avatar').text()).toBe('BB') }) it('displays the correct balance', () => { diff --git a/frontend/src/components/UserSettings/UserCard.vue b/frontend/src/components/UserSettings/UserCard.vue index 93f44c59f..6d2c556e5 100755 --- a/frontend/src/components/UserSettings/UserCard.vue +++ b/frontend/src/components/UserSettings/UserCard.vue @@ -1,12 +1,14 @@ diff --git a/frontend/src/components/UserSettings/UserGmsLocationCapturing.vue b/frontend/src/components/UserSettings/UserGmsLocationCapturing.vue new file mode 100644 index 000000000..946dcd577 --- /dev/null +++ b/frontend/src/components/UserSettings/UserGmsLocationCapturing.vue @@ -0,0 +1,91 @@ + + + diff --git a/frontend/src/components/UserSettings/UserLocationMap.vue b/frontend/src/components/UserSettings/UserLocationMap.vue new file mode 100644 index 000000000..8622f90b2 --- /dev/null +++ b/frontend/src/components/UserSettings/UserLocationMap.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/frontend/src/components/UserSettings/UserNamingFormat.spec.js b/frontend/src/components/UserSettings/UserNamingFormat.spec.js index de163c72c..58a025e34 100644 --- a/frontend/src/components/UserSettings/UserNamingFormat.spec.js +++ b/frontend/src/components/UserSettings/UserNamingFormat.spec.js @@ -79,7 +79,7 @@ describe('UserNamingFormat', () => { await dropdownItems[3].trigger('click') expect(mockUpdateUserData).toHaveBeenCalledWith({ - variables: { gmsPublishName: 'PUBLISH_NAME_FIRST_INITIAL' }, + gmsPublishName: 'PUBLISH_NAME_FIRST_INITIAL', }) expect(mockToastSuccess).toHaveBeenCalledWith('success message') expect(mockStore.commit).toHaveBeenCalledWith('gmsPublishName', 'PUBLISH_NAME_FIRST_INITIAL') diff --git a/frontend/src/components/UserSettings/UserNamingFormat.vue b/frontend/src/components/UserSettings/UserNamingFormat.vue index 36c4a62f6..664cd4a00 100644 --- a/frontend/src/components/UserSettings/UserNamingFormat.vue +++ b/frontend/src/components/UserSettings/UserNamingFormat.vue @@ -79,7 +79,7 @@ const update = async (option) => { try { const variables = {} variables[props.attrName] = option.value - await updateUserData({ variables }) + await updateUserData({ ...variables }) toastSuccess(props.successMessage) selectedOption.value = option.value store.commit(props.attrName, option.value) diff --git a/frontend/src/components/UserSettings/UserNewsletter.spec.js b/frontend/src/components/UserSettings/UserNewsletter.spec.js index a09c920e5..e40ee6e8c 100644 --- a/frontend/src/components/UserSettings/UserNewsletter.spec.js +++ b/frontend/src/components/UserSettings/UserNewsletter.spec.js @@ -4,8 +4,10 @@ import UserNewsletter from './UserNewsletter' import { unsubscribeNewsletter, subscribeNewsletter } from '@/graphql/mutations' import { createStore } from 'vuex' import { createI18n } from 'vue-i18n' -import { BFormCheckbox } from 'bootstrap-vue-next' +import * as bootstrapVueNext from 'bootstrap-vue-next' +import { nextTick } from 'vue' +// Mock composables and dependencies const mockToastError = vi.fn() const mockToastSuccess = vi.fn() @@ -26,6 +28,7 @@ vi.mock('@vue/apollo-composable', () => ({ } else if (mutation === unsubscribeNewsletter) { return { mutate: mockUnsubscribeMutate } } + throw new Error(`Unrecognized mutation: ${mutation}`) }), })) @@ -34,7 +37,7 @@ describe('UserNewsletter', () => { let store let i18n - const createVuexStore = (initialState) => + const createVuexStore = (initialState = {}) => createStore({ state: { language: 'de', @@ -42,7 +45,7 @@ describe('UserNewsletter', () => { ...initialState, }, mutations: { - setNewsletterState(state, value) { + newsletterState(state, value) { state.newsletterState = value }, }, @@ -63,11 +66,14 @@ describe('UserNewsletter', () => { const createWrapper = (storeState = {}) => { store = createVuexStore(storeState) i18n = createI18nInstance() + return mount(UserNewsletter, { global: { - plugins: [store, i18n], - stubs: { - BFormCheckbox: true, + plugins: [store, i18n, bootstrapVueNext], + config: { + compilerOptions: { + isCustomElement: (tag) => tag.startsWith('b-'), + }, }, }, }) @@ -82,8 +88,9 @@ describe('UserNewsletter', () => { expect(wrapper.find('div.formusernewsletter').exists()).toBe(true) }) - it('has an edit BFormCheckbox switch', () => { - expect(wrapper.find('[test="BFormCheckbox"]').exists()).toBe(true) + it('has a BFormCheckbox switch', () => { + const checkbox = wrapper.findComponent({ name: 'BFormCheckbox' }) + expect(checkbox.exists()).toBe(true) }) describe('unsubscribe with success', () => { @@ -94,7 +101,12 @@ describe('UserNewsletter', () => { unsubscribeNewsletter: true, }, }) - wrapper.vm.localNewsletterState = false + + const checkbox = wrapper.findComponent({ name: 'BFormCheckbox' }) + await checkbox.setValue(false) + await nextTick() + // Ensure all promises are resolved + await Promise.resolve() }) it('calls the unsubscribe mutation', () => { @@ -118,7 +130,12 @@ describe('UserNewsletter', () => { subscribeNewsletter: true, }, }) - wrapper.vm.localNewsletterState = true + + const checkbox = wrapper.findComponent({ name: 'BFormCheckbox' }) + await checkbox.setValue(true) + await nextTick() + // Ensure all promises are resolved + await Promise.resolve() }) it('calls the subscribe mutation', () => { @@ -138,7 +155,12 @@ describe('UserNewsletter', () => { beforeEach(async () => { wrapper = createWrapper({ newsletterState: true }) mockUnsubscribeMutate.mockRejectedValue(new Error('Ouch')) - wrapper.vm.localNewsletterState = false + + const checkbox = wrapper.findComponent({ name: 'BFormCheckbox' }) + await checkbox.setValue(false) + await nextTick() + // Ensure all promises are resolved + await Promise.resolve() }) it('resets the newsletterState', () => { diff --git a/frontend/src/components/UserSettings/UserNewsletter.vue b/frontend/src/components/UserSettings/UserNewsletter.vue index 322f2e0ed..db5539171 100644 --- a/frontend/src/components/UserSettings/UserNewsletter.vue +++ b/frontend/src/components/UserSettings/UserNewsletter.vue @@ -29,20 +29,16 @@ const { mutate: newsletterSubscribe } = useMutation(subscribeNewsletter) const { mutate: newsletterUnsubscribe } = useMutation(unsubscribeNewsletter) watch(localNewsletterState, async (newValue, oldValue) => { - if (newValue !== oldValue) { + if (newValue !== undefined && newValue !== null && newValue !== oldValue) { await onSubmit() } }) const onSubmit = async () => { try { - if (localNewsletterState.value) { - await newsletterSubscribe() - } else { - await newsletterUnsubscribe() - } + localNewsletterState.value ? await newsletterSubscribe() : await newsletterUnsubscribe() - store.commit('setNewsletterState', localNewsletterState.value) + store.commit('newsletterState', localNewsletterState.value) toastSuccess( localNewsletterState.value diff --git a/frontend/src/components/skeleton/Overview.vue b/frontend/src/components/skeleton/Overview.vue index 76b90b224..882dff659 100644 --- a/frontend/src/components/skeleton/Overview.vue +++ b/frontend/src/components/skeleton/Overview.vue @@ -2,18 +2,18 @@
- - - - + +
- - - + + + + +
@@ -21,28 +21,53 @@
- - - + - - - - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/frontend/src/composables/useToast.js b/frontend/src/composables/useToast.js index bc9bdbe49..826119ec2 100644 --- a/frontend/src/composables/useToast.js +++ b/frontend/src/composables/useToast.js @@ -22,6 +22,7 @@ export function useAppToast() { toast(message, { title: t('navigation.info'), variant: 'warning', + bodyClass: 'gdd-toaster-body-darken', }) } diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index 78ebc1b5b..5090f34af 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -50,6 +50,7 @@ const community = { COMMUNITY_DESCRIPTION: process.env.COMMUNITY_DESCRIPTION ?? 'Die lokale Entwicklungsumgebung von Gradido.', COMMUNITY_SUPPORT_MAIL: process.env.COMMUNITY_SUPPORT_MAIL ?? 'support@supportmail.com', + COMMUNITY_LOCATION: process.env.COMMUNITY_LOCATION ?? '49.280377, 9.690151', } const meta = { diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index b9095a7e4..0d4858e98 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -28,6 +28,15 @@ export const authenticateGmsUserSearch = gql` } ` +export const userLocationQuery = gql` + query { + userLocation { + userLocation + communityLocation + } + } +` + export const authenticateHumhubAutoLogin = gql` query { authenticateHumhubAutoLogin diff --git a/frontend/src/layouts/DashboardLayout.spec.js b/frontend/src/layouts/DashboardLayout.spec.js index 37feb0d2f..0906793ff 100644 --- a/frontend/src/layouts/DashboardLayout.spec.js +++ b/frontend/src/layouts/DashboardLayout.spec.js @@ -1,6 +1,6 @@ import { mount } from '@vue/test-utils' import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest' -import { nextTick } from 'vue' +import { nextTick, ref } from 'vue' import DashboardLayout from './DashboardLayout' import { createStore } from 'vuex' import { createRouter, createWebHistory } from 'vue-router' @@ -15,11 +15,15 @@ vi.mock('@/composables/useToast', () => ({ })) const mockQueryFn = vi.fn() +const mockRefetchFn = vi.fn() const mockMutateFn = vi.fn() +const mockQueryResult = ref(null) vi.mock('@vue/apollo-composable', () => ({ useLazyQuery: vi.fn(() => ({ load: mockQueryFn, + refetch: mockRefetchFn, + result: mockQueryResult, onResult: vi.fn(), onError: vi.fn(), })), @@ -136,25 +140,25 @@ describe('DashboardLayout', () => { describe('update transactions', () => { beforeEach(async () => { - mockQueryFn.mockResolvedValue({ + mockQueryResult.value = { transactionList: { balance: { - balanceGDT: 100, + balanceGDT: '100', count: 4, linkCount: 8, - balance: 1450, - decay: 1250, + balance: '1450', }, - transactions: ['transaction', 'transaction', 'transaction', 'transaction'], + transactions: ['transaction1', 'transaction2', 'transaction3', 'transaction4'], }, - }) - await wrapper - .findComponent({ ref: 'router-view' }) - .vm.$emit('update-transactions', { currentPage: 2, pageSize: 5 }) - await nextTick() + } + + mockQueryFn.mockResolvedValue(mockQueryResult.value) + + await wrapper.vm.updateTransactions({ currentPage: 2, pageSize: 5 }) + await nextTick() // Ensure all promises are resolved }) - it('calls the API', () => { + it('load call to the API', () => { expect(mockQueryFn).toHaveBeenCalled() }) @@ -164,10 +168,10 @@ describe('DashboardLayout', () => { it('updates transactions', () => { expect(wrapper.vm.transactions).toEqual([ - 'transaction', - 'transaction', - 'transaction', - 'transaction', + 'transaction1', + 'transaction2', + 'transaction3', + 'transaction4', ]) }) diff --git a/frontend/src/layouts/DashboardLayout.vue b/frontend/src/layouts/DashboardLayout.vue index c06f46c46..25151cf39 100755 --- a/frontend/src/layouts/DashboardLayout.vue +++ b/frontend/src/layouts/DashboardLayout.vue @@ -181,7 +181,7 @@
- +
@@ -215,7 +215,11 @@ import { useAppToast } from '@/composables/useToast' const store = useStore() const router = useRouter() const { load: useCommunityStatsQuery } = useLazyQuery(communityStatistics) -const { load: useTransactionsQuery } = useLazyQuery(transactionsQuery) +const { + load: useTransactionsQuery, + refetch: useRefetchTransactionsQuery, + result: transactionQueryResult, +} = useLazyQuery(transactionsQuery, {}, { fetchPolicy: 'network-only' }) const { mutate: useLogoutMutation } = useMutation(logout) const { t } = useI18n() const { toastError } = useAppToast() @@ -232,14 +236,8 @@ const darkMode = ref(false) const skeleton = ref(true) const totalUsers = ref(null) -const sessionModal = ref(null) - -const testModal = () => { - sessionModal.value.showTimeoutModalForTesting() -} - onMounted(() => { - updateTransactions({ currentPage: 0, pageSize: 10 }) + updateTransactions({ currentPage: 1, pageSize: 10 }) getCommunityStatistics() setTimeout(() => { skeleton.value = false @@ -251,7 +249,7 @@ const logoutUser = async () => { await useLogoutMutation() await store.dispatch('logout') await router.push('/login') - } catch { + } catch (err) { await store.dispatch('logout') if (router.currentRoute.value.path !== '/login') await router.push('/login') } @@ -260,9 +258,9 @@ const logoutUser = async () => { const updateTransactions = async ({ currentPage, pageSize }) => { pending.value = true try { - const result = await useTransactionsQuery() - if (!result) return // TODO this return mitigate an error when this method is called second time but without actual request - const { transactionList } = result + await loadOrFetchTransactionQuery({ currentPage, pageSize }) + if (!transactionQueryResult) return + const { transactionList } = transactionQueryResult.value GdtBalance.value = transactionList.balance.balanceGDT === null ? 0 : Number(transactionList.balance.balanceGDT) transactions.value = transactionList.transactions @@ -277,6 +275,13 @@ const updateTransactions = async ({ currentPage, pageSize }) => { } } +const loadOrFetchTransactionQuery = async (queryVariables = { currentPage: 1, pageSize: 25 }) => { + return ( + (await useTransactionsQuery(transactionsQuery, queryVariables)) || + (await useRefetchTransactionsQuery(queryVariables)) + ) +} + const getCommunityStatistics = async () => { try { const result = await useCommunityStatsQuery() @@ -298,6 +303,7 @@ const setVisible = (bool) => { diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index fa9a5ab58..5f2400608 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -248,7 +248,8 @@ }, "h": "h", "language": "Sprache", - "link-load": "den letzten Link nachladen | die letzten {n} Links nachladen | weitere {n} Links nachladen", + "link-load": "den letzten Link nachladen | die letzten {n} Links nachladen", + "link-load-more": "weitere {n} Links nachladen", "login": "Anmelden", "math": { "asterisk": "*", @@ -312,10 +313,20 @@ "disabled": "Daten werden nicht nach GMS exportiert", "enabled": "Daten werden nach GMS exportiert", "location": { + "button": "Klick mich!", "label": "Positionsbestimmung", - "button": "Klick mich!" + "saveLocation": "Standort speichern", + "updateSuccess": "Standort erfolgreich gespeichert" }, "location-format": "Position auf Karte anzeigen:", + "map": { + "communityCoords": "Ihr Gemeinschafts-Standort: Breitengrad {lat}, Längengrad {lng}", + "communityLocationLabel": "Ihr Gemeinschafts-Standort", + "headline": "Geografische Standorterfassung des Benutzers", + "userCoords": "Ihr Standort: Breitengrad {lat}, Längengrad {lng}", + "userLocationLabel": "Ihr Standort", + "search": "Nach einem Standort suchen" + }, "naming-format": "Namen anzeigen:", "publish-location": { "exact": "Genaue Position", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 6dc4b077c..835d26ea3 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -248,7 +248,8 @@ }, "h": "h", "language": "Language", - "link-load": "Load the last link | Load the last {n} links | Load more {n} links", + "link-load": "Load the last link | Load the last {n} links", + "link-load-more": "Load more {n} links", "login": "Sign in", "math": { "asterisk": "*", @@ -312,10 +313,20 @@ "disabled": "Data not exported to GMS", "enabled": "Data exported to GMS", "location": { - "label": "pinpoint location", - "button": "click me!" + "button": "Click me!", + "label": "Pinpoint location", + "saveLocation": "Save Location", + "updateSuccess": "Location successfully saved" }, "location-format": "Show position on map:", + "map": { + "communityCoords": "Your Community Location: Lat {lat}, Lng {lng}", + "communityLocationLabel": "Your Community-Location", + "headline": "Geographic Location-Capturing of the User", + "userCoords": "Your Location: Lat {lat}, Lng {lng}", + "userLocationLabel": "Your Location", + "search": "Search for a location" + }, "naming-format": "Show Name:", "publish-location": { "exact": "exact position", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 53cd3aa8d..b220c13a0 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -218,7 +218,8 @@ "recruited-member": "Miembro invitado" }, "language": "Idioma", - "link-load": "recargar el último enlace |recargar los últimos {n} enlaces | descargar más {n} enlaces", + "link-load": "recargar el último enlace | recargar los últimos {n} enlaces", + "link-load-more": "descargar más {n} enlaces", "login": "iniciar sesión", "math": { "aprox": "~", @@ -275,6 +276,23 @@ "warningText": "Aún estas?" }, "settings": { + "GMS": { + "location": { + "button": "¡Haz clic aquí!", + "label": "Ubicación exacta", + "saveLocation": "Guardar ubicación", + "updateSuccess": "Ubicación guardada exitosamente" + }, + "map": { + "communityCoords": "Ubicación de tu comunidad: Lat {lat}, Lng {lng}", + "communityLocationLabel": "Ubicación de tu comunidad", + "headline": "Captura de ubicación geográfica del usuario", + "userCoords": "Tu ubicación: Lat {lat}, Lng {lng}", + "userLocationLabel": "Tu ubicación", + "search": "Buscar una ubicación", + "success": "Ubicación guardada exitosamente" + } + }, "language": { "changeLanguage": "Cambiar idioma", "de": "Deutsch", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index e8a7e377f..e1ff9acb9 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -226,7 +226,8 @@ }, "h": "h", "language": "Langage", - "link-load": "Enregistrer le dernier lien | Enregistrer les derniers {n} liens | Enregistrer plus de {n} liens", + "link-load": "Enregistrer le dernier lien | Enregistrer les derniers {n} liens", + "link-load-more": "Enregistrer plus de {n} liens", "login": "Connexion", "math": { "asterisk": "*", @@ -283,6 +284,23 @@ "warningText": "Êtes-vous toujours connecté?" }, "settings": { + "GMS": { + "location": { + "button": "Cliquez ici !", + "label": "Emplacement précis", + "saveLocation": "Enregistrer l'emplacement", + "updateSuccess": "Emplacement enregistré avec succès" + }, + "map": { + "communityCoords": "Emplacement de votre communauté : Lat {lat}, Long {lng}", + "communityLocationLabel": "Emplacement de votre communauté", + "headline": "Capture de la localisation géographique de l'utilisateur", + "userCoords": "Votre emplacement : Lat {lat}, Long {lng}", + "userLocationLabel": "Votre emplacement", + "search": "Rechercher un emplacement", + "success": "Emplacement enregistré avec succès" + } + }, "hideAmountGDD": "Votre montant GDD est caché.", "hideAmountGDT": "Votre montant GDT est caché.", "language": { diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index de0c4137d..d09634c80 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -218,7 +218,8 @@ "recruited-member": "Uitgenodigd lid" }, "language": "Taal", - "link-load": "de laatste link herladen | de laatste links herladen | verdere {n} links herladen", + "link-load": "de laatste link herladen | de laatste links herladen", + "link-load-more": "verdere {n} links herladen", "login": "Aanmelding", "math": { "aprox": "~", @@ -275,6 +276,23 @@ "warningText": "Ben je er nog?" }, "settings": { + "GMS": { + "location": { + "button": "Klik hier!", + "label": "Exacte locatie", + "saveLocation": "Locatie opslaan", + "updateSuccess": "Locatie succesvol opgeslagen" + }, + "map": { + "communityCoords": "Locatie van je gemeenschap: Lat {lat}, Lng {lng}", + "communityLocationLabel": "Locatie van je gemeenschap", + "headline": "Geografische locatiebepaling van de gebruiker", + "userCoords": "Jouw locatie: Lat {lat}, Lng {lng}", + "userLocationLabel": "Jouw locatie", + "search": "Zoek een locatie", + "success": "Locatie succesvol opgeslagen" + } + }, "language": { "changeLanguage": "Taal veranderen", "de": "Deutsch", diff --git a/frontend/src/locales/tr.json b/frontend/src/locales/tr.json index 3e3ac0a04..e4c6d3385 100644 --- a/frontend/src/locales/tr.json +++ b/frontend/src/locales/tr.json @@ -204,7 +204,8 @@ "recruited-member": "Davetli üye" }, "language": "Dil", - "link-load": "Son linki yükle| Son {n} linki yükle | {n} link daha yükle", + "link-load": "Son linki yükle| Son {n} linki yükle", + "link-load-more": "{n} link daha yükle", "login": "Giriş", "math": { "aprox": "~", @@ -245,6 +246,23 @@ "warningText": "Hala orada mısın?" }, "settings": { + "GMS": { + "location": { + "button": "Buraya tıklayın!", + "label": "Tam konum", + "saveLocation": "Konumu Kaydet", + "updateSuccess": "Konum başarıyla kaydedildi" + }, + "map": { + "communityCoords": "Topluluk Konumunuz: Enlem {lat}, Boylam {lng}", + "communityLocationLabel": "Topluluk Konumunuz", + "headline": "Kullanıcının Coğrafi Konum Tespiti", + "userCoords": "Konumunuz: Enlem {lat}, Boylam {lng}", + "userLocationLabel": "Konumunuz", + "search": "Konum ara", + "success": "Konum başarıyla kaydedildi" + } + }, "language": { "changeLanguage": "Dili değiştir", "de": "Deutsch", diff --git a/frontend/src/pages/Circles.spec.js b/frontend/src/pages/Circles.spec.js index 66eb3fcf1..8f22573f4 100644 --- a/frontend/src/pages/Circles.spec.js +++ b/frontend/src/pages/Circles.spec.js @@ -76,7 +76,7 @@ describe('Circles', () => { null, expect.objectContaining({ fetchPolicy: 'network-only', - enabled: false, + enabled: true, }), ) expect(mockRefetch).toHaveBeenCalled() diff --git a/frontend/src/pages/Circles.vue b/frontend/src/pages/Circles.vue index 7dc315342..f9cef737e 100644 --- a/frontend/src/pages/Circles.vue +++ b/frontend/src/pages/Circles.vue @@ -51,7 +51,7 @@ const { onError, } = useQuery(authenticateHumhubAutoLogin, null, { fetchPolicy: 'network-only', - enabled: false, + enabled: true, }) onResult(({ data }) => { diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index 26828257e..f02fc64ed 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -19,10 +19,11 @@ - + -
- -
{{ $t('settings.allow-community-services') }}
-
- + +
{{ $t('settings.allow-community-services') }}
+
+ + +
{{ $t('Humhub.title') }}
+
+ + + +
+
{{ $t('Humhub.desc') }}
+ + + {{ $t('settings.humhub.naming-format') }} + + + + + +
+
+ + +
{{ $t('GMS.title') }}
+
+ + + +
+
{{ $t('GMS.desc') }}
+
+ -
{{ $t('Humhub.title') }}
-
- - - -
-
{{ $t('Humhub.desc') }}
- - - {{ $t('settings.humhub.naming-format') }} + {{ $t('settings.GMS.naming-format') }} -
-
- + -
{{ $t('GMS.title') }}
+ {{ $t('settings.GMS.location-format') }}
- - + +
-
{{ $t('GMS.desc') }}
-
- - - {{ $t('settings.GMS.naming-format') }} - - - - - - - - {{ $t('settings.GMS.location-format') }} - - - - - - - - {{ $t('settings.GMS.location.label') }} - - - - - -
-
-
- + -
{{ $t('GMS.title') }}
+ {{ $t('settings.GMS.location.label') }}
- - + +
-
{{ $t('GMS.desc') }}
- -
+
+
+ + +
{{ $t('GMS.title') }}
+
+ + + +
+
{{ $t('GMS.desc') }}
+
+