From 5adc84bc843acf5c1db2357715e79c0b295789f9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 13 Feb 2025 19:07:35 +0100 Subject: [PATCH 01/62] add Project Branding Table --- .../ProjectBranding.ts | 25 +++++++++++++++++++ database/entity/ProjectBranding.ts | 1 + database/entity/index.ts | 2 ++ .../0088-create_project_brandings.ts | 25 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 database/entity/0088-create_project_brandings/ProjectBranding.ts create mode 100644 database/entity/ProjectBranding.ts create mode 100644 database/migrations/0088-create_project_brandings.ts diff --git a/database/entity/0088-create_project_brandings/ProjectBranding.ts b/database/entity/0088-create_project_brandings/ProjectBranding.ts new file mode 100644 index 000000000..9fb53e32b --- /dev/null +++ b/database/entity/0088-create_project_brandings/ProjectBranding.ts @@ -0,0 +1,25 @@ +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('project_brandings') +export class ProjectBranding { + @PrimaryGeneratedColumn() + id: number + + @Column({ name: 'name', type: 'varchar', length: 255 }) + name: string + + @Column({ name: 'alias', type: 'varchar', length: 32 }) + alias: string + + @Column({ name: 'description', type: 'text', nullable: true, default: null }) + description: string | null + + @Column({ name: 'space_id', type: 'int', unsigned: true, nullable: true, default: null }) + spaceId: number | null + + @Column({ name:'new_user_to_space', type: 'tinyint', width: 1, default: 0 }) + newUserToSpace: boolean + + @Column({ name: 'logo_url', type: 'varchar', length: 255, nullable: true, default: null }) + logoUrl: string | null +} diff --git a/database/entity/ProjectBranding.ts b/database/entity/ProjectBranding.ts new file mode 100644 index 000000000..0622d00ef --- /dev/null +++ b/database/entity/ProjectBranding.ts @@ -0,0 +1 @@ +export { ProjectBranding } from './0088-create_project_brandings/ProjectBranding' diff --git a/database/entity/index.ts b/database/entity/index.ts index 3352abdb4..138df80ae 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -2,6 +2,7 @@ import { ContributionLink } from './ContributionLink' import { LoginElopageBuys } from './LoginElopageBuys' import { LoginEmailOptIn } from './LoginEmailOptIn' import { Migration } from './Migration' +import { ProjectBranding } from './ProjectBranding' import { Transaction } from './Transaction' import { TransactionLink } from './TransactionLink' import { User } from './User' @@ -26,6 +27,7 @@ export const entities = [ LoginElopageBuys, LoginEmailOptIn, Migration, + ProjectBranding, PendingTransaction, Transaction, TransactionLink, diff --git a/database/migrations/0088-create_project_brandings.ts b/database/migrations/0088-create_project_brandings.ts new file mode 100644 index 000000000..a741b4fed --- /dev/null +++ b/database/migrations/0088-create_project_brandings.ts @@ -0,0 +1,25 @@ +/* MIGRATION TO CREATE THE project_brandings table + * + * This migration creates the `community` and 'communityfederation' tables in the `apollo` database (`gradido_community`). + */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`project_brandings\`( + \`id\` INT UNSIGNED NOT NULL AUTO_INCREMENT, + \`name\` VARCHAR(255) NOT NULL, + \`alias\` VARCHAR(32) NOT NULL, + \`description\` TEXT NULL DEFAULT NULL, + \`space_id\` INT UNSIGNED NULL DEFAULT NULL, + \`new_user_to_space\` TINYINT(1) NOT NULL DEFAULT FALSE, + \`logo_url\` VARCHAR(255) NULL DEFAULT NULL, + PRIMARY KEY(\`id\`) + ) ENGINE = InnoDB; + `) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('DROP TABLE `project_brandings`') +} From eb3ce6e9cf8c77dc63ed7b1e3f983711fe858c45 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 14 Feb 2025 13:21:38 +0100 Subject: [PATCH 02/62] add graphql handling and adjust entity --- backend/src/auth/ADMIN_RIGHTS.ts | 1 + backend/src/auth/INALIENABLE_RIGHTS.ts | 1 + backend/src/auth/RIGHTS.ts | 3 + backend/src/auth/USER_RIGHTS.ts | 1 + .../src/graphql/input/ProjectBrandingInput.ts | 38 ++++++++++ backend/src/graphql/model/ProjectBranding.ts | 30 ++++++++ .../resolver/ProjectBrandingResolver.ts | 72 +++++++++++++++++++ .../ProjectBranding.ts | 8 +-- 8 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 backend/src/graphql/input/ProjectBrandingInput.ts create mode 100644 backend/src/graphql/model/ProjectBranding.ts create mode 100644 backend/src/graphql/resolver/ProjectBrandingResolver.ts diff --git a/backend/src/auth/ADMIN_RIGHTS.ts b/backend/src/auth/ADMIN_RIGHTS.ts index e95935fd0..9ba3e7ccd 100644 --- a/backend/src/auth/ADMIN_RIGHTS.ts +++ b/backend/src/auth/ADMIN_RIGHTS.ts @@ -8,4 +8,5 @@ export const ADMIN_RIGHTS = [ RIGHTS.COMMUNITY_BY_UUID, RIGHTS.COMMUNITY_BY_IDENTIFIER, RIGHTS.HOME_COMMUNITY, + RIGHTS.PROJECT_BRANDING_MUTATE, ] diff --git a/backend/src/auth/INALIENABLE_RIGHTS.ts b/backend/src/auth/INALIENABLE_RIGHTS.ts index 25a4fa76d..c3c96b95e 100644 --- a/backend/src/auth/INALIENABLE_RIGHTS.ts +++ b/backend/src/auth/INALIENABLE_RIGHTS.ts @@ -9,4 +9,5 @@ export const INALIENABLE_RIGHTS = [ RIGHTS.QUERY_TRANSACTION_LINK, RIGHTS.QUERY_OPT_IN, RIGHTS.CHECK_USERNAME, + RIGHTS.PROJECT_BRANDING_BANNER, ] diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 1f0bda2b3..28ca70e79 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -8,6 +8,7 @@ export enum RIGHTS { QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', QUERY_OPT_IN = 'QUERY_OPT_IN', CHECK_USERNAME = 'CHECK_USERNAME', + PROJECT_BRANDING_BANNER = 'PROJECT_BRANDING_BANNER', // User VERIFY_LOGIN = 'VERIFY_LOGIN', BALANCE = 'BALANCE', @@ -39,6 +40,7 @@ export enum RIGHTS { USER = 'USER', GMS_USER_PLAYGROUND = 'GMS_USER_PLAYGROUND', HUMHUB_AUTO_LOGIN = 'HUMHUB_AUTO_LOGIN', + PROJECT_BRANDING_VIEW = 'PROJECT_BRANDING_VIEW', // Moderator SEARCH_USERS = 'SEARCH_USERS', ADMIN_CREATE_CONTRIBUTION = 'ADMIN_CREATE_CONTRIBUTION', @@ -64,4 +66,5 @@ export enum RIGHTS { COMMUNITY_BY_IDENTIFIER = 'COMMUNITY_BY_IDENTIFIER', HOME_COMMUNITY = 'HOME_COMMUNITY', COMMUNITY_UPDATE = 'COMMUNITY_UPDATE', + PROJECT_BRANDING_MUTATE = 'PROJECT_BRANDING_MUTATE', } diff --git a/backend/src/auth/USER_RIGHTS.ts b/backend/src/auth/USER_RIGHTS.ts index de8e54af1..44f600a16 100644 --- a/backend/src/auth/USER_RIGHTS.ts +++ b/backend/src/auth/USER_RIGHTS.ts @@ -31,4 +31,5 @@ export const USER_RIGHTS = [ RIGHTS.USER, RIGHTS.GMS_USER_PLAYGROUND, RIGHTS.HUMHUB_AUTO_LOGIN, + RIGHTS.PROJECT_BRANDING_VIEW, ] diff --git a/backend/src/graphql/input/ProjectBrandingInput.ts b/backend/src/graphql/input/ProjectBrandingInput.ts new file mode 100644 index 000000000..cf5459b49 --- /dev/null +++ b/backend/src/graphql/input/ProjectBrandingInput.ts @@ -0,0 +1,38 @@ +import { IsString, IsOptional, MaxLength, IsNumber, IsBoolean, IsUrl } from 'class-validator' +import { InputType, Field, Int } from 'type-graphql' + +@InputType() +export class ProjectBrandingInput { + @Field(() => Int, { nullable: true }) + @IsOptional() + id: number | null | undefined + + @Field(() => String) + @IsString() + name: string + + @Field(() => String) + @IsString() + @MaxLength(32) + alias: string + + @Field(() => String, { nullable: true }) + @IsOptional() + @IsString() + description: string | null | undefined + + @Field(() => Int, { nullable: true }) + @IsNumber() + @IsOptional() + spaceId: number | null | undefined + + @Field(() => Boolean) + @IsBoolean() + newUserToSpace: boolean + + @Field(() => String, { nullable: true }) + @IsOptional() + @IsString() + @IsUrl() + logoUrl: string | null | undefined +} diff --git a/backend/src/graphql/model/ProjectBranding.ts b/backend/src/graphql/model/ProjectBranding.ts new file mode 100644 index 000000000..6f53b357a --- /dev/null +++ b/backend/src/graphql/model/ProjectBranding.ts @@ -0,0 +1,30 @@ +import { ProjectBranding as dbProjectBranding } from '@entity/ProjectBranding' +import { ObjectType, Field, Int } from 'type-graphql' + +@ObjectType() +export class ProjectBranding { + constructor(projectBranding: dbProjectBranding) { + Object.assign(this, projectBranding) + } + + @Field(() => Int) + id: number + + @Field(() => String) + name: string + + @Field(() => String) + alias: string + + @Field(() => String, { nullable: true }) + description: string | null + + @Field(() => Int, { nullable: true }) + spaceId: number | null + + @Field(() => Boolean) + newUserToSpace: boolean + + @Field(() => String, { nullable: true }) + logoUrl: string | null +} diff --git a/backend/src/graphql/resolver/ProjectBrandingResolver.ts b/backend/src/graphql/resolver/ProjectBrandingResolver.ts new file mode 100644 index 000000000..82b433283 --- /dev/null +++ b/backend/src/graphql/resolver/ProjectBrandingResolver.ts @@ -0,0 +1,72 @@ +import { ProjectBranding as DbProjectBranding } from '@entity/ProjectBranding' +import { Resolver, Query, Mutation, Arg, Int, Authorized } from 'type-graphql' + +import { ProjectBrandingInput } from '@input/ProjectBrandingInput' +import { ProjectBranding } from '@model/ProjectBranding' + +import { RIGHTS } from '@/auth/RIGHTS' +import { LogError } from '@/server/LogError' +import { backendLogger as logger } from '@/server/logger' + +@Resolver() +export class ProjectBrandingResolver { + @Query(() => [ProjectBranding]) + @Authorized([RIGHTS.PROJECT_BRANDING_VIEW]) + async getProjectBrandings(): Promise { + return (await DbProjectBranding.find()).map( + (entity: DbProjectBranding) => new ProjectBranding(entity), + ) + } + + @Query(() => ProjectBranding, { nullable: true }) + @Authorized([RIGHTS.PROJECT_BRANDING_VIEW]) + async getProjectBranding(@Arg('id', () => Int) id: number): Promise { + const projectBrandingEntity = await DbProjectBranding.findOneBy({ id }) + if (!projectBrandingEntity) { + throw new LogError(`Project Branding with id: ${id} not found`) + } + return new ProjectBranding(projectBrandingEntity) + } + + @Query(() => String, { nullable: true }) + @Authorized([RIGHTS.PROJECT_BRANDING_BANNER]) + async getProjectBrandingBanner( + @Arg('alias', () => String) alias: string, + ): Promise { + const projectBrandingEntity = await DbProjectBranding.findOne({ + where: { alias }, + select: { logoUrl: true }, + }) + if (!projectBrandingEntity) { + throw new LogError(`Project Branding with alias: ${alias} not found`) + } + return projectBrandingEntity.logoUrl + } + + @Mutation(() => ProjectBranding, { nullable: true }) + @Authorized([RIGHTS.PROJECT_BRANDING_MUTATE]) + async upsertProjectBranding( + @Arg('data') data: ProjectBrandingInput, + ): Promise { + const projectBranding = data.id + ? await DbProjectBranding.findOneOrFail({ where: { id: data.id } }) + : new DbProjectBranding() + + Object.assign(projectBranding, data) + await projectBranding.save() + + return new ProjectBranding(projectBranding) + } + + @Mutation(() => Boolean) + @Authorized([RIGHTS.PROJECT_BRANDING_MUTATE]) + async deleteProjectBranding(@Arg('id', () => Int) id: number): Promise { + try { + await DbProjectBranding.delete({ id }) + return true + } catch (err) { + logger.error(err) + return false + } + } +} diff --git a/database/entity/0088-create_project_brandings/ProjectBranding.ts b/database/entity/0088-create_project_brandings/ProjectBranding.ts index 9fb53e32b..4757904a3 100644 --- a/database/entity/0088-create_project_brandings/ProjectBranding.ts +++ b/database/entity/0088-create_project_brandings/ProjectBranding.ts @@ -1,8 +1,8 @@ -import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from 'typeorm' @Entity('project_brandings') -export class ProjectBranding { - @PrimaryGeneratedColumn() +export class ProjectBranding extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number @Column({ name: 'name', type: 'varchar', length: 255 }) @@ -17,7 +17,7 @@ export class ProjectBranding { @Column({ name: 'space_id', type: 'int', unsigned: true, nullable: true, default: null }) spaceId: number | null - @Column({ name:'new_user_to_space', type: 'tinyint', width: 1, default: 0 }) + @Column({ name: 'new_user_to_space', type: 'tinyint', width: 1, default: 0 }) newUserToSpace: boolean @Column({ name: 'logo_url', type: 'varchar', length: 255, nullable: true, default: null }) From b3290a8191d4de9fa24b9e671ff070128d0c20b3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 14 Feb 2025 13:30:42 +0100 Subject: [PATCH 03/62] lint --- backend/src/graphql/resolver/ProjectBrandingResolver.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/backend/src/graphql/resolver/ProjectBrandingResolver.ts b/backend/src/graphql/resolver/ProjectBrandingResolver.ts index 82b433283..b18536e1f 100644 --- a/backend/src/graphql/resolver/ProjectBrandingResolver.ts +++ b/backend/src/graphql/resolver/ProjectBrandingResolver.ts @@ -12,7 +12,7 @@ import { backendLogger as logger } from '@/server/logger' export class ProjectBrandingResolver { @Query(() => [ProjectBranding]) @Authorized([RIGHTS.PROJECT_BRANDING_VIEW]) - async getProjectBrandings(): Promise { + async projectBrandings(): Promise { return (await DbProjectBranding.find()).map( (entity: DbProjectBranding) => new ProjectBranding(entity), ) @@ -20,7 +20,7 @@ export class ProjectBrandingResolver { @Query(() => ProjectBranding, { nullable: true }) @Authorized([RIGHTS.PROJECT_BRANDING_VIEW]) - async getProjectBranding(@Arg('id', () => Int) id: number): Promise { + async projectBranding(@Arg('id', () => Int) id: number): Promise { const projectBrandingEntity = await DbProjectBranding.findOneBy({ id }) if (!projectBrandingEntity) { throw new LogError(`Project Branding with id: ${id} not found`) @@ -30,9 +30,7 @@ export class ProjectBrandingResolver { @Query(() => String, { nullable: true }) @Authorized([RIGHTS.PROJECT_BRANDING_BANNER]) - async getProjectBrandingBanner( - @Arg('alias', () => String) alias: string, - ): Promise { + async projectBrandingBanner(@Arg('alias', () => String) alias: string): Promise { const projectBrandingEntity = await DbProjectBranding.findOne({ where: { alias }, select: { logoUrl: true }, From c160c393782ebd46d723e2e319c22fb44250a483 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 15 Feb 2025 12:43:14 +0100 Subject: [PATCH 04/62] create, edit, delete project branding --- admin/package.json | 3 +- .../Federation/FederationVisualizeItem.vue | 2 +- admin/src/components/NavBar.vue | 3 + .../ProjectBranding/ProjectBrandingForm.vue | 129 ++++++++++++++++++ .../ProjectBranding/ProjectBrandingItem.vue | 69 ++++++++++ admin/src/components/input/LabeledInput.vue | 45 ++++++ admin/src/components/input/ValidatedInput.vue | 90 ++++++++++++ admin/src/locales/de.json | 14 +- admin/src/locales/en.json | 15 +- admin/src/pages/ProjectBranding.vue | 119 ++++++++++++++++ admin/src/router/routes.js | 5 + admin/src/validationSchemas.js | 14 ++ admin/yarn.lock | 30 ++++ .../resolver/ProjectBrandingResolver.ts | 12 +- 14 files changed, 540 insertions(+), 10 deletions(-) create mode 100644 admin/src/components/ProjectBranding/ProjectBrandingForm.vue create mode 100644 admin/src/components/ProjectBranding/ProjectBrandingItem.vue create mode 100644 admin/src/components/input/LabeledInput.vue create mode 100644 admin/src/components/input/ValidatedInput.vue create mode 100644 admin/src/pages/ProjectBranding.vue create mode 100644 admin/src/validationSchemas.js diff --git a/admin/package.json b/admin/package.json index 5b4c7a24c..f74ff7729 100644 --- a/admin/package.json +++ b/admin/package.json @@ -55,7 +55,8 @@ "vue-router": "4.4.0", "vue3-datepicker": "^0.4.0", "vuex": "4.1.0", - "vuex-persistedstate": "4.1.0" + "vuex-persistedstate": "4.1.0", + "yup": "^1.6.1" }, "devDependencies": { "@apollo/client": "^3.10.8", diff --git a/admin/src/components/Federation/FederationVisualizeItem.vue b/admin/src/components/Federation/FederationVisualizeItem.vue index ea8a6196f..1aa4176e9 100644 --- a/admin/src/components/Federation/FederationVisualizeItem.vue +++ b/admin/src/components/Federation/FederationVisualizeItem.vue @@ -56,7 +56,7 @@ export default { ? formatDistanceToNow(new Date(dateString), { includeSecond: true, addSuffix: true, - locale: useDateLocale, + locale: useDateLocale(), }) : '' }, diff --git a/admin/src/components/NavBar.vue b/admin/src/components/NavBar.vue index b9dc12106..fa715da88 100644 --- a/admin/src/components/NavBar.vue +++ b/admin/src/components/NavBar.vue @@ -32,6 +32,9 @@ {{ $t('navbar.instances') }} + + {{ $t('navbar.projectBranding') }} + {{ $t('navbar.statistic') }} diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue new file mode 100644 index 000000000..107da6b61 --- /dev/null +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -0,0 +1,129 @@ + + + diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue new file mode 100644 index 000000000..d52d416ef --- /dev/null +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -0,0 +1,69 @@ + + + diff --git a/admin/src/components/input/LabeledInput.vue b/admin/src/components/input/LabeledInput.vue new file mode 100644 index 000000000..920fceacd --- /dev/null +++ b/admin/src/components/input/LabeledInput.vue @@ -0,0 +1,45 @@ + + + diff --git a/admin/src/components/input/ValidatedInput.vue b/admin/src/components/input/ValidatedInput.vue new file mode 100644 index 000000000..1d8e90ea9 --- /dev/null +++ b/admin/src/components/input/ValidatedInput.vue @@ -0,0 +1,90 @@ + + + diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index 22bb1d614..c48582d54 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -1,5 +1,7 @@ { "GDD": "GDD", + "actions": "Aktionen", + "alias": "Alias", "all_emails": "Alle Nutzer", "back": "zurück", "change_user_role": "Nutzerrolle ändern", @@ -52,7 +54,6 @@ "enter_text": "Text eintragen", "form": "Schöpfungsformular", "min_characters": "Mindestens 10 Zeichen eingeben", - "reset": "Zurücksetzen", "select_month": "Monat auswählen", "select_value": "Betrag auswählen", "submit_creation": "Schöpfung einreichen", @@ -68,6 +69,7 @@ "deleted": "gelöscht", "deleted_user": "Alle gelöschten Nutzer", "deny": "Ablehnen", + "description": "Beschreibung", "e_mail": "E-Mail", "edit": "bearbeiten", "enabled": "aktiviert", @@ -127,6 +129,7 @@ "lastname": "Nachname", "latitude": "Breitengrad:", "latitude-longitude-smart": "Breitengrad, Längengrad", + "logo": "Logo", "longitude": "Längengrad:", "math": { "equals": "=", @@ -155,6 +158,8 @@ "instances": "Instanzen", "logout": "Abmelden", "my-account": "Mein Konto", + "projectBranding": "Projekt Branding", + "projectBrandingTooltip": "Nutze ein eigenes Logo im Gradido Login und füge neue Benutzer einem Humhub-Space hinzu", "statistic": "Statistik", "user_search": "Nutzersuche" }, @@ -199,8 +204,15 @@ "yes": "Ja, Nutzer wiederherstellen" } }, + "projectBranding": { + "addTooltip": "Neuen Projekt Branding Eintrag hinzufügen", + "title": "Projekt Brandings", + "newUserToSpace": "Benutzer hinzufügen?", + "newUserToSpaceTooltip": "Neue Benutzer automatisch zum Space hinzufügen, falls Space vorhanden" + }, "redeemed": "eingelöst", "removeNotSelf": "Als Admin/Moderator kannst du dich nicht selber löschen.", + "reset": "Zurücksetzen", "save": "Speichern", "statistic": { "activeUsers": "Aktive Mitglieder", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index c8c45a7a0..1fe06348d 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -1,5 +1,7 @@ { "GDD": "GDD", + "actions": "Actions", + "alias": "Alias", "all_emails": "All users", "back": "back", "change_user_role": "Change user role", @@ -68,6 +70,7 @@ "deleted": "deleted", "deleted_user": "All deleted user", "deny": "Reject", + "description": "Description", "e_mail": "E-mail", "edit": "edit", "enabled": "enabled", @@ -127,6 +130,7 @@ "lastname": "Lastname", "latitude": "Latitude:", "latitude-longitude-smart": "Latitude, Longitude", + "logo": "Logo", "longitude": "Longitude:", "math": { "equals": "=", @@ -155,6 +159,8 @@ "instances": "Instances", "logout": "Logout", "my-account": "My Account", + "projectBranding": "Project Branding", + "projectBrandingTooltip": "Use your own logo in the Gradido login and add new users to a Humhub space", "statistic": "Statistic", "user_search": "User search" }, @@ -199,9 +205,16 @@ "yes": "Yes,undelete user" } }, + "projectBranding": { + "addTooltip": "Add new project branding entry", + "title": "Project Branding", + "newUserToSpace": "Add user?", + "newUserToSpaceTooltip": "The hours should contain a maximum of two decimal places" + }, "redeemed": "redeemed", "removeNotSelf": "As an admin/moderator, you cannot delete yourself.", - "save": "Speichern", + "reset": "Reset", + "save": "Save", "statistic": { "activeUsers": "Active members", "count": "Count", diff --git a/admin/src/pages/ProjectBranding.vue b/admin/src/pages/ProjectBranding.vue new file mode 100644 index 000000000..03e137706 --- /dev/null +++ b/admin/src/pages/ProjectBranding.vue @@ -0,0 +1,119 @@ + + + diff --git a/admin/src/router/routes.js b/admin/src/router/routes.js index 7342a0b6b..9a76b1e31 100644 --- a/admin/src/router/routes.js +++ b/admin/src/router/routes.js @@ -36,6 +36,11 @@ const routes = [ name: 'federation', component: () => import('@/pages/FederationVisualize.vue'), }, + { + path: '/projectBranding', + name: 'projectBranding', + component: () => import('@/pages/ProjectBranding.vue'), + }, { path: '/:catchAll(.*)', name: 'NotFound', diff --git a/admin/src/validationSchemas.js b/admin/src/validationSchemas.js new file mode 100644 index 000000000..b31e3043c --- /dev/null +++ b/admin/src/validationSchemas.js @@ -0,0 +1,14 @@ +// TODO: only needed for grace period, before all inputs updated for using veeValidate + yup +export const isLanguageKey = (str) => + str.match(/^(?!\.)[a-z][a-zA-Z0-9-]*([.][a-z][a-zA-Z0-9-]*)*(? { + const type = typeof error + if (type === 'object') { + return t(error.key, error.values) + } else if (type === 'string' && error.length > 0 && isLanguageKey(error)) { + return t(error) + } else { + return error + } +} diff --git a/admin/yarn.lock b/admin/yarn.lock index 3e3a8b8c4..ce8dccf2c 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -5657,6 +5657,11 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.13.1" +property-expr@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -6484,6 +6489,11 @@ throttle-debounce@^5.0.0: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz#ec5549d84e053f043c9fd0f2a6dd892ff84456b1" integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + tinybench@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" @@ -6543,6 +6553,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + tough-cookie@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" @@ -6608,6 +6623,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -7145,6 +7165,16 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yup@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.6.1.tgz#8defcff9daaf9feac178029c0e13b616563ada4b" + integrity sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" + zen-observable-ts@^0.8.21: version "0.8.21" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" diff --git a/backend/src/graphql/resolver/ProjectBrandingResolver.ts b/backend/src/graphql/resolver/ProjectBrandingResolver.ts index b18536e1f..3f31e809a 100644 --- a/backend/src/graphql/resolver/ProjectBrandingResolver.ts +++ b/backend/src/graphql/resolver/ProjectBrandingResolver.ts @@ -1,5 +1,5 @@ import { ProjectBranding as DbProjectBranding } from '@entity/ProjectBranding' -import { Resolver, Query, Mutation, Arg, Int, Authorized } from 'type-graphql' +import { Resolver, Query, Mutation, Arg, Int, Authorized, ID } from 'type-graphql' import { ProjectBrandingInput } from '@input/ProjectBrandingInput' import { ProjectBranding } from '@model/ProjectBranding' @@ -44,13 +44,13 @@ export class ProjectBrandingResolver { @Mutation(() => ProjectBranding, { nullable: true }) @Authorized([RIGHTS.PROJECT_BRANDING_MUTATE]) async upsertProjectBranding( - @Arg('data') data: ProjectBrandingInput, + @Arg('input') input: ProjectBrandingInput, ): Promise { - const projectBranding = data.id - ? await DbProjectBranding.findOneOrFail({ where: { id: data.id } }) + const projectBranding = input.id + ? await DbProjectBranding.findOneOrFail({ where: { id: input.id } }) : new DbProjectBranding() - Object.assign(projectBranding, data) + Object.assign(projectBranding, input) await projectBranding.save() return new ProjectBranding(projectBranding) @@ -58,7 +58,7 @@ export class ProjectBrandingResolver { @Mutation(() => Boolean) @Authorized([RIGHTS.PROJECT_BRANDING_MUTATE]) - async deleteProjectBranding(@Arg('id', () => Int) id: number): Promise { + async deleteProjectBranding(@Arg('id', () => ID) id: number): Promise { try { await DbProjectBranding.delete({ id }) return true From ce08b2d843f061e3245c9e82e4af8879077dfb1a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sun, 16 Feb 2025 18:45:45 +0100 Subject: [PATCH 05/62] scale log img --- admin/src/components/ProjectBranding/ProjectBrandingForm.vue | 2 +- admin/src/components/ProjectBranding/ProjectBrandingItem.vue | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue index 107da6b61..695f8b89f 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -93,7 +93,7 @@ const validationSchema = object({ .required(), description: string().nullable().optional(), newUserToSpace: boolean().optional(), - logoUrl: string().url('Logo URL must be a valid URL.').nullable().optional(), + logoUrl: string().url('Logo URL must be a valid URL.').max(255).nullable().optional(), }) function updateField(value, name) { diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue index d52d416ef..172891f71 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -4,7 +4,9 @@ {{ item.name }} {{ item.alias }} {{ item.newUserToSpace }} - + + + From a3147661c3a60b816a1f47287486b876b15dd9d3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 17 Feb 2025 17:43:41 +0100 Subject: [PATCH 06/62] choose space in modal --- .../ProjectBranding/ListHumhubSpaces.vue | 117 ++++++++++++++++++ .../ProjectBranding/ProjectBrandingForm.vue | 49 +++++++- .../ProjectBranding/ProjectBrandingItem.vue | 47 ++++++- admin/src/locales/de.json | 8 ++ admin/src/locales/en.json | 8 ++ admin/src/pages/ProjectBranding.vue | 2 +- backend/src/apis/humhub/HumHubClient.ts | 25 ++++ backend/src/apis/humhub/model/Space.ts | 7 ++ .../src/apis/humhub/model/SpacesResponse.ts | 8 ++ backend/src/auth/RIGHTS.ts | 1 + backend/src/auth/USER_RIGHTS.ts | 1 + backend/src/graphql/model/ProjectBranding.ts | 5 + backend/src/graphql/model/Space.ts | 25 ++++ backend/src/graphql/model/SpaceList.ts | 24 ++++ .../resolver/ProjectBrandingResolver.ts | 40 +++++- 15 files changed, 360 insertions(+), 7 deletions(-) create mode 100644 admin/src/components/ProjectBranding/ListHumhubSpaces.vue create mode 100644 backend/src/apis/humhub/model/Space.ts create mode 100644 backend/src/apis/humhub/model/SpacesResponse.ts create mode 100644 backend/src/graphql/model/Space.ts create mode 100644 backend/src/graphql/model/SpaceList.ts diff --git a/admin/src/components/ProjectBranding/ListHumhubSpaces.vue b/admin/src/components/ProjectBranding/ListHumhubSpaces.vue new file mode 100644 index 000000000..809fd38fb --- /dev/null +++ b/admin/src/components/ProjectBranding/ListHumhubSpaces.vue @@ -0,0 +1,117 @@ + + + + diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue index 695f8b89f..52cc688fb 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -26,6 +26,14 @@ class="mb-3" @update:model-value="updateField" /> + + {{ selectedSpaceText }} + {{ $t('reset') }} + + + diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue index 52cc688fb..c3ac7d6b0 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -111,12 +111,11 @@ const GET_SPACE = gql` } } ` -const { result, loading } = useQuery(GET_SPACE, () => ({ id: spaceId.value }), { +const { result } = useQuery(GET_SPACE, () => ({ id: spaceId.value }), { enabled: computed(() => !!spaceId.value), }) const selectedSpaceText = computed(() => { - console.log('selectedSpaceText: ', result.value) if (!spaceId.value) { return t('projectBranding.selectSpace') } From cde38eb6396bacd2ba28a6d4867138fa60fd3bd9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 17 Feb 2025 18:00:13 +0100 Subject: [PATCH 08/62] show login url only if alias was already set --- admin/src/components/ProjectBranding/ProjectBrandingItem.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue index 8065c446a..bc384b7ae 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -62,7 +62,10 @@ const details = ref(false) const emit = defineEmits(['update:item', 'deleted:item']) const frontendLoginUrl = computed(() => { - return `${CONFIG.WALLET_LOGIN_URL}?project=${item.value.alias}` + if (item.value.alias && item.value.alias.length > 0) { + return `${CONFIG.WALLET_LOGIN_URL}?project=${item.value.alias}` + } + return undefined }) async function copyToClipboard(text) { From 7889e343b421777d33cc2487cbae43f9c683df83 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 17 Feb 2025 18:01:40 +0100 Subject: [PATCH 09/62] show copy button only if link was shown --- admin/src/components/ProjectBranding/ProjectBrandingItem.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue index bc384b7ae..2c8224ec1 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -6,6 +6,7 @@
{{ frontendLoginUrl }} Date: Tue, 18 Feb 2025 09:13:11 +0100 Subject: [PATCH 10/62] only admin can create, edit or delete project_branding entries --- .../ProjectBranding/ProjectBrandingItem.vue | 12 ++++++++++-- admin/src/pages/ProjectBranding.vue | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue index 2c8224ec1..b94aa19cc 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -1,6 +1,6 @@ - diff --git a/frontend/src/pages/Register.vue b/frontend/src/pages/Register.vue index e7f8b39b3..6feb1e9fe 100755 --- a/frontend/src/pages/Register.vue +++ b/frontend/src/pages/Register.vue @@ -70,6 +70,18 @@
+ + + {{ $t('existingGradidoAccount', { communityName: CONFIG.COMMUNITY_NAME }) }} + + + + + + + @@ -89,8 +101,11 @@ import { createUser } from '@/graphql/mutations' import { useI18n } from 'vue-i18n' import { useStore } from 'vuex' import { useRoute } from 'vue-router' +import { useAuthLinks } from '@/composables/useAuthLinks' +import CONFIG from '@/config' const { toastError } = useAppToast() +const { login } = useAuthLinks() const { mutate } = useMutation(createUser) @@ -151,4 +166,7 @@ async function onSubmit() { padding-right: 0; padding-left: 0; } +a.login-nav-item { + color: #0e79bc !important; +} From 421717a4d620b7b28e6c9221d338c92bbe094a18 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 26 Feb 2025 12:22:31 +0100 Subject: [PATCH 20/62] fix lint --- frontend/src/pages/Login.vue | 1 + frontend/src/pages/Register.vue | 1 + 2 files changed, 2 insertions(+) diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index 11a099920..13e16dd73 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -161,6 +161,7 @@ const enterData = computed(() => !showPageMessage.value) padding-right: 0; padding-left: 0; } + a.register-nav-item { color: #0e79bc !important; } diff --git a/frontend/src/pages/Register.vue b/frontend/src/pages/Register.vue index 6feb1e9fe..98344d80e 100755 --- a/frontend/src/pages/Register.vue +++ b/frontend/src/pages/Register.vue @@ -166,6 +166,7 @@ async function onSubmit() { padding-right: 0; padding-left: 0; } + a.login-nav-item { color: #0e79bc !important; } From 91c148178587293662fa17e1219621e5fd6c2bf2 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 26 Feb 2025 13:17:18 +0100 Subject: [PATCH 21/62] fix copy and paste error --- frontend/src/pages/Login.vue | 4 ++-- frontend/src/pages/Register.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index 13e16dd73..a24796d18 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -33,12 +33,12 @@ - + {{ $t('missingGradidoAccount', { communityName: CONFIG.COMMUNITY_NAME }) }} - + {{ $t('signup') }} diff --git a/frontend/src/pages/Register.vue b/frontend/src/pages/Register.vue index 98344d80e..a8044b330 100755 --- a/frontend/src/pages/Register.vue +++ b/frontend/src/pages/Register.vue @@ -71,12 +71,12 @@ - + {{ $t('existingGradidoAccount', { communityName: CONFIG.COMMUNITY_NAME }) }} - + From 76219f5ab248eb5ff1a12e6f0db93a7f21d7f357 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 27 Feb 2025 18:38:03 +0100 Subject: [PATCH 22/62] Update frontend/src/store/store.test.js Co-authored-by: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> --- frontend/src/store/store.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/store/store.test.js b/frontend/src/store/store.test.js index 019f1fbe6..8e6e3d941 100644 --- a/frontend/src/store/store.test.js +++ b/frontend/src/store/store.test.js @@ -161,7 +161,7 @@ describe('Vuex store', () => { const commit = vi.fn() const state = {} - it('calls twente commits', () => { + it('calls twenty commits', () => { logout({ commit, state }) expect(commit).toHaveBeenCalledTimes(20) }) From b9daad7212b6c737d0f8805d90e0cf061317bc99 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 4 Mar 2025 13:00:20 +0100 Subject: [PATCH 23/62] move and fragment new graphql queries and mutations --- admin/package.json | 1 + .../ProjectBranding/ListHumhubSpaces.vue | 28 ++++--------------- .../ProjectBranding/ProjectBrandingForm.vue | 4 +-- .../ProjectBranding/ProjectBrandingItem.vue | 23 ++------------- admin/src/config/index.js | 2 +- admin/src/graphql/fragments.graphql | 23 +++++++++++++++ admin/src/graphql/projectBranding.graphql | 22 +++++++++++++++ admin/vite.config.js | 4 ++- admin/yarn.lock | 13 +++++++-- backend/src/graphql/model/Pagination.ts | 19 +++++++++++++ backend/src/graphql/model/SpaceList.ts | 16 ++++------- 11 files changed, 97 insertions(+), 58 deletions(-) create mode 100644 admin/src/graphql/fragments.graphql create mode 100644 admin/src/graphql/projectBranding.graphql create mode 100644 backend/src/graphql/model/Pagination.ts diff --git a/admin/package.json b/admin/package.json index f74ff7729..a426ee8ab 100644 --- a/admin/package.json +++ b/admin/package.json @@ -89,6 +89,7 @@ "unplugin-icons": "^0.19.0", "unplugin-vue-components": "^0.27.3", "vite-plugin-environment": "^1.1.3", + "vite-plugin-graphql-loader": "^4.0.4", "vitest": "^2.0.5", "vitest-canvas-mock": "^0.3.3" }, diff --git a/admin/src/components/ProjectBranding/ListHumhubSpaces.vue b/admin/src/components/ProjectBranding/ListHumhubSpaces.vue index a8c359d1a..4e7a0bf77 100644 --- a/admin/src/components/ProjectBranding/ListHumhubSpaces.vue +++ b/admin/src/components/ProjectBranding/ListHumhubSpaces.vue @@ -26,9 +26,9 @@ import { ref, onMounted, computed } from 'vue' +import { spaces as spacesQuery } from '@/graphql/projectBranding.graphql' import { useQuery } from '@vue/apollo-composable' -import gql from 'graphql-tag' const props = defineProps({ modelValue: { @@ -57,26 +57,10 @@ function chooseSpace(space) { const ITEMS_PER_PAGE = 20 const page = ref(1) const selectedSpaceId = ref(props.modelValue) -const { result, refetch } = useQuery( - gql` - query spaces($page: Int!, $limit: Int!) { - spaces(page: $page, limit: $limit) { - total - page - pages - results { - id - name - description - url - } - } - } - `, - { page: page.value, limit: ITEMS_PER_PAGE }, -) +const { result, refetch } = useQuery(spacesQuery, { page: page.value, limit: ITEMS_PER_PAGE }) const spaces = computed(() => result.value?.spaces?.results || []) +const pagination = computed(() => result.value?.spaces?.pagination || {}) onMounted(() => { if (props.modelValue) { diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue index e412e55f3..e48a2004e 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -100,7 +100,7 @@ const spaceId = computed(() => form.spaceId) const newUserToSpace = computed(() => form.newUserToSpace) const logoUrl = computed(() => form.logoUrl) // show space -const GET_SPACE = gql` +const getSpace = gql` query space($id: ID!) { space(id: $id) { name @@ -108,7 +108,7 @@ const GET_SPACE = gql` } } ` -const { result } = useQuery(GET_SPACE, () => ({ id: spaceId.value }), { +const { result } = useQuery(getSpace, () => ({ id: spaceId.value }), { enabled: computed(() => !!spaceId.value), }) diff --git a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue index 265ccf597..1a02286f7 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingItem.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingItem.vue @@ -46,11 +46,11 @@ From 23228676a2b82062f9823e185e1e69a40376b01e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 4 Mar 2025 16:42:42 +0100 Subject: [PATCH 27/62] fix problem with fetching project with out logourl --- backend/src/graphql/resolver/ProjectBrandingResolver.ts | 2 +- frontend/src/layouts/AuthLayout.vue | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/ProjectBrandingResolver.ts b/backend/src/graphql/resolver/ProjectBrandingResolver.ts index 33fb845c9..de5b5b68a 100644 --- a/backend/src/graphql/resolver/ProjectBrandingResolver.ts +++ b/backend/src/graphql/resolver/ProjectBrandingResolver.ts @@ -36,7 +36,7 @@ export class ProjectBrandingResolver { async projectBrandingBanner(@Arg('alias', () => String) alias: string): Promise { const projectBrandingEntity = await DbProjectBranding.findOne({ where: { alias }, - select: { logoUrl: true }, + select: { id: true, logoUrl: true }, }) if (!projectBrandingEntity) { throw new LogError(`Project Branding with alias: ${alias} not found`) diff --git a/frontend/src/layouts/AuthLayout.vue b/frontend/src/layouts/AuthLayout.vue index 3a70d360a..fe6587d7a 100644 --- a/frontend/src/layouts/AuthLayout.vue +++ b/frontend/src/layouts/AuthLayout.vue @@ -141,8 +141,9 @@ onBeforeMount(() => { store.commit('project', null) }) +// put project value into store, if projectBrandingBanner query don't throw an error, so project exists watchEffect(() => { - if (projectBannerResult.value?.projectBrandingBanner) { + if (projectBannerResult.value) { store.commit('project', projectValue.value) } }) From 096dd9586d6aeb2992b24d21ab77ace584b5ffc1 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 4 Mar 2025 17:02:14 +0100 Subject: [PATCH 28/62] move around more graphql queries --- .../ProjectBranding/ProjectBrandingForm.vue | 15 +++------ admin/src/graphql/projectBranding.graphql | 7 ++++ frontend/package.json | 1 + frontend/src/graphql/projectBranding.graphql | 3 ++ frontend/src/layouts/AuthLayout.vue | 18 ++++------ frontend/vite.config.js | 4 ++- frontend/yarn.lock | 33 ++++++++++++++++--- 7 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 frontend/src/graphql/projectBranding.graphql diff --git a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue index 236b5f44b..90e928c41 100644 --- a/admin/src/components/ProjectBranding/ProjectBrandingForm.vue +++ b/admin/src/components/ProjectBranding/ProjectBrandingForm.vue @@ -75,11 +75,11 @@ diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 2385e92ef..590338bd5 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -18,7 +18,8 @@ dotenv.config() // load env vars from .env const CONFIG = require('./src/config') // https://vitejs.dev/config/ -export default defineConfig(({ command }) => { +export default defineConfig(async ({ command }) => { + const { vitePluginGraphqlLoader } = await import('vite-plugin-graphql-loader') if (command === 'serve') { CONFIG.FRONTEND_HOSTING = 'nodejs' } else { @@ -117,6 +118,7 @@ export default defineConfig(({ command }) => { META_KEYWORDS_EN: null, META_AUTHOR: null, }), + vitePluginGraphqlLoader(), commonjs(), ], css: { diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 8036b3e46..744643c9d 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4218,7 +4218,7 @@ graphql-tag@^2.12.6, graphql-tag@^2.4.2: dependencies: tslib "^2.1.0" -graphql@^16.9.0: +graphql@^16.8.1, graphql@^16.9.0: version "16.10.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== @@ -5074,7 +5074,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -magic-string@^0.30.11, magic-string@^0.30.12, magic-string@^0.30.14, magic-string@^0.30.17: +magic-string@^0.30.10, magic-string@^0.30.11, magic-string@^0.30.12, magic-string@^0.30.14, magic-string@^0.30.17: version "0.30.17" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== @@ -6466,7 +6466,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1, strip-ansi@^7.1.0: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -7168,6 +7175,15 @@ vite-plugin-environment@^1.1.3: resolved "https://registry.yarnpkg.com/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz#d01a04abb2f69730a4866c9c9db51d3dab74645b" integrity sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA== +vite-plugin-graphql-loader@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/vite-plugin-graphql-loader/-/vite-plugin-graphql-loader-4.0.4.tgz#cf6c599b3e5fa32bf2b768983da68f7beccc8486" + integrity sha512-lYnpQ2luV2fcuXmOJADljuktfMbDW00Y+6QS+Ek8Jz1Vdzlj/51LSGJwZqyjJ24a5YQ+o29Hr6el/5+nlZetvg== + dependencies: + graphql "^16.8.1" + graphql-tag "^2.12.6" + magic-string "^0.30.10" + vite-plugin-html@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz#661834fa09015d3fda48ba694dbaa809396f5f7a" @@ -7443,7 +7459,16 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^8.1.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@7.0.0, wrap-ansi@^8.1.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From daddb5b63a09deac921597bf7b8b8386a230f4a5 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 4 Mar 2025 17:08:06 +0100 Subject: [PATCH 29/62] nicer --- admin/src/pages/ProjectBranding.vue | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/admin/src/pages/ProjectBranding.vue b/admin/src/pages/ProjectBranding.vue index 925a0f75e..a1c73cc41 100644 --- a/admin/src/pages/ProjectBranding.vue +++ b/admin/src/pages/ProjectBranding.vue @@ -49,7 +49,7 @@ diff --git a/admin/src/components/ContributionMessages/ContributionMessagesList.vue b/admin/src/components/ContributionMessages/ContributionMessagesList.vue index 14b640066..a465fe5a8 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesList.vue +++ b/admin/src/components/ContributionMessages/ContributionMessagesList.vue @@ -1,17 +1,27 @@ + + diff --git a/admin/src/graphql/adminListContributions.js b/admin/src/graphql/adminListContributions.js index aa6c0c713..b5eca3477 100644 --- a/admin/src/graphql/adminListContributions.js +++ b/admin/src/graphql/adminListContributions.js @@ -26,6 +26,7 @@ export const adminListContributions = gql` id firstName lastName + email amount memo createdAt diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index b2d72cb91..9e5f3bc0e 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -36,7 +36,7 @@ }, "contributionMessagesForm": { "resubmissionDateInPast": "Wiedervorlage Datum befindet sich in der Vergangenheit!", - "userDetailsRegisteredAt": "{firstName} {lastName} <{email}> hat sich am {createdAt} registriert." + "hasRegisteredAt": "hat sich am {createdAt} registriert." }, "contributions": { "all": "Alle", @@ -143,7 +143,7 @@ "plus": "+" }, "message": { - "request": "Die Anfrage wurde gesendet." + "request": "Die Eingabe wurde gespeichert." }, "moderator": { "history": "Die Daten wurden geändert. Dies sind die alten Daten.", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 0eee027a3..7d71e8bf0 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -36,7 +36,7 @@ }, "contributionMessagesForm": { "resubmissionDateInPast": "Resubmission date is in the past!", - "userDetailsRegisteredAt": "{firstName} {lastName} <{email}> registered on {createdAt}." + "hasRegisteredAt": "registered on {createdAt}." }, "contributions": { "all": "All", @@ -74,8 +74,8 @@ "deleted_user": "All deleted user", "deny": "Reject", "description": "Description", - "e_mail": "E-mail", "details": "Details", + "e_mail": "E-mail", "edit": "edit", "enabled": "enabled", "error": "Error", @@ -143,7 +143,7 @@ "plus": "+" }, "message": { - "request": "Request has been sent." + "request": "The entry has been saved." }, "moderator": { "history": "The data has been changed. This is the old data.", diff --git a/backend/src/graphql/model/Contribution.ts b/backend/src/graphql/model/Contribution.ts index a0e7e4366..87240a47e 100644 --- a/backend/src/graphql/model/Contribution.ts +++ b/backend/src/graphql/model/Contribution.ts @@ -7,8 +7,9 @@ import { ObjectType, Field, Int } from 'type-graphql' export class Contribution { constructor(contribution: dbContribution, user?: User | null) { this.id = contribution.id - this.firstName = user ? user.firstName : null - this.lastName = user ? user.lastName : null + this.firstName = user?.firstName ?? null + this.lastName = user?.lastName ?? null + this.email = user?.emailContact?.email ?? null this.amount = contribution.amount this.memo = contribution.memo this.createdAt = contribution.createdAt @@ -37,6 +38,9 @@ export class Contribution { @Field(() => String, { nullable: true }) lastName: string | null + @Field(() => String, { nullable: true }) + email: string | null + @Field(() => Decimal) amount: Decimal diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index c1ee2d490..64bdd993e 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -51,8 +51,8 @@ "contribution": { "activity": "Tätigkeit", "alert": { - "answerQuestion": "Bitte beantworte diese Rückfrage.", - "answerQuestionToast": "Du hast eine Rückfrage auf einen Beitrag. Bitte antworte auf diese.", + "answerQuestion": "Zu diesem Beitrag liegt eine neue Nachricht vor.", + "answerQuestionToast": "Du hast neue Nachrichten.", "communityNoteList": "Hier findest du alle eingereichten und bestätigten Beiträge von allen Mitgliedern aus dieser Gemeinschaft.", "confirm": "bestätigt", "deleted": "gelöscht", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index ed23c4d27..a40034dff 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -51,8 +51,8 @@ "contribution": { "activity": "Activity", "alert": { - "answerQuestion": "Please answer the question.", - "answerQuestionToast": "You have a question about a post. Please reply to it.", + "answerQuestion": "There is a new message for this article.", + "answerQuestionToast": "You have new messages.", "communityNoteList": "Here you will find all submitted and confirmed contributions from all members of this community.", "confirm": "confirmed", "deleted": "deleted", From bd0c332612b51fd1495da7f61c1fc2361d246631 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 8 Mar 2025 09:13:24 +0100 Subject: [PATCH 36/62] modificate contribution detail layout --- .../ContributionMessagesList.vue | 22 ++++++++++++------- admin/src/graphql/adminListContributions.js | 1 + admin/src/locales/de.json | 5 +++++ admin/src/locales/en.json | 5 +++++ admin/src/pages/UserSearch.vue | 11 +++++++++- backend/src/graphql/model/Contribution.ts | 4 ++++ 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/admin/src/components/ContributionMessages/ContributionMessagesList.vue b/admin/src/components/ContributionMessages/ContributionMessagesList.vue index e62dae7f0..8e1d5fcb7 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesList.vue +++ b/admin/src/components/ContributionMessages/ContributionMessagesList.vue @@ -2,15 +2,17 @@
- - {{ contribution.firstName }} {{ contribution.lastName }} <{{ contribution.email }}> - + + {{ contribution.firstName }} {{ contribution.lastName }} +   - {{ - $t('contributionMessagesForm.hasRegisteredAt', { - createdAt: new Date(contribution.createdAt).toLocaleString(), - }) - }} + {{ contribution.email }} +   + {{ contribution.username }} +   Humhub-Profil + + + {{ $t('registered') }}: {{ new Date(contribution.createdAt).toLocaleString() }} @@ -42,6 +44,7 @@ import { useQuery } from '@vue/apollo-composable' import { adminListContributionMessages } from '../../graphql/adminListContributionMessages.js' import { useAppToast } from '@/composables/useToast' +import { BListGroupItem } from 'bootstrap-vue-next' const props = defineProps({ contribution: { @@ -63,6 +66,9 @@ const { toastError } = useAppToast() const mailtoLink = computed(() => { return `mailto:${props.contribution.email}` }) +const searchLink = computed(() => { + return `/user?search=${props.contribution.email}` +}) const messages = ref([]) diff --git a/admin/src/graphql/adminListContributions.js b/admin/src/graphql/adminListContributions.js index b5eca3477..4329fef05 100644 --- a/admin/src/graphql/adminListContributions.js +++ b/admin/src/graphql/adminListContributions.js @@ -27,6 +27,7 @@ export const adminListContributions = gql` firstName lastName email + username amount memo createdAt diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index 9e5f3bc0e..0ceb46d8f 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -119,6 +119,10 @@ "describe": "Teilt Koordinaten im Format 'Breitengrad, Längengrad' automatisch auf. Fügen sie hier einfach z.B. ihre Koordinaten von Google Maps, zum Beispiel: 49.28187664243721, 9.740672183943639, ein." } }, + "goTo": { + "userSearch": "Zur Nutzersuche gehen", + "humhubProfile": "Zum Humhub Profil gehen" + }, "help": { "help": "Hilfe", "transactionlist": { @@ -226,6 +230,7 @@ }, "redeemed": "eingelöst", "removeNotSelf": "Als Admin/Moderator kannst du dich nicht selber löschen.", + "registered": "Registriert", "reset": "Zurücksetzen", "save": "Speichern", "statistic": { diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 7d71e8bf0..ef626311a 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -119,6 +119,10 @@ "describe": "Automatically splits coordinates in the format 'latitude, longitude'. Simply enter your coordinates from Google Maps here, for example: 49.28187664243721, 9.740672183943639." } }, + "goTo": { + "userSearch": "Go to user search", + "humhubProfile": "Go to Humhub profile" + }, "help": { "help": "Help", "transactionlist": { @@ -226,6 +230,7 @@ }, "redeemed": "redeemed", "removeNotSelf": "As an admin/moderator, you cannot delete yourself.", + "registered": "Registered", "reset": "Reset", "save": "Save", "statistic": { diff --git a/admin/src/pages/UserSearch.vue b/admin/src/pages/UserSearch.vue index 72fa15934..78bfc7e90 100644 --- a/admin/src/pages/UserSearch.vue +++ b/admin/src/pages/UserSearch.vue @@ -43,8 +43,9 @@
diff --git a/admin/src/components/Tables/OpenCreationsTable.vue b/admin/src/components/Tables/OpenCreationsTable.vue index 56ff980f0..824c9e141 100644 --- a/admin/src/components/Tables/OpenCreationsTable.vue +++ b/admin/src/components/Tables/OpenCreationsTable.vue @@ -126,6 +126,7 @@ @update-status="updateStatus" @reload-contribution="reloadContribution" @update-contributions="updateContributions" + @search-for-email="$emit('search-for-email', $event)" /> @@ -173,7 +174,13 @@ export default { required: false, }, }, - emits: ['update-contributions', 'reload-contribution', 'update-status', 'show-overlay'], + emits: [ + 'update-contributions', + 'reload-contribution', + 'update-status', + 'show-overlay', + 'search-for-email', + ], data() { return { slotIndex: 0, diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index bce6fc229..a5c4d2e37 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -99,6 +99,9 @@ "verified": "Verifiziert", "verifiedAt": "Verifiziert am" }, + "filter": { + "byEmail": "Nach E-Mail filtern" + }, "firstname": "Vorname", "footer": { "app_version": "App version {version}", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 52555f12b..b3f500564 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -99,6 +99,9 @@ "verified": "Verified", "verifiedAt": "Verified at" }, + "filter": { + "byEmail": "Filter by email" + }, "firstname": "Firstname", "footer": { "app_version": "App version {version}", diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue index 7095d93c6..d9497df7a 100644 --- a/admin/src/pages/CreationConfirm.vue +++ b/admin/src/pages/CreationConfirm.vue @@ -58,6 +58,7 @@ @update-status="updateStatus" @reload-contribution="reloadContribution" @update-contributions="refetch" + @search-for-email="query = $event" /> Date: Mon, 10 Mar 2025 12:49:33 +0100 Subject: [PATCH 41/62] fix lint --- .../components/ContributionMessages/ContributionMessagesList.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/admin/src/components/ContributionMessages/ContributionMessagesList.vue b/admin/src/components/ContributionMessages/ContributionMessagesList.vue index 7f365298f..9b6285a21 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesList.vue +++ b/admin/src/components/ContributionMessages/ContributionMessagesList.vue @@ -119,6 +119,7 @@ const searchForEmail = () => { .temp-message { margin-top: 50px; } + .cursor-pointer { cursor: pointer; } From 758e3703492c702beb79e6b1b6686d70d708d680 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 10 Mar 2025 14:52:25 +0100 Subject: [PATCH 42/62] use bootstrap pointer css class --- .../ContributionMessages/ContributionMessagesList.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/admin/src/components/ContributionMessages/ContributionMessagesList.vue b/admin/src/components/ContributionMessages/ContributionMessagesList.vue index 9b6285a21..69c9bebfe 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesList.vue +++ b/admin/src/components/ContributionMessages/ContributionMessagesList.vue @@ -7,7 +7,7 @@   {{ contribution.email }} - + {{ $t('filter.byEmail') }} @@ -119,8 +119,4 @@ const searchForEmail = () => { .temp-message { margin-top: 50px; } - -.cursor-pointer { - cursor: pointer; -} From 85409f4a48faaf81a2f90a3a3fc1500506c34de2 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 10 Mar 2025 15:08:50 +0100 Subject: [PATCH 43/62] add underline for links on auth page --- frontend/src/assets/scss/auth-navbar.scss | 6 ++++++ frontend/src/assets/scss/custom/gradido-custom/_color.scss | 2 +- frontend/src/assets/scss/custom/gradido-custom/_links.scss | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/assets/scss/auth-navbar.scss b/frontend/src/assets/scss/auth-navbar.scss index 7fce0520c..1dcd038d5 100644 --- a/frontend/src/assets/scss/auth-navbar.scss +++ b/frontend/src/assets/scss/auth-navbar.scss @@ -5,3 +5,9 @@ .auth-navbar > a.router-link-exact-active { color: #383838; } + +.auth-template a:hover, +.auth-template .btn:hover, +.auth-template .language-switch .locales:hover { + text-decoration: underline; +} diff --git a/frontend/src/assets/scss/custom/gradido-custom/_color.scss b/frontend/src/assets/scss/custom/gradido-custom/_color.scss index ca57cea6d..b741f6be3 100644 --- a/frontend/src/assets/scss/custom/gradido-custom/_color.scss +++ b/frontend/src/assets/scss/custom/gradido-custom/_color.scss @@ -19,7 +19,7 @@ $gradido-205: rgb(205 86 86) ; $gradido-197: rgb(197 141 56) ; $gradido-209: rgb(209 209 209) ; $gradido-4: rgb(4 112 6) ; -$gradido-56: rgb(56, 56, 56) ; +$gradido-56: rgb(56 56 56) ; $black: #000 ; $grays: () ; $grays: map.merge( diff --git a/frontend/src/assets/scss/custom/gradido-custom/_links.scss b/frontend/src/assets/scss/custom/gradido-custom/_links.scss index 7a0474cef..d7d5e1a1a 100644 --- a/frontend/src/assets/scss/custom/gradido-custom/_links.scss +++ b/frontend/src/assets/scss/custom/gradido-custom/_links.scss @@ -4,5 +4,5 @@ $link-color: $gradido-4; $link-decoration: none ; $link-hover-color: $gradido-56; -$link-hover-decoration: none ; +$link-hover-decoration: underline; $link-active-color: $gradido-56; From bf836e721638342b7bba6e5ed8d7d557f34b7e73 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 11 Mar 2025 10:55:24 +0100 Subject: [PATCH 44/62] make auth nav link span if active --- frontend/src/components/Auth/AuthNavbar.vue | 9 +++++++-- .../src/components/Auth/AuthNavbarSmall.vue | 5 +++-- frontend/src/components/Menu/NavItem.vue | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 frontend/src/components/Menu/NavItem.vue diff --git a/frontend/src/components/Auth/AuthNavbar.vue b/frontend/src/components/Auth/AuthNavbar.vue index 456914f2a..710d15b30 100644 --- a/frontend/src/components/Auth/AuthNavbar.vue +++ b/frontend/src/components/Auth/AuthNavbar.vue @@ -8,9 +8,13 @@ - {{ $t('signup') }} + + {{ $t('signup') }} + {{ $t('|') }} - {{ $t('signin') }} + + {{ $t('signin') }} + @@ -19,6 +23,7 @@ diff --git a/frontend/src/components/Menu/NavItem.vue b/frontend/src/components/Menu/NavItem.vue new file mode 100644 index 000000000..af8760dce --- /dev/null +++ b/frontend/src/components/Menu/NavItem.vue @@ -0,0 +1,19 @@ + + + From 5af93fe1f40ee29648dccb627003f5e784003b0e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 11 Mar 2025 13:22:56 +0100 Subject: [PATCH 45/62] use gear instead of fingerprint for settting icon, replace svg icon with iconify icon --- frontend/package.json | 4 +++ .../scss/custom/gradido-custom/_color.scss | 1 + frontend/src/assets/scss/gradido.scss | 1 + frontend/src/assets/scss/navbar.scss | 4 +++ frontend/src/components/Menu/Sidebar.vue | 22 +++++++-------- frontend/yarn.lock | 28 +++++++++++++++++++ 6 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 frontend/src/assets/scss/navbar.scss diff --git a/frontend/package.json b/frontend/package.json index 48b2100e1..3bcb82bb8 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -72,7 +72,11 @@ }, "devDependencies": { "@apollo/client": "^3.10.8", + "@iconify-json/arcticons": "^1.2.20", "@iconify-json/bi": "^1.1.23", + "@iconify-json/fa": "^1.2.1", + "@iconify-json/ion": "^1.2.2", + "@iconify-json/mdi": "^1.2.3", "@intlify/eslint-plugin-vue-i18n": "^1.4.0", "@vitest/coverage-v8": "^2.0.5", "@vue/eslint-config-prettier": "^4.0.1", diff --git a/frontend/src/assets/scss/custom/gradido-custom/_color.scss b/frontend/src/assets/scss/custom/gradido-custom/_color.scss index b741f6be3..b2d2fe9da 100644 --- a/frontend/src/assets/scss/custom/gradido-custom/_color.scss +++ b/frontend/src/assets/scss/custom/gradido-custom/_color.scss @@ -20,6 +20,7 @@ $gradido-197: rgb(197 141 56) ; $gradido-209: rgb(209 209 209) ; $gradido-4: rgb(4 112 6) ; $gradido-56: rgb(56 56 56) ; +$gradido-114: rgb(114 119 143) ; $black: #000 ; $grays: () ; $grays: map.merge( diff --git a/frontend/src/assets/scss/gradido.scss b/frontend/src/assets/scss/gradido.scss index 6a872ee37..1a8ef07d6 100644 --- a/frontend/src/assets/scss/gradido.scss +++ b/frontend/src/assets/scss/gradido.scss @@ -53,3 +53,4 @@ @import "auth-navbar"; +@import "navbar"; diff --git a/frontend/src/assets/scss/navbar.scss b/frontend/src/assets/scss/navbar.scss new file mode 100644 index 000000000..a3b144e91 --- /dev/null +++ b/frontend/src/assets/scss/navbar.scss @@ -0,0 +1,4 @@ +.nav-item .nav-link svg.svg-icon { + height: 20px; + color: $gradido-114; +} diff --git a/frontend/src/components/Menu/Sidebar.vue b/frontend/src/components/Menu/Sidebar.vue index 706d0ead5..2411ef0f5 100644 --- a/frontend/src/components/Menu/Sidebar.vue +++ b/frontend/src/components/Menu/Sidebar.vue @@ -10,43 +10,43 @@ @@ -61,8 +61,8 @@ >