From 2d8ed9208964bc7246252d24dce62d77d703b780 Mon Sep 17 00:00:00 2001 From: Ludwig Reiter Date: Fri, 13 Dec 2024 10:15:47 +0100 Subject: [PATCH 1/7] Fix participant create wizard presence (#4475) --- .../repositories/users/user-repository.service.ts | 12 +++++++++--- .../participant-create-wizard.component.ts | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/client/src/app/gateways/repositories/users/user-repository.service.ts b/client/src/app/gateways/repositories/users/user-repository.service.ts index e37a25e73e..8db4e0c488 100644 --- a/client/src/app/gateways/repositories/users/user-repository.service.ts +++ b/client/src/app/gateways/repositories/users/user-repository.service.ts @@ -148,7 +148,7 @@ export class UserRepositoryService extends BaseRepository { const data = usersToCreate.map(user => { const meetingUsers = user.meeting_users as Partial[]; return { - user: this.sanitizePayload(this.getBaseUserPayload(user), true), + user: this.sanitizePayload(this.getBaseUserPayloadCreate(user), true), ...(meetingUsers && meetingUsers.length ? { first_meeting_user: this.sanitizePayload( @@ -213,7 +213,7 @@ export class UserRepositoryService extends BaseRepository { const updates = Array.isArray(dirtyUpdate) ? dirtyUpdate : [dirtyUpdate]; return updates.map(update => ({ id: user.id, - ...this.sanitizePayload(this.getBaseUserPayload(update)), + ...this.sanitizePayload(this.getBaseUserPayloadUpdate(update)), ...this.sanitizePayload(this.meetingUserRepo.getBaseUserPayload(update)) })); }); @@ -248,7 +248,7 @@ export class UserRepositoryService extends BaseRepository { return this.createAction(UserAction.ASSIGN_MEETINGS, payload); } - private getBaseUserPayload(partialUser: Partial): any { + private getBaseUserPayloadUpdate(partialUser: Partial): any { const partialPayload: Partial = { pronoun: partialUser.pronoun, title: partialUser.title, @@ -269,6 +269,12 @@ export class UserRepositoryService extends BaseRepository { return partialPayload; } + private getBaseUserPayloadCreate(partialUser: Partial): any { + const partialPayload = this.getBaseUserPayloadUpdate(partialUser); + partialPayload.is_present_in_meeting_ids = partialUser.is_present_in_meeting_ids; + return partialPayload; + } + public getTitle = (viewUser: ViewUser): string => this.getFullName(viewUser); /** diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/pages/participant-detail-manage/components/participant-create-wizard/participant-create-wizard.component.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/pages/participant-detail-manage/components/participant-create-wizard/participant-create-wizard.component.ts index 8d969f8ff2..291412a9d5 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/pages/participant-detail-manage/components/participant-create-wizard/participant-create-wizard.component.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/pages/participant-detail-manage/components/participant-create-wizard/participant-create-wizard.component.ts @@ -67,7 +67,7 @@ export class ParticipantCreateWizardComponent extends BaseMeetingComponent imple public get patchFormValueFn(): (controlName: string, user?: ViewUser) => any | null { return (controlName, user) => { if (controlName === `is_present`) { - return user?.isPresentInMeeting ? user.isPresentInMeeting() : true; + return user?.isPresentInMeeting ? user.isPresentInMeeting() : false; } return null; }; @@ -286,6 +286,9 @@ export class ParticipantCreateWizardComponent extends BaseMeetingComponent imple id: this._accountId }) .resolve(); + if (this.personalInfoFormValue.is_present) { + this.repo.setPresent(true, { ...payload, id: this._accountId }).resolve(); + } } else { this.repo.create(payload); } From 3b632526d9c6aaab539a0039088f1f694f5921ef Mon Sep 17 00:00:00 2001 From: Ludwig Reiter Date: Fri, 13 Dec 2024 10:26:29 +0100 Subject: [PATCH 2/7] Allow setTitle with nonTranslate, use it in some detail views (#4483) --- client/src/app/site/base/base.component.ts | 9 ++++++--- .../components/topic-detail/topic-detail.component.ts | 2 +- .../assignment-detail/assignment-detail.component.ts | 2 +- .../components/autopilot/autopilot.component.html | 2 +- .../components/motion-view/motion-view.component.ts | 2 +- .../participant-detail-view.component.ts | 2 +- .../projector-detail/projector-detail.component.ts | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/client/src/app/site/base/base.component.ts b/client/src/app/site/base/base.component.ts index 7f8bcd2bab..968e80be8d 100644 --- a/client/src/app/site/base/base.component.ts +++ b/client/src/app/site/base/base.component.ts @@ -93,9 +93,12 @@ export abstract class BaseComponent extends BaseUiComponent implements OnDestroy * Set the title in web browser using angulars TitleService * @param prefix The title prefix. Should be translated here. */ - public setTitle(prefix: string): void { - const translatedPrefix = this.translate.instant(prefix); - this.titleService.setTitle(translatedPrefix + this.titleSuffix); + public setTitle(prefix: string, nonTranslate?: boolean): void { + let titlePrefix = prefix; + if (!nonTranslate) { + titlePrefix = this.translate.instant(prefix); + } + this.titleService.setTitle(titlePrefix + this.titleSuffix); } /** diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-detail/components/topic-detail/topic-detail.component.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-detail/components/topic-detail/topic-detail.component.ts index 191bdb36aa..d96d4ea9bc 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-detail/components/topic-detail/topic-detail.component.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-detail/components/topic-detail/topic-detail.component.ts @@ -280,7 +280,7 @@ export class TopicDetailComponent extends BaseMeetingComponent implements OnInit // also ensures edition cannot be interrupted by autoupdate if (newViewTopic) { const title = newViewTopic.getListTitle(); - super.setTitle(title); + super.setTitle(title, true); this.topic = newViewTopic; // personalInfoForm is undefined during 'new' and directly after reloading if (!this.editTopic) { diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts index dda6004960..52056f4935 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts @@ -200,7 +200,7 @@ export class AssignmentDetailComponent extends BaseMeetingComponent implements O this.assignmentRepo.getViewModelObservable(assignmentId).subscribe(assignment => { if (assignment) { const title = assignment.getTitle(); - super.setTitle(title); + super.setTitle(title, true); this.assignment = assignment; if (!this.isEditing) { this.patchForm(this.assignment); diff --git a/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.html b/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.html index b4b984b6f8..d51dd74402 100644 --- a/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.html +++ b/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.html @@ -36,7 +36,7 @@

{{ 'Autopilot' | translate }}

[target]="lowerProjectionTarget" >

- {{ title | translate }} + {{ title }}

diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/pages/motion-view/components/motion-view/motion-view.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/pages/motion-view/components/motion-view/motion-view.component.ts index af6e6174ae..f04422a30f 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/pages/motion-view/components/motion-view/motion-view.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/pages/motion-view/components/motion-view/motion-view.component.ts @@ -231,7 +231,7 @@ export class MotionViewComponent extends BaseMeetingComponent implements OnInit, public onMotionUpdated(motion: ViewMotion): void { const title = motion.getTitle(); - super.setTitle(title); + super.setTitle(title, true); this.motion = motion; this.cd.markForCheck(); } diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.ts index 93cd1118e6..00d17206dd 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.ts @@ -279,7 +279,7 @@ export class ParticipantDetailViewComponent extends BaseMeetingComponent { this.repo.getViewModelObservable(this._userId!).subscribe(user => { if (user) { const title = user.getTitle(); - super.setTitle(title); + super.setTitle(title, true); this.user = user; this.cd.markForCheck(); } diff --git a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.ts b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.ts index 28a7e656dc..8ae1f60cc6 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.ts @@ -349,7 +349,7 @@ export class ProjectorDetailComponent extends BaseMeetingComponent implements On this.repo.getViewModelObservable(this._projectorId!).subscribe(projector => { if (projector) { const title = projector.name; - super.setTitle(title); + super.setTitle(title, true); this.projector = projector; } }) From e54f07830aa45ced8b3a3059a74eb7c5771862b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20H=C3=B6=C3=9Fl?= Date: Fri, 13 Dec 2024 11:53:46 +0100 Subject: [PATCH 3/7] Support MARK tag as inline, fix another diff issue (#4479) --- .../motion-diff.service.spec.ts | 24 ++++++++++ .../motion-diff.service.ts | 47 +++++++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts index 013fc6eea8..c1e79b225b 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts @@ -1186,6 +1186,30 @@ describe(`MotionDiffService`, () => { } )); + it(`does not fall back to block level replacement when replacement and tag insertion overlap (3)`, inject( + [MotionDiffService], + (service: MotionDiffService) => { + const before = `

es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`, + after = `

es war ihnen wie eine Bestätigung NEU NEU2 ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`; + const diff = service.diff(before, after); + expect(diff).toBe( + `

es war ihnen wie eine Bestätigung NEU NEU2 ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

` + ); + } + )); + + it(`does not fall back to block level replacement when replacement and tag insertion overlap (4)`, inject( + [MotionDiffService], + (service: MotionDiffService) => { + const before = `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`, + after = `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen alten Körpergehülle dehnte.

`; + const diff = service.diff(before, after); + expect(diff).toBe( + `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen alten KörperKörpergehülle dehnte.

` + ); + } + )); + it(`works with multiple inserted paragraphs`, inject([MotionDiffService], (service: MotionDiffService) => { const before = `

This is the text before

`, after = `

This is the text before

\n

This is one added line

\n

Another added line

`; diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts index c98c823d46..39dd6a1677 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts @@ -1581,7 +1581,7 @@ export class MotionDiffService { // formatted => formattedformatted diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<\/\1><\/ins>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<\/\1><\/ins>/gi, (_whole: string, inlineTag: string, tagAttributes: string, content: string): string => `` + content + @@ -1598,7 +1598,7 @@ export class MotionDiffService { // formatted => formattedformatted diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<\/\1><\/del>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<\/\1><\/del>/gi, (_whole: string, inlineTag: string, tagAttributes: string, content: string): string => `<` + inlineTag + @@ -1613,10 +1613,36 @@ export class MotionDiffService { `` ); + // Körperalten Körpergehülle => alten KörperKörpergehülle + diffUnnormalized = diffUnnormalized.replace( + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/del>([^<]*)<\1>([^<]*)<\/ins><\/\1>/gi, + ( + _whole: string, + inlineTag: string, + tagAttributes: string, + delContent: string, + insContent1: string, + insContent2: string + ): string => + `` + + insContent1 + + `<` + + inlineTag + + (tagAttributes ? tagAttributes : ``) + + `>` + + delContent + + `` + + `` + + insContent2 + + `` + ); + // with a a unformatted wordsentence -> // unformatted wordformatted word diffUnnormalized = diffUnnormalized.replace( - /([^<]*)<\/del><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<\/\2><\/ins>/gi, + /([^<]*)<\/del><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<\/\2><\/ins>/gi, ( _whole: string, delContent: string, @@ -1642,7 +1668,7 @@ export class MotionDiffService { // unformatted wordsentence -> // unformatted wordunformatted sentence diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)([^<]*)<\/del>([^<]*)<\/\1><\/ins>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)([^<]*)<\/del>([^<]*)<\/\1><\/ins>/gi, ( _whole: string, inlineTag: string, @@ -1665,6 +1691,19 @@ export class MotionDiffService { `>` ); + // Bestätigung NEU NEU2 --> + // Bestätigung NEU NEU2 + diffUnnormalized = diffUnnormalized.replace( + /(<\/(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)>)<\/del>([^>]*)<\/\2>([^>]*)<\/ins>/gi, + ( + _whole: string, + closingTag: string, + closingTagInner: string, + insertedText1: string, + insertedText2: string + ): string => `` + insertedText1 + `` + closingTag + `` + insertedText2 + `` + ); + // Ebene 3
  •  Ebene 3a
    • // => Ebene 3 Ebene 3a
      •   diffUnnormalized = diffUnnormalized.replace( From 273aab64c868eece3f74b513a42e67f2b3f9a993 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:15:25 +0100 Subject: [PATCH 4/7] Bump @types/node from 20.17.9 to 20.17.10 in /client (#4488) --- client/package-lock.json | 8 ++++---- client/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 4d8c357616..926d8b8536 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -84,7 +84,7 @@ "@types/file-saver": "^2.0.7", "@types/jasmine": "~5.1.5", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.17.9", + "@types/node": "^20.17.10", "@types/pdfmake": "^0.2.10", "@types/qrcode": "^1.5.5", "@types/tinycolor2": "^1.4.6", @@ -5992,9 +5992,9 @@ } }, "node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, "dependencies": { "undici-types": "~6.19.2" diff --git a/client/package.json b/client/package.json index 9e3c4adb3f..a66ab638ed 100644 --- a/client/package.json +++ b/client/package.json @@ -111,7 +111,7 @@ "@types/file-saver": "^2.0.7", "@types/jasmine": "~5.1.5", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.17.9", + "@types/node": "^20.17.10", "@types/pdfmake": "^0.2.10", "@types/qrcode": "^1.5.5", "@types/tinycolor2": "^1.4.6", From 24250ce3d1d36688610bf9c90be626ace099140f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:15:52 +0100 Subject: [PATCH 5/7] Bump pdfmake from 0.2.15 to 0.2.16 in /client (#4487) --- client/package-lock.json | 159 ++++++++++++++++++++++++++------------- client/package.json | 2 +- 2 files changed, 107 insertions(+), 54 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 926d8b8536..c6ade986e8 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -64,7 +64,7 @@ "ngx-material-timepicker": "^13.1.1", "ngx-papaparse": "^8.0.0", "pdfjs-dist": "^4.6.82", - "pdfmake": "^0.2.15", + "pdfmake": "^0.2.16", "pofile": "^1.1.4", "qrcode": "^1.5.4", "rxjs": "^7.8.1", @@ -3248,9 +3248,9 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "node_modules/@foliojs-fork/pdfkit": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.1.tgz", - "integrity": "sha512-4Cq2onHZAhThIfzv3/AFTPALqHzbmV8uNvgRELULWNbsZATgVeqEL4zHOzCyblLfX6tMXVO2BVaPcXboIxGjiw==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.2.tgz", + "integrity": "sha512-Wpj6BH4DGn+zAWmCk9agdbAw3Zxt+MpemjssLfYdnretWpZ014uR6Zo51E4ftVP75UA8a7mtt4TiCu09lIKsBw==", "dependencies": { "@foliojs-fork/fontkit": "^1.9.2", "@foliojs-fork/linebreak": "^1.1.1", @@ -7531,6 +7531,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8857,6 +8884,19 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -9082,12 +9122,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -9106,6 +9143,17 @@ "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", @@ -10276,15 +10324,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10406,11 +10459,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10477,21 +10530,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -10959,12 +11001,12 @@ } }, "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -11007,11 +11049,12 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -11157,12 +11200,14 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -12719,6 +12764,14 @@ "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz", "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==" }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -14330,12 +14383,12 @@ } }, "node_modules/pdfmake": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.15.tgz", - "integrity": "sha512-Ryef9mjxo6q8dthhbssAK0zwCsPZ6Pl7kCHnIEXOvQdd79LUGZD6SHGi21YryFXczPjvw6V009uxQwp5iritcA==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.16.tgz", + "integrity": "sha512-oCHFIAVybjCkeU1ZCY5fB6BxOZ7ofeinN/sYfgPBny7Frx+8GbxNkEuuvZGj70Xn8/9kUhKZ84Q9S6qxj5eq5Q==", "dependencies": { "@foliojs-fork/linebreak": "^1.1.2", - "@foliojs-fork/pdfkit": "^0.15.1", + "@foliojs-fork/pdfkit": "^0.15.2", "iconv-lite": "^0.6.3", "xmldoc": "^1.3.0" }, diff --git a/client/package.json b/client/package.json index a66ab638ed..0d43deb563 100644 --- a/client/package.json +++ b/client/package.json @@ -91,7 +91,7 @@ "ngx-material-timepicker": "^13.1.1", "ngx-papaparse": "^8.0.0", "pdfjs-dist": "^4.6.82", - "pdfmake": "^0.2.15", + "pdfmake": "^0.2.16", "pofile": "^1.1.4", "qrcode": "^1.5.4", "rxjs": "^7.8.1", From 03f93ca4f518b1588d53ef93731503264f489e34 Mon Sep 17 00:00:00 2001 From: Ludwig Reiter Date: Tue, 17 Dec 2024 08:20:33 +0100 Subject: [PATCH 6/7] Update Meeting Info: change count structure levels (#4450) --- .../list-of-speakers-controller.service.ts | 77 ++++++++++--------- .../meeting-info/meeting-info.component.ts | 34 +++++++- .../user-statistics.component.html | 2 +- 3 files changed, 74 insertions(+), 39 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/list-of-speakers-controller.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/list-of-speakers-controller.service.ts index cc04631af2..e3c4ac1d0d 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/list-of-speakers-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/list-of-speakers-controller.service.ts @@ -1,10 +1,13 @@ import { Injectable } from '@angular/core'; +import { Id } from 'src/app/domain/definitions/key-types'; import { ListOfSpeakers } from 'src/app/domain/models/list-of-speakers/list-of-speakers'; import { ListOfSpeakersRepositoryService } from 'src/app/gateways/repositories/list-of-speakers/list-of-speakers-repository.service'; import { BaseController } from 'src/app/site/base/base-controller'; import { BaseViewModel } from 'src/app/site/base/base-view-model'; +import { MeetingSettingsService } from 'src/app/site/pages/meetings/services/meeting-settings.service'; import { ControllerServiceCollectorService } from 'src/app/site/services/controller-service-collector.service'; +import { ViewStructureLevel } from '../../../../participants/pages/structure-levels/view-models'; import { ViewListOfSpeakers, ViewSpeaker } from '../view-models'; /** @@ -15,6 +18,7 @@ import { ViewListOfSpeakers, ViewSpeaker } from '../view-models'; export interface SpeakingTimeStructureLevelObject { finishedSpeakers: ViewSpeaker[]; speakingTime: number; + name: string; } @Injectable({ @@ -23,7 +27,8 @@ export interface SpeakingTimeStructureLevelObject { export class ListOfSpeakersControllerService extends BaseController { public constructor( controllerServiceCollector: ControllerServiceCollectorService, - protected override repo: ListOfSpeakersRepositoryService + protected override repo: ListOfSpeakersRepositoryService, + private meetingSettings: MeetingSettingsService ) { super(controllerServiceCollector, ListOfSpeakers, repo); } @@ -58,48 +63,46 @@ export class ListOfSpeakersControllerService extends BaseController(); + const parliamentMode = this.meetingSettings.instant(`list_of_speakers_default_structure_level_time`); for (const los of this.getViewModelList()) { for (const speaker of los.finishedSpeakers) { - const nextEntry = this.getSpeakingTimeStructureLevelObject(speaker); - listSpeakingTimeStructureLevel = this.getSpeakingTimeStructureLevelList( - nextEntry, - listSpeakingTimeStructureLevel - ); + if (!!parliamentMode) { + const structureLevelOrNull = speaker.structure_level_list_of_speakers?.structure_level; + this.putIntoMapForAggregation(structureLevelOrNull, speaker, mapForAggregation); + } else { + for (const structureLevel of speaker.user?.structure_levels() ?? []) { + this.putIntoMapForAggregation(structureLevel, speaker, mapForAggregation); + } + if (!(speaker.user?.structure_levels() ?? []).length) { + this.putIntoMapForAggregation(null, speaker, mapForAggregation); + } + } } } - return listSpeakingTimeStructureLevel; + return Array.from(mapForAggregation.values()); } - /** - * Helper-function to create a `SpeakingTimeStructureLevelObject` by a given speaker. - * - * @param speaker, with whom structure-level and speaking-time is calculated. - * - * @returns The created `SpeakingTimeStructureLevelObject`. - */ - private getSpeakingTimeStructureLevelObject(speaker: ViewSpeaker): SpeakingTimeStructureLevelObject { - return { - finishedSpeakers: [speaker], - speakingTime: this.getSpeakingTimeAsNumber(speaker) - }; - } - - /** - * Helper-function to update entries in a given list, if already existing, or create entries otherwise. - * - * @param object A `SpeakingTimeStructureLevelObject`, that contains information about speaking-time - * and structure-level. - * @param list A list, at which speaking-time, structure-level and finished_speakers are set. - * - * @returns The updated map. - */ - private getSpeakingTimeStructureLevelList( - object: SpeakingTimeStructureLevelObject, - list: SpeakingTimeStructureLevelObject[] - ): SpeakingTimeStructureLevelObject[] { - list.push(object); - return list; + private putIntoMapForAggregation( + structureLevel: ViewStructureLevel | null, + speaker: ViewSpeaker, + mapForAggregation: Map + ): void { + let structureLevelId = -1; + if (!!structureLevel) { + structureLevelId = structureLevel.id; + } + if (mapForAggregation.has(structureLevelId)) { + const entry = mapForAggregation.get(structureLevelId); + entry.finishedSpeakers.push(speaker); + entry.speakingTime += this.getSpeakingTimeAsNumber(speaker); + } else { + mapForAggregation.set(structureLevelId, { + finishedSpeakers: [speaker], + speakingTime: this.getSpeakingTimeAsNumber(speaker), + name: structureLevelId === -1 ? `Without Structure Level` : structureLevel.name + }); + } } /** diff --git a/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/meeting-info/meeting-info.component.ts b/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/meeting-info/meeting-info.component.ts index 008f029a5f..92dcde0fa8 100644 --- a/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/meeting-info/meeting-info.component.ts +++ b/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/meeting-info/meeting-info.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { filter, firstValueFrom, map } from 'rxjs'; +import { FULL_FIELDSET } from 'src/app/domain/fieldsets/misc'; import { OrganizationRepositoryService } from 'src/app/gateways/repositories/organization-repository.service'; import { BaseMeetingComponent } from 'src/app/site/pages/meetings/base/base-meeting.component'; import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting'; @@ -49,6 +50,16 @@ export class MeetingInfoComponent extends BaseMeetingComponent implements OnInit } ] }, + { + idField: `speaker_ids`, + fieldset: [`id`, `begin_time`, `end_time`], + follow: [ + { + idField: `structure_level_list_of_speakers_id`, + fieldset: FULL_FIELDSET + } + ] + }, { idField: `list_of_speakers_ids`, fieldset: [], @@ -56,7 +67,28 @@ export class MeetingInfoComponent extends BaseMeetingComponent implements OnInit { idField: `speaker_ids`, fieldset: [`begin_time`, `end_time`, `point_of_order`], - follow: [`meeting_user_id`] + follow: [ + { + idField: `meeting_user_id`, + fieldset: [`user_id`], + follow: [ + { + idField: `structure_level_ids`, + fieldset: [`name`] + } + ] + }, + { + idField: `structure_level_list_of_speakers_id`, + fieldset: FULL_FIELDSET, + follow: [ + { + idField: `structure_level_id`, + fieldset: [`name`] + } + ] + } + ] } ] } diff --git a/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/user-statistics/user-statistics.component.html b/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/user-statistics/user-statistics.component.html index 3a0d8d884e..cb08140136 100644 --- a/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/user-statistics/user-statistics.component.html +++ b/client/src/app/site/pages/meetings/pages/home/pages/meeting-info/components/user-statistics/user-statistics.component.html @@ -37,7 +37,7 @@
        {{ 'Structure level' | translate }}
        - {{ object.structureLevel | translate }} + {{ object.name }}
        {{ 'Duration of requests to speak' | translate }}
        From 056aa703bf5266c36089474a276f254b148edc9b Mon Sep 17 00:00:00 2001 From: anbebe <58171814+anbebe@users.noreply.github.com> Date: Tue, 17 Dec 2024 08:29:26 +0100 Subject: [PATCH 7/7] Add meeting icons for user detail view (#4455) --- .../account-main/account-main.component.ts | 3 ++ .../account-detail.component.html | 37 ++++++++++++++++++- .../account-detail.component.scss | 9 +++++ .../account-detail.component.ts | 17 ++++++++- 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/organization/pages/accounts/components/account-main/account-main.component.ts b/client/src/app/site/pages/organization/pages/accounts/components/account-main/account-main.component.ts index b228ec9c4a..a626922715 100644 --- a/client/src/app/site/pages/organization/pages/accounts/components/account-main/account-main.component.ts +++ b/client/src/app/site/pages/organization/pages/accounts/components/account-main/account-main.component.ts @@ -4,6 +4,7 @@ import { distinctUntilChanged, map, skip } from 'rxjs'; import { OML } from 'src/app/domain/definitions/organization-permission'; import { BaseModelRequestHandlerComponent } from 'src/app/site/base/base-model-request-handler.component'; import { ViewUser } from 'src/app/site/pages/meetings/view-models/view-user'; +import { getMeetingListSubscriptionConfig } from 'src/app/site/pages/organization/organization.subscription'; import { OperatorService } from 'src/app/site/services/operator.service'; import { ORGANIZATION_ID } from '../../../../services/organization.service'; @@ -51,6 +52,8 @@ export class AccountMainComponent extends BaseModelRequestHandlerComponent { { hideWhenMeetingChanged: true } ); + this.subscribeTo(getMeetingListSubscriptionConfig(), { hideWhenMeetingChanged: true }); + this.subscriptions.push( this.operator.userObservable .pipe( diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html index 84661eca53..ad496f7e61 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html @@ -205,9 +205,42 @@

        {{ 'Committees and meetings' | translate }}

        } - + + @if (meeting_row.value.is_archieved) { + + + archive + + + } + + + @if (meeting_row.value.is_public) { + + + public + + + } + + + @if (meeting_row.value.is_closed) { + + + lock + + + } + @if (meeting_row.value.is_accessible) { + + {{ meeting_row.value.meeting_name }} + + } @else { {{ meeting_row.value.meeting_name }} - + } @for (group of meeting_row.value.group_names; track group; let lastGroup = $last) { diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.scss b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.scss index 3bed440a0f..4b5810372d 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.scss +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.scss @@ -24,6 +24,15 @@ os-user-detail-view h2 { td { padding-right: 5px; vertical-align: top; + .icon { + display: inline-table !important; + vertical-align: middle; + $icon-size: 16px; + font-size: $icon-size; + height: $icon-size; + width: $icon-size; + color: inherit; + } } .admin-column { diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.ts b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.ts index 214053e07f..3e0512ce7c 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.ts +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.ts @@ -28,7 +28,14 @@ type ParticipationTableDataRow = { is_manager?: boolean; meetings: { [meeting_id: Id]: ParticipationTableMeetingDataRow }; }; -type ParticipationTableMeetingDataRow = { meeting_name: string; group_names: string[] }; +type ParticipationTableMeetingDataRow = { + meeting_name: string; + group_names: string[]; + is_public: boolean; + is_closed: boolean; + is_archieved: boolean; + is_accessible: boolean; +}; @Component({ selector: `os-account-detail`, @@ -240,7 +247,13 @@ export class AccountDetailComponent extends BaseComponent implements OnInit { group_names: this.user .groups(meeting.id) .map(group => group.getTitle()) - .sort((a, b) => a.localeCompare(b)) + .sort((a, b) => a.localeCompare(b)), + is_archieved: meeting.isArchived, + is_closed: meeting.locked_from_inside, + is_public: meeting.publicAccessPossible(), + is_accessible: + (meeting.canAccess() && this.operator.isInMeeting(meeting.id)) || + (!meeting.locked_from_inside && this.operator.isSuperAdmin) }; }); this._tableData = tableData;