From 09dcd1d5a76700511b39c89de3d2efa1a9c7722c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 15 May 2023 23:55:16 +0200 Subject: [PATCH 001/405] update neo4j docker file --- neo4j/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile index dc5a912f0..a88c16c09 100644 --- a/neo4j/Dockerfile +++ b/neo4j/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM amd64/neo4j:3.5.14 as community +FROM amd64/neo4j:4.4-community as community # ENVs ## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 @@ -31,15 +31,15 @@ LABEL maintainer="devops@ocelot.social" ## install: wget, htop (TODO: why do we need htop?) RUN apt-get update && apt-get -y install wget htop ## install: apoc plugin for neo4j -RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.5.0.4/apoc-3.5.0.4-all.jar -P plugins/ +RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/4.4.0.17/apoc-4.4.0.17-all.jar -P plugins/ ################################################################################## # ENTERPRISE ##################################################################### ################################################################################## -FROM neo4j:3.5.14-enterprise as enterprise +FROM neo4j:4.4-enterprise as enterprise # Install Additional Software ## install: wget, htop (TODO: why do we need htop?) RUN apt-get update && apt-get -y install wget htop ## install: apoc plugin for neo4j -RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.5.0.4/apoc-3.5.0.4-all.jar -P plugins/ \ No newline at end of file +RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/4.4.0.17/apoc-4.4.0.17-all.jar -P plugins/ \ No newline at end of file From a9b06e6779e52e483f318d881c589107c2167bb0 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 15 May 2023 23:55:38 +0200 Subject: [PATCH 002/405] allow migration of neo4j database in docker --- docker-compose.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index aeb26e4fd..759986d25 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,6 +111,9 @@ services: # TODO: This sounds scary for a production environment - NEO4J_AUTH=none - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_dbms_connector_http_listen__address=:7474 + - NEO4J_dbms_allow__format__migration=true # TODO enable this in kubernetes setup + - NEO4J_dbms_allow__upgrade=true # TODO enable this in kubernetes setup # Uncomment following line for Neo4j Enterprise version instead of Community version # TODO: clarify if that is the only thing needed to unlock the Enterprise version # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes From 3c023e877cd801031a6f8afcbdd2c887842019c8 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 15 May 2023 23:55:52 +0200 Subject: [PATCH 003/405] fix broken query due to outdated query format --- backend/src/schema/resolvers/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 1ce3b986f..8a7037397 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -319,7 +319,7 @@ export default { email: async (parent, params, context, resolveInfo) => { if (typeof parent.email !== 'undefined') return parent.email const { id } = parent - const statement = `MATCH(u:User {id: {id}})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` + const statement = `MATCH(u:User {id: $id})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` const result = await neode.cypher(statement, { id }) const [{ email }] = result.records.map((r) => r.get('e').properties) return email From 168aed6233fbd823aff76c24af53af8477449e1a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 00:15:41 +0200 Subject: [PATCH 004/405] migrate kubernetes cluster(untested) --- deployment/src/kubernetes/templates/neo4j/ConfigMap.yml | 2 ++ docker-compose.yml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml index 9f0aa4bee..10edc50f7 100644 --- a/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml +++ b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml @@ -18,4 +18,6 @@ data: NEO4J_dbms_memory_heap_max__size: "{{ .Values.NEO4J.DBMS_MEMORY_HEAP_MAX_SIZE }}" NEO4J_dbms_memory_pagecache_size: "{{ .Values.NEO4J.DBMS_MEMORY_PAGECACHE_SIZE }}" NEO4J_dbms_security_procedures_unrestricted: "{{ .Values.NEO4J.DBMS_SECURITY_PROCEDURES_UNRESTRICTED }}" + NEO4J_dbms_allow__format__migration: true + NEO4J_dbms_allow__upgrade: true NEO4J_apoc_import_file_enabled: "{{ .Values.NEO4J.APOC_IMPORT_FILE_ENABLED }}" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 759986d25..1f4e4646f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -112,8 +112,8 @@ services: - NEO4J_AUTH=none - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* - NEO4J_dbms_connector_http_listen__address=:7474 - - NEO4J_dbms_allow__format__migration=true # TODO enable this in kubernetes setup - - NEO4J_dbms_allow__upgrade=true # TODO enable this in kubernetes setup + - NEO4J_dbms_allow__format__migration=true + - NEO4J_dbms_allow__upgrade=true # Uncomment following line for Neo4j Enterprise version instead of Community version # TODO: clarify if that is the only thing needed to unlock the Enterprise version # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes From a326b2777f7b6826d497bd1a5f4afbee98bb0dc9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 00:38:02 +0200 Subject: [PATCH 005/405] fix migrations --- ...te_fulltext_indices_and_unique_keys_for_groups.js | 12 ++++++------ .../20230320130345-fulltext-search-indexes.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js index b87e5632a..4c4c145f9 100644 --- a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js +++ b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js @@ -12,12 +12,12 @@ export async function up(next) { try { // Implement your migration here. - await transaction.run(` - CREATE CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE - `) - await transaction.run(` - CREATE CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE - `) + //await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE + //`) + //await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE + //`) await transaction.run(` CALL db.index.fulltext.createNodeIndex("group_fulltext_search",["Group"],["name", "slug", "about", "description"]) `) diff --git a/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js index 11029bea6..40ebc6c2e 100644 --- a/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js +++ b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js @@ -10,7 +10,7 @@ export async function up(next) { try { // Drop indexes if they exist because due to legacy code they might be set already const indexesResponse = await transaction.run(`CALL db.indexes()`) - const indexes = indexesResponse.records.map((record) => record.get('indexName')) + const indexes = indexesResponse.records.map((record) => record.get('name')) if (indexes.indexOf('user_fulltext_search') > -1) { await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`) } From 44700f8a4192474deb9d0e03273836d0ceed1628 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 00:43:37 +0200 Subject: [PATCH 006/405] lint + comment --- ..._fulltext_indices_and_unique_keys_for_groups.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js index 4c4c145f9..63e40c72b 100644 --- a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js +++ b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js @@ -11,13 +11,13 @@ export async function up(next) { const transaction = session.beginTransaction() try { - // Implement your migration here. - //await transaction.run(` - // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE - //`) - //await transaction.run(` - // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE - //`) + // Those two indexes already exist + // await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE + // `) + // await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE + // `) await transaction.run(` CALL db.index.fulltext.createNodeIndex("group_fulltext_search",["Group"],["name", "slug", "about", "description"]) `) From 33b18a5431dae9dcfc0e7bb5db38aec37c288ca9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 11:53:40 +0200 Subject: [PATCH 007/405] fix searches --- backend/src/schema/resolvers/searches.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.js index a67abe90d..08825fad0 100644 --- a/backend/src/schema/resolvers/searches.js +++ b/backend/src/schema/resolvers/searches.js @@ -12,7 +12,7 @@ const cypherTemplate = (setup) => ` RETURN ${setup.returnClause} AS result - SKIP $skip + SKIP toInteger($skip) ${setup.limit} ` @@ -45,7 +45,7 @@ const searchPostsSetup = { clickedCount: toString(resource.clickedCount), viewedTeaserCount: toString(resource.viewedTeaserCount) }`, - limit: 'LIMIT $limit', + limit: 'LIMIT toInteger($limit)', } const searchUsersSetup = { @@ -54,7 +54,7 @@ const searchUsersSetup = { whereClause: simpleWhereClause, withClause: '', returnClause: 'resource {.*, __typename: labels(resource)[0]}', - limit: 'LIMIT $limit', + limit: 'LIMIT toInteger($limit)', } const searchHashtagsSetup = { @@ -63,7 +63,7 @@ const searchHashtagsSetup = { whereClause: simpleWhereClause, withClause: '', returnClause: 'resource {.*, __typename: labels(resource)[0]}', - limit: 'LIMIT $limit', + limit: 'LIMIT toInteger($limit)', } const searchGroupsSetup = { @@ -78,7 +78,7 @@ const searchGroupsSetup = { OR membership.role IN ['usual', 'admin', 'owner'])`, withClause: 'WITH resource, membership', returnClause: 'resource { .*, myRole: membership.role, __typename: labels(resource)[0] }', - limit: 'LIMIT $limit', + limit: 'LIMIT toInteger($limit)', } const countSetup = { From d86efa0a555144ab60f8e850b55704223da05d77 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 11:54:01 +0200 Subject: [PATCH 008/405] use write permissions for delete queries --- backend/src/schema/resolvers/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 8a7037397..513b1a28f 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -81,7 +81,7 @@ export default { muteUser: async (_parent, params, context, _resolveInfo) => { const { user: currentUser } = context if (currentUser.id === params.id) return null - await neode.cypher( + await neode.writeCypher( ` MATCH(u:User {id: $currentUser.id})-[previousRelationship:FOLLOWS]->(b:User {id: $params.id}) DELETE previousRelationship @@ -98,7 +98,7 @@ export default { unmuteUser: async (_parent, params, context, _resolveInfo) => { const { user: currentUser } = context if (currentUser.id === params.id) return null - await neode.cypher( + await neode.writeCypher( ` MATCH(u:User {id: $currentUser.id})-[previousRelationship:MUTED]->(b:User {id: $params.id}) DELETE previousRelationship From c2583bad0cba6ef66e42146aeff10200a95f9810 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 11:54:10 +0200 Subject: [PATCH 009/405] new query format --- backend/src/schema/resolvers/registration.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js index bfc6a5fa6..54e7f1ba7 100644 --- a/backend/src/schema/resolvers/registration.spec.js +++ b/backend/src/schema/resolvers/registration.spec.js @@ -251,7 +251,7 @@ describe('SignupVerification', () => { it('connects User with EmailAddress', async () => { const cypher = ` - MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: {name}}) + MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: $name}) RETURN email ` await mutate({ mutation, variables }) @@ -281,7 +281,7 @@ describe('SignupVerification', () => { it('marks the EmailAddress as primary', async () => { const cypher = ` - MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: {name}}) + MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: $name}) RETURN email ` await mutate({ mutation, variables }) From 46af4d80d01c76f177bcafa2f303545577cc29f8 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 11:54:22 +0200 Subject: [PATCH 010/405] new query format --- backend/src/schema/resolvers/follow.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js index 0d9d524ff..c9d8dc1bf 100644 --- a/backend/src/schema/resolvers/follow.spec.js +++ b/backend/src/schema/resolvers/follow.spec.js @@ -147,7 +147,7 @@ describe('follow', () => { variables, }) const relation = await neode.cypher( - 'MATCH (user:User {id: {id}})-[relationship:FOLLOWS]->(followed:User) WHERE relationship.createdAt IS NOT NULL RETURN relationship', + 'MATCH (user:User {id: $id})-[relationship:FOLLOWS]->(followed:User) WHERE relationship.createdAt IS NOT NULL RETURN relationship', { id: 'u1' }, ) const relationshipProperties = relation.records.map( From 5e758328f1db735c842830d4f40a7ed1b29ab303 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 11:54:36 +0200 Subject: [PATCH 011/405] write query for delete operations --- backend/src/schema/resolvers/follow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/follow.js b/backend/src/schema/resolvers/follow.js index 80cce8400..6cf4938c7 100644 --- a/backend/src/schema/resolvers/follow.js +++ b/backend/src/schema/resolvers/follow.js @@ -29,7 +29,7 @@ export default { * It's suggested to use query builder feature (https://github.com/adam-cowley/neode/issues/67) * However, pure cypher query looks cleaner IMO */ - await neode.cypher( + await neode.writeCypher( `MATCH (user:User {id: $currentUser.id})-[relation:FOLLOWS]->(followedUser:User {id: $followedUserId}) DELETE relation RETURN COUNT(relation) > 0 as isFollowed`, From 4ce324cba23ca0ecd881cf90eb6d75d015de1d64 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 May 2023 12:11:21 +0200 Subject: [PATCH 012/405] corrected old query format --- backend/src/schema/resolvers/comments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js index a3a0c7290..c6f07245c 100644 --- a/backend/src/schema/resolvers/comments.js +++ b/backend/src/schema/resolvers/comments.js @@ -21,7 +21,7 @@ export default { MATCH (post:Post {id: $postId}) MATCH (author:User {id: $userId}) WITH post, author - CREATE (comment:Comment {params}) + CREATE (comment:Comment $params) SET comment.createdAt = toString(datetime()) SET comment.updatedAt = toString(datetime()) MERGE (post)<-[:COMMENTS]-(comment)<-[:WROTE]-(author) From 144d39b35aea94a495ac29f0468cab2dcb0ca1ed Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 22 May 2023 15:58:19 +0200 Subject: [PATCH 013/405] fixed updatedAt field for fileReport --- backend/src/schema/resolvers/reports.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.js index da8d794c5..da61e6f10 100644 --- a/backend/src/schema/resolvers/reports.js +++ b/backend/src/schema/resolvers/reports.js @@ -13,7 +13,7 @@ export default { MATCH (resource {id: $resourceId}) WHERE resource:User OR resource:Post OR resource:Comment MERGE (resource)<-[:BELONGS_TO]-(report:Report {closed: false}) - ON CREATE SET report.id = randomUUID(), report.createdAt = $createdAt, report.updatedAt = report.createdAt, report.rule = 'latestReviewUpdatedAtRules', report.disable = resource.disabled, report.closed = false + ON CREATE SET report.id = randomUUID(), report.createdAt = $createdAt, report.updatedAt = $createdAt, report.rule = 'latestReviewUpdatedAtRules', report.disable = resource.disabled, report.closed = false WITH submitter, resource, report CREATE (report)<-[filed:FILED {createdAt: $createdAt, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription}]-(submitter) From 2204b29c0a9459a1e4a92799064ea9c12522f92d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 22 May 2023 16:08:50 +0200 Subject: [PATCH 014/405] fixed review updatedAt mutation --- backend/src/schema/resolvers/moderation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/moderation.js b/backend/src/schema/resolvers/moderation.js index c261d187e..97f48ec43 100644 --- a/backend/src/schema/resolvers/moderation.js +++ b/backend/src/schema/resolvers/moderation.js @@ -12,7 +12,7 @@ export default { MATCH (resource {id: $params.resourceId})<-[:BELONGS_TO]-(report:Report {closed: false}) WHERE resource:User OR resource:Post OR resource:Comment MERGE (report)<-[review:REVIEWED]-(moderator) - ON CREATE SET review.createdAt = $dateTime, review.updatedAt = review.createdAt + ON CREATE SET review.createdAt = $dateTime, review.updatedAt = $dateTime ON MATCH SET review.updatedAt = $dateTime SET review.disable = $params.disable SET report.updatedAt = $dateTime, report.disable = review.disable, report.closed = $params.closed From 8223024c308cc3ed785d9618270a5ab55d16bb03 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 22 May 2023 16:58:04 +0200 Subject: [PATCH 015/405] removed write rights from query where its not needed --- cypress/support/factories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/support/factories.js b/cypress/support/factories.js index 2ca46c483..f8f86f9f7 100644 --- a/cypress/support/factories.js +++ b/cypress/support/factories.js @@ -9,7 +9,7 @@ const neo4jConfigs = { } const neodeInstance = getNeode(neo4jConfigs) -beforeEach(() => cy.then(() => neodeInstance.cypher('MATCH (everything) DETACH DELETE everything;'))) +beforeEach(() => cy.then(() => neodeInstance.writeCypher('MATCH (everything) DETACH DELETE everything;'))) Cypress.Commands.add('neode', () => { return neodeInstance From 0c4b789da1b956cd7cc1fb011575cd131d7ff96c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 22 May 2023 16:58:19 +0200 Subject: [PATCH 016/405] remove write rights where its not needed --- backend/src/middleware/notifications/notificationsMiddleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/middleware/notifications/notificationsMiddleware.js b/backend/src/middleware/notifications/notificationsMiddleware.js index 1c97e9591..fd8629715 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.js +++ b/backend/src/middleware/notifications/notificationsMiddleware.js @@ -15,7 +15,7 @@ const queryNotificationEmails = async (context, notificationUserIds) => { RETURN emailAddress {.email} ` const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const writeTxResultPromise = session.readTransaction(async (transaction) => { const emailAddressTransactionResponse = await transaction.run(userEmailCypher, { notificationUserIds, }) From 1ca274fad43147410a3fb1e5f663623849b75742 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 31 May 2023 11:01:28 +0200 Subject: [PATCH 017/405] Add creatEvent to the update post so the form has event specific fields. Co-authored-by: elweyn Co-authored-by: maeckes-infinitylabs --- webapp/pages/post/edit/_id.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue index d365709be..d05eef449 100644 --- a/webapp/pages/post/edit/_id.vue +++ b/webapp/pages/post/edit/_id.vue @@ -12,6 +12,7 @@   From e18fa0cea03fb817e70235093dda0dd82de7279b Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 31 May 2023 12:32:48 +0200 Subject: [PATCH 018/405] Fix test of post edit. Co-authored-by: maeckes-infinitylabs --- webapp/pages/post/edit/_id.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webapp/pages/post/edit/_id.spec.js b/webapp/pages/post/edit/_id.spec.js index aa25eb8e8..3bb68b098 100644 --- a/webapp/pages/post/edit/_id.spec.js +++ b/webapp/pages/post/edit/_id.spec.js @@ -29,7 +29,10 @@ describe('post/_id.vue', () => { defaultClient: { query: jest.fn().mockResolvedValue({ data: { - Post: [{ author: { id: authorId } }], + Post: [{ + author: { id: authorId }, + postType: ['Article'], + }], }, }), }, From ef7bb652bc29647094aeac6ae0f467408e6088ea Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 31 May 2023 20:44:44 +0200 Subject: [PATCH 019/405] Fix linting. Co-authored-by: maeckes-infinitylabs --- webapp/pages/post/edit/_id.spec.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/webapp/pages/post/edit/_id.spec.js b/webapp/pages/post/edit/_id.spec.js index 3bb68b098..2773483a4 100644 --- a/webapp/pages/post/edit/_id.spec.js +++ b/webapp/pages/post/edit/_id.spec.js @@ -29,10 +29,12 @@ describe('post/_id.vue', () => { defaultClient: { query: jest.fn().mockResolvedValue({ data: { - Post: [{ - author: { id: authorId }, - postType: ['Article'], - }], + Post: [ + { + author: { id: authorId }, + postType: ['Article'], + }, + ], }, }), }, From 17e0d0a85c92102e99a42cd29d093ccf27745922 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 1 Jun 2023 13:04:06 +0200 Subject: [PATCH 020/405] Rename creatEvent to createEvent --- .../ContributionForm/ContributionForm.vue | 14 +++++++------- webapp/pages/post/create.vue | 16 ++++++++-------- webapp/pages/post/edit/_id.vue | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 997a25341..eea00e444 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -54,7 +54,7 @@ -
+

@@ -210,7 +210,7 @@ export default { type: Object, default: () => null, }, - creatEvent: { + createEvent: { type: Boolean, default: false, }, @@ -266,9 +266,9 @@ export default { return [] }, }, - eventStart: { required: !!this.creatEvent }, - eventVenue: { required: !!this.creatEvent, min: 3, max: 100 }, - eventLocationName: { required: !!this.creatEvent, min: 3, max: 100 }, + eventStart: { required: !!this.createEvent }, + eventVenue: { required: !!this.createEvent, min: 3, max: 100 }, + eventLocationName: { required: !!this.createEvent, min: 3, max: 100 }, }, loading: false, users: [], @@ -284,7 +284,7 @@ export default { currentUser: 'auth/user', }), eventInput() { - if (this.creatEvent) { + if (this.createEvent) { return { eventStart: this.formData.eventStart, eventVenue: this.formData.eventVenue, @@ -356,7 +356,7 @@ export default { id: this.contribution.id || null, image, groupId: this.groupId, - postType: !this.creatEvent ? 'Article' : 'Event', + postType: !this.createEvent ? 'Article' : 'Event', eventInput: this.eventInput, }, }) diff --git a/webapp/pages/post/create.vue b/webapp/pages/post/create.vue index 199cc14a4..9da1a85e9 100644 --- a/webapp/pages/post/create.vue +++ b/webapp/pages/post/create.vue @@ -4,10 +4,10 @@ - +
{{ $t('post.createNewPost.title') }} - + {{ $t('post.createNewPost.title') }}
- +
{{ $t('post.createNewEvent.title') }} - + {{ $t('post.createNewEvent.title') }}
@@ -50,7 +50,7 @@ - +   @@ -69,7 +69,7 @@ export default { const { groupId = null } = this.$route.query return { groupId, - creatEvent: false, + createEvent: false, } }, computed: { diff --git a/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue index d05eef449..649174ca3 100644 --- a/webapp/pages/post/edit/_id.vue +++ b/webapp/pages/post/edit/_id.vue @@ -12,7 +12,7 @@
  From 726640a7593c07f802ccb069118b3072a1f444df Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 1 Jun 2023 13:36:24 +0200 Subject: [PATCH 021/405] Create a function to switch between Article and Event. --- webapp/pages/post/create.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webapp/pages/post/create.vue b/webapp/pages/post/create.vue index 9da1a85e9..dbe58eaa0 100644 --- a/webapp/pages/post/create.vue +++ b/webapp/pages/post/create.vue @@ -15,7 +15,7 @@ > {{ $t('post.createNewPost.title') }} - + {{ $t('post.createNewPost.title') }}
@@ -34,7 +34,7 @@ > {{ $t('post.createNewEvent.title') }} - + {{ $t('post.createNewEvent.title') }}
@@ -98,6 +98,11 @@ export default { fetchPolicy: 'cache-and-network', }, }, + methods: { + switchPostType() { + this.createEvent = !this.createEvent + }, + }, } From 3d99382df9889b96056f5af83cc80ec6550503da Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 10:18:53 +0200 Subject: [PATCH 034/405] Add change event for checkbox. --- webapp/components/ContributionForm/ContributionForm.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index d346cf3a7..b95e977a1 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -134,6 +134,7 @@ v-model="formData.eventIsOnline" name="eventIsOnline" class="event-grid-item-font-helper" + @change="changeEventIsOnline($event)" /> {{ $t('post.viewEvent.eventIsOnline') }} @@ -384,6 +385,9 @@ export default { updateEditorContent(value) { this.$refs.contributionForm.update('content', value) }, + changeEventIsOnline(event) { + this.$refs.contributionForm.update('eventIsOnline', event.target.value) + }, addHeroImage(file) { this.formData.image = null if (file) { From 89503b6b13376fade9a844cf71b1b670938e9d98 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 10:20:28 +0200 Subject: [PATCH 035/405] Add change event for eventEnd. --- webapp/components/ContributionForm/ContributionForm.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index b95e977a1..eb630ec46 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -96,6 +96,7 @@ :disabled-date="notBeforeEventDay" :disabled-time="notBeforeEvent" :show-second="false" + @change="changeEventEnd($event)" > @@ -388,6 +389,9 @@ export default { changeEventIsOnline(event) { this.$refs.contributionForm.update('eventIsOnline', event.target.value) }, + changeEventEnd(event) { + this.$refs.contributionForm.update('eventEnd', event.target.value) + }, addHeroImage(file) { this.formData.image = null if (file) { From c0ae044182b479b73297078a5c9853915c865c5b Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 10:31:22 +0200 Subject: [PATCH 036/405] WIP add change event on DatePicker. --- .../ContributionForm/ContributionForm.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index eb630ec46..472d0db54 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -73,6 +73,7 @@ :disabled-date="notBeforeToday" :disabled-time="notBeforeNow" :show-second="false" + @change="changeEventStart($event)" >
@@ -86,6 +87,7 @@ Date: Wed, 7 Jun 2023 10:49:27 +0200 Subject: [PATCH 037/405] Make form interactive.. --- .../ContributionForm/ContributionForm.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 472d0db54..f4fc9ec46 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -116,7 +116,7 @@
- + Date: Wed, 7 Jun 2023 10:51:35 +0200 Subject: [PATCH 038/405] Remove unused InputCheckbox component. --- .../InputCheckbox/InputCheckbox.spec.js | 1 - .../InputCheckbox/InputCheckbox.vue | 42 ------------------- 2 files changed, 43 deletions(-) delete mode 100644 webapp/components/InputCheckbox/InputCheckbox.spec.js delete mode 100644 webapp/components/InputCheckbox/InputCheckbox.vue diff --git a/webapp/components/InputCheckbox/InputCheckbox.spec.js b/webapp/components/InputCheckbox/InputCheckbox.spec.js deleted file mode 100644 index 8b1378917..000000000 --- a/webapp/components/InputCheckbox/InputCheckbox.spec.js +++ /dev/null @@ -1 +0,0 @@ - diff --git a/webapp/components/InputCheckbox/InputCheckbox.vue b/webapp/components/InputCheckbox/InputCheckbox.vue deleted file mode 100644 index 04177d233..000000000 --- a/webapp/components/InputCheckbox/InputCheckbox.vue +++ /dev/null @@ -1,42 +0,0 @@ - - From 2c31453bb0b08467ccc6ca8fb6a21a25f777271e Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 7 Jun 2023 11:50:46 +0200 Subject: [PATCH 039/405] test event data form --- .../ContributionForm/ContributionForm.spec.js | 89 ++++++++++++++++++- .../ContributionForm/ContributionForm.vue | 4 +- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 6b9db448b..9095665fc 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -1,8 +1,8 @@ import { mount } from '@vue/test-utils' import ContributionForm from './ContributionForm.vue' +import PostMutations from '~/graphql/PostMutations.js' import Vuex from 'vuex' -import PostMutations from '~/graphql/PostMutations.js' import ImageUploader from '~/components/Uploader/ImageUploader' import MutationObserver from 'mutation-observer' @@ -108,6 +108,10 @@ describe('ContributionForm.vue', () => { await wrapper.vm.updateEditorContent(postContent) }) + it('has no event data block', () => { + expect(wrapper.find('div.eventDatas').exists()).toBe(false) + }) + it('title cannot be empty', async () => { postTitleInput.setValue('') wrapper.find('form').trigger('submit') @@ -293,5 +297,88 @@ describe('ContributionForm.vue', () => { }) }) }) + + describe('Events', () => { + beforeEach(() => { + propsData.createEvent = true + wrapper = Wrapper() + }) + + it('has event data block', () => { + expect(wrapper.find('div.eventDatas').exists()).toBe(true) + }) + + describe('is online event', () => { + it('has false as default', () => { + expect(wrapper.vm.formData.eventIsOnline).toBe(false) + }) + + it('has input for event location', () => { + expect(wrapper.find('input[name="eventLocationName"]').exists()).toBe(true) + }) + + describe('click is online event', () => { + beforeEach(() => { + wrapper.find('input[name="eventIsOnline"]').setChecked(true) + }) + + it('has no input for event location', () => { + expect(wrapper.find('input[name="eventLocationName"]').exists()).toBe(false) + }) + }) + + describe('invalid form', () => { + beforeEach(() => { + wrapper.find('input[name="title"]').setValue('Illegaler Kindergeburtstag') + wrapper.vm.updateEditorContent('Elli hat Geburtstag!') + }) + + it('has submit button disabled', () => { + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + }) + }) + + describe('valid form', () => { + const now = new Date() + + beforeEach(() => { + wrapper.find('input[name="title"]').setValue('Illegaler Kindergeburtstag') + wrapper.vm.updateEditorContent('Elli hat Geburtstag!') + wrapper + .findComponent({ name: 'DatePicker' }) + .vm.$emit('change', new Date(now.getFullYear(), now.getMonth() + 1).toISOString()) + wrapper.find('input[name="eventVenue"]').setValue('Ellis Kinderzimmer') + wrapper.find('input[name="eventLocationName"]').setValue('Deutschland') + }) + + it('has submit button not disabled', () => { + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe(undefined) + }) + + describe('submit', () => { + beforeEach(() => { + wrapper.find('form').trigger('submit') + }) + + it('calls create post', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: PostMutations().CreatePost, + variables: expect.objectContaining({ + title: 'Illegaler Kindergeburtstag', + content: 'Elli hat Geburtstag!', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventVenue: 'Ellis Kinderzimmer', + eventLocationName: 'Deutschland', + eventIsOnline: false, + eventEnd: null, + }, + }), + }) + }) + }) + }) + }) + }) }) }) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index f4fc9ec46..31ff849a3 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -106,7 +106,7 @@
@@ -119,7 +119,7 @@
From de553e1f8262c8a1775e9a60f6d6114740708565 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 12:27:09 +0200 Subject: [PATCH 040/405] Make eventEnd removable. Co-authored-by: maeckes --- backend/src/schema/resolvers/helpers/events.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/schema/resolvers/helpers/events.js b/backend/src/schema/resolvers/helpers/events.js index 84e64299d..e97d7aeac 100644 --- a/backend/src/schema/resolvers/helpers/events.js +++ b/backend/src/schema/resolvers/helpers/events.js @@ -5,10 +5,10 @@ export const validateEventParams = (params) => { const { eventInput } = params validateEventDate(eventInput.eventStart) params.eventStart = eventInput.eventStart - if (eventInput.eventEnd) { - validateEventEnd(eventInput.eventStart, eventInput.eventEnd) - params.eventEnd = eventInput.eventEnd - } + + validateEventEnd(eventInput.eventStart, eventInput.eventEnd) + params.eventEnd = eventInput.eventEnd + if (eventInput.eventLocationName && !eventInput.eventVenue) { throw new UserInputError('Event venue must be present if event location is given!') } @@ -38,6 +38,7 @@ const validateEventDate = (dateString) => { } const validateEventEnd = (start, end) => { + if (end === null) return const endDate = new Date(end) if (endDate.toString() === 'Invalid Date') throw new UserInputError('Event end date must be a valid date!') From 3dadfd43299aa54e92dbfed56d158d63d67b2965 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 12:34:09 +0200 Subject: [PATCH 041/405] Add a trim to check if locationName is not empty. --- backend/src/schema/resolvers/helpers/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/helpers/events.js b/backend/src/schema/resolvers/helpers/events.js index e97d7aeac..41f8b0d74 100644 --- a/backend/src/schema/resolvers/helpers/events.js +++ b/backend/src/schema/resolvers/helpers/events.js @@ -18,7 +18,7 @@ export const validateEventParams = (params) => { } delete params.eventInput let locationName - if (params.eventLocationName) { + if (params.eventLocationName.trim()) { locationName = params.eventLocationName } else { params.eventLocationName = null From 4e43b77da2ea05859c334ab1d24530bfe79f8f91 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 12:55:21 +0200 Subject: [PATCH 042/405] Add custom error messages for events. Co-authored-by: maeckes --- .../ContributionForm/ContributionForm.vue | 23 ++++++++++++++++++- webapp/locales/de.json | 4 ++++ webapp/locales/en.json | 4 ++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 31ff849a3..ae1a7654b 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -286,11 +286,32 @@ export default { }, }, eventStart: { required: !!this.createEvent }, - eventVenue: { required: !!this.createEvent, min: 3, max: 100 }, + eventVenue: { + required: !!this.createEvent, + min: 3, + max: 100, + validator: (_, value = '') => { + if (!value.trim()) { + return [new Error(this.$t('common.validations.eventVenueNotEmpty'))] + } + if (value.length < 3 || value.length > 100) { + return [new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 }))] + } + return [] + }, }, eventLocationName: { required: !!this.createEvent && !this.formData.eventIsOnline, min: 3, max: 100, + validator: (_, value = '') => { + if (!value.trim()) { + return [new Error(this.$t('common.validations.eventLocationNameNotEmpty'))] + } + if (value.length < 3 || value.length > 100) { + return [new Error(this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }))] + } + return [] + }, }, } }, diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 1b57fb0dc..5acab107e 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -115,6 +115,10 @@ "validations": { "categories": "es müssen eine bis drei Themen ausgewählt werden", "email": "muss eine gültige E-Mail-Adresse sein", + "eventLocationNameLength": "Mindestens {min} Maximal {max}", + "eventLocationNameNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", + "eventVenueLength": "Mindestens {min} Maximal {max}", + "eventVenueNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", "url": "muss eine gültige URL sein" }, "versus": "Versus" diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 0f0b9c6b4..565f4b80a 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -115,6 +115,10 @@ "validations": { "categories": "at least one and at most three topics must be selected", "email": "must be a valid e-mail address", + "eventLocationNameLength": "minimal {min} maximal {max}", + "eventLocationNameNotEmpty": "only empty characters are not allowed", + "eventVenueLength": "minimal {min} maximal {max}", + "eventVenueNotEmpty": "only empty characters are not allowed", "url": "must be a valid URL" }, "versus": "Versus" From 7ad74b139863ba518ec74d24fcded15c873a681d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 7 Jun 2023 14:06:28 +0200 Subject: [PATCH 043/405] Move date time range to an own component --- .../ContributionForm/ContributionForm.vue | 15 ++- webapp/components/DateRange/DateRange.vue | 114 ++++++++++++++++++ webapp/components/PostTeaser/PostTeaser.vue | 23 ++-- webapp/pages/post/_id/_slug/index.vue | 56 ++------- 4 files changed, 146 insertions(+), 62 deletions(-) create mode 100644 webapp/components/DateRange/DateRange.vue diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index ae1a7654b..b1b9b3935 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -286,7 +286,7 @@ export default { }, }, eventStart: { required: !!this.createEvent }, - eventVenue: { + eventVenue: { required: !!this.createEvent, min: 3, max: 100, @@ -295,10 +295,13 @@ export default { return [new Error(this.$t('common.validations.eventVenueNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 }))] + return [ + new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 })), + ] } return [] - }, }, + }, + }, eventLocationName: { required: !!this.createEvent && !this.formData.eventIsOnline, min: 3, @@ -308,7 +311,11 @@ export default { return [new Error(this.$t('common.validations.eventLocationNameNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }))] + return [ + new Error( + this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }), + ), + ] } return [] }, diff --git a/webapp/components/DateRange/DateRange.vue b/webapp/components/DateRange/DateRange.vue new file mode 100644 index 000000000..be895f31a --- /dev/null +++ b/webapp/components/DateRange/DateRange.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/webapp/components/PostTeaser/PostTeaser.vue b/webapp/components/PostTeaser/PostTeaser.vue index 604fb121f..5f18d5d5b 100644 --- a/webapp/components/PostTeaser/PostTeaser.vue +++ b/webapp/components/PostTeaser/PostTeaser.vue @@ -44,10 +44,12 @@ - - - {{ getEventDateString }} - + @@ -113,12 +115,12 @@ import Category from '~/components/Category' import ContentMenu from '~/components/ContentMenu/ContentMenu' import CounterIcon from '~/components/_new/generic/CounterIcon/CounterIcon' +import DateRange from '~/components/DateRange/DateRange' import HcRibbon from '~/components/Ribbon' 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', @@ -126,6 +128,7 @@ export default { Category, ContentMenu, CounterIcon, + DateRange, HcRibbon, UserTeaser, }, @@ -185,15 +188,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() { @@ -228,6 +222,7 @@ export default { }, } + diff --git a/webapp/components/PostTeaser/PostTeaser.vue b/webapp/components/PostTeaser/PostTeaser.vue index 615b18054..c76ebfc7b 100644 --- a/webapp/components/PostTeaser/PostTeaser.vue +++ b/webapp/components/PostTeaser/PostTeaser.vue @@ -32,15 +32,13 @@ > - - - - {{ $t('post.viewEvent.eventIsOnline') }} - - - {{ post.eventLocationName }} - - + - - - {{ post.eventVenue }} - - - {{ post.eventLocationName }} - - - {{ $t('post.viewEvent.eventIsOnline') }} - - + Date: Wed, 7 Jun 2023 16:43:38 +0200 Subject: [PATCH 051/405] Fix eventLocationName validator and remove eventLocationName of query parameters if eventIsOnline true. --- webapp/components/ContributionForm/ContributionForm.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index ae1a7654b..c305b1fed 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -304,6 +304,7 @@ export default { min: 3, max: 100, validator: (_, value = '') => { + if (this.formData.eventIsOnline) return [] if (!value.trim()) { return [new Error(this.$t('common.validations.eventLocationNameNotEmpty'))] } @@ -322,7 +323,7 @@ export default { eventVenue: this.formData.eventVenue, eventEnd: this.formData.eventEnd, eventIsOnline: this.formData.eventIsOnline, - eventLocationName: this.formData.eventLocationName, + eventLocationName: !this.formData.eventIsOnline ? this.formData.eventLocationName : null, } } return undefined From 107a9491ca046a38aadb8d7f8f257b14b4fdeb16 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 16:47:30 +0200 Subject: [PATCH 052/405] Correct some locales. --- webapp/locales/de.json | 4 ++-- webapp/locales/en.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 5acab107e..1ce7d2f61 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -115,9 +115,9 @@ "validations": { "categories": "es müssen eine bis drei Themen ausgewählt werden", "email": "muss eine gültige E-Mail-Adresse sein", - "eventLocationNameLength": "Mindestens {min} Maximal {max}", + "eventLocationNameLength": "Minimum {min}, Maximum {max} Zeichen", "eventLocationNameNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", - "eventVenueLength": "Mindestens {min} Maximal {max}", + "eventVenueLength": "Minimum {min}, Maximum {max} Zeichen", "eventVenueNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", "url": "muss eine gültige URL sein" }, diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 565f4b80a..f25cc8575 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -115,9 +115,9 @@ "validations": { "categories": "at least one and at most three topics must be selected", "email": "must be a valid e-mail address", - "eventLocationNameLength": "minimal {min} maximal {max}", + "eventLocationNameLength": "minimum {min} or maximum {max} characters", "eventLocationNameNotEmpty": "only empty characters are not allowed", - "eventVenueLength": "minimal {min} maximal {max}", + "eventVenueLength": "minimum {min} or maximum {max} characters", "eventVenueNotEmpty": "only empty characters are not allowed", "url": "must be a valid URL" }, From 930c1f219b613a60060b0057ba8b52511d6683b4 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 17:08:31 +0200 Subject: [PATCH 053/405] Fix linting of webapp. --- .../ContributionForm/ContributionForm.vue | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index c305b1fed..6db9f7e02 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -286,7 +286,7 @@ export default { }, }, eventStart: { required: !!this.createEvent }, - eventVenue: { + eventVenue: { required: !!this.createEvent, min: 3, max: 100, @@ -295,10 +295,13 @@ export default { return [new Error(this.$t('common.validations.eventVenueNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 }))] + return [ + new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 })), + ] } return [] - }, }, + }, + }, eventLocationName: { required: !!this.createEvent && !this.formData.eventIsOnline, min: 3, @@ -309,7 +312,11 @@ export default { return [new Error(this.$t('common.validations.eventLocationNameNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }))] + return [ + new Error( + this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }), + ), + ] } return [] }, From e18baf34f3c491fa4cac95c4ed036fc08c79d9db Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 7 Jun 2023 17:09:19 +0200 Subject: [PATCH 054/405] Fix linting of backend. --- backend/src/schema/resolvers/helpers/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/helpers/events.js b/backend/src/schema/resolvers/helpers/events.js index bb573021f..835088d8c 100644 --- a/backend/src/schema/resolvers/helpers/events.js +++ b/backend/src/schema/resolvers/helpers/events.js @@ -11,7 +11,7 @@ export const validateEventParams = (params) => { validateEventEnd(eventInput.eventStart, eventInput.eventEnd) params.eventEnd = eventInput.eventEnd } else { - params.eventEnd = null + params.eventEnd = null } if (eventInput.eventLocationName && !eventInput.eventVenue) { From 2f87ea0de7a05896af9d71018806989ca1ee1fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 7 Jun 2023 17:21:06 +0200 Subject: [PATCH 055/405] Fix linting in backend --- backend/src/schema/resolvers/helpers/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/schema/resolvers/helpers/events.js b/backend/src/schema/resolvers/helpers/events.js index bb573021f..835088d8c 100644 --- a/backend/src/schema/resolvers/helpers/events.js +++ b/backend/src/schema/resolvers/helpers/events.js @@ -11,7 +11,7 @@ export const validateEventParams = (params) => { validateEventEnd(eventInput.eventStart, eventInput.eventEnd) params.eventEnd = eventInput.eventEnd } else { - params.eventEnd = null + params.eventEnd = null } if (eventInput.eventLocationName && !eventInput.eventVenue) { From a8659e37bd3d06133060018af7e3f8f676a8e563 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 7 Jun 2023 17:46:06 +0200 Subject: [PATCH 056/405] check required in valiator --- .../ContributionForm/#ContributionForm.vue# | 623 ++++++++++++++++++ .../ContributionForm/ContributionForm.vue | 17 +- 2 files changed, 636 insertions(+), 4 deletions(-) create mode 100644 webapp/components/ContributionForm/#ContributionForm.vue# diff --git a/webapp/components/ContributionForm/#ContributionForm.vue# b/webapp/components/ContributionForm/#ContributionForm.vue# new file mode 100644 index 000000000..1d1353b1e --- /dev/null +++ b/webapp/components/ContributionForm/#ContributionForm.vue# @@ -0,0 +1,623 @@ + + + + diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index c305b1fed..47841c717 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -286,30 +286,39 @@ export default { }, }, eventStart: { required: !!this.createEvent }, - eventVenue: { + eventVenue: { required: !!this.createEvent, min: 3, max: 100, validator: (_, value = '') => { + if (!this.createEvent) return [] if (!value.trim()) { return [new Error(this.$t('common.validations.eventVenueNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 }))] + return [ + new Error(this.$t('common.validations.eventVenueLength', { min: 3, max: 100 })), + ] } return [] - }, }, + }, + }, eventLocationName: { required: !!this.createEvent && !this.formData.eventIsOnline, min: 3, max: 100, validator: (_, value = '') => { + if (!this.createEvent) return [] if (this.formData.eventIsOnline) return [] if (!value.trim()) { return [new Error(this.$t('common.validations.eventLocationNameNotEmpty'))] } if (value.length < 3 || value.length > 100) { - return [new Error(this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }))] + return [ + new Error( + this.$t('common.validations.eventLocationNameLength', { min: 3, max: 100 }), + ), + ] } return [] }, From a669f799ae5cea661e3cb2dcc17ac2e3aa483c17 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 7 Jun 2023 17:48:06 +0200 Subject: [PATCH 057/405] remove emacs backup --- .../ContributionForm/#ContributionForm.vue# | 623 ------------------ 1 file changed, 623 deletions(-) delete mode 100644 webapp/components/ContributionForm/#ContributionForm.vue# diff --git a/webapp/components/ContributionForm/#ContributionForm.vue# b/webapp/components/ContributionForm/#ContributionForm.vue# deleted file mode 100644 index 1d1353b1e..000000000 --- a/webapp/components/ContributionForm/#ContributionForm.vue# +++ /dev/null @@ -1,623 +0,0 @@ - - - - From 9ee47c13625295842b882aac681f87d06442e213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 7 Jun 2023 20:10:10 +0200 Subject: [PATCH 058/405] Fulfill Mogges suggestions Co-Authored-By: Mogge --- .../DateTimeRange/DateTimeRange.vue | 25 +++++++++++-------- webapp/locales/de.json | 5 ++++ webapp/locales/en.json | 5 ++++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/webapp/components/DateTimeRange/DateTimeRange.vue b/webapp/components/DateTimeRange/DateTimeRange.vue index 8d318709a..de9b442c5 100644 --- a/webapp/components/DateTimeRange/DateTimeRange.vue +++ b/webapp/components/DateTimeRange/DateTimeRange.vue @@ -8,11 +8,12 @@
{{ - getStartTimeString + (this.endDateAsDate && isSameDay ? '—' + getEndTimeString : '') + getStartTimeString + + (this.endDateAsDate && isSameDayLocal ? '—' + getEndTimeString : '') }}
-