From 718450ccddeaaacc0d9dbf7cfc3bb6433acbe27b Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Thu, 22 Feb 2024 12:03:35 +0100 Subject: [PATCH 01/59] Motion default workflow selection (#3329) --- .../components/motion-content/motion-content.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-content/motion-content.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-content/motion-content.component.ts index 5278bc225d..c7d2cc90f5 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-content/motion-content.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-content/motion-content.component.ts @@ -488,7 +488,7 @@ export class MotionContentComponent extends BaseMotionDetailChildComponent { agenda_parent_id: [], submitter_ids: [[]], supporter_user_ids: [[]], - workflow_id: [], + workflow_id: [+this.meetingSettingService.instant(`motions_default_workflow_id`)], tag_ids: [[]], statute_amendment: [``], // Internal value for the checkbox, not saved to the model statute_paragraph_id: [], From f8b50258d13f1545c64760f8cd653b88c7a68ae6 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Thu, 22 Feb 2024 12:07:25 +0100 Subject: [PATCH 02/59] Hide moderation note if no agenda item assigned (#3332) --- .../components/moderation-note/moderation-note.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.html index b72a449771..263dd8141f 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.html @@ -2,7 +2,7 @@
From 8725bb80f7a4cf7d336789a445a33e018b1d5701 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:08:36 +0100 Subject: [PATCH 03/59] Allow to set PoO for others (#3324) --- .../src/app/domain/models/meetings/meeting.ts | 2 + .../list-of-speakers-content.component.ts | 12 ++-- .../point-of-order-dialog.component.html | 9 +++ .../point-of-order-dialog.component.ts | 62 ++++++++++++++++++- .../point-of-order-dialog.module.ts | 4 +- .../services/point-of-order-dialog.service.ts | 2 + .../participant-search-selector.component.ts | 15 +++-- .../meeting-settings-definitions.ts | 6 ++ client/src/meta | 2 +- 9 files changed, 101 insertions(+), 13 deletions(-) diff --git a/client/src/app/domain/models/meetings/meeting.ts b/client/src/app/domain/models/meetings/meeting.ts index 685f9eccce..12cbcf2175 100644 --- a/client/src/app/domain/models/meetings/meeting.ts +++ b/client/src/app/domain/models/meetings/meeting.ts @@ -97,6 +97,7 @@ export class Settings { public list_of_speakers_can_set_contribution_self!: boolean; public list_of_speakers_speaker_note_for_everyone!: boolean; public list_of_speakers_closing_disables_point_of_order!: boolean; + public list_of_speakers_can_create_point_of_order_for_others!: boolean; public list_of_speakers_default_structure_level_time: number; public list_of_speakers_enable_interposed_question: boolean; @@ -338,6 +339,7 @@ export class Meeting extends BaseModel { `list_of_speakers_show_first_contribution`, `list_of_speakers_enable_point_of_order_speakers`, `list_of_speakers_enable_point_of_order_categories`, + `list_of_speakers_can_create_point_of_order_for_others`, `list_of_speakers_closing_disables_point_of_order`, `list_of_speakers_enable_pro_contra_speech`, `list_of_speakers_can_set_contribution_self`, diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index cb3da1975c..b1e21652d7 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -305,10 +305,14 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme try { const result = await firstValueFrom(dialogRef.afterClosed()); if (result) { - await this.speakerRepo.create(this.listOfSpeakers, this._currentUser!.id, { - pointOfOrder: true, - ...result - }); + await this.speakerRepo.create( + this.listOfSpeakers, + result.speaker ? result.speaker.userId : this._currentUser!.id, + { + pointOfOrder: true, + ...result + } + ); } } catch (e) { this.raiseError(e); diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html index 4405a7d7e1..c566a2e28d 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html @@ -3,6 +3,15 @@

+ + + + {{ 'Possible points of order' | translate }} diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts index 2103b99dd9..56c5a972e8 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts @@ -5,9 +5,14 @@ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; +import { Permission } from 'src/app/domain/definitions/permission'; import { ViewListOfSpeakers, ViewPointOfOrderCategory } from 'src/app/site/pages/meetings/pages/agenda'; import { ActiveMeetingService } from 'src/app/site/pages/meetings/services/active-meeting.service'; import { MeetingSettingsService } from 'src/app/site/pages/meetings/services/meeting-settings.service'; +import { ViewUser } from 'src/app/site/pages/meetings/view-models/view-user'; +import { OperatorService } from 'src/app/site/services/operator.service'; + +import { UserSelectionData } from '../../../../../participant-search-selector'; @Component({ selector: `os-point-of-order-dialog`, @@ -15,6 +20,28 @@ import { MeetingSettingsService } from 'src/app/site/pages/meetings/services/mee styleUrls: [`./point-of-order-dialog.component.scss`] }) export class PointOfOrderDialogComponent { + /** + * To check permissions in templates using permission.[...] + */ + public readonly permission = Permission; + + public get canManage(): boolean { + return this.operator.hasPerms(this.permission.listOfSpeakersCanManage); + } + + public get canSetPoOsForOthers(): boolean { + return this.meetingSettingsService.instant(`list_of_speakers_can_create_point_of_order_for_others`) ?? false; + } + + public users: ViewUser[] = []; + public nonAvailableUserIds: number[] = []; + + public speaker: ViewUser; + + private get onlyPresentUsers(): boolean { + return this.meetingSettingsService.instant(`list_of_speakers_present_users_only`) ?? false; + } + public editForm: UntypedFormGroup; public readonly MAX_LENGTH = 80; @@ -29,13 +56,17 @@ export class PointOfOrderDialogComponent { private _showCategorySelect = false; + private _currentUser: ViewUser | null = null; + public constructor( public readonly dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public readonly listOfSpeakers: ViewListOfSpeakers, private fb: UntypedFormBuilder, private meetingSettings: MeetingSettingsService, - private activeMeeting: ActiveMeetingService + private activeMeeting: ActiveMeetingService, + private operator: OperatorService, + private meetingSettingsService: MeetingSettingsService ) { this.activeMeeting.meeting.point_of_order_categories_as_observable .pipe( @@ -50,9 +81,11 @@ export class PointOfOrderDialogComponent { this.editForm = this.fb.group({ note: [``, [Validators.maxLength(this.MAX_LENGTH)]], - category: [] + category: [], + speaker: [] }); + this.operator.userObservable.subscribe(user => (this._currentUser = user)); combineLatest([ this.meetingSettings.get(`list_of_speakers_enable_point_of_order_categories`), this.categoriesSubject @@ -70,6 +103,8 @@ export class PointOfOrderDialogComponent { this.editForm.updateValueAndValidity(); this._showCategorySelect = show; }); + + this.filterNonAvailableUsers(); } public onOk(): void { @@ -77,13 +112,34 @@ export class PointOfOrderDialogComponent { return; } const note = this.editForm.value.note || undefined; + const speaker = this.editForm.value.speaker || undefined; const point_of_order_category_id = this._showCategorySelect ? this.editForm.value.category || undefined : undefined; - this.dialogRef.close({ note, point_of_order_category_id }); + this.dialogRef.close({ note, point_of_order_category_id, speaker }); } public onCancel(): void { this.dialogRef.close(); } + + /** + * Creates an array of users who currently shouldn't be selectable for the speaker list. + */ + private filterNonAvailableUsers() { + const nonAvailableUsers = this.users + .filter(user => !(!this.onlyPresentUsers || user?.isPresentInMeeting())) + .map(user => user?.id) + .filter(user => !!user); + this.nonAvailableUserIds = nonAvailableUsers; + } + + public selectUser(data: UserSelectionData): UserSelectionData { + if (!data.userId) { + data.userId = this.operator.operatorId; + } + this.speaker = this.users.find(speaker => speaker.id === data.userId); + this.editForm.value.speaker = data; + return data; + } } diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts index 8ad73fa60c..01d105699a 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts @@ -8,6 +8,7 @@ import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/lega import { MatSelectModule } from '@angular/material/select'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; +import { ParticipantSearchSelectorModule } from '../../../participant-search-selector'; import { PointOfOrderDialogComponent } from './components/point-of-order-dialog/point-of-order-dialog.component'; @NgModule({ @@ -20,7 +21,8 @@ import { PointOfOrderDialogComponent } from './components/point-of-order-dialog/ MatInputModule, MatSelectModule, ReactiveFormsModule, - OpenSlidesTranslationModule.forChild() + OpenSlidesTranslationModule.forChild(), + ParticipantSearchSelectorModule ] }) export class PointOfOrderDialogModule { diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts index 7b1484feca..655a12bf6d 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts @@ -4,12 +4,14 @@ import { infoDialogSettings } from 'src/app/infrastructure/utils/dialog-settings import { ViewListOfSpeakers } from 'src/app/site/pages/meetings/pages/agenda'; import { BaseDialogService } from 'src/app/ui/base/base-dialog-service'; +import { UserSelectionData } from '../../../../participant-search-selector'; import { PointOfOrderDialogComponent } from '../components/point-of-order-dialog/point-of-order-dialog.component'; import { PointOfOrderDialogModule } from '../point-of-order-dialog.module'; interface PointOfOrderResult { note: string; point_of_order_category_id: number; + speaker?: UserSelectionData; } @Injectable({ diff --git a/client/src/app/site/pages/meetings/modules/participant-search-selector/components/participant-search-selector/participant-search-selector.component.ts b/client/src/app/site/pages/meetings/modules/participant-search-selector/components/participant-search-selector/participant-search-selector.component.ts index 5ad3f520fa..759bff605d 100644 --- a/client/src/app/site/pages/meetings/modules/participant-search-selector/components/participant-search-selector/participant-search-selector.component.ts +++ b/client/src/app/site/pages/meetings/modules/participant-search-selector/components/participant-search-selector/participant-search-selector.component.ts @@ -62,6 +62,9 @@ export class ParticipantSearchSelectorComponent extends BaseUiComponent implemen @Output() public userSelected = new EventEmitter(); + @Input() + public shouldReset = true; + /** * Subject that holds the currently selectable users. */ @@ -90,15 +93,17 @@ export class ParticipantSearchSelectorComponent extends BaseUiComponent implemen public ngOnInit(): void { this.userSortService.initSorting(); this.subscriptions.push( - // ovserve changes to the form + // observe changes to the form this.usersForm.valueChanges.subscribe(async formResult => { // resetting a form triggers a form.next(null) - check if user_id if (formResult?.userId && typeof formResult?.userId === `number`) { await this.processSelectedUser(formResult.userId); - this.usersForm.reset(); + if (this.shouldReset) { + this.usersForm.reset(); + } } }), - //The list should be updated when the participants have been edited + // The list should be updated when the participants have been edited this.userRepo .getSortedViewModelListObservable(this.userSortService.repositorySortingKey) .subscribe(users => { @@ -146,7 +151,9 @@ export class ParticipantSearchSelectorComponent extends BaseUiComponent implemen private processSelectedUser(userId: number): void { if (this._filteredUsersSubject.value.some(user => user.id === userId)) { - this.removeUserFromSelectorList(userId); + if (this.shouldReset) { + this.removeUserFromSelectorList(userId); + } this.emitSelectedUser({ userId: userId }); } else { throw new Error(`Tried to select an unselectable user`); diff --git a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts index c08d1e20be..48795b20a9 100644 --- a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +++ b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts @@ -363,6 +363,12 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([ label: _(`Enable interposed questions`), type: `boolean` }, + { + key: `list_of_speakers_can_create_point_of_order_for_others`, + label: _(`Enable point of orders for other participants`), + helpText: _(`Requires permission to manage lists of speakers`), + type: `boolean` + }, { key: `list_of_speakers_intervention_time`, label: _(`Intervention speaking time in seconds`), diff --git a/client/src/meta b/client/src/meta index ce532f10a7..15446a89f9 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit ce532f10a71a363544a1e65fee9da7e57bf4c4d2 +Subproject commit 15446a89f9e9fedda6f35d8e691653713a22d317 From 796f2db75d2d3f7bdb115be61dd523f100e44bf3 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:18:31 +0100 Subject: [PATCH 04/59] Add options for one participant multiple times in the LoS (#3322) --- .../src/app/domain/models/meetings/meeting.ts | 2 ++ .../list-of-speakers-content.component.ts | 18 +++++++++++++----- .../meeting-settings-definitions.ts | 5 +++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/client/src/app/domain/models/meetings/meeting.ts b/client/src/app/domain/models/meetings/meeting.ts index 12cbcf2175..c30f2bcfa3 100644 --- a/client/src/app/domain/models/meetings/meeting.ts +++ b/client/src/app/domain/models/meetings/meeting.ts @@ -95,6 +95,7 @@ export class Settings { public list_of_speakers_initially_closed!: boolean; public list_of_speakers_enable_pro_contra_speech!: boolean; public list_of_speakers_can_set_contribution_self!: boolean; + public list_of_speakers_allow_multiple_speakers!: boolean; public list_of_speakers_speaker_note_for_everyone!: boolean; public list_of_speakers_closing_disables_point_of_order!: boolean; public list_of_speakers_can_create_point_of_order_for_others!: boolean; @@ -341,6 +342,7 @@ export class Meeting extends BaseModel { `list_of_speakers_enable_point_of_order_categories`, `list_of_speakers_can_create_point_of_order_for_others`, `list_of_speakers_closing_disables_point_of_order`, + `list_of_speakers_allow_multiple_speakers`, `list_of_speakers_enable_pro_contra_speech`, `list_of_speakers_can_set_contribution_self`, `list_of_speakers_speaker_note_for_everyone`, diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index b1e21652d7..822d2f8ea4 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -143,6 +143,8 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme public isPointOfOrderFn = (speaker: ViewSpeaker) => speaker.point_of_order; public enableProContraSpeech = false; + public enableMultipleParticipants = false; + @Output() private isListOfSpeakersEmptyEvent = new EventEmitter(); @@ -245,7 +247,7 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme ) || (!this.activeSpeaker?.point_of_order && this.activeSpeaker?.user_id === lastSpeaker.user_id); } - canReaddLast = !isLastSpeakerWaiting; + canReaddLast = !isLastSpeakerWaiting || this.enableMultipleParticipants; } else { canReaddLast = false; } @@ -518,7 +520,10 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme ) .map(user => user?.id) .filter(user => !!user); - this.nonAvailableUserIds = nonAvailableUsers; + + if (!this.enableMultipleParticipants) { + this.nonAvailableUserIds = nonAvailableUsers; + } } /** @@ -651,13 +656,16 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme }), this.meetingSettingService.get(`list_of_speakers_can_set_contribution_self`).subscribe(canSet => { this.canMarkSelf = canSet; + }), + this.meetingSettingService.get(`list_of_speakers_allow_multiple_speakers`).subscribe(multiple => { + this.enableMultipleParticipants = multiple; }) ); } private findOperatorSpeaker(pointOfOrder?: boolean): ViewSpeaker | undefined { - return this.waitingSpeakers.find( - speaker => speaker.user_id === this.operator.operatorId && speaker.point_of_order === pointOfOrder - ); + return this.waitingSpeakers + .sort((a, b) => b.id - a.id) + .find(speaker => speaker.user_id === this.operator.operatorId && speaker.point_of_order === pointOfOrder); } } diff --git a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts index 48795b20a9..2af685f4b7 100644 --- a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +++ b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts @@ -358,6 +358,11 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([ label: _(`Show hint »first speech« in the list of speakers management view`), type: `boolean` }, + { + key: `list_of_speakers_allow_multiple_speakers`, + label: _(`Allow one participant to be on the LoS serveral times`), + type: `boolean` + }, { key: `list_of_speakers_enable_interposed_question`, label: _(`Enable interposed questions`), From ff4899447f9669f07efa0681710f772305a7577d Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:47:43 +0100 Subject: [PATCH 05/59] Update meta repository (#3338) Co-authored-by: jsangmeister <33004050+jsangmeister@users.noreply.github.com> --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index 15446a89f9..48cc2b11b8 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit 15446a89f9e9fedda6f35d8e691653713a22d317 +Subproject commit 48cc2b11b89db89eb79b1b0c70100d894615720a From 6e8622690893d03d26f4e0fec154af7a394aeecf Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Fri, 23 Feb 2024 17:48:06 +0100 Subject: [PATCH 06/59] Make speaker list display speaker names in the same way as LoS (#3349) --- .../participant-speaker-list.component.html | 10 +--------- .../participant-speaker-list.component.ts | 4 ++++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html index b6062dbe3c..3908bfae39 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html @@ -23,15 +23,7 @@

{{ 'Contributions' | translate }}

-
{{ speaker?.meeting_user?.user?.short_name }}
- -   -
({{ speaker.meeting_user.user.pronoun }})
-
- -   -
({{ speaker.structure_level_list_of_speakers.structure_level.name }})
-
+
{{ speaker?.getLOSName((structureLevelCountdownEnabled | async) === false) }}
diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.ts index 530319a2b3..9e5b490aa0 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.ts @@ -40,6 +40,10 @@ export class ParticipantSpeakerListComponent extends BaseMeetingListViewComponen return this.operator.hasPerms(Permission.userCanManage); } + public get structureLevelCountdownEnabled(): Observable { + return this.meetingSettingService.get(`list_of_speakers_default_structure_level_time`).pipe(map(v => v > 0)); + } + /** * Define extra filter properties */ From 11b983d08797dd7edb25eeb83b66958a4478ee6c Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Fri, 23 Feb 2024 18:03:40 +0100 Subject: [PATCH 07/59] Fix PoO creation for others (#3348) --- .../speakers/speaker-repository.service.ts | 14 ++++ .../list-of-speakers-content.component.html | 19 +++++ .../list-of-speakers-content.component.ts | 53 ++++++++++---- .../point-of-order-dialog.component.html | 9 --- .../point-of-order-dialog.component.ts | 72 +++---------------- .../point-of-order-dialog.module.ts | 4 +- .../services/point-of-order-dialog.service.ts | 18 ++--- .../services/speaker-controller.service.ts | 9 ++- .../meeting-settings-definitions.ts | 12 ++-- 9 files changed, 104 insertions(+), 106 deletions(-) diff --git a/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts b/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts index b6734bc6ae..239952b7b7 100644 --- a/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts +++ b/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts @@ -10,6 +10,12 @@ import { BaseMeetingRelatedRepository } from '../base-meeting-related-repository import { RepositoryMeetingServiceCollectorService } from '../repository-meeting-service-collector.service'; import { SpeakerAction } from './speaker.action'; +export interface PointOfOrderInformation { + point_of_order?: boolean; + note?: string; + point_of_order_category_id?: Id; +} + @Injectable({ providedIn: `root` }) @@ -131,4 +137,12 @@ export class SpeakerRepositoryService extends BaseMeetingRelatedRepository { + const payload: any = { + id: speaker.id, + ...data + }; + return this.sendActionToBackend(SpeakerAction.UPDATE, payload); + } } diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html index 48cf8a1e2b..816bf1bdb2 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -428,6 +428,25 @@ {{ 'Intervention' | translate }} + + + + + diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index 822d2f8ea4..1cedb6d204 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -79,6 +79,10 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme return this.meetingSettingService.get(`list_of_speakers_intervention_time`).pipe(map(v => v > 0)); } + public get pointOfOrderForOthersEnabled(): Observable { + return this.meetingSettingsService.get(`list_of_speakers_can_create_point_of_order_for_others`); + } + public get structureLevelCountdownEnabled(): Observable { return this.meetingSettingService.get(`list_of_speakers_default_structure_level_time`).pipe(map(v => v > 0)); } @@ -145,6 +149,8 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme public enableMultipleParticipants = false; + public pointOfOrderEnabled = false; + @Output() private isListOfSpeakersEmptyEvent = new EventEmitter(); @@ -155,8 +161,6 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme private _listOfSpeakers: ViewListOfSpeakers | null = null; - private pointOfOrderEnabled = false; - private canMarkSelf = false; private get onlyPresentUsers(): boolean { @@ -167,7 +171,7 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme protected override translate: TranslateService, private listOfSpeakersRepo: ListOfSpeakersControllerService, private speakerRepo: SpeakerControllerService, - private operator: OperatorService, + public operator: OperatorService, private promptService: PromptService, private durationService: DurationService, private userRepository: ParticipantControllerService, @@ -303,18 +307,14 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme } public async addPointOfOrder(): Promise { - const dialogRef = await this.dialog.open(this.listOfSpeakers); + const dialogRef = await this.dialog.open(); try { const result = await firstValueFrom(dialogRef.afterClosed()); if (result) { - await this.speakerRepo.create( - this.listOfSpeakers, - result.speaker ? result.speaker.userId : this._currentUser!.id, - { - pointOfOrder: true, - ...result - } - ); + await this.speakerRepo.create(this.listOfSpeakers, this._currentUser!.id, { + pointOfOrder: true, + ...result + }); } } catch (e) { this.raiseError(e); @@ -455,6 +455,31 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme } } + public async onPointOfOrderButton(speaker: ViewSpeaker): Promise { + if (!speaker.point_of_order && this.pointOfOrderCategoriesEnabled) { + const dialogRef = await this.dialog.open(); + const result = await firstValueFrom(dialogRef.afterClosed()); + if (result) { + await this.speakerRepo.setPointOfOrder(speaker, { + point_of_order: true, + ...result + }); + } + } else { + await this.speakerRepo.setPointOfOrder(speaker, { + point_of_order: !speaker.point_of_order + }); + } + } + + public async onEditPointOfOrderButton(speaker: ViewSpeaker): Promise { + const dialogRef = await this.dialog.open(speaker); + const result = await firstValueFrom(dialogRef.afterClosed()); + if (result) { + await this.speakerRepo.setPointOfOrder(speaker, result); + } + } + /** * Receives an updated list from sorting-event. * @@ -666,6 +691,8 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme private findOperatorSpeaker(pointOfOrder?: boolean): ViewSpeaker | undefined { return this.waitingSpeakers .sort((a, b) => b.id - a.id) - .find(speaker => speaker.user_id === this.operator.operatorId && speaker.point_of_order === pointOfOrder); + .find( + speaker => speaker.user_id === this.operator.operatorId && !!speaker.point_of_order === !!pointOfOrder + ); } } diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html index c566a2e28d..4405a7d7e1 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.html @@ -3,15 +3,6 @@

- - - - {{ 'Possible points of order' | translate }} diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts index 56c5a972e8..0f63b8754f 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/components/point-of-order-dialog/point-of-order-dialog.component.ts @@ -5,14 +5,11 @@ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; -import { Permission } from 'src/app/domain/definitions/permission'; -import { ViewListOfSpeakers, ViewPointOfOrderCategory } from 'src/app/site/pages/meetings/pages/agenda'; +import { ViewPointOfOrderCategory } from 'src/app/site/pages/meetings/pages/agenda'; import { ActiveMeetingService } from 'src/app/site/pages/meetings/services/active-meeting.service'; import { MeetingSettingsService } from 'src/app/site/pages/meetings/services/meeting-settings.service'; -import { ViewUser } from 'src/app/site/pages/meetings/view-models/view-user'; -import { OperatorService } from 'src/app/site/services/operator.service'; -import { UserSelectionData } from '../../../../../participant-search-selector'; +import { PointOfOrderData } from '../../services/point-of-order-dialog.service'; @Component({ selector: `os-point-of-order-dialog`, @@ -20,28 +17,6 @@ import { UserSelectionData } from '../../../../../participant-search-selector'; styleUrls: [`./point-of-order-dialog.component.scss`] }) export class PointOfOrderDialogComponent { - /** - * To check permissions in templates using permission.[...] - */ - public readonly permission = Permission; - - public get canManage(): boolean { - return this.operator.hasPerms(this.permission.listOfSpeakersCanManage); - } - - public get canSetPoOsForOthers(): boolean { - return this.meetingSettingsService.instant(`list_of_speakers_can_create_point_of_order_for_others`) ?? false; - } - - public users: ViewUser[] = []; - public nonAvailableUserIds: number[] = []; - - public speaker: ViewUser; - - private get onlyPresentUsers(): boolean { - return this.meetingSettingsService.instant(`list_of_speakers_present_users_only`) ?? false; - } - public editForm: UntypedFormGroup; public readonly MAX_LENGTH = 80; @@ -56,17 +31,13 @@ export class PointOfOrderDialogComponent { private _showCategorySelect = false; - private _currentUser: ViewUser | null = null; - public constructor( public readonly dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) - public readonly listOfSpeakers: ViewListOfSpeakers, + public readonly data: PointOfOrderData, private fb: UntypedFormBuilder, private meetingSettings: MeetingSettingsService, - private activeMeeting: ActiveMeetingService, - private operator: OperatorService, - private meetingSettingsService: MeetingSettingsService + private activeMeeting: ActiveMeetingService ) { this.activeMeeting.meeting.point_of_order_categories_as_observable .pipe( @@ -80,12 +51,10 @@ export class PointOfOrderDialogComponent { .subscribe(this.categoriesSubject); this.editForm = this.fb.group({ - note: [``, [Validators.maxLength(this.MAX_LENGTH)]], - category: [], - speaker: [] + note: [data?.note ?? ``, [Validators.maxLength(this.MAX_LENGTH)]], + category: [] }); - this.operator.userObservable.subscribe(user => (this._currentUser = user)); combineLatest([ this.meetingSettings.get(`list_of_speakers_enable_point_of_order_categories`), this.categoriesSubject @@ -95,7 +64,7 @@ export class PointOfOrderDialogComponent { if (show) { categoryForm.setValidators([Validators.required]); if (!categories.map(cat => cat.id).includes(categoryForm.value)) { - categoryForm.setValue(categories[0].id); + categoryForm.setValue(data?.point_of_order_category_id ?? categories[0].id); } } else { categoryForm.clearValidators(); @@ -103,43 +72,20 @@ export class PointOfOrderDialogComponent { this.editForm.updateValueAndValidity(); this._showCategorySelect = show; }); - - this.filterNonAvailableUsers(); } public onOk(): void { if (!this.editForm.valid) { return; } - const note = this.editForm.value.note || undefined; - const speaker = this.editForm.value.speaker || undefined; + const note = this.editForm.value.note; const point_of_order_category_id = this._showCategorySelect ? this.editForm.value.category || undefined : undefined; - this.dialogRef.close({ note, point_of_order_category_id, speaker }); + this.dialogRef.close({ note, point_of_order_category_id }); } public onCancel(): void { this.dialogRef.close(); } - - /** - * Creates an array of users who currently shouldn't be selectable for the speaker list. - */ - private filterNonAvailableUsers() { - const nonAvailableUsers = this.users - .filter(user => !(!this.onlyPresentUsers || user?.isPresentInMeeting())) - .map(user => user?.id) - .filter(user => !!user); - this.nonAvailableUserIds = nonAvailableUsers; - } - - public selectUser(data: UserSelectionData): UserSelectionData { - if (!data.userId) { - data.userId = this.operator.operatorId; - } - this.speaker = this.users.find(speaker => speaker.id === data.userId); - this.editForm.value.speaker = data; - return data; - } } diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts index 01d105699a..8ad73fa60c 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/point-of-order-dialog.module.ts @@ -8,7 +8,6 @@ import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/lega import { MatSelectModule } from '@angular/material/select'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; -import { ParticipantSearchSelectorModule } from '../../../participant-search-selector'; import { PointOfOrderDialogComponent } from './components/point-of-order-dialog/point-of-order-dialog.component'; @NgModule({ @@ -21,8 +20,7 @@ import { PointOfOrderDialogComponent } from './components/point-of-order-dialog/ MatInputModule, MatSelectModule, ReactiveFormsModule, - OpenSlidesTranslationModule.forChild(), - ParticipantSearchSelectorModule + OpenSlidesTranslationModule.forChild() ] }) export class PointOfOrderDialogModule { diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts index 655a12bf6d..6a0b2a9429 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/point-of-order-dialog/services/point-of-order-dialog.service.ts @@ -1,17 +1,15 @@ import { Injectable } from '@angular/core'; import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { Id } from 'src/app/domain/definitions/key-types'; import { infoDialogSettings } from 'src/app/infrastructure/utils/dialog-settings'; -import { ViewListOfSpeakers } from 'src/app/site/pages/meetings/pages/agenda'; import { BaseDialogService } from 'src/app/ui/base/base-dialog-service'; -import { UserSelectionData } from '../../../../participant-search-selector'; import { PointOfOrderDialogComponent } from '../components/point-of-order-dialog/point-of-order-dialog.component'; import { PointOfOrderDialogModule } from '../point-of-order-dialog.module'; -interface PointOfOrderResult { - note: string; - point_of_order_category_id: number; - speaker?: UserSelectionData; +export interface PointOfOrderData { + note?: string; + point_of_order_category_id?: Id; } @Injectable({ @@ -19,12 +17,10 @@ interface PointOfOrderResult { }) export class PointOfOrderDialogService extends BaseDialogService< PointOfOrderDialogComponent, - ViewListOfSpeakers, - PointOfOrderResult + PointOfOrderData, + PointOfOrderData > { - public async open( - data: ViewListOfSpeakers - ): Promise> { + public async open(data?: PointOfOrderData): Promise> { const module = await import(`../point-of-order-dialog.module`).then(m => m.PointOfOrderDialogModule); return this.dialog.open(module.getComponent(), { data, diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts index 4d0786ccb9..1a709125b3 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts @@ -4,7 +4,10 @@ import { Id, UnsafeHtml } from 'src/app/domain/definitions/key-types'; import { Identifiable } from 'src/app/domain/interfaces'; import { Speaker } from 'src/app/domain/models/speakers/speaker'; import { SpeechState } from 'src/app/domain/models/speakers/speech-state'; -import { SpeakerRepositoryService } from 'src/app/gateways/repositories/speakers/speaker-repository.service'; +import { + PointOfOrderInformation, + SpeakerRepositoryService +} from 'src/app/gateways/repositories/speakers/speaker-repository.service'; import { BaseMeetingControllerService } from 'src/app/site/pages/meetings/base/base-meeting-controller.service'; import { UserControllerService } from 'src/app/site/services/user-controller.service'; @@ -78,6 +81,10 @@ export class SpeakerControllerService extends BaseMeetingControllerService { + return this.repo.setPointOfOrder(speaker, data); + } + public startToSpeak(speaker: ViewSpeaker): Promise { return this.repo.startToSpeak(speaker); } diff --git a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts index 2af685f4b7..99f0256e4b 100644 --- a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +++ b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts @@ -368,12 +368,6 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([ label: _(`Enable interposed questions`), type: `boolean` }, - { - key: `list_of_speakers_can_create_point_of_order_for_others`, - label: _(`Enable point of orders for other participants`), - helpText: _(`Requires permission to manage lists of speakers`), - type: `boolean` - }, { key: `list_of_speakers_intervention_time`, label: _(`Intervention speaking time in seconds`), @@ -441,6 +435,12 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([ label: _(`Enable point of order`), type: `boolean` }, + { + key: `list_of_speakers_can_create_point_of_order_for_others`, + label: _(`Enable point of orders for other participants`), + helpText: _(`Requires permission to manage lists of speakers`), + type: `boolean` + }, { key: `list_of_speakers_speaker_note_for_everyone`, label: _( From b34d34848025ef3171284d44a4fab05c324dcab4 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Fri, 23 Feb 2024 18:05:52 +0100 Subject: [PATCH 08/59] Update service worker caching (#3345) --- client/ngsw-config.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/client/ngsw-config.json b/client/ngsw-config.json index ae4ee94647..1405481722 100644 --- a/client/ngsw-config.json +++ b/client/ngsw-config.json @@ -1,28 +1,31 @@ { "$schema": "./node_modules/@angular/service-worker/config/schema.json", "index": "/index.html", + "version": 2, "assetGroups": [ { "name": "app", "installMode": "prefetch", "resources": { "files": [ - "/favicon.ico", "/index.html", - "/manifest.webmanifest", "/*.css", - "/*.js", - "/fira-sans*", - "/Material-Icons-Baseline.*" + "/*.js" ] } }, { "name": "assets", "installMode": "lazy", - "updateMode": "prefetch", "resources": { - "files": ["/assets/**", "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"] + "files": [ + "/assets/**", + "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)", + "/fira-sans*", + "/favicon.ico", + "/manifest.webmanifest", + "/Material-Icons-Baseline.*" + ] } } ], From 46b973d9b7ddf23989b4e8976bee48667f07215d Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:49:38 +0100 Subject: [PATCH 09/59] Fix countdows with PoO updates (#3354) --- .../list-of-speakers-content.component.ts | 6 +++++- .../view-models/view-structure-level-list-of-speakers.ts | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index 1cedb6d204..24b84a90fd 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -641,7 +641,11 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme default_time, countdown_time: speaker.begin_time ? countdown_time : default_time }; - } else if (this.structureLevelCountdownEnabled && speaker.structure_level_list_of_speakers) { + } else if ( + this.structureLevelCountdownEnabled && + speaker.structure_level_list_of_speakers && + !speaker.point_of_order + ) { const speakingTime = speaker.structure_level_list_of_speakers; const remaining = speakingTime.remaining_time; return { diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/structure-levels/view-models/view-structure-level-list-of-speakers.ts b/client/src/app/site/pages/meetings/pages/participants/pages/structure-levels/view-models/view-structure-level-list-of-speakers.ts index 49c72b601b..4ee01baa4f 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/structure-levels/view-models/view-structure-level-list-of-speakers.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/structure-levels/view-models/view-structure-level-list-of-speakers.ts @@ -14,7 +14,9 @@ export class ViewStructureLevelListOfSpeakers extends BaseViewModel SPECIAL_SPEECH_STATES.includes(speaker.speech_state)) + this.speakers.every( + speaker => SPECIAL_SPEECH_STATES.includes(speaker.speech_state) || speaker.point_of_order + ) ); } } From 821fc210525305b1e25c5c13c195af349e217a4e Mon Sep 17 00:00:00 2001 From: reiterl Date: Tue, 27 Feb 2024 09:21:54 +0100 Subject: [PATCH 10/59] Fix meeting edit, start_time/end_time at disabled daterange (#3355) --- .../components/meeting-edit/meeting-edit.component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/app/site/pages/organization/pages/committees/pages/committee-detail/modules/committee-detail-meeting/components/meeting-edit/meeting-edit.component.ts b/client/src/app/site/pages/organization/pages/committees/pages/committee-detail/modules/committee-detail-meeting/components/meeting-edit/meeting-edit.component.ts index cf30ba5bbf..9b4238d5a4 100644 --- a/client/src/app/site/pages/organization/pages/committees/pages/committee-detail/modules/committee-detail-meeting/components/meeting-edit/meeting-edit.component.ts +++ b/client/src/app/site/pages/organization/pages/committees/pages/committee-detail/modules/committee-detail-meeting/components/meeting-edit/meeting-edit.component.ts @@ -368,7 +368,10 @@ export class MeetingEditComponent extends BaseComponent implements OnInit { const { daterange: { start: start_time, end: end_time } = { start: null, end: null }, ...rawPayload } = { ...this.meetingForm.value }; - return { start_time, end_time, ...rawPayload }; + if (!this.meetingForm.get(`daterange`).disabled) { + return { start_time, end_time, ...rawPayload }; + } + return { ...rawPayload }; } /** From d971b14f8ced29b81ea01be758bc506c61ca3fee Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 08:35:13 +0000 Subject: [PATCH 11/59] Update meta repository (#3363) Co-authored-by: jsangmeister <33004050+jsangmeister@users.noreply.github.com> --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index 48cc2b11b8..fb66a293e5 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit 48cc2b11b89db89eb79b1b0c70100d894615720a +Subproject commit fb66a293e5e9c7130b208dd71298f124fed5a4da From 9170dc884b3b795ac0db51f7e7855533c49ed5c8 Mon Sep 17 00:00:00 2001 From: rrenkert Date: Tue, 27 Feb 2024 09:49:49 +0100 Subject: [PATCH 12/59] Reordered columns in participant export (#3351) --- .../pages/participant-import/definitions/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-import/definitions/index.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-import/definitions/index.ts index a7f74902f5..00b3ce9fd2 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-import/definitions/index.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-import/definitions/index.ts @@ -3,10 +3,10 @@ import { GeneralUser } from 'src/app/gateways/repositories/users'; export const participantHeadersAndVerboseNames: { [key in keyof GeneralUser]?: string } = { ...userHeadersAndVerboseNames, + is_present: `Is present`, + structure_level: `Structure levels`, number: `Participant number`, vote_weight: `Vote weight`, - is_present: `Is present`, groups: `Groups`, - comment: `Comment`, - structure_level: `Structure levels` + comment: `Comment` }; From e47a42655cceb223f982562f197313f7fd4fb57c Mon Sep 17 00:00:00 2001 From: reiterl Date: Tue, 27 Feb 2024 14:50:10 +0100 Subject: [PATCH 13/59] Small improvement to the get-forwarding-meetings presenter call (#3270) --- .../services/motion-forward-dialog.service.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts index adc2ce96b8..d5f67a5741 100644 --- a/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, firstValueFrom, Observable } from 'rxjs'; +import { BehaviorSubject, filter, firstValueFrom, Observable } from 'rxjs'; import { Ids } from 'src/app/domain/definitions/key-types'; import { Permission } from 'src/app/domain/definitions/permission'; import { Selectable } from 'src/app/domain/interfaces'; @@ -95,9 +95,13 @@ export class MotionForwardDialogService extends BaseDialogService { if (this._forwardingMeetingsUpdateRequired && !this.activeMeeting.meeting.isArchived) { - const meetings = this.operator.hasPerms(Permission.motionCanManage) - ? await this.presenter.call({ meeting_id: this.activeMeeting.meetingId! }) - : []; + const meetingId = await firstValueFrom( + this.activeMeeting.meetingIdObservable.pipe(filter(id => id !== undefined)) + ); + const meetings = + this.operator.hasPerms(Permission.motionCanManage) && !!meetingId + ? await this.presenter.call({ meeting_id: meetingId }) + : []; this._forwardingMeetings = meetings; this._forwardingMeetingsUpdateRequired = false; this._forwardingCommitteesSubject.next( From c01bbb2337a1190f17b87e3214d99d183af0c833 Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 13:13:35 +0100 Subject: [PATCH 14/59] Update meta repository (#3369) Co-authored-by: jsangmeister <33004050+jsangmeister@users.noreply.github.com> --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index fb66a293e5..3aa7942280 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit fb66a293e5e9c7130b208dd71298f124fed5a4da +Subproject commit 3aa7942280f41c5794c728545061d36f88a22b5d From 7480d58348aaa2d60a53ededdc3fe74cff2e8c09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:28:07 +0100 Subject: [PATCH 15/59] Bump es5-ext from 0.10.62 to 0.10.64 in /client (#3370) --- client/package-lock.json | 51 +++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index d487c8c3cf..a1a8d8d455 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8934,13 +8934,14 @@ "dev": true }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -9529,6 +9530,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/espree": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", @@ -26541,12 +26561,13 @@ "dev": true }, "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, @@ -26970,6 +26991,24 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, "espree": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", From 757b4a6bbb80560aa21145058758de653410a6cd Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:48:53 +0000 Subject: [PATCH 16/59] Automatically create PRs for commits on staging branches (#3378) (#3381) * Automatically create PRs for commits on staging branches (#3378) * Fix CI --------- Co-authored-by: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Co-authored-by: Joshua Sangmeister --- .github/workflows/build.yml | 2 +- .github/workflows/staging-to-main.yml | 54 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/staging-to-main.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccc6399ab3..72a054743d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: submodules: "recursive" - name: Checkout latest commits env: - BRANCH: ${{ github.event.pull_request.head.repo.owner.login == 'OpenSlides' && github.head_ref || github.base_ref }} + BRANCH: ${{ github.event.pull_request.head.repo.owner.login == 'OpenSlides' && contains(github.head_ref, 'feature/') && github.head_ref || github.base_ref }} run: git submodule foreach 'git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" && ((git fetch origin ${{ env.BRANCH }} && git checkout ${{ env.BRANCH }}) || (git checkout main && git pull origin main)) && git submodule update --init' - name: Delete the client folder run: rm -r openslides-client diff --git a/.github/workflows/staging-to-main.yml b/.github/workflows/staging-to-main.yml new file mode 100644 index 0000000000..2bb8525ffc --- /dev/null +++ b/.github/workflows/staging-to-main.yml @@ -0,0 +1,54 @@ +name: Copy staging commits to main + +on: + push: + branches: + - 'staging/4*' + + +jobs: + create-pr-for-main: + name: Create PR against main branch + runs-on: ubuntu-latest + + steps: + - name: Checkout main + uses: actions/checkout@v4 + with: + ref: main + + - name: Set git credentials + run: | + git config --global user.name openslides-automation + git config --global user.email openslides-automation@users.noreply.github.com + + - name: Cherry-pick new commit + id: cherry-pick + run: | + git fetch origin + git cherry-pick ${{ github.sha }} || { + echo "error=1" >> $GITHUB_OUTPUT + git add . + git cherry-pick --continue + } + + - name: Generate access token + uses: tibdex/github-app-token@v2 + id: generate-token + with: + app_id: ${{ secrets.AUTOMATION_APP_ID }} + private_key: ${{ secrets.AUTOMATION_APP_PRIVATE_KEY }} + + - name: Create or update PR + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ steps.generate-token.outputs.token }} + commit-message: ${{ github.event.commits[0].message }} + branch: apply/commit-${{ github.sha }} + delete-branch: true + title: ${{ github.event.commits[0].message }} + body: "Triggered by commit [${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }})\n\n${{ steps.cherry-pick.outputs.error && 'There were conflicts during the cherry-pick. These were commited without any resolving. Please resolve them manually and push the result to this branch before merging.' || 'The cherry-pick was successful without any conflicts. You should be able to simply merge this PR.' }}" + reviewers: ${{ github.event.commits[0].author.username }} + assignees: ${{ github.event.commits[0].author.username }} + labels: staging-port + milestone: 4 From 059c11afa01f8b127444f714c222ca53158bc41a Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Fri, 1 Mar 2024 10:08:50 +0100 Subject: [PATCH 17/59] Implement datetimepicker for motion workflow (#3298) --- .../motion-manage-timestamp.component.html | 53 ++++++++ .../motion-manage-timestamp.component.scss | 0 .../motion-manage-timestamp.component.spec.ts | 21 +++ .../motion-manage-timestamp.component.ts | 120 ++++++++++++++++++ .../motion-meta-data.component.html | 9 +- .../motion-detail/motion-detail.module.ts | 10 +- client/src/meta | 2 +- 7 files changed, 209 insertions(+), 6 deletions(-) create mode 100644 client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.html create mode 100644 client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.scss create mode 100644 client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.spec.ts create mode 100644 client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.ts diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.html new file mode 100644 index 0000000000..a3d18c1b4f --- /dev/null +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.html @@ -0,0 +1,53 @@ +

+ {{ title }} + + +

+ +
+
{{ motion[field] | localizedDate }}
+
+ +
+ + + + +
+ + + access_time + + +
+ +
+ + +

+ + +

+
diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.scss b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.spec.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.spec.ts new file mode 100644 index 0000000000..3acd06ddb7 --- /dev/null +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MotionManageTimestampComponent } from './motion-manage-timestamp.component'; + +xdescribe(`MotionManageTimestampComponent`, () => { + let component: MotionManageTimestampComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [MotionManageTimestampComponent] + }); + fixture = TestBed.createComponent(MotionManageTimestampComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.ts new file mode 100644 index 0000000000..228a82150c --- /dev/null +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-timestamp/motion-manage-timestamp.component.ts @@ -0,0 +1,120 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { fromUnixTime, getHours, getMinutes, isDate } from 'date-fns'; +import { KeyOfType } from 'src/app/infrastructure/utils/keyof-type'; +import { BaseUiComponent } from 'src/app/ui/base/base-ui-component'; + +import { MotionControllerService } from '../../../../services/common/motion-controller.service'; +import { MotionPermissionService } from '../../../../services/common/motion-permission.service'; +import { ViewMotion } from '../../../../view-models'; + +@Component({ + selector: `os-motion-manage-timestamp`, + templateUrl: `./motion-manage-timestamp.component.html`, + styleUrls: [`./motion-manage-timestamp.component.scss`], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MotionManageTimestampComponent extends BaseUiComponent { + public get motion(): ViewMotion { + return this._motion; + } + + @Input() + public set motion(value: ViewMotion) { + this._motion = value; + } + + @Input() + public field: KeyOfType; + + @Input() + public title: string; + + public form: UntypedFormGroup; + + /** + * Saves if the users edits the note. + */ + public set isEditMode(value: boolean) { + this._editMode = value; + } + + public get isEditMode(): boolean { + return this._editMode; + } + + private _editMode = false; + + private _motion!: ViewMotion; + + public constructor( + public perms: MotionPermissionService, + private motionController: MotionControllerService, + private fb: UntypedFormBuilder + ) { + super(); + + this.form = this.fb.group({ + date: [``], + time: [``] + }); + + this.form.get(`date`).valueChanges.subscribe(currDate => { + if (isDate(currDate) !== !!this.form.get(`time`).value) { + this.form.get(`time`).setValue(isDate(currDate) ? `00:00` : ``); + } + }); + this.form.get(`time`).valueChanges.subscribe(currTime => { + if (!!currTime !== isDate(this.form.get(`date`).value)) { + this.form.get(`date`).setValue(!!currTime ? new Date() : null); + } + }); + } + + public async onSave(): Promise { + const date: { date: Date | null; time: string } = this.form.value; + const [hours, minutes, ..._] = date.time.split(`:`); + if (date.date) { + date.date.setHours(+hours, +minutes); + } + await this.motionController + .update({ [this.field]: date.date ? Math.floor(date.date.getTime() / 1000) : null }, this.motion) + .resolve(); + this.isEditMode = false; + } + + /** + * Close the edit view. + */ + public onCancel(): void { + this.isEditMode = false; + } + + /** + * Enter the edit mode and reset the form and the data. + */ + public onEdit(): void { + const timestamp = this.motion[this.field]; + const date = timestamp + ? this.getTimes(timestamp) + : { + date: ``, + time: `` + }; + this.form.patchValue(date); + this.isEditMode = true; + } + + public getTimes(timestamp: number): { date: Date; time: string } { + const date = fromUnixTime(timestamp); + const time = getHours(date) + `:` + getMinutes(date); + return { date, time }; + } + + public clearForm(): void { + this.form.patchValue({ + date: ``, + time: `` + }); + } +} diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html index 4cbc216ee8..943adf600e 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html @@ -254,10 +254,11 @@

-
-

{{ 'Submission date' | translate }}

-
{{ motion.workflow_timestamp | localizedDate }}
-
+
diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts index c59c9bf398..6561913766 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts @@ -18,6 +18,7 @@ import { MatSelectModule } from '@angular/material/select'; import { MatStepperModule } from '@angular/material/stepper'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; +import { NgxMaterialTimepickerModule } from 'ngx-material-timepicker'; import { ChipSelectModule } from 'src/app/site/modules/chip-select/chip-select.module'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; import { MeetingsComponentCollectorModule } from 'src/app/site/pages/meetings/modules/meetings-component-collector'; @@ -25,9 +26,11 @@ import { DirectivesModule } from 'src/app/ui/directives'; import { ActionCardModule } from 'src/app/ui/modules/action-card'; import { ChoiceDialogModule } from 'src/app/ui/modules/choice-dialog'; import { CommaSeparatedListingModule } from 'src/app/ui/modules/comma-separated-listing'; +import { DatepickerModule } from 'src/app/ui/modules/datepicker'; import { EditorModule } from 'src/app/ui/modules/editor'; import { HeadBarModule } from 'src/app/ui/modules/head-bar'; import { IconContainerModule } from 'src/app/ui/modules/icon-container'; +import { OpenSlidesDateAdapterModule } from 'src/app/ui/modules/openslides-date-adapter/openslides-date-adapter.module'; import { SearchSelectorModule } from 'src/app/ui/modules/search-selector'; import { SortingModule } from 'src/app/ui/modules/sorting'; import { PipesModule } from 'src/app/ui/pipes/pipes.module'; @@ -55,6 +58,7 @@ import { MotionFinalVersionComponent } from './components/motion-final-version/m import { MotionHighlightFormComponent } from './components/motion-highlight-form/motion-highlight-form.component'; import { MotionManageMotionMeetingUsersComponent } from './components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component'; import { MotionManagePollsComponent } from './components/motion-manage-polls/motion-manage-polls.component'; +import { MotionManageTimestampComponent } from './components/motion-manage-timestamp/motion-manage-timestamp.component'; import { MotionManageTitleComponent } from './components/motion-manage-title/motion-manage-title.component'; import { MotionMetaDataComponent } from './components/motion-meta-data/motion-meta-data.component'; import { MotionParagraphbasedAmendmentComponent } from './components/motion-paragraphbased-amendment/motion-paragraphbased-amendment.component'; @@ -86,7 +90,8 @@ import { MotionDetailServiceModule } from './services/motion-detail-service.modu MotionPersonalNoteComponent, MotionCommentComponent, MotionFinalVersionComponent, - ParagraphBasedAmendmentComponent + ParagraphBasedAmendmentComponent, + MotionManageTimestampComponent ], imports: [ CommonModule, @@ -129,6 +134,9 @@ import { MotionDetailServiceModule } from './services/motion-detail-service.modu MatInputModule, MatProgressBarModule, ParticipantSearchSelectorModule, + OpenSlidesDateAdapterModule, + NgxMaterialTimepickerModule, + DatepickerModule, // Detail view ScrollingModule, diff --git a/client/src/meta b/client/src/meta index 3aa7942280..d346289040 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit 3aa7942280f41c5794c728545061d36f88a22b5d +Subproject commit d3462890400f62c815ebd4607c542de2522d10fa From 1ade862f95825ea9870027ef7c09a3ac093b4d08 Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 11:26:48 +0100 Subject: [PATCH 18/59] Update meta repository (#3383) --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index d346289040..3bbf5a0dd9 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit d3462890400f62c815ebd4607c542de2522d10fa +Subproject commit 3bbf5a0dd9bc0127997bd2aeea067cbf306ee8e1 From e91ad92dd5a10d43f2558622cdf1978042c15eb7 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Fri, 1 Mar 2024 11:29:11 +0100 Subject: [PATCH 19/59] Ensure that general abstain is listed in single votes (#3379) --- client/src/app/domain/models/poll/option.ts | 2 ++ .../definitions/relations/relations.ts | 2 +- .../assignment-poll-detail.component.ts | 2 +- .../assignment-poll-main.component.ts | 24 +++++++++++++++---- .../pages/polls/polls.subscription.ts | 6 ++++- .../pages/polls/view-models/view-option.ts | 1 + 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/client/src/app/domain/models/poll/option.ts b/client/src/app/domain/models/poll/option.ts index 0d539c1217..afd8cd32dc 100644 --- a/client/src/app/domain/models/poll/option.ts +++ b/client/src/app/domain/models/poll/option.ts @@ -11,6 +11,7 @@ export class Option extends BaseDecimalModel
From 2250fd601e748f74f72abcbb2d8268f1cdb30ad0 Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:55:28 +0100 Subject: [PATCH 22/59] Prevent structure level stats second scrollbar (#3371) (#3384) Co-authored-by: reiterl --- .../user-statistics/user-statistics.component.html | 1 - .../user-statistics/user-statistics.component.scss | 9 --------- 2 files changed, 10 deletions(-) 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 7e8640e4f0..953ff59a08 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 @@ -25,7 +25,6 @@ Date: Mon, 4 Mar 2024 11:52:02 +0100 Subject: [PATCH 23/59] Update committee export column names and format (#3335) --- .../services/meeting-controller.service.ts | 2 +- .../committee-export.service.ts | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/client/src/app/site/pages/meetings/services/meeting-controller.service.ts b/client/src/app/site/pages/meetings/services/meeting-controller.service.ts index 37a8a93e4e..5bd3d35782 100644 --- a/client/src/app/site/pages/meetings/services/meeting-controller.service.ts +++ b/client/src/app/site/pages/meetings/services/meeting-controller.service.ts @@ -96,6 +96,6 @@ export class MeetingControllerService extends BaseController 9 ? `${date.getMonth() + 1}` : `0${date.getMonth() + 1}`; - return `${date.getFullYear()}${month}${date.getDate()}`; + return `${date.getFullYear()}-${month}-${date.getDate()}`; } } diff --git a/client/src/app/site/pages/organization/pages/committees/pages/committee-list/services/committee-list-export.service/committee-export.service.ts b/client/src/app/site/pages/organization/pages/committees/pages/committee-list/services/committee-list-export.service/committee-export.service.ts index 3c8bec2a9c..bbe88825f8 100644 --- a/client/src/app/site/pages/organization/pages/committees/pages/committee-list/services/committee-list-export.service/committee-export.service.ts +++ b/client/src/app/site/pages/organization/pages/committees/pages/committee-list/services/committee-list-export.service/committee-export.service.ts @@ -20,32 +20,30 @@ export class CommitteeExportService { public export(committees: ViewCommittee[]): void { const properties: CsvColumnsDefinition = [ { - property: `name`, - label: this.translate.instant(`Title`) + property: `name` }, { - property: `description`, - label: this.translate.instant(`Description`) + property: `description` }, { label: `organization_tags`, - map: model => model.organization_tags.map(tag => tag.name).join(`, `) + map: model => model.organization_tags.map(tag => tag.name).join(`,`) }, { label: `forward_to_committees`, - map: model => model.forward_to_committees.map(committee => committee.name).join(`, `) + map: model => model.forward_to_committees.map(committee => committee.name).join(`,`) }, { label: `managers`, map: model => model .getManagers() - .map(manager => manager.full_name) - .join(`, `) + .map(manager => manager.username) + .join(`,`) }, { label: `meeting_name`, - map: model => (console.log(`meeting:`, model.meetings[0]), model.meetings[0]?.name) + map: model => model.meetings[0]?.name }, { label: `meeting_start_time`, @@ -54,6 +52,10 @@ export class CommitteeExportService { { label: `meeting_end_time`, map: model => this.meetingRepo.parseUnixToMeetingTime(model.meetings[0]?.end_time * 1000) + }, + { + label: `meeting_admins`, + map: _ => `` } ]; const filename = `${this.translate.instant(`Committees`)}.csv`; From 5afbd8119549367a0287870bfb094e890afca987 Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:59:26 +0100 Subject: [PATCH 24/59] Update meta repository (#3387) --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index 3bbf5a0dd9..c1f547f0a9 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit 3bbf5a0dd9bc0127997bd2aeea067cbf306ee8e1 +Subproject commit c1f547f0a96284a5074b86cff17ce37832948925 From d7810681b8056c28c5b2a487c265709921ce5a37 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:59:18 +0100 Subject: [PATCH 25/59] Center finished speakers (#3386) --- .../list-of-speakers-content.component.html | 8 ++++---- .../list-of-speakers-content.component.scss | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html index 816bf1bdb2..e73ebe139d 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -23,9 +23,9 @@
-
{{ number + 1 }}.
-
-
+
{{ number + 1 }}.
+
+
{{ speaker.getLOSName((structureLevelCountdownEnabled | async) === false) }}
@@ -35,7 +35,7 @@ >
-
+
{{ durationString(speaker) }} ({{ 'Start time' | translate }}: {{ startTimeToString(speaker) }})
diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.scss b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.scss index 670d89ce27..f51fffa078 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.scss +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.scss @@ -31,6 +31,10 @@ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } } + + .center-text { + margin: auto 0; + } } .current-speaker, From 2ad927620bc7260efe01e76a2b3111dd47243ff6 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:51:50 +0100 Subject: [PATCH 26/59] Add free text submitter field (#3377) --- .../src/app/domain/models/motions/motion.ts | 2 ++ .../motion-repository.service.ts | 4 +-- .../global-search.component.html | 4 +-- .../global-search/global-search.component.ts | 11 ++++-- .../motion-slide/motion-slide.component.ts | 6 +++- .../modules/motion-slide/motion-slide-data.ts | 1 + .../pages/motions/motions.subscription.ts | 1 + ...manage-motion-meeting-users.component.html | 12 ++++++- ...manage-motion-meeting-users.component.scss | 3 +- ...n-manage-motion-meeting-users.component.ts | 34 +++++++++++++++++-- .../motion-meta-data.component.html | 4 +++ .../motion-list/motion-list.component.html | 4 +-- .../motion-list/motion-list.component.ts | 1 + .../amendment-list-pdf.service.ts | 2 +- .../motion-csv-export.service.ts | 2 +- .../motion-pdf.service/motion-pdf.service.ts | 4 +-- .../motion-list-base-sort.service.ts | 7 ++-- .../pages/motions/view-models/view-motion.ts | 12 +++++++ .../comma-separated-listing.component.html | 2 +- 19 files changed, 95 insertions(+), 21 deletions(-) diff --git a/client/src/app/domain/models/motions/motion.ts b/client/src/app/domain/models/motions/motion.ts index 842a4aa1c8..ee6dccc888 100644 --- a/client/src/app/domain/models/motions/motion.ts +++ b/client/src/app/domain/models/motions/motion.ts @@ -44,6 +44,7 @@ export class Motion extends BaseModel implements MotionFormattingReprese public state_extension!: string; public recommendation_extension!: string; public sort_weight!: number; + public additional_submitter!: string; /** * Client-calculated field: The tree_weight indicates the position of a motion in a list of * motions in regard to the call list. @@ -117,6 +118,7 @@ export class Motion extends BaseModel implements MotionFormattingReprese `workflow_timestamp`, `start_line_number`, `forwarded`, + `additional_submitter`, `lead_motion_id`, `amendment_ids`, `sort_parent_id`, diff --git a/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts index 1341375174..c12aecb467 100644 --- a/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts @@ -291,8 +291,8 @@ export class MotionRepositoryService extends BaseAgendaItemAndListOfSpeakersCont } const agendaTitle: AgendaListTitle = { title }; - if (viewMotion.submittersAsUsers && viewMotion.submittersAsUsers.length) { - agendaTitle.subtitle = `${this.translate.instant(`by`)} ${viewMotion.submittersAsUsers.join(`, `)}`; + if (viewMotion.submitterNames && viewMotion.submitterNames.length) { + agendaTitle.subtitle = `${this.translate.instant(`by`)} ${viewMotion.submitterNames.join(`, `)}`; } return agendaTitle; }; diff --git a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.html b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.html index 066d600b5b..702ac11fae 100644 --- a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.html +++ b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.html @@ -81,10 +81,10 @@

- + {{ 'by' | translate }} diff --git a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts index 1ce0b9725d..7611d64663 100644 --- a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts +++ b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts @@ -154,15 +154,22 @@ export class GlobalSearchComponent implements OnDestroy { return GlobalSearchComponent.models[`${model}/${id}`] || null; } - public getNamesBySubmitters(submitters: Id[]): string[] { + public hasSubmitters(entry: GlobalSearchEntry): boolean { + return entry.obj?.submitter_ids?.length || entry.obj?.additional_submitter; + } + + public getSubmitterNames(entry: GlobalSearchEntry): string[] { const submitterNames: string[] = []; - for (const submitterId of submitters) { + for (const submitterId of entry.obj?.submitter_ids || []) { const motionSubmitter = this.getModel(`motion_submitter`, submitterId)?.content; const meetingUser = this.getModel(`meeting_user`, motionSubmitter?.meeting_user_id)?.content; const user = this.getModel(`user`, meetingUser?.user_id)?.content; submitterNames.push(this.globalSearchService.getTitle(`user`, user)); } + if (entry.obj?.additional_submitter) { + submitterNames.push(entry.obj.additional_submitter); + } return submitterNames; } diff --git a/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/components/motion-slide/motion-slide.component.ts b/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/components/motion-slide/motion-slide.component.ts index 8c2b69ec5b..539de91f56 100644 --- a/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/components/motion-slide/motion-slide.component.ts +++ b/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/components/motion-slide/motion-slide.component.ts @@ -168,7 +168,11 @@ export class MotionSlideComponent protected override setData(value: SlideData): void { super.setData(value); - this._submittersSubject.next(value.data.submitters || []); + const submitters = [...value.data.submitters] || []; + if (value.data.additional_submitter) { + submitters.push(value.data.additional_submitter); + } + this._submittersSubject.next(submitters); this.lnMode = value.data.line_numbering; this.lineLength = value.data.line_length; this.preamble = value.data.preamble; diff --git a/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/motion-slide-data.ts b/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/motion-slide-data.ts index c65ee451e5..5b58030e4b 100644 --- a/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/motion-slide-data.ts +++ b/client/src/app/site/pages/meetings/modules/projector/modules/slides/components/motions/modules/motion-slide/motion-slide-data.ts @@ -61,6 +61,7 @@ export interface MotionSlideData extends MotionFormattingRepresentation { title: string; reason: string; submitters: string[]; + additional_submitter: string; amendment_paragraphs: { [paragraphNumber: string]: string }; lead_motion: LeadMotionData; base_statute: BaseStatuteData; diff --git a/client/src/app/site/pages/meetings/pages/motions/motions.subscription.ts b/client/src/app/site/pages/meetings/pages/motions/motions.subscription.ts index 8c6cc643c2..42801c7dbb 100644 --- a/client/src/app/site/pages/meetings/pages/motions/motions.subscription.ts +++ b/client/src/app/site/pages/meetings/pages/motions/motions.subscription.ts @@ -55,6 +55,7 @@ export const getMotionListSubscriptionConfig: SubscriptionConfigGenerator = (id: `state_extension_reference_ids`, `state_id`, `submitter_ids`, + `additional_submitter`, `tag_ids`, `title` ], diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html index a88f0b8a7c..1d88d5de70 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html @@ -26,6 +26,9 @@

{{ model.user?.getTitle() }} + + {{ additionalInputValue }} +

@@ -51,7 +54,7 @@

-
+
>
+
+ + {{ additionalInputLabel }} + + +
+

diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.html index 75b250530a..ddefe1a955 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.html @@ -92,9 +92,9 @@

{{ 'Motions' | translate }}

- + {{ 'by' | translate }} - {{ motion.submittersAsUsers }} + {{ motion.submitterNames }} diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.ts index 83bbc9f44d..e75ace1659 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/components/motion-list/motion-list.component.ts @@ -80,6 +80,7 @@ export class MotionListComponent extends BaseMeetingListViewComponent (motion.sort_parent_id ? `` : motion.numberOrTitle) }, { label: `Called with`, map: motion => (!motion.sort_parent_id ? `` : motion.numberOrTitle) }, - { label: `submitters`, map: motion => motion.submittersAsUsers.map(s => s.short_name).join(`,`) }, + { label: `submitters`, map: motion => motion.mapSubmittersWithAdditional(s => s.short_name).join(`,`) }, { property: `title` }, { label: `recommendation`, diff --git a/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts index 2421cbe928..ccc383b4af 100644 --- a/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts @@ -258,7 +258,7 @@ export class MotionPdfService { // submitters if (!infoToExport || infoToExport.includes(`submitters`)) { - const submitters = motion.submittersAsUsers.map(user => user.full_name).join(`, `); + const submitters = motion.mapSubmittersWithAdditional(user => user.full_name).join(`, `); metaTableBody.push([ { @@ -823,7 +823,7 @@ export class MotionPdfService { text: motion.sort_parent_id ? `` : motion.numberOrTitle }, { text: motion.sort_parent_id ? motion.numberOrTitle : `` }, - { text: motion.submitters.length ? motion.submittersAsUsers.map(s => s.short_name).join(`, `) : `` }, + { text: motion.submitters.length ? motion.mapSubmittersWithAdditional(s => s.short_name).join(`, `) : `` }, { text: motion.title }, { text: motion.recommendation ? this.motionService.getExtendedRecommendationLabel(motion) : `` diff --git a/client/src/app/site/pages/meetings/pages/motions/services/list/motion-list-base-sort.service/motion-list-base-sort.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/list/motion-list-base-sort.service/motion-list-base-sort.service.ts index 7a9f8ee649..09bb6520f8 100644 --- a/client/src/app/site/pages/meetings/pages/motions/services/list/motion-list-base-sort.service/motion-list-base-sort.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/services/list/motion-list-base-sort.service/motion-list-base-sort.service.ts @@ -31,11 +31,12 @@ export class MotionListBaseSortService extends BaseSortListService { * Define the sort options */ protected motionSortOptions: OsSortingOption[] = [ - { property: `tree_weight`, label: `Call list`, baseKeys: [`sort_weight`, `sort_parent_id`] }, + { property: `tree_weight`, label: _(`Call list`), baseKeys: [`sort_weight`, `sort_parent_id`] }, { property: `number` }, { property: `title` }, { - property: `submitters`, + property: `submitterNames`, + label: _(`Submitters`), foreignBaseKeys: { user: [`username`, `first_name`, `last_name`], meeting_user: [`structure_level`] @@ -47,7 +48,7 @@ export class MotionListBaseSortService extends BaseSortListService { baseKeys: [`category_id`, `category_weight`], foreignBaseKeys: { category: [`parent_id`, `weight`] } }, - { property: `block_id`, label: `Motion block` }, + { property: `block_id`, label: _(`Motion block`) }, { property: `state`, baseKeys: [`state_id`], foreignBaseKeys: { motion_state: [`name`] } }, { property: `created`, label: _(`Creation date`) }, { property: `sequential_number`, label: _(`Sequential number`) }, diff --git a/client/src/app/site/pages/meetings/pages/motions/view-models/view-motion.ts b/client/src/app/site/pages/meetings/pages/motions/view-models/view-motion.ts index 67d37cd33e..04afb54ee8 100644 --- a/client/src/app/site/pages/meetings/pages/motions/view-models/view-motion.ts +++ b/client/src/app/site/pages/meetings/pages/motions/view-models/view-motion.ts @@ -74,6 +74,10 @@ export class ViewMotion extends BaseProjectableViewModel { return (this.submitters || []).map(submitter => submitter.user); } + public get submitterNames(): string[] { + return this.mapSubmittersWithAdditional(submitter => submitter.getTitle()); + } + public get editorUserIds(): Id[] { return (this.editors || []).map(editor => editor.user_id); } @@ -262,6 +266,14 @@ export class ViewMotion extends BaseProjectableViewModel { return null; } + public mapSubmittersWithAdditional(mapFn: (submitter: ViewUser) => string): string[] { + const submitters = this.submittersAsUsers.map(mapFn); + if (this.additional_submitter) { + submitters.push(this.additional_submitter); + } + return submitters; + } + /** * Extract the lines of the amendments * If an amendments has multiple changes, they will be printed like an array of strings diff --git a/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.html b/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.html index 5558a7b21b..0559e0acdf 100644 --- a/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.html +++ b/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.html @@ -2,7 +2,7 @@ - {{ item }} + ,  From 56196515cd23247aa0605c4e92e57030a610ef19 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Mon, 4 Mar 2024 15:59:34 +0100 Subject: [PATCH 27/59] Fix reset default settings (#3245) --- .../domain/definitions/meeting-settings-defaults.ts | 1 + .../meeting-settings-group-detail.component.ts | 7 +++++-- .../meeting-settings-group-list.component.ts | 11 ++++++++--- .../meeting-settings-definitions.ts | 7 +++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/client/src/app/domain/definitions/meeting-settings-defaults.ts b/client/src/app/domain/definitions/meeting-settings-defaults.ts index 18c2e4aea4..020beb6b58 100644 --- a/client/src/app/domain/definitions/meeting-settings-defaults.ts +++ b/client/src/app/domain/definitions/meeting-settings-defaults.ts @@ -3,6 +3,7 @@ import { marker as _ } from '@colsen1991/ngx-translate-extract-marker'; export const meetingSettingsDefaults: { [key: string]: any } = { + name: `Meeting title`, enable_anonymous: false, export_csv_separator: `;`, export_csv_encoding: `utf-8`, diff --git a/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-detail/components/meeting-settings-group-detail/meeting-settings-group-detail.component.ts b/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-detail/components/meeting-settings-group-detail/meeting-settings-group-detail.component.ts index 485866990d..091c745b22 100644 --- a/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-detail/components/meeting-settings-group-detail/meeting-settings-group-detail.component.ts +++ b/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-detail/components/meeting-settings-group-detail/meeting-settings-group-detail.component.ts @@ -13,7 +13,8 @@ import { MeetingControllerService } from 'src/app/site/pages/meetings/services/m import { MeetingSettingsDefinitionService } from 'src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definition.service'; import { SettingsGroup, - SettingsItem + SettingsItem, + SKIPPED_SETTINGS } from 'src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions'; import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting'; import { CollectionMapperService } from 'src/app/site/services/collection-mapper.service'; @@ -166,7 +167,9 @@ export class MeetingSettingsGroupDetailComponent ); if (await this.promptDialog.open(title)) { for (const settingsField of this.settingsFields) { - settingsField.onResetButton(); + if (!SKIPPED_SETTINGS.includes(settingsField.setting.key.toString())) { + settingsField.onResetButton(); + } } await this.saveAll(); } diff --git a/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-list/components/meeting-settings-group-list/meeting-settings-group-list.component.ts b/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-list/components/meeting-settings-group-list/meeting-settings-group-list.component.ts index 40a5dabe1a..0c91b291cc 100644 --- a/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-list/components/meeting-settings-group-list/meeting-settings-group-list.component.ts +++ b/client/src/app/site/pages/meetings/pages/meeting-settings/pages/meeting-settings-group-list/components/meeting-settings-group-list/meeting-settings-group-list.component.ts @@ -3,7 +3,10 @@ import { TranslateService } from '@ngx-translate/core'; import { BaseMeetingComponent } from 'src/app/site/pages/meetings/base/base-meeting.component'; import { MeetingControllerService } from 'src/app/site/pages/meetings/services/meeting-controller.service'; import { MeetingSettingsDefinitionService } from 'src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definition.service'; -import { SettingsGroup } from 'src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions'; +import { + SettingsGroup, + SKIPPED_SETTINGS +} from 'src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions'; import { PromptService } from 'src/app/ui/modules/prompt-dialog'; @Component({ @@ -40,8 +43,10 @@ export class MeetingSettingsGroupListComponent extends BaseMeetingComponent { private getDefaultValues(): any { const payload: any = {}; - for (const setting of this.meetingSettingsDefinitionProvider.getSettingsKeys()) { - payload[setting] = this.meetingSettingsDefinitionProvider.getDefaultValue(setting); + for (const settingGroup of this.meetingSettingsDefinitionProvider.getSettingsKeys()) { + if (!SKIPPED_SETTINGS.includes(settingGroup)) { + payload[settingGroup] = this.meetingSettingsDefinitionProvider.getDefaultValue(settingGroup); + } } return payload; } diff --git a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts index 99f0256e4b..928d968439 100644 --- a/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +++ b/client/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts @@ -91,6 +91,13 @@ export interface SettingsGroup { }[]; } +export const SKIPPED_SETTINGS = [ + `motions_default_workflow_id`, + `motions_default_amendment_workflow_id`, + `motions_default_statute_amendment_workflow_id`, + `point_of_order_category_ids` +]; + function fillInSettingsDefaults(settingsGroups: SettingsGroup[]): SettingsGroup[] { settingsGroups.forEach(group => group.subgroups.forEach( From 54be1970e49e08be7c88f8f7206ca4760cda3f00 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:09:49 +0100 Subject: [PATCH 28/59] Automatically close feature branch issues (#3396) --- .github/workflows/close-issues.yml | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/close-issues.yml diff --git a/.github/workflows/close-issues.yml b/.github/workflows/close-issues.yml new file mode 100644 index 0000000000..d6ea45bd24 --- /dev/null +++ b/.github/workflows/close-issues.yml @@ -0,0 +1,52 @@ +on: + pull_request: + types: + - closed + branches: + - "feature/*" + +jobs: + close-issue: + runs-on: ubuntu-latest + if: github.event.pull_request.merged + steps: + - name: Generate access token + uses: tibdex/github-app-token@v2 + id: generate-token + with: + app_id: ${{ secrets.AUTOMATION_APP_ID }} + private_key: ${{ secrets.AUTOMATION_APP_PRIVATE_KEY }} + + - uses: octokit/graphql-action@v2.x + id: get-issues + env: + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + with: + query: | + query getLinkedIssues($owner: String!, $name: String!, $number: Int!) { + repository(owner: $owner, name: $name) { + pullRequest(number: $number) { + closingIssuesReferences(first: 100) { + nodes { + number + repository { + nameWithOwner + } + } + } + } + } + } + variables: | + owner: ${{ github.event.repository.owner.name }} + repo: ${{ github.event.repository.name }} + number: ${{ github.event.pull_request.number }} + + - name: Close issues + env: + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + run: | + issue_data="$(echo "${{ steps.get-issues.outputs.data }}" | jq -r '.data.repository.pullRequest.closingIssuesReferences.nodes[] | [.number,.repository.nameWithOwner] | @tsv')" + echo "$issue_data" | while read number nameWithOwner; do + gh issue close "$number" -r "$nameWithOwner" + done From fcb74105611e5d24fc15472ffb3ed009daab95dc Mon Sep 17 00:00:00 2001 From: rrenkert Date: Wed, 6 Mar 2024 17:18:54 +0100 Subject: [PATCH 29/59] Prepend pub key size in cipher text --- client/src/app/gateways/vote-decrypt-gateway.service.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/app/gateways/vote-decrypt-gateway.service.ts b/client/src/app/gateways/vote-decrypt-gateway.service.ts index 919bbb2c72..80867f6541 100644 --- a/client/src/app/gateways/vote-decrypt-gateway.service.ts +++ b/client/src/app/gateways/vote-decrypt-gateway.service.ts @@ -350,10 +350,11 @@ export class VoteDecryptGatewayService { } private createPayload(ephPublKey: Uint8Array, nonce: Uint8Array, encrypted: Uint8Array): string { - const payload = new Uint8Array(this._publicKeySize + this._nonceSize + encrypted.length); - payload.set(ephPublKey.slice(0, this._publicKeySize)); - payload.set(nonce, this._publicKeySize); - payload.set(encrypted, this._publicKeySize + this._nonceSize); + const payload = new Uint8Array(this._publicKeySize + this._nonceSize + encrypted.length + 1); + payload.set([this._publicKeySize]) + payload.set(ephPublKey.slice(0, this._publicKeySize), 1); + payload.set(nonce, this._publicKeySize + 1); + payload.set(encrypted, this._publicKeySize + this._nonceSize + 1); return btoa(String.fromCharCode(...payload)); } } From 93d50b15f28e09efb46fb8f923e20cb9d2056b02 Mon Sep 17 00:00:00 2001 From: rrenkert Date: Wed, 6 Mar 2024 17:28:47 +0100 Subject: [PATCH 30/59] Fixed linting --- client/src/app/gateways/vote-decrypt-gateway.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/gateways/vote-decrypt-gateway.service.ts b/client/src/app/gateways/vote-decrypt-gateway.service.ts index 80867f6541..a98ae0e08c 100644 --- a/client/src/app/gateways/vote-decrypt-gateway.service.ts +++ b/client/src/app/gateways/vote-decrypt-gateway.service.ts @@ -351,7 +351,7 @@ export class VoteDecryptGatewayService { private createPayload(ephPublKey: Uint8Array, nonce: Uint8Array, encrypted: Uint8Array): string { const payload = new Uint8Array(this._publicKeySize + this._nonceSize + encrypted.length + 1); - payload.set([this._publicKeySize]) + payload.set([this._publicKeySize]); payload.set(ephPublKey.slice(0, this._publicKeySize), 1); payload.set(nonce, this._publicKeySize + 1); payload.set(encrypted, this._publicKeySize + this._nonceSize + 1); From 01b5790de84ab430903276752383460a7f3df220 Mon Sep 17 00:00:00 2001 From: reiterl Date: Thu, 7 Mar 2024 08:01:47 +0100 Subject: [PATCH 31/59] Update edit total time to format min:sec (#3394) --- .../speaking-times/speaking-times.component.html | 4 ++-- .../speaking-times/speaking-times.component.ts | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.html index c9a42b0042..fc7bd5e0cf 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.html @@ -55,9 +55,9 @@

{{ currentEntry.name }}

{{ 'Total time' | translate }} - + - {{ 'A total time is required and must be greater than 0.' | translate }} + {{ 'A total time is required and must be in min:secs format.' | translate }} diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts index a1c5a94dab..ca17a6a5a8 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts @@ -98,7 +98,7 @@ export class SpeakingTimesComponent implements OnDestroy { private translateService: TranslateService ) { this.totalTimeForm = this.formBuilder.group({ - totalTime: [0, [Validators.required, Validators.min(1)]] + totalTime: [0, [Validators.required, Validators.pattern(/^\d+:\d{2}$/)]] }); } @@ -114,7 +114,7 @@ export class SpeakingTimesComponent implements OnDestroy { public setTotalTime(speakingTimeId: number): void { this.currentEntry = this.structureLevels.get(speakingTimeId); - this.totalTimeForm.get(`totalTime`).setValue(this.currentEntry.countdown.countdown_time); + this.totalTimeForm.get(`totalTime`).setValue(this.duration(this.currentEntry.countdown.countdown_time)); const dialogSettings = infoDialogSettings; this.dialogRef = this.dialog.open(this.totalTimeDialog!, dialogSettings); this.dialogRef.afterClosed().subscribe(res => { @@ -191,7 +191,14 @@ export class SpeakingTimesComponent implements OnDestroy { return; } this.speakingTimesRepo.update([ - { id: this.currentEntry.id, initial_time: this.totalTimeForm.get(`totalTime`).value } + { + id: this.currentEntry.id, + initial_time: this.durationService.stringToDuration( + this.totalTimeForm.get(`totalTime`).value, + `m`, + true + ) + } ]); } From 94fffe7ba6647c5a1b627145cd283b35dee74b37 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:28:51 +0100 Subject: [PATCH 32/59] Change visibility of projection icon (#3402) --- .../projectable-list/projectable-list.component.ts | 3 ++- .../services/projectable-list.service.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/components/projectable-list/projectable-list.component.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/components/projectable-list/projectable-list.component.ts index 91730b1312..3dfdd72278 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/components/projectable-list/projectable-list.component.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/components/projectable-list/projectable-list.component.ts @@ -90,7 +90,8 @@ export class ProjectableListComponent this.service.isProjected(model); + public readonly isProjectedFn = (model: BaseProjectableViewModel) => + this.service.isProjectedOnReferenceProjector(model); public constructor( private operator: OperatorService, diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts index cc67c6d608..3c8ac3cb98 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts @@ -21,6 +21,15 @@ export class ProjectableListService { }); } + public isProjectedOnReferenceProjector(model: ProjectionBuildDescriptor | Projectable | null): boolean { + if (!model) { + return false; + } + const descriptor = this.ensureDescriptor(model); + const projector = this.activeMeetingService.meeting?.reference_projector; + return projector.current_projections.some(projection => projection.isEqualToDescriptor(descriptor)); + } + private ensureDescriptor(obj: ProjectionBuildDescriptor | Projectable): ProjectionBuildDescriptor { return isProjectable(obj) ? obj.getProjectionBuildDescriptor(this.meetingSettingsService)! : obj; } From c577efa63ebb86213a6b09205172c12b3a67bbf3 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Fri, 8 Mar 2024 13:58:06 +0100 Subject: [PATCH 33/59] Fix ordering of LoS with interposed questions (#3413) --- .../list-of-speakers-content.component.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index 24b84a90fd..aa275dd75c 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -499,8 +499,11 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme public async onSaveSorting(sortedSpeakerList: Selectable[] = this.listElement.sortedItems): Promise { return await this.speakerRepo .sortSpeakers( - this._listOfSpeakers!, - sortedSpeakerList.map(el => el.id) + this.listOfSpeakers, + this.listOfSpeakers.speakers + .filter(speaker => speaker.state == SpeakerState.INTERPOSED_QUESTION && !speaker.isCurrentSpeaker) + .map(speaker => speaker.id) + .concat(sortedSpeakerList.map(el => el.id)) ) .catch(this.raiseError); } From 3bd13cd327aacf28a85b9843d65cb28f9ffe7f08 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Fri, 8 Mar 2024 14:06:29 +0100 Subject: [PATCH 34/59] Fix interposed questions with structure level (#3415) --- .../domain/models/speakers/speech-state.ts | 2 + .../speakers/speaker-repository.service.ts | 6 + .../list-of-speakers-content.component.html | 62 ++++----- .../list-of-speakers-content.component.ts | 129 ++++++++++++------ .../view-structure-level-list-of-speakers.ts | 4 +- 5 files changed, 123 insertions(+), 80 deletions(-) diff --git a/client/src/app/domain/models/speakers/speech-state.ts b/client/src/app/domain/models/speakers/speech-state.ts index b62dbf3769..46be7b8b58 100644 --- a/client/src/app/domain/models/speakers/speech-state.ts +++ b/client/src/app/domain/models/speakers/speech-state.ts @@ -5,3 +5,5 @@ export enum SpeechState { INTERPOSED_QUESTION = `interposed_question`, INTERVENTION = `intervention` } + +export const SPECIAL_SPEECH_STATES = [SpeechState.INTERPOSED_QUESTION, SpeechState.INTERVENTION]; diff --git a/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts b/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts index 239952b7b7..c38cc5d19a 100644 --- a/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts +++ b/client/src/app/gateways/repositories/speakers/speaker-repository.service.ts @@ -74,6 +74,9 @@ export class SpeakerRepositoryService extends BaseMeetingRelatedRepository
- {{ speaker.getLOSName((structureLevelCountdownEnabled | async) === false) }} + {{ speaker.getLOSName(!structureLevelCountdownEnabled) }}
- {{ activeSpeaker.getLOSName((structureLevelCountdownEnabled | async) === false) }} + {{ activeSpeaker.getLOSName(!structureLevelCountdownEnabled) }}
@@ -136,7 +136,7 @@ - {{ speaker.getLOSName((structureLevelCountdownEnabled | async) === false) }} + {{ speaker.getLOSName(!structureLevelCountdownEnabled) }}
- {{ speaker.getLOSName((structureLevelCountdownEnabled | async) === false) }} + {{ speaker.getLOSName(!structureLevelCountdownEnabled) }}
- + - - - @@ -463,23 +451,13 @@ - @@ -503,7 +481,14 @@ - +

- + {{ supporter.full_name }}

diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.ts index a82d8082ce..3b8e422046 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.ts @@ -1,6 +1,6 @@ -import { Component } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; -import { distinctUntilChanged, map, Subscription } from 'rxjs'; +import { BehaviorSubject, distinctUntilChanged, map, Observable, Subscription } from 'rxjs'; import { Permission } from 'src/app/domain/definitions/permission'; import { Settings } from 'src/app/domain/models/meetings/meeting'; import { Motion } from 'src/app/domain/models/motions'; @@ -9,8 +9,10 @@ import { ChangeRecoMode } from 'src/app/domain/models/motions/motions.constants' import { ViewMotion, ViewMotionCategory, ViewMotionState, ViewTag } from 'src/app/site/pages/meetings/pages/motions'; import { MeetingControllerService } from 'src/app/site/pages/meetings/services/meeting-controller.service'; import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting'; +import { ViewUser } from 'src/app/site/pages/meetings/view-models/view-user'; import { OperatorService } from 'src/app/site/services/operator.service'; +import { ParticipantListSortService } from '../../../../../participants/pages/participant-list/services/participant-list-sort/participant-list-sort.service'; import { MotionForwardDialogService } from '../../../../components/motion-forward-dialog/services/motion-forward-dialog.service'; import { MotionEditorControllerService } from '../../../../modules/editors/services'; import { MotionSubmitterControllerService } from '../../../../modules/submitters/services'; @@ -24,7 +26,7 @@ import { SearchListDefinition } from '../motion-extension-field/motion-extension templateUrl: `./motion-meta-data.component.html`, styleUrls: [`./motion-meta-data.component.scss`] }) -export class MotionMetaDataComponent extends BaseMotionDetailChildComponent { +export class MotionMetaDataComponent extends BaseMotionDetailChildComponent implements OnInit, OnDestroy { public motionBlocks: MotionBlock[] = []; public categories: ViewMotionCategory[] = []; @@ -114,6 +116,12 @@ export class MotionMetaDataComponent extends BaseMotionDetailChildComponent { private _forwardingAvailable = false; + public get supportersObservable(): Observable { + return this._supportersSubject; + } + + private _supportersSubject = new BehaviorSubject([]); + /** * The subscription to the recommender config variable. */ @@ -127,7 +135,8 @@ export class MotionMetaDataComponent extends BaseMotionDetailChildComponent { private meetingController: MeetingControllerService, public motionSubmitterRepo: MotionSubmitterControllerService, public motionEditorRepo: MotionEditorControllerService, - public motionWorkingGroupSpeakerRepo: MotionWorkingGroupSpeakerControllerService + public motionWorkingGroupSpeakerRepo: MotionWorkingGroupSpeakerControllerService, + private participantSort: ParticipantListSortService ) { super(); @@ -140,6 +149,19 @@ export class MotionMetaDataComponent extends BaseMotionDetailChildComponent { } } + public ngOnInit(): void { + this.participantSort.initSorting(); + + this.subscriptions.push( + this.participantSort.getSortedViewModelListObservable().subscribe(() => this.updateSupportersSubject()) + ); + } + + public override ngOnDestroy(): void { + this.participantSort.exitSortService(); + super.ngOnDestroy(); + } + /** * Sets the state * @@ -300,6 +322,15 @@ export class MotionMetaDataComponent extends BaseMotionDetailChildComponent { return origin?.canAccess(); } + protected override onAfterSetMotion(previous: ViewMotion, current: ViewMotion): void { + super.onAfterSetMotion(previous, current); + this.updateSupportersSubject(); + } + + private async updateSupportersSubject(): Promise { + this._supportersSubject.next(await this.participantSort.sort(this.motion.supporter_users)); + } + private isViewMotion(toTest: ViewMotion | ViewMeeting): boolean { return toTest.COLLECTION === Motion.COLLECTION; } From 8c00ea083f4270aa142478c58045d38c21945ab9 Mon Sep 17 00:00:00 2001 From: reiterl Date: Mon, 11 Mar 2024 10:35:10 +0100 Subject: [PATCH 37/59] Add editors and working group speakers to pdf export (#3411) --- .../motions/services/export/definitions.ts | 4 +- .../motion-pdf.service/motion-pdf.service.ts | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/services/export/definitions.ts b/client/src/app/site/pages/meetings/pages/motions/services/export/definitions.ts index abba7e94d7..8b48a2df7a 100644 --- a/client/src/app/site/pages/meetings/pages/motions/services/export/definitions.ts +++ b/client/src/app/site/pages/meetings/pages/motions/services/export/definitions.ts @@ -15,7 +15,9 @@ export type InfoToExport = | 'id' | 'sequential_number' | 'referring_motions' - | 'allcomments'; + | 'allcomments' + | 'editors' + | 'working_group_speakers'; /** * Determines the possible file format of a motion export diff --git a/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts index ccc383b4af..f46e3bd926 100644 --- a/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/services/export/motion-pdf.service/motion-pdf.service.ts @@ -288,6 +288,45 @@ export class MotionPdfService { ]); } } + // editors + if (!infoToExport || infoToExport.includes(`editors`)) { + const motionEnableEditor = this.meetingSettingsService.instant(`motions_enable_editor`); + if (motionEnableEditor && motion.editors.length > 0) { + const editors = motion.editors.map(editor => editor.user.full_name).join(`, `); + + metaTableBody.push([ + { + text: `${this.translate.instant(`Editors`)}:`, + style: `boldText` + }, + { + text: editors + } + ]); + } + } + + // working group speakers + if (!infoToExport || infoToExport.includes(`working_group_speakers`)) { + const motionEnableWorkingGroupSpeaker = this.meetingSettingsService.instant( + `motions_enable_working_group_speaker` + ); + if (motionEnableWorkingGroupSpeaker && motion.working_group_speakers.length > 0) { + const working_group_speakers = motion.working_group_speakers + .map(speaker => speaker.user.full_name) + .join(`, `); + + metaTableBody.push([ + { + text: `${this.translate.instant(`Working group speakers`)}:`, + style: `boldText` + }, + { + text: working_group_speakers + } + ]); + } + } // state if (!infoToExport || infoToExport.includes(`state`)) { From 4db51d753346317229096fce9ea87338ddb5d9ea Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:27:32 +0100 Subject: [PATCH 38/59] Permission directive tests (#3408) * Perms directive tests * cml/oml directive tests --- .../perms/cml-perms.directive.spec.ts | 163 +++++++++++++++++- .../perms/oml-perms.directive.spec.ts | 131 +++++++++++++- .../directives/perms/perms.directive.spec.ts | 125 +++++++++++++- 3 files changed, 395 insertions(+), 24 deletions(-) diff --git a/client/src/app/ui/directives/perms/cml-perms.directive.spec.ts b/client/src/app/ui/directives/perms/cml-perms.directive.spec.ts index ab3ec16b3d..1f0a25dd20 100644 --- a/client/src/app/ui/directives/perms/cml-perms.directive.spec.ts +++ b/client/src/app/ui/directives/perms/cml-perms.directive.spec.ts @@ -1,17 +1,164 @@ -import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Observable, Subject } from 'rxjs'; +import { Id } from 'src/app/domain/definitions/key-types'; +import { CML } from 'src/app/domain/definitions/organization-permission'; +import { OperatorService } from 'src/app/site/services/operator.service'; import { CmlPermsDirective } from './cml-perms.directive'; +import { BasePermsTestComponent } from './perms.directive.spec'; -xdescribe(`CmlPermsDirective`, () => { - let directive: CmlPermsDirective; +type TestConditionalType = { + and: boolean; + or: boolean; + complement: boolean; + id: number; + nonAdmin: boolean; +}; - beforeEach(async () => { - await TestBed.configureTestingModule({}).compileComponents(); +@Component({ + template: ` +
+
+
+
+ ` +}) +class TestComponent extends BasePermsTestComponent { + public permission = CML.can_manage; + public constructor() { + super({ and: true, or: true, complement: true, id: 1, nonAdmin: false }); + } +} - directive = TestBed.inject(CmlPermsDirective); +class MockOperatorService { + public get operatorUpdated(): Observable { + return this._operatorUpdatedSubject; + } + + private _operatorUpdatedSubject = new Subject(); + private _permList: CML[] = []; + private _isAdmin = false; + + public hasCommitteePermissions(committeeId: Id | null, ...checkPerms: CML[]): boolean { + return this._isAdmin || this.hasCommitteePermissionsNonAdminCheck(committeeId, ...checkPerms); + } + + public hasCommitteePermissionsNonAdminCheck(committeeId: Id | null, ...checkPerms: CML[]): boolean { + return checkPerms.some(perm => this._permList.includes(perm)); + } + + public changeOperatorPermsForTest(newPermList: CML[], isAdmin?: boolean): void { + this._permList = newPermList; + if (isAdmin !== undefined) { + this._isAdmin = isAdmin; + } + this._operatorUpdatedSubject.next(); + } +} + +describe(`CmlPermsDirective`, () => { + let fixture: ComponentFixture; + let operatorService: MockOperatorService; + const update = () => { + fixture.detectChanges(); + jasmine.clock().tick(100000); + }; + const getElement = (css: string) => fixture.debugElement.query(By.css(css)); + + beforeEach(() => { + jasmine.clock().install(); + fixture = TestBed.configureTestingModule({ + declarations: [CmlPermsDirective, TestComponent], + providers: [CmlPermsDirective, { provide: OperatorService, useClass: MockOperatorService }] + }).createComponent(TestComponent); + + operatorService = TestBed.inject(OperatorService) as unknown as MockOperatorService; + update(); + }); + + afterEach(() => { + jasmine.clock().uninstall(); + }); + + it(`check if element gets restricted`, async () => { + expect(getElement(`#normal`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([CML.can_manage], true); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + }); + + it(`check if element gets restricted with non-admin-check`, async () => { + fixture.componentInstance.setTestComponentData({ nonAdmin: true }); + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([CML.can_manage], true); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeFalsy(); + }); + + it(`check if or condition works`, async () => { + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: false }); + update(); + expect(getElement(`#or`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: true }); + update(); + expect(getElement(`#or`)).toBeTruthy(); + }); + + it(`check if and condition works`, async () => { + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: false }); + update(); + expect(getElement(`#and`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: true }); + update(); + expect(getElement(`#and`)).toBeTruthy(); + }); + + it(`check if complement works`, async () => { + expect(getElement(`#complement`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#complement`)).toBeFalsy(); }); - it(`should create an instance`, () => { - expect(directive).toBeTruthy(); + it(`check what happens if there's no committee id`, async () => { + operatorService.changeOperatorPermsForTest([CML.can_manage]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ id: undefined }); + update(); + expect(getElement(`#normal`)).toBeFalsy(); }); }); diff --git a/client/src/app/ui/directives/perms/oml-perms.directive.spec.ts b/client/src/app/ui/directives/perms/oml-perms.directive.spec.ts index dedc910d1a..220245935e 100644 --- a/client/src/app/ui/directives/perms/oml-perms.directive.spec.ts +++ b/client/src/app/ui/directives/perms/oml-perms.directive.spec.ts @@ -1,17 +1,132 @@ -import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Observable, Subject } from 'rxjs'; +import { OML } from 'src/app/domain/definitions/organization-permission'; +import { OperatorService } from 'src/app/site/services/operator.service'; import { OmlPermsDirective } from './oml-perms.directive'; +import { BasePermsTestComponent } from './perms.directive.spec'; -xdescribe(`OmlPermsDirective`, () => { - let directive: OmlPermsDirective; +type TestConditionalType = { + and: boolean; + or: boolean; + complement: boolean; +}; - beforeEach(async () => { - await TestBed.configureTestingModule({}).compileComponents(); +@Component({ + template: ` +
+
+
+
+ + +
+
+ +
+
+ ` +}) +class TestComponent extends BasePermsTestComponent { + public permission = OML.can_manage_organization; + public constructor() { + super({ and: true, or: true, complement: true }); + } +} - directive = TestBed.inject(OmlPermsDirective); +class MockOperatorService { + public get operatorUpdated(): Observable { + return this._operatorUpdatedSubject; + } + + private _operatorUpdatedSubject = new Subject(); + private _permList: OML[] = []; + + public hasOrganizationPermissions(...checkPerms: OML[]): boolean { + return checkPerms.some(perm => this._permList.includes(perm)); + } + + public changeOperatorPermsForTest(newPermList: OML[]): void { + this._permList = newPermList; + this._operatorUpdatedSubject.next(); + } +} + +describe(`OmlPermsDirective`, () => { + let fixture: ComponentFixture; + let operatorService: MockOperatorService; + const update = () => { + fixture.detectChanges(); + jasmine.clock().tick(100000); + }; + const getElement = (css: string) => fixture.debugElement.query(By.css(css)); + + beforeEach(() => { + jasmine.clock().install(); + fixture = TestBed.configureTestingModule({ + declarations: [OmlPermsDirective, TestComponent], + providers: [OmlPermsDirective, { provide: OperatorService, useClass: MockOperatorService }] + }).createComponent(TestComponent); + + operatorService = TestBed.inject(OperatorService) as unknown as MockOperatorService; + update(); + }); + + afterEach(() => { + jasmine.clock().uninstall(); + }); + + it(`check if element gets restricted`, async () => { + expect(getElement(`#normal`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([OML.can_manage_organization]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeFalsy(); + }); + + it(`check if or condition works`, async () => { + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: false }); + update(); + expect(getElement(`#or`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([OML.can_manage_organization]); + update(); + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: true }); + update(); + expect(getElement(`#or`)).toBeTruthy(); + }); + + it(`check if and condition works`, async () => { + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: false }); + update(); + expect(getElement(`#and`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([OML.can_manage_organization]); + update(); + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: true }); + update(); + expect(getElement(`#and`)).toBeTruthy(); + }); + + it(`check if complement works`, async () => { + expect(getElement(`#complement`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([OML.can_manage_organization]); + update(); + expect(getElement(`#complement`)).toBeFalsy(); }); - it(`should create an instance`, () => { - expect(directive).toBeTruthy(); + it(`check if then and else work`, async () => { + expect(getElement(`#else`)).toBeTruthy(); + expect(getElement(`#then`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([OML.can_manage_organization]); + update(); + expect(getElement(`#else`)).toBeFalsy(); + expect(getElement(`#then`)).toBeTruthy(); }); }); diff --git a/client/src/app/ui/directives/perms/perms.directive.spec.ts b/client/src/app/ui/directives/perms/perms.directive.spec.ts index 37e107acab..aa2b93a85f 100644 --- a/client/src/app/ui/directives/perms/perms.directive.spec.ts +++ b/client/src/app/ui/directives/perms/perms.directive.spec.ts @@ -1,17 +1,126 @@ -import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Observable, Subject } from 'rxjs'; +import { Permission } from 'src/app/domain/definitions/permission'; +import { OperatorService } from 'src/app/site/services/operator.service'; import { PermsDirective } from './perms.directive'; -xdescribe(`PermsDirective`, () => { - let directive: PermsDirective; +type TestConditionalType = { + and: boolean; + or: boolean; + complement: boolean; +}; - beforeEach(async () => { - await TestBed.configureTestingModule({}).compileComponents(); +export class BasePermsTestComponent { + public constructor(public conditionals: ComponentDataType) {} - directive = TestBed.inject(PermsDirective); + public setTestComponentData(conditionals: Partial): void { + for (const key of Object.keys(conditionals)) { + this.conditionals[key] = conditionals[key]; + } + } +} + +@Component({ + template: ` +
+
+
+
+ ` +}) +class TestComponent extends BasePermsTestComponent { + public readonly permission = Permission.listOfSpeakersCanSee; + + public constructor() { + super({ and: true, or: true, complement: true }); + } +} + +class MockOperatorService { + public get operatorUpdated(): Observable { + return this._operatorUpdatedSubject; + } + + private _operatorUpdatedSubject = new Subject(); + private _permList: Permission[] = []; + + public hasPerms(...checkPerms: Permission[]): boolean { + return checkPerms.some(perm => this._permList.includes(perm)); + } + + public changeOperatorPermsForTest(newPermList: Permission[]): void { + this._permList = newPermList; + this._operatorUpdatedSubject.next(); + } +} + +describe(`PermsDirective`, () => { + let fixture: ComponentFixture; + let operatorService: MockOperatorService; + const update = () => { + fixture.detectChanges(); + jasmine.clock().tick(100000); + }; + const getElement = (css: string) => fixture.debugElement.query(By.css(css)); + + beforeEach(() => { + jasmine.clock().install(); + fixture = TestBed.configureTestingModule({ + declarations: [PermsDirective, TestComponent], + providers: [PermsDirective, { provide: OperatorService, useClass: MockOperatorService }] + }).createComponent(TestComponent); + + operatorService = TestBed.inject(OperatorService) as unknown as MockOperatorService; + update(); + }); + + afterEach(() => { + jasmine.clock().uninstall(); + }); + + it(`check if element gets restricted`, async () => { + expect(getElement(`#normal`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([Permission.listOfSpeakersCanSee]); + update(); + expect(getElement(`#normal`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([]); + update(); + expect(getElement(`#normal`)).toBeFalsy(); + }); + + it(`check if or condition works`, async () => { + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: false }); + update(); + expect(getElement(`#or`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([Permission.listOfSpeakersCanSee]); + update(); + expect(getElement(`#or`)).toBeTruthy(); + fixture.componentInstance.setTestComponentData({ or: true }); + update(); + expect(getElement(`#or`)).toBeTruthy(); + }); + + it(`check if and condition works`, async () => { + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: false }); + update(); + expect(getElement(`#and`)).toBeFalsy(); + operatorService.changeOperatorPermsForTest([Permission.listOfSpeakersCanSee]); + update(); + expect(getElement(`#and`)).toBeFalsy(); + fixture.componentInstance.setTestComponentData({ and: true }); + update(); + expect(getElement(`#and`)).toBeTruthy(); }); - it(`should create an instance`, () => { - expect(directive).toBeTruthy(); + it(`check if complement works`, async () => { + expect(getElement(`#complement`)).toBeTruthy(); + operatorService.changeOperatorPermsForTest([Permission.listOfSpeakersCanSee]); + update(); + expect(getElement(`#complement`)).toBeFalsy(); }); }); From 8684f73040ac4260436ac8d12a9928bd859d1506 Mon Sep 17 00:00:00 2001 From: "openslides-automation[bot]" <125256978+openslides-automation[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:05:16 +0000 Subject: [PATCH 39/59] Update meta repository (#3391) --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index c1f547f0a9..9e390b0b16 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit c1f547f0a96284a5074b86cff17ce37832948925 +Subproject commit 9e390b0b16af49e4c57b1802e8912c8ac550a634 From 00787ac0a32583186da1d72639d838ed6f33a344 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:11:31 +0100 Subject: [PATCH 40/59] marker changes (#3421) --- .../list-of-speakers-content.component.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html index 442f6faa7a..ecde9f4d1b 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -432,7 +432,9 @@
{{ 'Received votes' | translate }} - +
diff --git a/client/src/app/site/pages/meetings/modules/poll/poll.module.ts b/client/src/app/site/pages/meetings/modules/poll/poll.module.ts index e282b17559..2922822243 100644 --- a/client/src/app/site/pages/meetings/modules/poll/poll.module.ts +++ b/client/src/app/site/pages/meetings/modules/poll/poll.module.ts @@ -5,7 +5,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.scss b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.scss index 2881910643..2435c6bf1c 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.scss +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.scss @@ -84,7 +84,8 @@ .submit-vote-indicator { text-align: center; - .mat-spinner { + .mat-mdc-progress-spinner { + display: block; margin: auto; } } diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/topic-poll.module.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/topic-poll.module.ts index 7a26b4f5c0..10b8ddbb37 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/topic-poll.module.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/topic-poll.module.ts @@ -9,7 +9,7 @@ import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/lega import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; diff --git a/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/assignment-poll.module.ts b/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/assignment-poll.module.ts index 42b3e9f329..19defbbee2 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/assignment-poll.module.ts +++ b/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/assignment-poll.module.ts @@ -10,7 +10,7 @@ import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-c import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { RouterModule } from '@angular/router'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; diff --git a/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.scss b/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.scss index 7c550fb741..00255615e2 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.scss +++ b/client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.scss @@ -84,7 +84,8 @@ .submit-vote-indicator { text-align: center; - .mat-spinner { + .mat-mdc-progress-spinner { + display: block; margin: auto; } } diff --git a/client/src/app/site/pages/meetings/pages/history/services/history.service.ts b/client/src/app/site/pages/meetings/pages/history/services/history.service.ts index bbd5ba10ce..7c9e3dbf72 100644 --- a/client/src/app/site/pages/meetings/pages/history/services/history.service.ts +++ b/client/src/app/site/pages/meetings/pages/history/services/history.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { combineLatest } from 'rxjs'; import { Fqid } from 'src/app/domain/definitions/key-types'; import { ActionService } from 'src/app/gateways/actions'; diff --git a/client/src/app/site/pages/meetings/pages/interaction/modules/interaction-container/interaction-container.module.ts b/client/src/app/site/pages/meetings/pages/interaction/modules/interaction-container/interaction-container.module.ts index 52f76b854e..92ba1db4fd 100644 --- a/client/src/app/site/pages/meetings/pages/interaction/modules/interaction-container/interaction-container.module.ts +++ b/client/src/app/site/pages/meetings/pages/interaction/modules/interaction-container/interaction-container.module.ts @@ -4,7 +4,7 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip'; import { NgParticlesModule } from 'ng-particles'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts index d5f67a5741..62c4585d0a 100644 --- a/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-forward-dialog/services/motion-forward-dialog.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, filter, firstValueFrom, Observable } from 'rxjs'; import { Ids } from 'src/app/domain/definitions/key-types'; diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts index 5e67547ecc..61d162fcbb 100644 --- a/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { marker as _ } from '@colsen1991/ngx-translate-extract-marker'; import { TranslateService } from '@ngx-translate/core'; import { Id, Ids } from 'src/app/domain/definitions/key-types'; diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.scss b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.scss index 740922b160..01a52b61fb 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.scss +++ b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.scss @@ -19,7 +19,8 @@ .submit-vote-indicator { margin-top: 1em; text-align: center; - .mat-spinner { + .mat-mdc-progress-spinner { + display: block; margin: auto; } } diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/motion-poll.module.ts b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/motion-poll.module.ts index f2dd36faa8..bf8a0439c4 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/motion-poll.module.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/motion-poll.module.ts @@ -10,7 +10,7 @@ import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-c import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts index 6561913766..2c002c61df 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/motion-detail.module.ts @@ -12,7 +12,7 @@ import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/ import { MatLegacyChipsModule as MatChipsModule } from '@angular/material/legacy-chips'; import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; import { MatStepperModule } from '@angular/material/stepper'; diff --git a/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts b/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts index 2498c8e0cc..496361b8f0 100644 --- a/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts +++ b/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { Title } from '@angular/platform-browser'; import { Router } from '@angular/router'; diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/account-detail.module.ts b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/account-detail.module.ts index 90000cb2d3..4ac68800d0 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/account-detail.module.ts +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/account-detail.module.ts @@ -6,7 +6,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-password/account-password.component.ts b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-password/account-password.component.ts index 53501f6292..69c6e9d125 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-password/account-password.component.ts +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-password/account-password.component.ts @@ -1,5 +1,5 @@ import { AfterViewInit, Component, OnInit } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { Id } from 'src/app/domain/definitions/key-types'; import { OML } from 'src/app/domain/definitions/organization-permission'; import { BaseComponent } from 'src/app/site/base/base.component'; diff --git a/client/src/app/site/pages/organization/pages/dashboard/pages/dashboard-detail/dashboard-detail.module.ts b/client/src/app/site/pages/organization/pages/dashboard/pages/dashboard-detail/dashboard-detail.module.ts index c71a8e336d..9cf0b15b44 100644 --- a/client/src/app/site/pages/organization/pages/dashboard/pages/dashboard-detail/dashboard-detail.module.ts +++ b/client/src/app/site/pages/organization/pages/dashboard/pages/dashboard-detail/dashboard-detail.module.ts @@ -5,7 +5,7 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; import { HeadBarModule } from 'src/app/ui/modules/head-bar'; diff --git a/client/src/app/site/pages/organization/pages/organization-info/organization-info.module.ts b/client/src/app/site/pages/organization/pages/organization-info/organization-info.module.ts index 009dcfd09e..9622269fd2 100644 --- a/client/src/app/site/pages/organization/pages/organization-info/organization-info.module.ts +++ b/client/src/app/site/pages/organization/pages/organization-info/organization-info.module.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { InfoModule } from 'src/app/site/modules/info'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; import { DirectivesModule } from 'src/app/ui/directives'; diff --git a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts index 72d92ce552..5982bb7674 100644 --- a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts +++ b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; import { Observable, Subscriber } from 'rxjs'; import { Id } from 'src/app/domain/definitions/key-types'; diff --git a/client/src/app/site/services/component-service-collector.service.ts b/client/src/app/site/services/component-service-collector.service.ts index 95a49f85ff..f03f02f009 100644 --- a/client/src/app/site/services/component-service-collector.service.ts +++ b/client/src/app/site/services/component-service-collector.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { Title } from '@angular/platform-browser'; import { Router } from '@angular/router'; diff --git a/client/src/app/site/services/import-service-collector.service.ts b/client/src/app/site/services/import-service-collector.service.ts index 204712db5c..7c47bf3c86 100644 --- a/client/src/app/site/services/import-service-collector.service.ts +++ b/client/src/app/site/services/import-service-collector.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; import { Papa } from 'ngx-papaparse'; diff --git a/client/src/app/ui/modules/file-upload/file-upload.module.ts b/client/src/app/ui/modules/file-upload/file-upload.module.ts index 7b4a69f68a..3add0690b8 100644 --- a/client/src/app/ui/modules/file-upload/file-upload.module.ts +++ b/client/src/app/ui/modules/file-upload/file-upload.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { NgxFileDropModule } from 'ngx-file-drop'; import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations'; diff --git a/client/src/app/ui/modules/sidenav/sidenav.module.ts b/client/src/app/ui/modules/sidenav/sidenav.module.ts index 7d4ccd688f..cf4af7cef9 100644 --- a/client/src/app/ui/modules/sidenav/sidenav.module.ts +++ b/client/src/app/ui/modules/sidenav/sidenav.module.ts @@ -4,7 +4,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; diff --git a/client/src/assets/styles/theme-styles.scss b/client/src/assets/styles/theme-styles.scss index 0e8681a939..2762749f91 100644 --- a/client/src/assets/styles/theme-styles.scss +++ b/client/src/assets/styles/theme-styles.scss @@ -8,12 +8,19 @@ /** Global component style definition */ @import 'global-components-style.scss'; +@mixin os-var-overwrites { + .mat-mdc-progress-bar { + --mdc-linear-progress-track-color: var(--theme-primary-100); + } +} + @include mat.all-component-themes($openslides-light-theme); .openslides-light-theme { /*TODO(mdc-migration): Remove all-legacy-component-themes once all legacy components are migrated */ @include mat.all-legacy-component-themes($openslides-light-theme); @include os-component-themes($openslides-light-theme); + @include os-var-overwrites(); } .openslides-dark-theme { @@ -21,6 +28,7 @@ @include mat.all-legacy-component-colors($openslides-dark-theme); @include mat.all-component-colors($openslides-dark-theme); @include os-component-themes($openslides-dark-theme); + @include os-var-overwrites(); } .mat-calendar-body-cell { From d0723d21f3661ab47d84eade06d6cbfeb538a260 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Tue, 12 Mar 2024 16:55:16 +0100 Subject: [PATCH 42/59] Add eslint rules (#3427) --- client/.eslintrc.js | 4 ++++ .../src/app/domain/models/meetings/meeting.ts | 18 +++++++++--------- .../action-worker-watch.service.ts | 6 +++--- .../html-to-pdf.service/html-to-pdf.service.ts | 2 +- .../services/progress-snack-bar.service.ts | 2 +- ...et-active-users-amount-presenter.service.ts | 2 +- .../action-worker-repository.service.ts | 2 +- .../assignment-candidate-repository.service.ts | 2 +- .../assignment-repository.service.ts | 2 +- .../chat-group-repository.service.ts | 2 +- .../motion-block-repository.service.ts | 2 +- .../motion-category-repository.service.ts | 2 +- ...change-recommendation-repository.service.ts | 2 +- .../motion-comment-repository.service.ts | 2 +- ...otion-comment-section-repository.service.ts | 2 +- .../motion-repository.service.ts | 2 +- .../motion-state-repository.service.ts | 2 +- ...ion-statute-paragraph-repository.service.ts | 2 +- .../motion-workflow-repository.service.ts | 2 +- ...int-of-order-category-repository.service.ts | 2 +- .../repository-service-collector.service.ts | 2 +- .../utils/import/import-process.ts | 2 +- .../utils/import/json-import-file-utils.ts | 2 +- .../import/static-after-import-handler.ts | 6 +++--- .../openslides-main.component.ts | 2 +- .../services/shared-worker.service.ts | 2 +- .../chip-select-chip.component.ts | 2 +- .../chip-select/chip-select.component.ts | 6 +++--- .../global-search/global-search.component.ts | 2 +- .../info-actions/info-actions.component.ts | 2 +- .../site-wrapper/services/banner.service.ts | 16 ++++++++-------- .../speaking-times/speaking-times.component.ts | 4 ++-- ...list-of-speakers-content-title.directive.ts | 2 +- .../agenda-content-object-form.service.ts | 5 ++++- .../projectable-title.component.ts | 2 +- .../services/projectable-list.service.ts | 2 +- .../projection-dialog.component.ts | 4 ++-- .../services/projection-dialog.service.ts | 2 +- .../entitled-users-table.component.ts | 5 ++++- .../poll-controller.service.ts | 2 +- .../vote-controller.service.ts | 2 +- .../services/speaker-controller.service.ts | 2 +- .../topic-poll-dialog.component.ts | 13 ++++++++----- .../topic-export.service.ts | 2 +- .../topic-controller.service.ts | 2 +- .../agenda-item-export.service.ts | 2 +- .../agenda-item-multiselect.service.ts | 2 +- .../agenda-sort/agenda-sort.component.ts | 2 +- .../agenda-item-controller.service.ts | 2 +- .../assignment-candidate-controller.service.ts | 2 +- .../services/assignment-sort-list.service.ts | 2 +- .../services/assignment-controller.service.ts | 2 +- ...chat-group-detail-message-form.component.ts | 2 +- .../services/chat-group-controller.service.ts | 2 +- .../chat-message-controller.service.ts | 2 +- .../interaction/services/broadcast.service.ts | 2 +- .../services/interaction-receive.service.ts | 2 +- .../services/mediafile-common.service.ts | 2 +- .../services/mediafile-controller.service.ts | 2 +- .../motion-category-controller.service.ts | 2 +- .../motion-comment-controller.service.ts | 2 +- ...otion-comment-section-controller.service.ts | 2 +- .../motion-poll-controller.service.ts | 2 +- .../motion-state-controller.service.ts | 2 +- ...ion-statute-paragraph-controller.service.ts | 2 +- .../tag-controller.service.ts | 2 +- .../motion-workflow-controller.service.ts | 2 +- .../motion-list-info-dialog.component.ts | 2 +- .../workflow-export.service.ts | 2 +- .../amendment-list-sort.service.ts | 2 +- .../participant-list-info-dialog.component.ts | 2 +- .../projection-controller.service.ts | 2 +- .../projector-countdown-controller.service.ts | 2 +- .../projector-message-controller.service.ts | 2 +- .../export/meeting-pdf-export.service.ts | 2 +- ...ting-component-service-collector.service.ts | 2 +- ...ing-controller-service-collector.service.ts | 2 +- .../account-list-search.service.ts | 2 +- .../autoupdate-communication.service.ts | 2 +- .../stream-handler.ts | 2 +- .../component-service-collector.service.ts | 2 +- .../trim-on-paste/trim-on-paste.directive.ts | 4 ++-- .../comma-separated-listing.component.ts | 4 ++-- .../base-datepicker.component.ts | 4 ++-- .../datepicker/datepicker.component.ts | 2 +- .../daterangepicker.component.ts | 2 +- .../expandable-content-wrapper.component.ts | 2 +- .../file-upload/file-upload.component.ts | 2 +- .../components/head-bar/head-bar.component.ts | 2 +- .../import-list-first-tab.directive.ts | 2 +- .../import-list-last-tab.directive.ts | 2 +- .../scrolling-table.component.ts | 2 +- ...ch-selector-not-found-template.directive.ts | 2 +- .../services/chess-challenge.service.ts | 2 +- .../src/app/ui/pipes/entries/entries.pipe.ts | 2 +- .../autoupdate/autoupdate-stream-pool.ts | 2 +- .../app/worker/autoupdate/autoupdate-stream.ts | 2 +- .../autoupdate/autoupdate-subscription.ts | 2 +- .../page-objects/components/list-component.ts | 2 +- .../page-objects/meeting/home/detail.ts | 2 +- .../page-objects/meeting/home/edit.ts | 2 +- .../page-objects/meeting/motion/detail.ts | 2 +- 102 files changed, 144 insertions(+), 131 deletions(-) diff --git a/client/.eslintrc.js b/client/.eslintrc.js index 5ac1cddc1e..d8ccee6133 100644 --- a/client/.eslintrc.js +++ b/client/.eslintrc.js @@ -66,6 +66,8 @@ module.exports = { '@typescript-eslint/no-this-alias': ['error'], '@typescript-eslint/adjacent-overload-signatures': ['error'], '@typescript-eslint/ban-types': ['error'], + '@typescript-eslint/explicit-member-accessibility': ['error'], + '@typescript-eslint/explicit-function-return-type': ['warn'], 'jsdoc/require-example': ['off'], 'jsdoc/newline-after-description': ['off'], @@ -85,6 +87,8 @@ module.exports = { files: ['*.spec.ts'], rules: { 'no-restricted-globals': ['error', 'fdescribe', 'fit'], + '@typescript-eslint/explicit-member-accessibility': ['off'], + '@typescript-eslint/explicit-function-return-type': ['off'], } }, { diff --git a/client/src/app/domain/models/meetings/meeting.ts b/client/src/app/domain/models/meetings/meeting.ts index c30f2bcfa3..e8e621c53e 100644 --- a/client/src/app/domain/models/meetings/meeting.ts +++ b/client/src/app/domain/models/meetings/meeting.ts @@ -179,17 +179,17 @@ export class Settings { public assignment_poll_default_backend!: PollBackendDurationType; //topic poll - topic_poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; + public topic_poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; //default poll - poll_ballot_paper_selection: BallotPaperSelection; - poll_ballot_paper_number: number; - poll_sort_poll_result_by_votes: boolean; - poll_default_type: PollType; - poll_default_method: PollMethod; - poll_default_onehundred_percent_base: PollPercentBase; - poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; - poll_default_backend: PollBackendDurationType; + public poll_ballot_paper_selection: BallotPaperSelection; + public poll_ballot_paper_number: number; + public poll_sort_poll_result_by_votes: boolean; + public poll_default_type: PollType; + public poll_default_method: PollMethod; + public poll_default_onehundred_percent_base: PollPercentBase; + public poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; + public poll_default_backend: PollBackendDurationType; //SSO public external_id!: string; diff --git a/client/src/app/gateways/action-worker-watch/action-worker-watch.service.ts b/client/src/app/gateways/action-worker-watch/action-worker-watch.service.ts index 7446d7017b..d351d4b0ff 100644 --- a/client/src/app/gateways/action-worker-watch/action-worker-watch.service.ts +++ b/client/src/app/gateways/action-worker-watch/action-worker-watch.service.ts @@ -108,7 +108,7 @@ export class ActionWorkerWatchService { * Should only be used if the option to manage the handling of these specific action workers is done in a separate component. * @param actionName the (backend) name of the action for which there shouldn't be a dialog. */ - public disableWaitDialog(actionName: string) { + public disableWaitDialog(actionName: string): void { if (!this._noDialogActionNames.find(name => name === actionName)) { this._noDialogActionNames.push(actionName); } @@ -117,7 +117,7 @@ export class ActionWorkerWatchService { /** * May be used to reverse the effects of enableWaitDialog. */ - public enableWaitDialog(actionName: string) { + public enableWaitDialog(actionName: string): void { const index = this._noDialogActionNames.findIndex(name => name === actionName); if (!(index === -1)) { this._noDialogActionNames.splice(index, 1); @@ -163,7 +163,7 @@ export class ActionWorkerWatchService { /** * Deletes all workers from _toBeDeleted that have been in there for more than 10 seconds. */ - private cleanup() { + private cleanup(): void { const toDelete = this._toBeDeleted .filter(date => (Date.now() - date.timestamp) / 1000 > 10) .map(date => date.workerId); diff --git a/client/src/app/gateways/export/html-to-pdf.service/html-to-pdf.service.ts b/client/src/app/gateways/export/html-to-pdf.service/html-to-pdf.service.ts index aee8866e39..7ab839c5b8 100644 --- a/client/src/app/gateways/export/html-to-pdf.service/html-to-pdf.service.ts +++ b/client/src/app/gateways/export/html-to-pdf.service/html-to-pdf.service.ts @@ -372,7 +372,7 @@ export class HtmlToPdfService { * Takes a list of paragraphs and the data from which to calculate the next paragraph and appends the child node. * Can be overwritten by subclasses for more specific functionality. */ - protected addChildNodeIntoParagraphs(paragraph: any[], data: ChildNodeParagraphPayload) { + protected addChildNodeIntoParagraphs(paragraph: any[], data: ChildNodeParagraphPayload): void { const parsedElement = this.parseElement(data.child, data.styles); paragraph.push(parsedElement); } diff --git a/client/src/app/gateways/export/progress-snack-bar/services/progress-snack-bar.service.ts b/client/src/app/gateways/export/progress-snack-bar/services/progress-snack-bar.service.ts index 29b32b15e2..7aa0303b56 100644 --- a/client/src/app/gateways/export/progress-snack-bar/services/progress-snack-bar.service.ts +++ b/client/src/app/gateways/export/progress-snack-bar/services/progress-snack-bar.service.ts @@ -8,7 +8,7 @@ import { ProgressSnackBarServiceModule } from './progress-snack-bar-service.modu providedIn: ProgressSnackBarServiceModule }) export class ProgressSnackBarService { - constructor(private matSnackBar: MatSnackBar) {} + public constructor(private matSnackBar: MatSnackBar) {} public async open(config?: MatSnackBarConfig): Promise> { const module = await import(`../progress-snack-bar.module`).then(m => m.ProgressSnackBarModule); diff --git a/client/src/app/gateways/presenter/get-active-users-amount-presenter.service.ts b/client/src/app/gateways/presenter/get-active-users-amount-presenter.service.ts index 16c0e44069..2987db1cee 100644 --- a/client/src/app/gateways/presenter/get-active-users-amount-presenter.service.ts +++ b/client/src/app/gateways/presenter/get-active-users-amount-presenter.service.ts @@ -11,7 +11,7 @@ interface GetActiveUsersPresenterResult { providedIn: `root` }) export class GetActiveUsersAmountPresenterService { - constructor(private presenter: PresenterService) {} + public constructor(private presenter: PresenterService) {} public async call(): Promise { const response = await this.presenter.call(Presenter.GET_ACTIVE_USER_AMOUNT, {}); diff --git a/client/src/app/gateways/repositories/action-worker/action-worker-repository.service.ts b/client/src/app/gateways/repositories/action-worker/action-worker-repository.service.ts index 601466b799..f2482a7e38 100644 --- a/client/src/app/gateways/repositories/action-worker/action-worker-repository.service.ts +++ b/client/src/app/gateways/repositories/action-worker/action-worker-repository.service.ts @@ -9,7 +9,7 @@ import { ViewActionWorker } from './view-action-worker'; providedIn: `root` }) export class ActionWorkerRepositoryService extends BaseRepository { - constructor(repositoryServiceCollector: RepositoryServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryServiceCollectorService) { super(repositoryServiceCollector, ActionWorker); } diff --git a/client/src/app/gateways/repositories/assignments/assignment-candidate-repository.service/assignment-candidate-repository.service.ts b/client/src/app/gateways/repositories/assignments/assignment-candidate-repository.service/assignment-candidate-repository.service.ts index f8a843c688..848b7cbdaa 100644 --- a/client/src/app/gateways/repositories/assignments/assignment-candidate-repository.service/assignment-candidate-repository.service.ts +++ b/client/src/app/gateways/repositories/assignments/assignment-candidate-repository.service/assignment-candidate-repository.service.ts @@ -17,7 +17,7 @@ export class AssignmentCandidateRepositoryService extends BaseMeetingRelatedRepo ViewAssignmentCandidate, AssignmentCandidate > { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, AssignmentCandidate); } diff --git a/client/src/app/gateways/repositories/assignments/assignment-repository.service/assignment-repository.service.ts b/client/src/app/gateways/repositories/assignments/assignment-repository.service/assignment-repository.service.ts index 24ce17f750..2723adda1d 100644 --- a/client/src/app/gateways/repositories/assignments/assignment-repository.service/assignment-repository.service.ts +++ b/client/src/app/gateways/repositories/assignments/assignment-repository.service/assignment-repository.service.ts @@ -18,7 +18,7 @@ export class AssignmentRepositoryService extends BaseAgendaItemAndListOfSpeakers ViewAssignment, Assignment > { - constructor( + public constructor( repositoryServiceCollector: RepositoryMeetingServiceCollectorService, agendaItemRepo: AgendaItemRepositoryService ) { diff --git a/client/src/app/gateways/repositories/chat/chat-group-repository.service/chat-group-repository.service.ts b/client/src/app/gateways/repositories/chat/chat-group-repository.service/chat-group-repository.service.ts index 37564f269f..3c9bc31354 100644 --- a/client/src/app/gateways/repositories/chat/chat-group-repository.service/chat-group-repository.service.ts +++ b/client/src/app/gateways/repositories/chat/chat-group-repository.service/chat-group-repository.service.ts @@ -12,7 +12,7 @@ import { ChatGroupAction } from './chat-group.action'; providedIn: `root` }) export class ChatGroupRepositoryService extends BaseMeetingRelatedRepository { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, ChatGroup); } diff --git a/client/src/app/gateways/repositories/motions/motion-block-repository.service/motion-block-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-block-repository.service/motion-block-repository.service.ts index 101edab7e7..6c94552ac5 100644 --- a/client/src/app/gateways/repositories/motions/motion-block-repository.service/motion-block-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-block-repository.service/motion-block-repository.service.ts @@ -15,7 +15,7 @@ export class MotionBlockRepositoryService extends BaseAgendaItemAndListOfSpeaker ViewMotionBlock, MotionBlock > { - constructor( + public constructor( repositoryServiceCollector: RepositoryMeetingServiceCollectorService, agendaItemRepo: AgendaItemRepositoryService ) { diff --git a/client/src/app/gateways/repositories/motions/motion-category-repository.service/motion-category-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-category-repository.service/motion-category-repository.service.ts index f3a67d19a9..b0b1625856 100644 --- a/client/src/app/gateways/repositories/motions/motion-category-repository.service/motion-category-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-category-repository.service/motion-category-repository.service.ts @@ -14,7 +14,7 @@ import { MotionCategoryAction } from './motion-category.action'; providedIn: `root` }) export class MotionCategoryRepositoryService extends BaseMeetingRelatedRepository { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionCategory); } diff --git a/client/src/app/gateways/repositories/motions/motion-change-recommendation-repository.service/motion-change-recommendation-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-change-recommendation-repository.service/motion-change-recommendation-repository.service.ts index f1a82a000d..a7a59435be 100644 --- a/client/src/app/gateways/repositories/motions/motion-change-recommendation-repository.service/motion-change-recommendation-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-change-recommendation-repository.service/motion-change-recommendation-repository.service.ts @@ -14,7 +14,7 @@ export class MotionChangeRecommendationRepositoryService extends BaseMeetingRela ViewMotionChangeRecommendation, MotionChangeRecommendation > { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionChangeRecommendation); } diff --git a/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-repository.service.ts index 6cb2383483..297f08c77f 100644 --- a/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-repository.service.ts @@ -11,7 +11,7 @@ import { MotionCommentAction } from './motion-comment.action'; providedIn: `root` }) export class MotionCommentRepositoryService extends BaseMeetingRelatedRepository { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionComment); } diff --git a/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-section-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-section-repository.service.ts index e4786e6d8f..013f6ed941 100644 --- a/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-section-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-comments/motion-comment-section-repository.service.ts @@ -14,7 +14,7 @@ export class MotionCommentSectionRepositoryService extends BaseMeetingRelatedRep ViewMotionCommentSection, MotionCommentSection > { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionCommentSection); this.viewModelSortFn = (a: ViewMotionCommentSection, b: ViewMotionCommentSection) => { diff --git a/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts index c12aecb467..9912063f65 100644 --- a/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-repository.service/motion-repository.service.ts @@ -31,7 +31,7 @@ export class MotionRepositoryService extends BaseAgendaItemAndListOfSpeakersCont */ protected sortProperty: SortProperty = `number`; - constructor( + public constructor( repositoryServiceCollector: RepositoryMeetingServiceCollectorService, agendaItemRepo: AgendaItemRepositoryService, private treeService: TreeService diff --git a/client/src/app/gateways/repositories/motions/motion-state-repository.service/motion-state-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-state-repository.service/motion-state-repository.service.ts index 786d0395ee..4698029573 100644 --- a/client/src/app/gateways/repositories/motions/motion-state-repository.service/motion-state-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-state-repository.service/motion-state-repository.service.ts @@ -12,7 +12,7 @@ import { MotionStateAction } from './motion-state.action'; providedIn: `root` }) export class MotionStateRepositoryService extends BaseMeetingRelatedRepository { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionState); } diff --git a/client/src/app/gateways/repositories/motions/motion-statute-paragraph-repository.serivce/motion-statute-paragraph-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-statute-paragraph-repository.serivce/motion-statute-paragraph-repository.service.ts index ddd35ee92b..326622bd42 100644 --- a/client/src/app/gateways/repositories/motions/motion-statute-paragraph-repository.serivce/motion-statute-paragraph-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-statute-paragraph-repository.serivce/motion-statute-paragraph-repository.service.ts @@ -15,7 +15,7 @@ export class MotionStatuteParagraphRepositoryService extends BaseMeetingRelatedR ViewMotionStatuteParagraph, MotionStatuteParagraph > { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionStatuteParagraph); } diff --git a/client/src/app/gateways/repositories/motions/motion-workflow-repository.service/motion-workflow-repository.service.ts b/client/src/app/gateways/repositories/motions/motion-workflow-repository.service/motion-workflow-repository.service.ts index e143109ca9..f2b2edeba4 100644 --- a/client/src/app/gateways/repositories/motions/motion-workflow-repository.service/motion-workflow-repository.service.ts +++ b/client/src/app/gateways/repositories/motions/motion-workflow-repository.service/motion-workflow-repository.service.ts @@ -13,7 +13,7 @@ import { MotionWorkflowAction } from './motion-workflow.action'; providedIn: `root` }) export class MotionWorkflowRepositoryService extends BaseMeetingRelatedRepository { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, MotionWorkflow); } diff --git a/client/src/app/gateways/repositories/point-of-order-category/point-of-order-category-repository.service.ts b/client/src/app/gateways/repositories/point-of-order-category/point-of-order-category-repository.service.ts index 3602a12b15..b2fd72775d 100644 --- a/client/src/app/gateways/repositories/point-of-order-category/point-of-order-category-repository.service.ts +++ b/client/src/app/gateways/repositories/point-of-order-category/point-of-order-category-repository.service.ts @@ -18,7 +18,7 @@ export class PointOfOrderCategoryRepositoryService extends BaseMeetingRelatedRepository implements CanPerformListUpdates { - constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { + public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) { super(repositoryServiceCollector, PointOfOrderCategory); } diff --git a/client/src/app/gateways/repositories/repository-service-collector.service.ts b/client/src/app/gateways/repositories/repository-service-collector.service.ts index fd48b1aee9..cd7a410619 100644 --- a/client/src/app/gateways/repositories/repository-service-collector.service.ts +++ b/client/src/app/gateways/repositories/repository-service-collector.service.ts @@ -14,7 +14,7 @@ import { ActionService } from '../actions'; export class RepositoryServiceCollectorService { public collectionToKeyUpdatesObservableMap: { [collection: string]: BehaviorSubject } = {}; - constructor( + public constructor( public DS: DataStoreService, public actionService: ActionService, public collectionMapperService: CollectionMapperService, diff --git a/client/src/app/infrastructure/utils/import/import-process.ts b/client/src/app/infrastructure/utils/import/import-process.ts index e1a67c364b..67eec59d51 100644 --- a/client/src/app/infrastructure/utils/import/import-process.ts +++ b/client/src/app/infrastructure/utils/import/import-process.ts @@ -29,7 +29,7 @@ export class ImportProcess { private _importFailCounter = 0; - public constructor(readonly config: ImportProcessConfig) { + public constructor(config: ImportProcessConfig) { this._afterImportChunkFn = config.afterImportChunkFn ?? VoidFn; this._importFn = config.importFn; this._chunkSize = config.chunkSize; diff --git a/client/src/app/infrastructure/utils/import/json-import-file-utils.ts b/client/src/app/infrastructure/utils/import/json-import-file-utils.ts index 193f2cd474..03249738bb 100644 --- a/client/src/app/infrastructure/utils/import/json-import-file-utils.ts +++ b/client/src/app/infrastructure/utils/import/json-import-file-utils.ts @@ -10,7 +10,7 @@ export const WRONG_JSON_IMPORT_FORMAT_ERROR_MSG = _(`Import data needs to have t providedIn: `root` }) export class UploadFileJsonProcessorService { - constructor(private snackbar: MatSnackBar, private translate: TranslateService) {} + public constructor(private snackbar: MatSnackBar, private translate: TranslateService) {} public async getUploadFileJson(file: FileData): Promise { const json = await new Promise(resolve => { diff --git a/client/src/app/infrastructure/utils/import/static-after-import-handler.ts b/client/src/app/infrastructure/utils/import/static-after-import-handler.ts index 29d04a4278..08769e5af7 100644 --- a/client/src/app/infrastructure/utils/import/static-after-import-handler.ts +++ b/client/src/app/infrastructure/utils/import/static-after-import-handler.ts @@ -9,9 +9,9 @@ export class StaticAfterImportHandler extends Ba ToImport > { public constructor( - readonly config: StaticAfterImportConfig, - override readonly idProperty: keyof ToCreate, - override readonly translateFn: (value: string) => string + config: StaticAfterImportConfig, + idProperty: keyof ToCreate, + translateFn: (value: string) => string ) { super({ idProperty, ...config, translateFn }); } diff --git a/client/src/app/openslides-main-module/components/openslides-main/openslides-main.component.ts b/client/src/app/openslides-main-module/components/openslides-main/openslides-main.component.ts index eafa1396bb..bf43af72c8 100644 --- a/client/src/app/openslides-main-module/components/openslides-main/openslides-main.component.ts +++ b/client/src/app/openslides-main-module/components/openslides-main/openslides-main.component.ts @@ -28,7 +28,7 @@ const CURRENT_LANGUAGE_STORAGE_KEY = `currentLanguage`; export class OpenSlidesMainComponent implements OnInit { private onInitDone = new Deferred(); - title = `OpenSlides`; + public title = `OpenSlides`; public constructor( _viewContainer: ViewContainerRef, diff --git a/client/src/app/openslides-main-module/services/shared-worker.service.ts b/client/src/app/openslides-main-module/services/shared-worker.service.ts index ee98cfb115..fc336f22df 100644 --- a/client/src/app/openslides-main-module/services/shared-worker.service.ts +++ b/client/src/app/openslides-main-module/services/shared-worker.service.ts @@ -50,7 +50,7 @@ export class SharedWorkerService { private healthCheckSubscription: Subscription; private messageEventSubscription: Subscription; - constructor(private zone: NgZone) { + public constructor(private zone: NgZone) { this.connectWorker(true); } diff --git a/client/src/app/site/modules/chip-select/components/chip-select-chip/chip-select-chip.component.ts b/client/src/app/site/modules/chip-select/components/chip-select-chip/chip-select-chip.component.ts index a35a55ecca..3a6cfc6ee2 100644 --- a/client/src/app/site/modules/chip-select/components/chip-select-chip/chip-select-chip.component.ts +++ b/client/src/app/site/modules/chip-select/components/chip-select-chip/chip-select-chip.component.ts @@ -6,5 +6,5 @@ import { Component, TemplateRef, ViewChild } from '@angular/core'; styleUrls: [`./chip-select-chip.component.scss`] }) export class ChipSelectChipComponent { - @ViewChild(TemplateRef) template: TemplateRef; + @ViewChild(TemplateRef) public template: TemplateRef; } diff --git a/client/src/app/site/modules/chip-select/components/chip-select/chip-select.component.ts b/client/src/app/site/modules/chip-select/components/chip-select/chip-select.component.ts index 3bf2f7e53e..6d38f5633e 100644 --- a/client/src/app/site/modules/chip-select/components/chip-select/chip-select.component.ts +++ b/client/src/app/site/modules/chip-select/components/chip-select/chip-select.component.ts @@ -8,7 +8,7 @@ import { ChipSelectChipComponent } from '../chip-select-chip/chip-select-chip.co styleUrls: [`./chip-select.component.scss`] }) export class ChipSelectComponent implements AfterContentInit { - constructor() {} + public constructor() {} @Input() public chipClass: string | null; @@ -16,11 +16,11 @@ export class ChipSelectComponent implements AfterContentInit { @Input() public canOpen: boolean; - @ContentChildren(ChipSelectChipComponent) inputChips: QueryList; + @ContentChildren(ChipSelectChipComponent) public inputChips: QueryList; public chips: ChipSelectChipComponent[] = []; - ngAfterContentInit(): void { + public ngAfterContentInit(): void { this.chips = this.inputChips.toArray(); this.inputChips.changes.subscribe((chips: ChipSelectChipComponent[]) => { this.chips = chips; diff --git a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts index 7611d64663..94b6e70bbf 100644 --- a/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts +++ b/client/src/app/site/modules/global-headbar/components/global-search/global-search.component.ts @@ -96,7 +96,7 @@ export class GlobalSearchComponent implements OnDestroy { }); } - ngOnDestroy(): void { + public ngOnDestroy(): void { this.filterChangeSubscription.unsubscribe(); this.viewportSubscription.unsubscribe(); } diff --git a/client/src/app/site/modules/info/components/info-actions/info-actions.component.ts b/client/src/app/site/modules/info/components/info-actions/info-actions.component.ts index ba8f1ff3f3..37602b35b5 100644 --- a/client/src/app/site/modules/info/components/info-actions/info-actions.component.ts +++ b/client/src/app/site/modules/info/components/info-actions/info-actions.component.ts @@ -11,7 +11,7 @@ import { LifecycleService } from 'src/app/site/services/lifecycle.service'; styleUrls: [`./info-actions.component.scss`] }) export class InfoActionsComponent extends BaseComponent { - constructor( + public constructor( private lifecycleService: LifecycleService, private snackbar: MatSnackBar, private presenter: CheckDatabasePresenterService, diff --git a/client/src/app/site/modules/site-wrapper/services/banner.service.ts b/client/src/app/site/modules/site-wrapper/services/banner.service.ts index d55799c704..b5a819b790 100644 --- a/client/src/app/site/modules/site-wrapper/services/banner.service.ts +++ b/client/src/app/site/modules/site-wrapper/services/banner.service.ts @@ -3,14 +3,14 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { Constructable } from 'src/app/domain/interfaces/constructable'; export class BannerDefinition { - type?: string; - class?: string; - icon?: string; - text?: string; - subText?: string; - link?: string; - largerOnMobileView?: boolean; - component?: Constructable; + public type?: string; + public class?: string; + public icon?: string; + public text?: string; + public subText?: string; + public link?: string; + public largerOnMobileView?: boolean; + public component?: Constructable; } @Injectable({ diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts index ca17a6a5a8..ad821e50a8 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/speaking-times/speaking-times.component.ts @@ -85,7 +85,7 @@ export class SpeakingTimesComponent implements OnDestroy { } } - constructor( + public constructor( private durationService: DurationService, private speakingTimesRepo: StructureLevelListOfSpeakersRepositoryService, private speakerRepo: SpeakerRepositoryService, @@ -102,7 +102,7 @@ export class SpeakingTimesComponent implements OnDestroy { }); } - ngOnDestroy(): void { + public ngOnDestroy(): void { for (const speakingTimeId of this.subscriptions.keys()) { this.subscriptions.get(speakingTimeId).unsubscribe(); } diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/directives/list-of-speakers-content-title.directive.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/directives/list-of-speakers-content-title.directive.ts index ed52f4539d..1a93373713 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/directives/list-of-speakers-content-title.directive.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/directives/list-of-speakers-content-title.directive.ts @@ -4,5 +4,5 @@ import { Directive } from '@angular/core'; selector: `[osListOfSpeakersContentTitle]` }) export class ListOfSpeakersContentTitleDirective { - constructor() {} + public constructor() {} } diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/services/agenda-content-object-form.service.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/services/agenda-content-object-form.service.ts index 9f119df973..3932f6adc0 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/services/agenda-content-object-form.service.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/services/agenda-content-object-form.service.ts @@ -7,7 +7,10 @@ import { ViewAgendaItem } from '../../../../pages/agenda'; @Injectable() export class AgendaContentObjectFormService { - constructor(private repo: AgendaItemRepositoryService, private activeMeetingIdService: ActiveMeetingIdService) {} + public constructor( + private repo: AgendaItemRepositoryService, + private activeMeetingIdService: ActiveMeetingIdService + ) {} public getViewModelListObservable(): Observable { return this.repo.getViewModelListObservable(); diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/detail-view/components/projectable-title/projectable-title.component.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/detail-view/components/projectable-title/projectable-title.component.ts index 7e3ee3be71..23ffc3802c 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/detail-view/components/projectable-title/projectable-title.component.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/detail-view/components/projectable-title/projectable-title.component.ts @@ -25,7 +25,7 @@ export class ProjectableTitleComponent { map(_ => this.isBeingProjected()) ); - constructor(private projectorService: ProjectorControllerService, private cd: ChangeDetectorRef) {} + public constructor(private projectorService: ProjectorControllerService, private cd: ChangeDetectorRef) {} public isBeingProjected(): boolean { if (!this.model) { diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts index 3c8ac3cb98..2820f520e1 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projectable-list/services/projectable-list.service.ts @@ -5,7 +5,7 @@ import { isProjectable, Projectable, ProjectionBuildDescriptor } from 'src/app/s @Injectable() export class ProjectableListService { - constructor( + public constructor( private activeMeetingService: ActiveMeetingService, private meetingSettingsService: MeetingSettingsService ) {} diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/components/projection-dialog/projection-dialog.component.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/components/projection-dialog/projection-dialog.component.ts index f150daa365..e19476778f 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/components/projection-dialog/projection-dialog.component.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/components/projection-dialog/projection-dialog.component.ts @@ -92,12 +92,12 @@ export class ProjectionDialogComponent implements OnInit, OnDestroy { ); } - ngOnDestroy(): void { + public ngOnDestroy(): void { this.modelRequestService.closeSubscription(this._projectorSubscription); this._subscriptions.forEach(s => s.unsubscribe()); } - ngOnInit(): void { + public ngOnInit(): void { this._projectorSubscription = PROJECTOR_LIST_MINIMAL_SUBSCRIPTION + `_${Date.now()}`; this.modelRequestService.subscribeTo({ ...getProjectorListMinimalSubscriptionConfig(this.activeMeetingService.meetingId), diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/services/projection-dialog.service.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/services/projection-dialog.service.ts index 29b2e36f3e..d77269e599 100644 --- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/services/projection-dialog.service.ts +++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/projection-dialog/services/projection-dialog.service.ts @@ -13,7 +13,7 @@ import { ProjectionDialogModule } from '../projection-dialog.module'; @Injectable({ providedIn: ProjectionDialogModule }) export class ProjectionDialogService { - constructor(private dialog: MatDialog, private projectorRepo: ProjectorControllerService) {} + public constructor(private dialog: MatDialog, private projectorRepo: ProjectorControllerService) {} /** * Opens the projection dialog for the given projectable. After the user's choice, diff --git a/client/src/app/site/pages/meetings/modules/poll/components/entitled-users-table/entitled-users-table.component.ts b/client/src/app/site/pages/meetings/modules/poll/components/entitled-users-table/entitled-users-table.component.ts index e1eb22afa4..eb4d01173b 100644 --- a/client/src/app/site/pages/meetings/modules/poll/components/entitled-users-table/entitled-users-table.component.ts +++ b/client/src/app/site/pages/meetings/modules/poll/components/entitled-users-table/entitled-users-table.component.ts @@ -45,7 +45,10 @@ export class EntitledUsersTableComponent { public readonly permission = Permission; public filterPropsEntitledUsersTable = [`user.full_name`, `vote_delegated_to.full_name`, `voted_verbose`]; - constructor(private controller: ParticipantControllerService, public filter: EntitledUsersListFilterService) {} + public constructor( + private controller: ParticipantControllerService, + public filter: EntitledUsersListFilterService + ) {} private getNameFromEntry(entry: EntitledUsersTableEntry): string { return (entry.user ?? this.controller.getViewModel(entry.user_id))?.getShortName(); diff --git a/client/src/app/site/pages/meetings/modules/poll/services/poll-controller.service/poll-controller.service.ts b/client/src/app/site/pages/meetings/modules/poll/services/poll-controller.service/poll-controller.service.ts index e38f798939..9bc313f797 100644 --- a/client/src/app/site/pages/meetings/modules/poll/services/poll-controller.service/poll-controller.service.ts +++ b/client/src/app/site/pages/meetings/modules/poll/services/poll-controller.service/poll-controller.service.ts @@ -13,7 +13,7 @@ import { ViewPoll } from '../../../../pages/polls'; @Injectable({ providedIn: `root` }) export class PollControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: PollRepositoryService, protected voteRepo: VoteRepositoryService diff --git a/client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/vote-controller.service.ts b/client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/vote-controller.service.ts index a4c9d9ba6c..aab55579d9 100644 --- a/client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/vote-controller.service.ts +++ b/client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/vote-controller.service.ts @@ -13,7 +13,7 @@ import { ViewPoll, ViewVote } from '../../../../pages/polls'; providedIn: `root` }) export class VoteControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: VoteRepositoryService, private operator: OperatorService diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts index 1a709125b3..37fc027e0f 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/services/speaker-controller.service.ts @@ -18,7 +18,7 @@ import { ViewListOfSpeakers, ViewSpeaker } from '../view-models'; providedIn: `root` }) export class SpeakerControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: SpeakerRepositoryService, protected userRepo: UserControllerService diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-dialog/topic-poll-dialog.component.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-dialog/topic-poll-dialog.component.ts index ec58b1636c..eaebecdb10 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-dialog/topic-poll-dialog.component.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-dialog/topic-poll-dialog.component.ts @@ -25,7 +25,7 @@ let uniqueId = 0; export class TextOptionSelectable implements Selectable { public readonly id = ++uniqueId; - constructor(private readonly text: string) {} + public constructor(private readonly text: string) {} public getTitle(): string { return this.text; @@ -42,8 +42,8 @@ export class TextOptionSelectable implements Selectable { styleUrls: [`./topic-poll-dialog.component.scss`] }) export class TopicPollDialogComponent extends BasePollDialogComponent implements AfterViewInit { - @ViewChild(`scrollframe`, { static: false }) scrollFrame: ElementRef; - @ViewChildren(`item`) itemElements: QueryList; + @ViewChild(`scrollframe`, { static: false }) public scrollFrame: ElementRef; + @ViewChildren(`item`) public itemElements: QueryList; private scrollContainer: any; private isNearBottom = true; @@ -80,12 +80,15 @@ export class TopicPollDialogComponent extends BasePollDialogComponent implements return super.formsValid; } - constructor(public topicPollService: TopicPollService, @Inject(MAT_DIALOG_DATA) pollData: ViewPoll) { + public constructor( + public topicPollService: TopicPollService, + @Inject(MAT_DIALOG_DATA) pollData: ViewPoll + ) { super(pollData); this.optionTypeText = true; } - ngAfterViewInit() { + public ngAfterViewInit() { if (this.scrollFrame) { this.scrollContainer = this.scrollFrame.nativeElement; this.itemElements.changes.subscribe(_ => this.onItemElementsChanged()); diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-import/services/topic-export.service/topic-export.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-import/services/topic-export.service/topic-export.service.ts index be8735df59..32fe059035 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-import/services/topic-export.service/topic-export.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/pages/topic-import/services/topic-export.service/topic-export.service.ts @@ -17,7 +17,7 @@ interface TopicExport { providedIn: TopicImportServiceModule }) export class TopicExportService { - constructor(private csvExportService: CsvExportForBackendService, private translate: TranslateService) {} + public constructor(private csvExportService: CsvExportForBackendService, private translate: TranslateService) {} public downloadCsvImportExample(): void { const rows: TopicExport[] = [ diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/services/topic-controller.service/topic-controller.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/services/topic-controller.service/topic-controller.service.ts index 73ad00d01b..32817d05c6 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/services/topic-controller.service/topic-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/services/topic-controller.service/topic-controller.service.ts @@ -12,7 +12,7 @@ import { ViewTopic } from '../../view-models'; providedIn: `root` }) export class TopicControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: TopicRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-export.service/agenda-item-export.service.ts b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-export.service/agenda-item-export.service.ts index d8a37ea511..305c00d049 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-export.service/agenda-item-export.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-export.service/agenda-item-export.service.ts @@ -21,7 +21,7 @@ interface AgendaTreePdfEntry { providedIn: AgendaItemListServiceModule }) export class AgendaItemExportService { - constructor( + public constructor( private translate: TranslateService, private csvExportService: MeetingCsvExportForBackendService, private pdfExportService: MeetingPdfExportService, diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-multiselect.service/agenda-item-multiselect.service.ts b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-multiselect.service/agenda-item-multiselect.service.ts index 72635d608f..195b59f0c5 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-multiselect.service/agenda-item-multiselect.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-item-list/services/agenda-item-multiselect.service/agenda-item-multiselect.service.ts @@ -16,7 +16,7 @@ import { AgendaItemListServiceModule } from '../agenda-item-list-service.module' export class AgendaItemMultiselectService { private messageForSpinner = this.translate.instant(`Agenda items are in process. Please wait ...`); - constructor( + public constructor( private choiceService: ChoiceService, private spinnerService: SpinnerService, public repo: AgendaItemControllerService, diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.ts b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.ts index 10e050bdf3..2628ce5105 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.ts @@ -26,7 +26,7 @@ export class AgendaSortComponent extends BaseSortTreeViewComponent; - @ViewChild(`visibilities`) visibilitiesEl: MatSelectionList; + @ViewChild(`visibilities`) public visibilitiesEl: MatSelectionList; /** * These are the available options for filtering the nodes. diff --git a/client/src/app/site/pages/meetings/pages/agenda/services/agenda-item-controller.service/agenda-item-controller.service.ts b/client/src/app/site/pages/meetings/pages/agenda/services/agenda-item-controller.service/agenda-item-controller.service.ts index f2daac49eb..441b9608f2 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/services/agenda-item-controller.service/agenda-item-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/services/agenda-item-controller.service/agenda-item-controller.service.ts @@ -17,7 +17,7 @@ import { AgendaItemCommonServiceModule } from '../agenda-item-common-service.mod providedIn: AgendaItemCommonServiceModule }) export class AgendaItemControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: AgendaItemRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/services/assignment-candidate-controller.service.ts b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/services/assignment-candidate-controller.service.ts index 844be79876..97c36449b8 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/services/assignment-candidate-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/services/assignment-candidate-controller.service.ts @@ -15,7 +15,7 @@ export class AssignmentCandidateControllerService extends BaseMeetingControllerS ViewAssignmentCandidate, AssignmentCandidate > { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: AssignmentCandidateRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-list/services/assignment-sort-list.service.ts b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-list/services/assignment-sort-list.service.ts index 064ee72ba4..e4cf452373 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-list/services/assignment-sort-list.service.ts +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-list/services/assignment-sort-list.service.ts @@ -28,7 +28,7 @@ export class AssignmentSortListService extends BaseSortListService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: AssignmentRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/chat/pages/chat-group-list/components/chat-group-detail-message-form/chat-group-detail-message-form.component.ts b/client/src/app/site/pages/meetings/pages/chat/pages/chat-group-list/components/chat-group-detail-message-form/chat-group-detail-message-form.component.ts index 3a1fa361fa..d96d8494ea 100644 --- a/client/src/app/site/pages/meetings/pages/chat/pages/chat-group-list/components/chat-group-detail-message-form/chat-group-detail-message-form.component.ts +++ b/client/src/app/site/pages/meetings/pages/chat/pages/chat-group-list/components/chat-group-detail-message-form/chat-group-detail-message-form.component.ts @@ -36,7 +36,7 @@ export class ChatGroupDetailMessageFormComponent { private _currentMessage: ViewChatMessage | null = null; - constructor(fb: UntypedFormBuilder) { + public constructor(fb: UntypedFormBuilder) { this.messageForm = fb.control(``, [Validators.maxLength(CHAT_MESSAGE_MAX_LENGTH)]); } diff --git a/client/src/app/site/pages/meetings/pages/chat/services/chat-group-controller.service.ts b/client/src/app/site/pages/meetings/pages/chat/services/chat-group-controller.service.ts index 04a464cd8a..109d7cfd1b 100644 --- a/client/src/app/site/pages/meetings/pages/chat/services/chat-group-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/chat/services/chat-group-controller.service.ts @@ -11,7 +11,7 @@ import { ViewChatGroup } from '../view-models'; providedIn: `root` }) export class ChatGroupControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: ChatGroupRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/chat/services/chat-message-controller.service.ts b/client/src/app/site/pages/meetings/pages/chat/services/chat-message-controller.service.ts index 55313f1be0..6dc5b9a57e 100644 --- a/client/src/app/site/pages/meetings/pages/chat/services/chat-message-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/chat/services/chat-message-controller.service.ts @@ -11,7 +11,7 @@ import { ViewChatMessage } from '../view-models'; providedIn: `root` }) export class ChatMessageControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: ChatMessageRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/interaction/services/broadcast.service.ts b/client/src/app/site/pages/meetings/pages/interaction/services/broadcast.service.ts index 43cbdc4042..f01d09c932 100644 --- a/client/src/app/site/pages/meetings/pages/interaction/services/broadcast.service.ts +++ b/client/src/app/site/pages/meetings/pages/interaction/services/broadcast.service.ts @@ -28,7 +28,7 @@ export class BroadcastService { private broadcastChannel: BroadcastChannel; private onMessage = new Subject(); - constructor() { + public constructor() { this.broadcastChannel = new BroadcastChannel(BroadcastChannelName); this.broadcastChannel.onmessage = message => this.onMessage.next(message.data); } diff --git a/client/src/app/site/pages/meetings/pages/interaction/services/interaction-receive.service.ts b/client/src/app/site/pages/meetings/pages/interaction/services/interaction-receive.service.ts index d19b1d3266..311635ebbd 100644 --- a/client/src/app/site/pages/meetings/pages/interaction/services/interaction-receive.service.ts +++ b/client/src/app/site/pages/meetings/pages/interaction/services/interaction-receive.service.ts @@ -84,7 +84,7 @@ export class InteractionReceiveService { private _kickObservable = this.notifyService.getMessageObservable(KickMessage); - constructor(private notifyService: NotifyService, private activeMeetingService: ActiveMeetingService) {} + public constructor(private notifyService: NotifyService, private activeMeetingService: ActiveMeetingService) {} public startListening(lazyServices: InteractionReceiveSetupServices): void { if (!!this._inviteSubscription) { diff --git a/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-common.service.ts b/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-common.service.ts index 19203431a6..f925b914a1 100644 --- a/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-common.service.ts +++ b/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-common.service.ts @@ -18,7 +18,7 @@ export class MediafileCommonService { return this.meetingIdService.meetingId!; } - constructor( + public constructor( private meetingIdService: ActiveMeetingIdService, private router: Router, private repo: MediafileControllerService, diff --git a/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-controller.service.ts b/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-controller.service.ts index 61171b19bd..07ac5a7005 100644 --- a/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/mediafiles/services/mediafile-controller.service.ts @@ -14,7 +14,7 @@ import { MediafileCommonServiceModule } from './mediafile-common-service.module' @Injectable({ providedIn: MediafileCommonServiceModule }) export class MediafileControllerService extends BaseController { - constructor( + public constructor( protected override controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MediafileRepositoryService, private operator: OperatorService diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/categories/services/motion-category-controller.service/motion-category-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/categories/services/motion-category-controller.service/motion-category-controller.service.ts index bae138386d..9777335d11 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/categories/services/motion-category-controller.service/motion-category-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/categories/services/motion-category-controller.service/motion-category-controller.service.ts @@ -18,7 +18,7 @@ import { ViewMotionCategory } from '../../view-models'; export class MotionCategoryControllerService extends BaseMeetingControllerService { private readonly _currentCategoriesSubject = new BehaviorSubject([]); - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionCategoryRepositoryService, private treeService: TreeService diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-controller.service.ts index 3e95bc8859..5238038752 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-controller.service.ts @@ -11,7 +11,7 @@ import { ViewMotionComment } from '../view-models'; providedIn: `root` }) export class MotionCommentControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionCommentRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-section-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-section-controller.service.ts index 7a2408a1ab..4b1d6e4a9e 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-section-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/comments/services/motion-comment-section-controller.service.ts @@ -14,7 +14,7 @@ export class MotionCommentSectionControllerService extends BaseMeetingController ViewMotionCommentSection, MotionCommentSection > { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionCommentSectionRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll-controller.service/motion-poll-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll-controller.service/motion-poll-controller.service.ts index 3ad268ecdc..5147280421 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll-controller.service/motion-poll-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll-controller.service/motion-poll-controller.service.ts @@ -10,7 +10,7 @@ import { MotionPollServiceModule } from '../motion-poll-service.module'; providedIn: MotionPollServiceModule }) export class MotionPollControllerService { - constructor(private repo: PollRepositoryService) {} + public constructor(private repo: PollRepositoryService) {} public getViewModelList(): ViewPoll[] { return this.repo.getViewModelList().filter(poll => poll.pollClassType === PollClassType.Motion); diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/states/services/motion-state-controller.service/motion-state-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/states/services/motion-state-controller.service/motion-state-controller.service.ts index 7c0f3e2148..da7350eee5 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/states/services/motion-state-controller.service/motion-state-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/states/services/motion-state-controller.service/motion-state-controller.service.ts @@ -13,7 +13,7 @@ import { ViewMotionState } from '../../view-models'; providedIn: `root` }) export class MotionStateControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionStateRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/statute-paragraphs/services/motion-statute-paragraph-controller.service/motion-statute-paragraph-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/statute-paragraphs/services/motion-statute-paragraph-controller.service/motion-statute-paragraph-controller.service.ts index 32773a4e45..c88a11431c 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/statute-paragraphs/services/motion-statute-paragraph-controller.service/motion-statute-paragraph-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/statute-paragraphs/services/motion-statute-paragraph-controller.service/motion-statute-paragraph-controller.service.ts @@ -14,7 +14,7 @@ export class MotionStatuteParagraphControllerService extends BaseMeetingControll ViewMotionStatuteParagraph, MotionStatuteParagraph > { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionStatuteParagraphRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/tags/services/tag-controller.service/tag-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/tags/services/tag-controller.service/tag-controller.service.ts index 202e16b36d..916f6d3ad1 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/tags/services/tag-controller.service/tag-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/tags/services/tag-controller.service/tag-controller.service.ts @@ -11,7 +11,7 @@ import { ViewTag } from '../../view-models'; providedIn: `root` }) export class TagControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: TagRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/workflows/services/motion-workflow-controller.service/motion-workflow-controller.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/workflows/services/motion-workflow-controller.service/motion-workflow-controller.service.ts index ca3fdfaab1..a5b75abc75 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/workflows/services/motion-workflow-controller.service/motion-workflow-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/workflows/services/motion-workflow-controller.service/motion-workflow-controller.service.ts @@ -15,7 +15,7 @@ import { ViewMotionWorkflow } from '../../view-models'; providedIn: `root` }) export class MotionWorkflowControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: MotionWorkflowRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/modules/motion-list-info-dialog/components/motion-list-info-dialog/motion-list-info-dialog.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/modules/motion-list-info-dialog/components/motion-list-info-dialog/motion-list-info-dialog.component.ts index 9bf27082de..8ba40fcb39 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/modules/motion-list-info-dialog/components/motion-list-info-dialog/motion-list-info-dialog.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-list/modules/motion-list-info-dialog/components/motion-list-info-dialog/motion-list-info-dialog.component.ts @@ -40,7 +40,7 @@ export class MotionListInfoDialogComponent { public readonly selectedMotion: ViewMotion; public constructor( - @Inject(MAT_DIALOG_DATA) readonly config: MotionListInfoDialogConfig, + @Inject(MAT_DIALOG_DATA) public readonly config: MotionListInfoDialogConfig, repo: MotionControllerService, private categoryRepo: MotionCategoryControllerService, private blockRepo: MotionBlockControllerService, diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/workflows/services/workflow-export.service/workflow-export.service.ts b/client/src/app/site/pages/meetings/pages/motions/pages/workflows/services/workflow-export.service/workflow-export.service.ts index 181c1bf65f..4f52f33192 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/workflows/services/workflow-export.service/workflow-export.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/workflows/services/workflow-export.service/workflow-export.service.ts @@ -12,7 +12,7 @@ import { MotionWorkflowServiceModule } from '../motion-workflow-service.module'; providedIn: MotionWorkflowServiceModule }) export class WorkflowExportService { - constructor(private translate: TranslateService, private stateRepo: MotionStateControllerService) {} + public constructor(private translate: TranslateService, private stateRepo: MotionStateControllerService) {} public exportWorkflows(...workflows: ViewMotionWorkflow[]): void { const workflowKeysToCopy: (keyof MotionWorkflow)[] = [`name`]; diff --git a/client/src/app/site/pages/meetings/pages/motions/services/list/amendment-list-sort.service/amendment-list-sort.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/list/amendment-list-sort.service/amendment-list-sort.service.ts index 0f5da24b77..1e38338a8a 100644 --- a/client/src/app/site/pages/meetings/pages/motions/services/list/amendment-list-sort.service/amendment-list-sort.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/services/list/amendment-list-sort.service/amendment-list-sort.service.ts @@ -26,7 +26,7 @@ export class AmendmentListSortService extends MotionListBaseSortService { } ]; - constructor() { + public constructor() { super({ sortProperty: `parentAndLineNumber`, sortAscending: true diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/modules/participant-list-info-dialog/components/participant-list-info-dialog/participant-list-info-dialog.component.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/modules/participant-list-info-dialog/components/participant-list-info-dialog/participant-list-info-dialog.component.ts index 33fd200bee..72c6f11a8c 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/modules/participant-list-info-dialog/components/participant-list-info-dialog/participant-list-info-dialog.component.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/modules/participant-list-info-dialog/components/participant-list-info-dialog/participant-list-info-dialog.component.ts @@ -46,7 +46,7 @@ export class ParticipantListInfoDialogComponent extends BaseUiComponent implemen private _currentUser: ViewUser | null = null; private _voteDelegationEnabled = false; - constructor( + public constructor( @Inject(MAT_DIALOG_DATA) public readonly infoDialog: InfoDialog, private participantRepo: ParticipantControllerService, private groupRepo: GroupControllerService, diff --git a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projection-controller.service/projection-controller.service.ts b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projection-controller.service/projection-controller.service.ts index abe74f978f..36179c985c 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projection-controller.service/projection-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projection-controller.service/projection-controller.service.ts @@ -10,7 +10,7 @@ import { ProjectorDetailServiceModule } from '../projector-detail-service.module @Injectable({ providedIn: ProjectorDetailServiceModule }) export class ProjectionControllerService extends BaseMeetingControllerService { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: ProjectionRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-countdown-controller.service/projector-countdown-controller.service.ts b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-countdown-controller.service/projector-countdown-controller.service.ts index 4f2f8d2e73..9f869acef4 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-countdown-controller.service/projector-countdown-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-countdown-controller.service/projector-countdown-controller.service.ts @@ -13,7 +13,7 @@ export class ProjectorCountdownControllerService extends BaseMeetingControllerSe ViewProjectorCountdown, ProjectorCountdown > { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: ProjectorCountdownRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-message-controller.service/projector-message-controller.service.ts b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-message-controller.service/projector-message-controller.service.ts index 61768ddd25..7e634c98b1 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-message-controller.service/projector-message-controller.service.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/services/projector-message-controller.service/projector-message-controller.service.ts @@ -13,7 +13,7 @@ export class ProjectorMessageControllerService extends BaseMeetingControllerServ ViewProjectorMessage, ProjectorMessage > { - constructor( + public constructor( controllerServiceCollector: MeetingControllerServiceCollectorService, protected override repo: ProjectorMessageRepositoryService ) { diff --git a/client/src/app/site/pages/meetings/services/export/meeting-pdf-export.service.ts b/client/src/app/site/pages/meetings/services/export/meeting-pdf-export.service.ts index e1681af1f0..482418adf7 100644 --- a/client/src/app/site/pages/meetings/services/export/meeting-pdf-export.service.ts +++ b/client/src/app/site/pages/meetings/services/export/meeting-pdf-export.service.ts @@ -53,7 +53,7 @@ export class MeetingPdfExportService { return mmToPoints(this.meetingSettingsService.instant(`export_pdf_page_margin_bottom`)!); } - constructor( + public constructor( private pdfExportService: PdfDocumentService, private meetingSettingsService: MeetingSettingsService, private httpService: HttpService, diff --git a/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts b/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts index 496361b8f0..c9f9671eb8 100644 --- a/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts +++ b/client/src/app/site/pages/meetings/services/meeting-component-service-collector.service.ts @@ -34,7 +34,7 @@ export class MeetingComponentServiceCollectorService { return this.componentServiceCollector.router; } - constructor( + public constructor( private componentServiceCollector: ComponentServiceCollectorService, public activeMeetingIdService: ActiveMeetingIdService, public activeMeetingService: ActiveMeetingService, diff --git a/client/src/app/site/pages/meetings/services/meeting-controller-service-collector.service.ts b/client/src/app/site/pages/meetings/services/meeting-controller-service-collector.service.ts index 8a3c9fc8ed..dcd4510ba0 100644 --- a/client/src/app/site/pages/meetings/services/meeting-controller-service-collector.service.ts +++ b/client/src/app/site/pages/meetings/services/meeting-controller-service-collector.service.ts @@ -30,7 +30,7 @@ export class MeetingControllerServiceCollectorService { return this.controllerServiceCollector.viewModelStoreService; } - constructor( + public constructor( private controllerServiceCollector: ControllerServiceCollectorService, public activeMeetingIdService: ActiveMeetingIdService, public activeMeetingService: ActiveMeetingService, diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-search/account-list-search.service.ts b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-search/account-list-search.service.ts index 51e6f4cfa8..7f163881f6 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-search/account-list-search.service.ts +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-search/account-list-search.service.ts @@ -8,7 +8,7 @@ import { AccountListServiceModule } from '../account-list-service.module'; providedIn: AccountListServiceModule }) export class AccountListSearchService extends ListSearchService { - constructor() { + public constructor() { super([`short_name`, `username`, `email`, `saml_id`], []); } } diff --git a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts index 5982bb7674..4c873e4293 100644 --- a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts +++ b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts @@ -42,7 +42,7 @@ export class AutoupdateCommunicationService { private tryReconnectOpen = false; private subscriptionsWithData = new Set(); - constructor( + public constructor( private authTokenService: AuthTokenService, private authService: AuthService, private sharedWorker: SharedWorkerService, diff --git a/client/src/app/site/services/communication-manager.service/stream-handler.ts b/client/src/app/site/services/communication-manager.service/stream-handler.ts index 89e2969cd9..24bd0da737 100644 --- a/client/src/app/site/services/communication-manager.service/stream-handler.ts +++ b/client/src/app/site/services/communication-manager.service/stream-handler.ts @@ -15,7 +15,7 @@ export class StreamHandler { public constructor( private readonly buildStreamFn: () => HttpStream, - readonly config: { + config: { afterOpenedFn?: AfterEventFn; afterClosedFn?: AfterEventFn; } = {} diff --git a/client/src/app/site/services/component-service-collector.service.ts b/client/src/app/site/services/component-service-collector.service.ts index f03f02f009..529c1c3842 100644 --- a/client/src/app/site/services/component-service-collector.service.ts +++ b/client/src/app/site/services/component-service-collector.service.ts @@ -10,7 +10,7 @@ import { ModelRequestService } from './model-request.service'; providedIn: `root` }) export class ComponentServiceCollectorService { - constructor( + public constructor( public router: Router, public titleService: Title, public matSnackBar: MatSnackBar, diff --git a/client/src/app/ui/directives/trim-on-paste/trim-on-paste.directive.ts b/client/src/app/ui/directives/trim-on-paste/trim-on-paste.directive.ts index fb9ede2885..17783a21cf 100644 --- a/client/src/app/ui/directives/trim-on-paste/trim-on-paste.directive.ts +++ b/client/src/app/ui/directives/trim-on-paste/trim-on-paste.directive.ts @@ -4,9 +4,9 @@ import { Directive, ElementRef, HostListener } from '@angular/core'; selector: `[osTrimOnPaste]` }) export class TrimOnPasteDirective { - constructor(private el: ElementRef) {} + public constructor(private el: ElementRef) {} - @HostListener(`paste`, [`$event`]) onPaste(event: ClipboardEvent) { + @HostListener(`paste`, [`$event`]) public onPaste(event: ClipboardEvent): void { const clipboardData = event.clipboardData; let paste = clipboardData?.getData(`text`); if (paste !== paste.trim()) { diff --git a/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.ts b/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.ts index 7f3fa65d0e..1820a28688 100644 --- a/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.ts +++ b/client/src/app/ui/modules/comma-separated-listing/components/comma-separated-listing/comma-separated-listing.component.ts @@ -19,7 +19,7 @@ export class CommaSeparatedListingComponent { /** * If it is bigger than 0, the listing will be ellipsed after showElementsAmount elements. */ - @Input() showElementsAmount = 0; + @Input() public showElementsAmount = 0; public get ellipsed(): boolean { return this.showElementsAmount > 0 && this.showElementsAmount < this.list.length; @@ -29,5 +29,5 @@ export class CommaSeparatedListingComponent { return this.ellipsed ? this.list.slice(0, this.showElementsAmount) : this.list; } - constructor() {} + public constructor() {} } diff --git a/client/src/app/ui/modules/datepicker/components/base-datepicker/base-datepicker.component.ts b/client/src/app/ui/modules/datepicker/components/base-datepicker/base-datepicker.component.ts index 35be03260f..1b5ea225ff 100644 --- a/client/src/app/ui/modules/datepicker/components/base-datepicker/base-datepicker.component.ts +++ b/client/src/app/ui/modules/datepicker/components/base-datepicker/base-datepicker.component.ts @@ -6,7 +6,7 @@ import { BaseFormFieldControlComponent } from 'src/app/ui/base/base-form-field-c @Directive() export abstract class BaseDatepickerComponent extends BaseFormFieldControlComponent { - @ViewChild(`picker`) picker: MatDateRangePicker | MatDatepicker; + @ViewChild(`picker`) public picker: MatDateRangePicker | MatDatepicker; public readonly controlType = `os-datepicker`; @@ -25,7 +25,7 @@ export abstract class BaseDatepickerComponent extends BaseFormFieldControlCompon @Input() public showUpdateSuccessIcon = false; - constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { + public constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { super(ngControl); this.fm diff --git a/client/src/app/ui/modules/datepicker/components/datepicker/datepicker.component.ts b/client/src/app/ui/modules/datepicker/components/datepicker/datepicker.component.ts index 4e854a8aea..c41893bc00 100644 --- a/client/src/app/ui/modules/datepicker/components/datepicker/datepicker.component.ts +++ b/client/src/app/ui/modules/datepicker/components/datepicker/datepicker.component.ts @@ -19,7 +19,7 @@ export class DatepickerComponent extends BaseDatepickerComponent { public override contentForm: UntypedFormControl; - constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { + public constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { super(element, ngControl); } diff --git a/client/src/app/ui/modules/datepicker/components/daterangepicker/daterangepicker.component.ts b/client/src/app/ui/modules/datepicker/components/daterangepicker/daterangepicker.component.ts index 0b1952e647..858a64199c 100644 --- a/client/src/app/ui/modules/datepicker/components/daterangepicker/daterangepicker.component.ts +++ b/client/src/app/ui/modules/datepicker/components/daterangepicker/daterangepicker.component.ts @@ -22,7 +22,7 @@ export class DaterangepickerComponent extends BaseDatepickerComponent { private currentValue: any; - constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { + public constructor(element: ElementRef, @Optional() @Self() ngControl: NgControl) { super(element, ngControl); } diff --git a/client/src/app/ui/modules/expandable-content-wrapper/components/expandable-content-wrapper/expandable-content-wrapper.component.ts b/client/src/app/ui/modules/expandable-content-wrapper/components/expandable-content-wrapper/expandable-content-wrapper.component.ts index 076212a5a0..4cf05b22d3 100644 --- a/client/src/app/ui/modules/expandable-content-wrapper/components/expandable-content-wrapper/expandable-content-wrapper.component.ts +++ b/client/src/app/ui/modules/expandable-content-wrapper/components/expandable-content-wrapper/expandable-content-wrapper.component.ts @@ -47,7 +47,7 @@ export class ExpandableContentWrapperComponent { public showCollapsed: boolean; - constructor(private cd: ChangeDetectorRef) { + public constructor(private cd: ChangeDetectorRef) { this.update(); } diff --git a/client/src/app/ui/modules/file-upload/components/file-upload/file-upload.component.ts b/client/src/app/ui/modules/file-upload/components/file-upload/file-upload.component.ts index 1df5361620..e9231948fb 100644 --- a/client/src/app/ui/modules/file-upload/components/file-upload/file-upload.component.ts +++ b/client/src/app/ui/modules/file-upload/components/file-upload/file-upload.component.ts @@ -46,7 +46,7 @@ export class FileUploadComponent { @ContentChild(TemplateRef, { static: true }) public additionalContent: TemplateRef | null = null; - @ViewChild(`fileInput`) fileInput: ElementRef; + @ViewChild(`fileInput`) public fileInput: ElementRef; /** * Determine if uploading should happen parallel or synchronously. diff --git a/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.ts b/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.ts index 522c50210d..870916eeef 100644 --- a/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.ts +++ b/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.ts @@ -115,7 +115,7 @@ export class HeadBarComponent implements OnInit, AfterViewInit { return this._isSaveButtonEnabled; } - @ViewChild(`headbarContent`) headbarContent: TemplateRef; + @ViewChild(`headbarContent`) public headbarContent: TemplateRef; /** * Determine multiSelect mode: changed interactions and head bar diff --git a/client/src/app/ui/modules/import-list/directives/import-list-first-tab.directive.ts b/client/src/app/ui/modules/import-list/directives/import-list-first-tab.directive.ts index ae86f5abd2..583c914082 100644 --- a/client/src/app/ui/modules/import-list/directives/import-list-first-tab.directive.ts +++ b/client/src/app/ui/modules/import-list/directives/import-list-first-tab.directive.ts @@ -4,5 +4,5 @@ import { Directive } from '@angular/core'; selector: `[osImportListFirstTab]` }) export class ImportListFirstTabDirective { - constructor() {} + public constructor() {} } diff --git a/client/src/app/ui/modules/import-list/directives/import-list-last-tab.directive.ts b/client/src/app/ui/modules/import-list/directives/import-list-last-tab.directive.ts index 48081f742c..4b4f734a19 100644 --- a/client/src/app/ui/modules/import-list/directives/import-list-last-tab.directive.ts +++ b/client/src/app/ui/modules/import-list/directives/import-list-last-tab.directive.ts @@ -4,5 +4,5 @@ import { Directive } from '@angular/core'; selector: `[osImportListLastTab]` }) export class ImportListLastTabDirective { - constructor() {} + public constructor() {} } diff --git a/client/src/app/ui/modules/scrolling-table/components/scrolling-table/scrolling-table.component.ts b/client/src/app/ui/modules/scrolling-table/components/scrolling-table/scrolling-table.component.ts index 6d12e156fe..c6ddcd3495 100644 --- a/client/src/app/ui/modules/scrolling-table/components/scrolling-table/scrolling-table.component.ts +++ b/client/src/app/ui/modules/scrolling-table/components/scrolling-table/scrolling-table.component.ts @@ -43,7 +43,7 @@ export class ScrollingTableComponent>> @ViewChild(CdkVirtualScrollViewport) public scrollViewport: CdkVirtualScrollViewport | undefined; - @ViewChild(`cdkContainer`) cdkContainer: ElementRef; + @ViewChild(`cdkContainer`) public cdkContainer: ElementRef; @Input() public tableHeight: string | undefined = undefined; diff --git a/client/src/app/ui/modules/search-selector/directives/search-selector-not-found-template.directive.ts b/client/src/app/ui/modules/search-selector/directives/search-selector-not-found-template.directive.ts index 7b00854b08..5b29d4b18d 100644 --- a/client/src/app/ui/modules/search-selector/directives/search-selector-not-found-template.directive.ts +++ b/client/src/app/ui/modules/search-selector/directives/search-selector-not-found-template.directive.ts @@ -4,5 +4,5 @@ import { Directive } from '@angular/core'; selector: `[osSearchSelectorNotFoundTemplate]` }) export class SearchSelectorNotFoundTemplateDirective { - constructor() {} + public constructor() {} } diff --git a/client/src/app/ui/modules/sidenav/modules/easter-egg/modules/chess-dialog/services/chess-challenge.service.ts b/client/src/app/ui/modules/sidenav/modules/easter-egg/modules/chess-dialog/services/chess-challenge.service.ts index 4d1ae3c6ac..44bd6fddc2 100644 --- a/client/src/app/ui/modules/sidenav/modules/easter-egg/modules/chess-dialog/services/chess-challenge.service.ts +++ b/client/src/app/ui/modules/sidenav/modules/easter-egg/modules/chess-dialog/services/chess-challenge.service.ts @@ -12,7 +12,7 @@ import { ChessDialogModule } from '../chess-dialog.module'; providedIn: ChessDialogModule }) export class ChessChallengeService { - constructor( + public constructor( private notifyService: NotifyService, private op: OperatorService, private dialog: MatDialog, diff --git a/client/src/app/ui/pipes/entries/entries.pipe.ts b/client/src/app/ui/pipes/entries/entries.pipe.ts index f5b3e7dea0..76b6e4964f 100644 --- a/client/src/app/ui/pipes/entries/entries.pipe.ts +++ b/client/src/app/ui/pipes/entries/entries.pipe.ts @@ -15,7 +15,7 @@ export class EntriesPipe implements PipeTransform { public constructor(private readonly differs: KeyValueDiffers) {} - transform( + public transform( instance: IterableMap | any, compareFn?: (a: KeyValue, b: KeyValue) => number ): Array> { diff --git a/client/src/app/worker/autoupdate/autoupdate-stream-pool.ts b/client/src/app/worker/autoupdate/autoupdate-stream-pool.ts index d35b61d030..980b9d0683 100644 --- a/client/src/app/worker/autoupdate/autoupdate-stream-pool.ts +++ b/client/src/app/worker/autoupdate/autoupdate-stream-pool.ts @@ -38,7 +38,7 @@ export class AutoupdateStreamPool { return this.streams.filter(stream => stream.active); } - constructor(private endpoint: AutoupdateSetEndpointParams) { + public constructor(private endpoint: AutoupdateSetEndpointParams) { this.updateAuthentication(); } diff --git a/client/src/app/worker/autoupdate/autoupdate-stream.ts b/client/src/app/worker/autoupdate/autoupdate-stream.ts index 42dd366b9f..1e4cc67c7c 100644 --- a/client/src/app/worker/autoupdate/autoupdate-stream.ts +++ b/client/src/app/worker/autoupdate/autoupdate-stream.ts @@ -45,7 +45,7 @@ export class AutoupdateStream { return this.failedCounter; } - constructor( + public constructor( private _subscriptions: AutoupdateSubscription[], public queryParams: URLSearchParams, private endpoint: AutoupdateSetEndpointParams, diff --git a/client/src/app/worker/autoupdate/autoupdate-subscription.ts b/client/src/app/worker/autoupdate/autoupdate-subscription.ts index 78352380f6..18bfe8729c 100644 --- a/client/src/app/worker/autoupdate/autoupdate-subscription.ts +++ b/client/src/app/worker/autoupdate/autoupdate-subscription.ts @@ -13,7 +13,7 @@ export class AutoupdateSubscription { return this._request; } - constructor( + public constructor( public id: number, public url: string, public requestHash: string, diff --git a/client/tests/integration/page-objects/components/list-component.ts b/client/tests/integration/page-objects/components/list-component.ts index c3c9026f1f..d55a4483d1 100644 --- a/client/tests/integration/page-objects/components/list-component.ts +++ b/client/tests/integration/page-objects/components/list-component.ts @@ -4,7 +4,7 @@ export class ListComponent { readonly page: Page; readonly osList: Locator; - constructor(page: Page, osList?: Locator) { + public constructor(page: Page, osList?: Locator) { this.page = page; this.osList = osList || page.locator('os-list').first(); } diff --git a/client/tests/integration/page-objects/meeting/home/detail.ts b/client/tests/integration/page-objects/meeting/home/detail.ts index c5cbe4e3ba..1798587d90 100644 --- a/client/tests/integration/page-objects/meeting/home/detail.ts +++ b/client/tests/integration/page-objects/meeting/home/detail.ts @@ -6,7 +6,7 @@ export class MeetingHomePage { public readonly welcomeText: Locator; public readonly editButton: Locator; - constructor(page: Page) { + public constructor(page: Page) { this.page = page; this.frontPageTitle = page.locator(`mat-sidenav-content`).locator(`.app-content > h1`); this.welcomeText = page.locator(`mat-sidenav-content`).locator(`.app-content > div`); diff --git a/client/tests/integration/page-objects/meeting/home/edit.ts b/client/tests/integration/page-objects/meeting/home/edit.ts index d074dc134b..b05e747c1a 100644 --- a/client/tests/integration/page-objects/meeting/home/edit.ts +++ b/client/tests/integration/page-objects/meeting/home/edit.ts @@ -8,7 +8,7 @@ export class MeetingHomeEditPage { public readonly saveButton: Locator; public readonly closeButton: Locator; - constructor(page: Page) { + public constructor(page: Page) { this.page = page; this.frontPageTitleInput = page.locator(`[formcontrolname=welcome_title]`); this.welcomeTextTinyMce = page.locator(`.tox-tinymce`); diff --git a/client/tests/integration/page-objects/meeting/motion/detail.ts b/client/tests/integration/page-objects/meeting/motion/detail.ts index 2863bbc4ab..fe1445f85a 100644 --- a/client/tests/integration/page-objects/meeting/motion/detail.ts +++ b/client/tests/integration/page-objects/meeting/motion/detail.ts @@ -3,7 +3,7 @@ import { Page } from '@playwright/test'; export class MeetingMotionDetailPage { private readonly page: Page; - constructor(page: Page) { + public constructor(page: Page) { this.page = page; } From c14826c5c755fee2050da6843cc7cbe6f79b63ca Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Thu, 14 Mar 2024 07:59:37 +0100 Subject: [PATCH 43/59] Fix unreadable ActionWorkerBar link (#3436) --- .../wait-for-action-banner.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/site/modules/wait-for-action-dialog/components/wait-for-action-banner/wait-for-action-banner.component.scss b/client/src/app/site/modules/wait-for-action-dialog/components/wait-for-action-banner/wait-for-action-banner.component.scss index ea47185883..9250ab648f 100644 --- a/client/src/app/site/modules/wait-for-action-dialog/components/wait-for-action-banner/wait-for-action-banner.component.scss +++ b/client/src/app/site/modules/wait-for-action-dialog/components/wait-for-action-banner/wait-for-action-banner.component.scss @@ -8,7 +8,7 @@ span, a { padding: 2px; - color: #000000; + color: #000000 !important; background: yellow; } From f69022f2bae38c69d1443f5b88a45c24948a0709 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:27:58 +0100 Subject: [PATCH 44/59] Activate re-add button only if active speaker is true (#3380) --- .../list-of-speakers-content.component.ts | 12 ++++++++++-- .../list-of-speakers/list-of-speakers.component.ts | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts index e38ddd8065..7de74bba62 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.ts @@ -241,6 +241,11 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme (!this.activeSpeaker?.point_of_order && this.activeSpeaker?.user_id === lastSpeaker.user_id); } canReaddLast = !isLastSpeakerWaiting || this.enableMultipleParticipants; + if (lastSpeaker.speech_state === `interposed_question` && !this.activeSpeaker) { + canReaddLast = false; + } else if (lastSpeaker.speech_state === `interposed_question` && this.activeSpeaker) { + canReaddLast = true; + } } else { canReaddLast = false; } @@ -563,8 +568,11 @@ export class ListOfSpeakersContentComponent extends BaseMeetingComponent impleme // convert begin time to date and sort this.finishedSpeakers.sort((a: ViewSpeaker, b: ViewSpeaker) => { - const aTime = new Date(a.begin_time).getTime(); - const bTime = new Date(b.begin_time).getTime(); + const aTime = new Date(a.end_time).getTime(); + const bTime = new Date(b.end_time).getTime(); + if (aTime === bTime) { + return a.weight - b.weight; + } return aTime - bTime; }); diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/components/list-of-speakers/list-of-speakers.component.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/components/list-of-speakers/list-of-speakers.component.ts index dd7d19f722..cdd2af1eaf 100644 --- a/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/components/list-of-speakers/list-of-speakers.component.ts +++ b/client/src/app/site/pages/meetings/pages/agenda/modules/list-of-speakers/components/list-of-speakers/list-of-speakers.component.ts @@ -147,7 +147,7 @@ export class ListOfSpeakersComponent extends BaseMeetingComponent implements OnI } /** - * Removes the last finished speaker from the list an re-adds him on pole position + * Removes the last finished speaker from the list an re-adds them on pole position */ public readdLastSpeaker(): void { this.listOfSpeakersRepo.readdLastSpeaker(this.viewListOfSpeakers); From ba7b6ee31e0b64fcb931a89c4dee86fd2049e127 Mon Sep 17 00:00:00 2001 From: reiterl Date: Thu, 14 Mar 2024 11:18:45 +0100 Subject: [PATCH 45/59] add username sort option to account list (#3434) --- .../services/account-list-sort.service/account-sort.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-sort.service/account-sort.service.ts b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-sort.service/account-sort.service.ts index f277b03355..7e0943e3d9 100644 --- a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-sort.service/account-sort.service.ts +++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/services/account-list-sort.service/account-sort.service.ts @@ -17,6 +17,7 @@ export class AccountSortService extends BaseSortListService { { property: `full_name`, label: _(`Full name`), baseKeys: [`first_name`, `last_name`, `title`] }, { property: [`first_name`, `last_name`], label: _(`Given name`) }, { property: [`last_name`, `first_name`], label: _(`Surname`) }, + { property: `username`, label: _(`Username`) }, { property: `is_active`, label: _(`Is active`) }, { property: `default_vote_weight`, label: _(`Vote weight`) }, { property: `gender`, label: _(`Gender`) }, From 8d83eb4cc2b1eea19e8261649b5f1d3ed270d89b Mon Sep 17 00:00:00 2001 From: reiterl Date: Tue, 27 Feb 2024 14:25:12 +0100 Subject: [PATCH 46/59] Add arrow back to contributions list (#3364) --- .../participant-speaker-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html index 3908bfae39..9166c6caf6 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/components/participant-speaker-list/participant-speaker-list.component.html @@ -1,4 +1,4 @@ - +

{{ 'Contributions' | translate }}

From 3b67e178566ef37b14b51e83330bf7361b9ef77d Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister Date: Wed, 28 Feb 2024 09:53:44 +0100 Subject: [PATCH 47/59] Add staging branch to CI --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 72a054743d..0f9b6dcf4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: branches: - main - 'feature/**' + - 'staging/**' env: NG_CLI_ANALYTICS: ci From ac945de1b40bf199868370b2c21099a260fec407 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:04:38 +0100 Subject: [PATCH 48/59] Fix moderation note permission updates (#3365) --- .../moderation-note.component.ts | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.ts b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.ts index 33eeee0931..95ae173e89 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.ts +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/moderation-note/moderation-note.component.ts @@ -1,7 +1,17 @@ -import { ChangeDetectionStrategy, Component, ContentChild, Input, TemplateRef, ViewEncapsulation } from '@angular/core'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ContentChild, + Input, + OnInit, + TemplateRef, + ViewEncapsulation +} from '@angular/core'; import { FormBuilder, UntypedFormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { map, Observable } from 'rxjs'; +import { Permission } from 'src/app/domain/definitions/permission'; import { AgendaItemRepositoryService } from 'src/app/gateways/repositories/agenda'; import { BaseViewModel } from 'src/app/site/base/base-view-model'; import { BaseMeetingComponent } from 'src/app/site/pages/meetings/base/base-meeting.component'; @@ -17,7 +27,7 @@ import { ListOfSpeakersContentTitleDirective } from '../../directives/list-of-sp encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush }) -export class ModerationNoteComponent extends BaseMeetingComponent { +export class ModerationNoteComponent extends BaseMeetingComponent implements OnInit { public isEditing = false; public moderatorNoteForm: UntypedFormGroup; @@ -45,13 +55,17 @@ export class ModerationNoteComponent extends BaseMeetingComponent { } public get canSeeModerationNote(): boolean { - return this.operator.hasPerms(this.permission.agendaItemCanSeeModeratorNotes); + return this._canSeeModerationNote; } + private _canSeeModerationNote: boolean; + public get canManageModerationNote(): boolean { - return this.operator.hasPerms(this.permission.agendaItemCanManageModeratorNotes); + return this._canManageModerationNote; } + private _canManageModerationNote: boolean; + @ContentChild(ListOfSpeakersContentTitleDirective, { read: TemplateRef }) public explicitTitleContent: TemplateRef | null = null; @@ -63,7 +77,8 @@ export class ModerationNoteComponent extends BaseMeetingComponent { protected override translate: TranslateService, private operator: OperatorService, private formBuilder: FormBuilder, - protected agendaItemRepo: AgendaItemRepositoryService + protected agendaItemRepo: AgendaItemRepositoryService, + private cd: ChangeDetectorRef ) { super(); @@ -72,6 +87,14 @@ export class ModerationNoteComponent extends BaseMeetingComponent { }); } + public ngOnInit(): void { + this.operator.permissionsObservable.subscribe(() => { + this._canSeeModerationNote = this.operator.hasPerms(Permission.agendaItemCanSeeModeratorNotes); + this._canManageModerationNote = this.operator.hasPerms(Permission.agendaItemCanManageModeratorNotes); + this.cd.markForCheck(); + }); + } + public toggleEditModeratorNote(): void { this.isEditing = !this.isEditing; if (this.isEditing && !!this.moderatorNotesForForm) { From 547fb073063aaf852a2231623ca9917021bbd401 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Thu, 29 Feb 2024 08:24:49 +0100 Subject: [PATCH 49/59] Make own structure_level changeable (#3374) --- .../list-of-speakers-content.component.html | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html index ecde9f4d1b..70552f1ce6 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -227,6 +227,19 @@ + + + + + + From 3c30207b98fef296c49c3ea6682d58ea3fba44eb Mon Sep 17 00:00:00 2001 From: reiterl Date: Thu, 29 Feb 2024 13:57:23 +0100 Subject: [PATCH 50/59] Fix delete speakers from view model list (#3375) --- .../src/app/infrastructure/definitions/relations/relations.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/app/infrastructure/definitions/relations/relations.ts b/client/src/app/infrastructure/definitions/relations/relations.ts index 5ebb8b6611..854be3f325 100644 --- a/client/src/app/infrastructure/definitions/relations/relations.ts +++ b/client/src/app/infrastructure/definitions/relations/relations.ts @@ -428,7 +428,8 @@ export const RELATIONS: Relation[] = [ OViewModel: ViewMeeting, MViewModel: ViewSpeaker, OField: `speakers`, - MField: `meeting` + MField: `meeting`, + isFullList: true }), ...makeM2O({ OViewModel: ViewMeeting, From e230e84b15fd6400fb189f343919d2f94a19bb62 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:10:33 +0100 Subject: [PATCH 51/59] Change motion delete warnings (#3373) --- .../motion-multiselect/services/motion-multiselect.service.ts | 2 +- .../motion-detail-view/motion-detail-view.component.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts index 61d162fcbb..58efa5f3d7 100644 --- a/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts @@ -71,7 +71,7 @@ export class MotionMultiselectService { let title = this.translate.instant(`Are you sure you want to delete all selected motions?`); if (motions.some(motion => motion.amendments?.length)) { title = this.translate.instant( - `Warning: Amendments exist for at least one of the selected motions. Are you sure you want to delete these motions regardless?` + `Warning: At least one of the selected motions has amendments, these will be deleted as well. Do you want to delete anyway?` ); } if (await this.promptService.open(title)) { diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts index d75c05df4c..788595a15e 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts @@ -229,9 +229,7 @@ export class MotionDetailViewComponent extends BaseMeetingComponent implements O this.motion.getTitle() + `` + `
` + - this.translate.instant( - `Deleting this motion will likely impact it's amendments negatively and they could become unusable.` - ) + + this.translate.instant(`Deleting this motion will also delete the amendments.`) + `
` + this.translate.instant(`List of amendments: `) + `
` + From 9afed3bc0e2d80e068bb1e9c84d5b087aba7bc26 Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:25:51 +0100 Subject: [PATCH 52/59] Update meta (#3392) --- client/src/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/meta b/client/src/meta index 9e390b0b16..8c6fcb9f05 160000 --- a/client/src/meta +++ b/client/src/meta @@ -1 +1 @@ -Subproject commit 9e390b0b16af49e4c57b1802e8912c8ac550a634 +Subproject commit 8c6fcb9f058bd6e522313baba525e3f4edacd1aa From 43a28a158e0b82590131834805e2e423ea844b23 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Mon, 4 Mar 2024 15:23:55 +0100 Subject: [PATCH 53/59] Improve service worker update flow (#3368) --- client/angular.json | 2 + .../openslides-main.module.ts | 2 +- .../global-spinner.component.ts | 12 +++--- .../services/spinner.service.ts | 28 ++++++------- .../site-wrapper/services/update.service.ts | 6 +++ client/src/app/site/services/auth.service.ts | 11 +++-- .../autoupdate-communication.service.ts | 41 +++++++++++-------- client/src/ngsw-safety.json | 10 +++++ client/src/sw.js | 1 + nginx/nginx.conf | 4 ++ 10 files changed, 76 insertions(+), 41 deletions(-) create mode 100644 client/src/ngsw-safety.json create mode 100644 client/src/sw.js diff --git a/client/angular.json b/client/angular.json index 028543dc0b..b457eab31e 100644 --- a/client/angular.json +++ b/client/angular.json @@ -30,6 +30,8 @@ "assets": [ "src/assets", "src/manifest.webmanifest", + "src/sw.js", + "src/ngsw-safety.json", { "glob": "**/*", "input": "node_modules/tinymce", diff --git a/client/src/app/openslides-main-module/openslides-main.module.ts b/client/src/app/openslides-main-module/openslides-main.module.ts index 093c7bdb7f..9077df5250 100644 --- a/client/src/app/openslides-main-module/openslides-main.module.ts +++ b/client/src/app/openslides-main-module/openslides-main.module.ts @@ -34,7 +34,7 @@ const NOT_LAZY_LOADED_MODULES = [MatSnackBarModule, GlobalSpinnerModule, WaitFor HttpClientModule, OpenSlidesTranslationModule.forRoot(), ...NOT_LAZY_LOADED_MODULES, - ServiceWorkerModule.register(`ngsw-worker.js`, { + ServiceWorkerModule.register(`sw.js`, { enabled: environment.production, // Register the ServiceWorker as soon as the application is stable // or after 30 seconds (whichever comes first). diff --git a/client/src/app/site/modules/global-spinner/components/global-spinner/global-spinner.component.ts b/client/src/app/site/modules/global-spinner/components/global-spinner/global-spinner.component.ts index 6b6bc74e5d..e5fdc1d141 100644 --- a/client/src/app/site/modules/global-spinner/components/global-spinner/global-spinner.component.ts +++ b/client/src/app/site/modules/global-spinner/components/global-spinner/global-spinner.component.ts @@ -4,6 +4,8 @@ import { ConnectionStatusService } from 'src/app/site/services/connection-status import { LifecycleService } from 'src/app/site/services/lifecycle.service'; import { SpinnerComponent } from 'src/app/ui/modules/spinner/components/spinner/spinner.component'; +import { UpdateService } from '../../../site-wrapper/services/update.service'; + @Component({ selector: `os-global-spinner`, templateUrl: `./global-spinner.component.html`, @@ -28,6 +30,8 @@ export class GlobalSpinnerComponent extends SpinnerComponent { if (this.connectionStatusService.getReason()) { errorText.push(this.connectionStatusService.getReason()); } + } else if (this.updateService.updateAvailable) { + errorText.push(this.translate.instant(`Application update in progress.`)); } } @@ -37,18 +41,14 @@ export class GlobalSpinnerComponent extends SpinnerComponent { public constructor( private lifecycleService: LifecycleService, private connectionStatusService: ConnectionStatusService, - private translate: TranslateService + private translate: TranslateService, + private updateService: UpdateService ) { super(); this.lifecycleService.booted.then(() => { setTimeout(() => { this.displayDetailedInformation = true; - console.log( - this.displayDetailedInformation, - this.connectionStatusService.isOffline(), - this.connectionStatusService.getReason() - ); }, 10000); }); } diff --git a/client/src/app/site/modules/global-spinner/services/spinner.service.ts b/client/src/app/site/modules/global-spinner/services/spinner.service.ts index ba21c40374..d3a236cef9 100644 --- a/client/src/app/site/modules/global-spinner/services/spinner.service.ts +++ b/client/src/app/site/modules/global-spinner/services/spinner.service.ts @@ -16,17 +16,17 @@ import { GlobalSpinnerModule } from '../global-spinner.module'; export class SpinnerService { private overlayInstance: OverlayInstance | null = null; - private isOperatorReady = false; - private isStable = false; - private _isOffline = false; - private isOnLoginMask = false; - private isOnErrorPage = false; + private static isOperatorReady = false; + private static isStable = false; + private static _isOffline = false; + private static isOnLoginMask = false; + private static isOnErrorPage = false; - public get isOffline(): boolean { + public static get isOffline(): boolean { return this._isOffline; } - private set isOffline(isOffline: boolean) { + private static set isOffline(isOffline: boolean) { this._isOffline = isOffline; } @@ -72,7 +72,7 @@ export class SpinnerService { * * @returns True, if the three booleans are all true. */ - public isConnectionStable(): boolean { + public static isConnectionStable(): boolean { return this.isOnLoginMask || this.isOnErrorPage || (this.isOperatorReady && (this.isOffline || this.isStable)); } @@ -80,7 +80,7 @@ export class SpinnerService { * Function to check, if the app is stable and, if true, hide the spinner. */ private checkConnection(): void { - if (this.isConnectionStable()) { + if (SpinnerService.isConnectionStable()) { this.hide(); this.cleanupStableSubscription(); } @@ -94,12 +94,12 @@ export class SpinnerService { this.router.events.pipe(filter(event => event instanceof RoutesRecognized)).pipe(startWith(null)), this.router.events.pipe(filter(event => event.type === EventType.ActivationEnd)).pipe(startWith(null)) ]).subscribe(([isReady, isOffline, isStable, event, activationEnd]) => { - this.isOperatorReady = isReady; - this.isOffline = isOffline; - this.isStable = isStable && !!activationEnd; + SpinnerService.isOperatorReady = isReady; + SpinnerService.isOffline = isOffline; + SpinnerService.isStable = isStable && !!activationEnd; if (event) { - this.isOnLoginMask = (event as RoutesRecognized).url.includes(`login`); - this.isOnErrorPage = (event as RoutesRecognized).url.includes(`error`); + SpinnerService.isOnLoginMask = (event as RoutesRecognized).url.includes(`login`); + SpinnerService.isOnErrorPage = (event as RoutesRecognized).url.includes(`error`); } this.checkConnection(); diff --git a/client/src/app/site/modules/site-wrapper/services/update.service.ts b/client/src/app/site/modules/site-wrapper/services/update.service.ts index edc43636f1..4763f56135 100644 --- a/client/src/app/site/modules/site-wrapper/services/update.service.ts +++ b/client/src/app/site/modules/site-wrapper/services/update.service.ts @@ -14,6 +14,11 @@ export class UpdateService { return this._nextVersionAvailableSubject; } + private _updateAvailable = false; + public get updateAvailable(): boolean { + return this._updateAvailable; + } + private _nextVersionAvailableSubject = new Subject(); /** @@ -57,6 +62,7 @@ export class UpdateService { const currentVersion = version.currentVersion.hash; const latestVersion = version.latestVersion.hash; const isUpdateAvailable = currentVersion !== latestVersion; + this._updateAvailable = isUpdateAvailable; console.log(`Current version: ${currentVersion}.\n Latest version: ${latestVersion}`); console.log(isUpdateAvailable ? `Update available` : `No update available`); if (isUpdateAvailable) { diff --git a/client/src/app/site/services/auth.service.ts b/client/src/app/site/services/auth.service.ts index 67102f0f53..a1fb86112d 100644 --- a/client/src/app/site/services/auth.service.ts +++ b/client/src/app/site/services/auth.service.ts @@ -1,11 +1,11 @@ import { EventEmitter, Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { ActionService } from 'src/app/gateways/actions'; import { AuthToken } from '../../domain/interfaces/auth-token'; import { AuthAdapterService } from '../../gateways/auth-adapter.service'; import { ProcessError } from '../../infrastructure/errors'; +import { UpdateService } from '../modules/site-wrapper/services/update.service'; import { AuthTokenService } from './auth-token.service'; import { DataStoreService } from './data-store.service'; import { LifecycleService } from './lifecycle.service'; @@ -51,7 +51,7 @@ export class AuthService { private router: Router, private authAdapter: AuthAdapterService, private authTokenService: AuthTokenService, - private actionService: ActionService, + private updateService: UpdateService, private DS: DataStoreService ) { this.resumeTokenSubscription(); @@ -95,7 +95,12 @@ export class AuthService { public redirectUser(meetingId: number | null): void { if (this.isAuthenticated()) { const baseRoute = meetingId ? `${meetingId}/` : `/`; - this.router.navigate([baseRoute]); + if (this.updateService.updateAvailable) { + const baseUrl = this.router.serializeUrl(this.router.createUrlTree([baseRoute])); + location.href = baseUrl; + } else { + this.router.navigate([baseRoute]); + } } } diff --git a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts index 4c873e4293..2d878e33b0 100644 --- a/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts +++ b/client/src/app/site/services/autoupdate/autoupdate-communication.service.ts @@ -24,6 +24,7 @@ import { AutoupdateStatus } from 'src/app/worker/autoupdate/interfaces-autoupdate'; +import { SpinnerService } from '../../modules/global-spinner'; import { UpdateService } from '../../modules/site-wrapper/services/update.service'; import { AuthService } from '../auth.service'; import { AuthTokenService } from '../auth-token.service'; @@ -250,22 +251,24 @@ export class AutoupdateCommunicationService { if (data.content.data?.reason === `Logout`) { this.authService.logout(); } else if (data.content.data?.terminate) { - this.tryReconnectOpen = true; - this.matSnackBar - .open( - this.translate.instant(`Error talking to autoupdate service`), - this.translate.instant(`Try reconnect`), - { - duration: 0 - } - ) - .onAction() - .subscribe(() => { - this.tryReconnectOpen = false; - this.sharedWorker.sendMessage(`autoupdate`, { - action: `reconnect-inactive` - } as AutoupdateReconnectInactive); - }); + if (SpinnerService.isConnectionStable) { + this.tryReconnectOpen = true; + this.matSnackBar + .open( + this.translate.instant(`Error talking to autoupdate service`), + this.translate.instant(`Try reconnect`), + { + duration: 0 + } + ) + .onAction() + .subscribe(() => { + this.tryReconnectOpen = false; + this.sharedWorker.sendMessage(`autoupdate`, { + action: `reconnect-inactive` + } as AutoupdateReconnectInactive); + }); + } } else if (data.content.data?.reason === `HTTP error`) { console.error(data.content.data); const error = data.content?.data?.error; @@ -276,6 +279,10 @@ export class AutoupdateCommunicationService { this.updateService.checkForUpdate().then((hasUpdate: boolean) => { if (hasUpdate) { + if (!SpinnerService.isConnectionStable) { + this.updateService.applyUpdate(); + } + this.matSnackBar .open( this.translate.instant(`You are using an incompatible client version`), @@ -286,7 +293,7 @@ export class AutoupdateCommunicationService { ) .onAction() .subscribe(() => { - document.location.reload(); + this.updateService.applyUpdate(); }); } }); diff --git a/client/src/ngsw-safety.json b/client/src/ngsw-safety.json new file mode 100644 index 0000000000..2ac8de121e --- /dev/null +++ b/client/src/ngsw-safety.json @@ -0,0 +1,10 @@ +{ + "configVersion": 1, + "timestamp": 1, + "index": "/index.html", + "assetGroups": [], + "dataGroups": [], + "hashTable": {}, + "navigationUrls": [], + "navigationRequestStrategy": "performance" +} diff --git a/client/src/sw.js b/client/src/sw.js new file mode 100644 index 0000000000..79e65fa9f3 --- /dev/null +++ b/client/src/sw.js @@ -0,0 +1 @@ +importScripts('ngsw-worker.js'); diff --git a/nginx/nginx.conf b/nginx/nginx.conf index ca87e5ca8d..dd88a84141 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -27,6 +27,10 @@ http { proxy_send_timeout 120; proxy_read_timeout 120; + if ($http_referer ~ ngsw-worker\.js$) { + rewrite /ngsw.json /ngsw-safety.json break; + } + location / { try_files $uri $uri/ /index.html; } From 9b370447265fc6fc31b834a26a4e2de0330debfe Mon Sep 17 00:00:00 2001 From: luisa-beerboom <101706784+luisa-beerboom@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:10:46 +0100 Subject: [PATCH 54/59] Change label color of focused form field in dark mode (#3399) --- client/src/assets/styles/theme-styles.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/src/assets/styles/theme-styles.scss b/client/src/assets/styles/theme-styles.scss index 2762749f91..59b5f96498 100644 --- a/client/src/assets/styles/theme-styles.scss +++ b/client/src/assets/styles/theme-styles.scss @@ -29,6 +29,12 @@ @include mat.all-component-colors($openslides-dark-theme); @include os-component-themes($openslides-dark-theme); @include os-var-overwrites(); + + mat-form-field:focus-within { + mat-label{ + color: white; + } + } } .mat-calendar-body-cell { From 629a6c8f3106b0ee652f3121dab63b6195ea49b0 Mon Sep 17 00:00:00 2001 From: Joshua Sangmeister <33004050+jsangmeister@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:02:45 +0100 Subject: [PATCH 55/59] Prevent certain speech state changes (#3395) --- .../list-of-speakers-content.component.html | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html index 70552f1ce6..511f5fa47e 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -229,12 +229,7 @@ diff --git a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/speaker-user-select-dialog/components/speaker-user-select-dialog/speaker-user-select-dialog.component.html b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/speaker-user-select-dialog/components/speaker-user-select-dialog/speaker-user-select-dialog.component.html index 71d90ae43b..300d7aa1df 100644 --- a/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/speaker-user-select-dialog/components/speaker-user-select-dialog/speaker-user-select-dialog.component.html +++ b/client/src/app/site/pages/meetings/modules/list-of-speakers-content/modules/speaker-user-select-dialog/components/speaker-user-select-dialog/speaker-user-select-dialog.component.html @@ -6,7 +6,7 @@

diff --git a/client/src/app/site/pages/meetings/modules/projector/modules/slides/definitions/slides.ts b/client/src/app/site/pages/meetings/modules/projector/modules/slides/definitions/slides.ts index 51bd8a54e1..f5c383d5e3 100644 --- a/client/src/app/site/pages/meetings/modules/projector/modules/slides/definitions/slides.ts +++ b/client/src/app/site/pages/meetings/modules/projector/modules/slides/definitions/slides.ts @@ -130,7 +130,7 @@ export const Slides: SlideManifest[] = [ import(`../components/projector-countdown-slide/projector-countdown-slide.module`).then( m => m.ProjectorCountdownSlideModule ), - verboseName: _(`Countdown/Timer`), + verboseName: _(`Timer`), scaleable: false, scrollable: false }, diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html index 987de98fa3..2df22279db 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html @@ -188,7 +188,7 @@

{{ 'Candidates' | translate }}

diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-extension-field/motion-extension-field.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-extension-field/motion-extension-field.component.html index cf8b38e77a..4335e07d21 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-extension-field/motion-extension-field.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-extension-field/motion-extension-field.component.html @@ -24,7 +24,7 @@

{{ title }}

{{ chipValue | translate }} - ({{ 'intern' | translate }}) + ({{ 'internal' | translate }})
diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html index 1d88d5de70..d26ea32e21 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html @@ -57,7 +57,7 @@

diff --git a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html index 9be42f34eb..21a0275fdb 100644 --- a/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html +++ b/client/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html @@ -57,7 +57,7 @@

{{ 'Sup [motion]="motion" [repo]="motionEditorRepo" field="editors" - title="{{ 'Editors' | translate }}" + title="{{ 'Motion editors' | translate }}" >

@@ -66,7 +66,7 @@

{{ 'Sup [motion]="motion" [repo]="motionWorkingGroupSpeakerRepo" field="working_group_speakers" - title="{{ 'Working group speakers' | translate }}" + title="{{ 'Spokesperson' | translate }}" >

@@ -287,7 +287,7 @@

{{ 'Origin' | translate }}

-

{{ (motion.hasLeadMotion ? 'Identical amendments' : 'Identical motions') | translate }}

+

{{ 'Identical with' | translate }}

= { property: `editorUserIds`, - label: _(`Editors`), + label: _(`Motion editors`), options: [] }; private workingGroupSpeakerFilterOptions: OsFilter = { property: `workingGroupSpeakerUserIds`, - label: _(`Working group speakers`), + label: _(`Spokesperson`), options: [] }; @@ -229,14 +229,14 @@ export class MotionListFilterService extends BaseMeetingFilterListService editor.user }); this.updateFilterForRepo({ repo: this.workingGroupSpeakerRepo, filter: this.workingGroupSpeakerFilterOptions, - noneOptionLabel: _(`No working group speakers`), + noneOptionLabel: _(`No spokesperson`), mapFn: (speaker: ViewMotionWorkingGroupSpeaker) => speaker.user }); diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-filter.service/participant-speaker-list-filter.service.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-filter.service/participant-speaker-list-filter.service.ts index 35608cb725..8cb58b3287 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-filter.service/participant-speaker-list-filter.service.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-filter.service/participant-speaker-list-filter.service.ts @@ -67,7 +67,7 @@ export class ParticipantSpeakerListFilterService extends BaseMeetingFilterListSe condition: SpeechState.INTERPOSED_QUESTION, label: this.translate.instant(`Interposed question`) }, - { condition: null, label: this.translate.instant(`No speech type`) } + { condition: null, label: this.translate.instant(`not specified`) } ] }, { diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts index d120bb5077..04810c284c 100644 --- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts +++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts @@ -22,7 +22,7 @@ export class ParticipantSpeakerListSortService extends BaseSortListService[] = [ { property: `id`, label: _(`Receipt of contributions`) }, - { property: `begin_time`, label: _(`Speak start time`) }, + { property: `begin_time`, label: _(`Speech start time`) }, { property: `name`, label: _(`Speaker`) } ]; diff --git a/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.html b/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.html index 6cd8845b62..b1c4656a9d 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.html +++ b/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.html @@ -1,5 +1,5 @@

- {{ 'Countdown/Timer' | translate }} + {{ 'Timer' | translate }}

@@ -20,7 +20,7 @@

{{ 'Time' | translate }} - If the value is set to 0, the time counts up as a timer. + If the value is set to 0 the time counts up as stopwatch.

@@ -35,7 +35,7 @@

{{ 'Save' | translate }} - + diff --git a/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.ts b/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.ts index e68dbc6303..f1a559f770 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.ts @@ -38,7 +38,7 @@ export class ProjectorCountdownDialogComponent implements OnInit { */ public ngOnInit(): void { const time = this.data.duration || this.durationService.durationToString(this.defaultTime, `m`); - const title = this.data.title || `${this.translate.instant(`Countdown/Timer`)} ${this.data.count || 0 + 1}`; + const title = this.data.title || `${this.translate.instant(`Timer`)} ${this.data.count || 0 + 1}`; this.countdownForm = this.formBuilder.group({ title: [title, Validators.required], diff --git a/client/src/app/site/pages/meetings/pages/projectors/components/projector-message-dialog/components/projector-message-dialog/projector-message-dialog.component.html b/client/src/app/site/pages/meetings/pages/projectors/components/projector-message-dialog/components/projector-message-dialog/projector-message-dialog.component.html index 2494ba1de5..540772c8cd 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/components/projector-message-dialog/components/projector-message-dialog/projector-message-dialog.component.html +++ b/client/src/app/site/pages/meetings/pages/projectors/components/projector-message-dialog/components/projector-message-dialog/projector-message-dialog.component.html @@ -19,7 +19,7 @@

{{ 'Save' | translate }} - + diff --git a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html index ea9cd12d7e..6a1d977a3c 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html +++ b/client/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html @@ -290,7 +290,7 @@

{{ projector.name }}

- {{ 'Countdowns/Timers' | translate }} + {{ 'Timers' | translate }} @@ -304,7 +304,7 @@

{{ projector.name }}

diff --git a/client/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts b/client/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts index e718546a09..b94f8b5b19 100644 --- a/client/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts +++ b/client/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts @@ -31,8 +31,8 @@ export class ViewProjectorCountdown extends BaseProjectableViewModel General]" msgstr "" +"Attention : Entrez d'abord les données du réseau sans fil dans [Réglages > " +"Général]" msgid "Attention: This action cannot be undone!" msgstr "Attention : Cette action ne peut être annulée !" @@ -884,6 +925,9 @@ msgstr "" msgid "Can create, modify, start/stop and delete votings." msgstr "Peut créer, modifier, démarrer/arrêter et supprimer des votes." +msgid "Can edit all moderation notes." +msgstr "Peut modifier toutes les notes de modération." + msgid "" "Can edit and assign the following motion metadata: Submitter, state, " "recommendation, category, motion blocks and tags." @@ -927,6 +971,9 @@ msgstr "U" msgid "Can manage logos and fonts" msgstr "Peut gérer les logos et les polices de caractères" +msgid "Can manage moderation notes" +msgstr "Peut gérer les notes de modération" + msgid "Can manage motion metadata" msgstr "Peut gérer les métadonnées de mouvement" @@ -973,7 +1020,7 @@ msgstr "" "Nécessite l'autorisation du groupe : [Peut voir les participants]" msgid "Can not import because of errors" -msgstr "" +msgstr "Ne peut pas être importé en raison d'erreurs" msgid "Can put oneself on the list of speakers" msgstr "Peut se mettre soi-même sur la liste des orateurs" @@ -993,11 +1040,15 @@ msgstr "Peut voir tous les sujets internes, les horaires et les commentaires." msgid "Can see all lists of speakers" msgstr "Peut voir toutes les listes d'orateurs" +msgid "Can see all moderation notes in each list of speakers." +msgstr "" +"Peut voir toutes les notes de modération dans chaque liste de participants." + msgid "Can see elections" msgstr "Peut voir les élections" msgid "Can see files" -msgstr "" +msgstr "Peut voir les fichiers" msgid "Can see history" msgstr "Peut voir l'histoire" @@ -1008,6 +1059,9 @@ msgstr "Peut voir les points internes et l'horaire de l'ordre du jour" msgid "Can see list of speakers" msgstr "Peut voir la liste des orateurs" +msgid "Can see moderation notes" +msgstr "Peut voir les notes de modération" + msgid "Can see motions" msgstr "Peut voir les motions" @@ -1236,20 +1290,30 @@ msgstr "" "participants :" msgid "Checkmate! You lost!" -msgstr "" +msgstr "Échec et mat ! Vous avez perdu !" msgid "Checkmate! You won!" -msgstr "" +msgstr "Échec et mat ! Vous avez gagné !" msgid "Chess" -msgstr "" +msgstr "Échecs" msgid "Choice" msgstr "Choix" +msgid "Choose 0 to disable Intervention." +msgstr "Choisissez 0 pour désactiver l'intervention." + msgid "Choose 0 to disable the supporting system." msgstr "Choisissez 0 pour desactiver le système de soutien." +msgid "" +"Choose a number greater than 0 to activate speaking times widget for " +"structure level countdowns." +msgstr "" +"Choisissez un nombre supérieur à 0 pour activer le widget des temps de " +"parole pour les décomptes de niveau de structure." + msgid "Chyron" msgstr "Chyron" @@ -1271,6 +1335,9 @@ msgstr "Supprimer tous les filtres" msgid "Clear all list of speakers" msgstr "Effacer toute les listes d'orateurs." +msgid "Clear current projection" +msgstr "Effacer la projection actuelle" + msgid "Clear list" msgstr "Effacer la liste" @@ -1287,7 +1354,10 @@ msgid "Click here to vote!" msgstr "Cliquez ici pour voter !" msgid "Close" -msgstr "" +msgstr "Fermer" + +msgid "Close edit mode" +msgstr "Fermer le mode édition" msgid "Close list of speakers" msgstr "Fermer la liste des orateurs" @@ -1364,8 +1434,17 @@ msgstr "Comissions" msgid "Committees and meetings" msgstr "Comissions et réunions" -msgid "Complex Workflow" -msgstr "Flux de travail complexe" +msgid "Committees created" +msgstr "Comités créés" + +msgid "Committees updated" +msgstr "Comités mis à jour" + +msgid "Committees with errors" +msgstr "Comités avec des erreurs" + +msgid "Committees with warnings: affected cells will be skipped" +msgstr "Comités avec avertissements : les cellules affectées seront ignorées" msgid "Conference room" msgstr "Salle de conférence" @@ -1401,6 +1480,9 @@ msgstr "Contre discours" msgid "Contribution" msgstr "Contribution" +msgid "Contributions" +msgstr "Contributions" + msgid "Copy report to clipboard" msgstr "Copier le rapport dans le presse-papiers" @@ -1408,23 +1490,11 @@ msgid "Count completed requests to speak" msgstr "Compter les demandes de parole complétées" msgid "Count logged-in users" -msgstr "" +msgstr "Compter les utilisateurs connectés" msgid "Countdown" msgstr " Compte à rebours " -msgid "Countdown and traffic light" -msgstr "Compte à rebours et feux rouges." - -msgid "Countdown description" -msgstr "Description du compte à rebours" - -msgid "Countdown time" -msgstr "Temps de compte à rebours" - -msgid "Countdown title" -msgstr "Titre du compte à rebours" - msgid "Countdowns" msgstr " Comptes à rebours " @@ -1443,12 +1513,6 @@ msgstr "Créer" msgid "Create editorial final version" msgstr "Créer la version éditoriale finale" -msgid "Create new chat group" -msgstr "Créer un nouveau groupe de chat" - -msgid "Create new tag" -msgstr "Créer une nouvelle balise" - msgid "Create subitem" msgstr "Créer une sous-rubrique" @@ -1476,6 +1540,9 @@ msgstr "Liste actuelle des orateurs (sous forme de diapositive)" msgid "Current slide" msgstr "Diapositive actuelle" +msgid "Current speaker" +msgstr "L'orateur actuel" + msgid "Current speaker chyron" msgstr "Chyron de l'orateur actuel" @@ -1506,29 +1573,6 @@ msgstr "Le stock de données est corrompu ! Voir la console pour les erreurs." msgid "Datastore is ok!" msgstr "Le stock de données est correct !" -msgid "" -"Dear {name},\n" -"\n" -"this is your personal OpenSlides login:\n" -"\n" -"{url}\n" -"Username: {username}\n" -"Password: {password}\n" -"\n" -"\n" -"This email was generated automatically." -msgstr "" -"Cher {nom},\n" -"\n" -"voici votre login personnel OpenSlides :\n" -"\n" -"{url}\n" -"Nom d'utilisateur : {nom d'utilisateur}\n" -"Mot de passe : {mot de passe}\n" -"\n" -"\n" -"Cet e-mail a été généré automatiquement." - msgid "Decision" msgstr "Décision" @@ -1556,21 +1600,14 @@ msgstr "Groupes par défaut avec droit de vote" msgid "Default line numbering" msgstr "Numérotation par ligne par défaut" -msgid "Default number" -msgstr "Numéro par défaut" - -msgid "Default participant number" -msgstr "Nombre de participants par défaut" - -msgid "Default projector" -msgstr "Projecteur par défaut" - -msgid "Default structure level" -msgstr "Niveau de structure par défaut" +msgid "Default speaking time for structure levels in seconds" +msgstr "Temps de parole par défaut pour les niveaux de structure en secondes" msgid "" "Default text version for change recommendations and projection of motions" msgstr "" +"Version par défaut du texte pour les recommandations de changement et la " +"projection des mouvements" msgid "Default visibility for new agenda items (except topics)" msgstr "" @@ -1639,9 +1676,6 @@ msgstr "" "Définit les états qui peuvent être sélectionnés ensuite dans le flux de " "travail." -msgid "Delegates" -msgstr "Délégués" - msgid "Delegation of vote" msgstr "Délégation de vote" @@ -1660,6 +1694,13 @@ msgstr "Supprimer le projecteur" msgid "Deleted user" msgstr "Utilisateur supprimé" +msgid "" +"Deleting this motion will likely impact it's amendments negatively and they " +"could become unusable." +msgstr "" +"Supprimer cette motion aura probablement un impact négatif sur ses " +"amendements et ils pourraient devenir inutilisables." + msgid "Deletion" msgstr "Suppression" @@ -1689,27 +1730,26 @@ msgstr "Désactivé (pas de pourcentages)" msgid "Disallow new point of order when list of speakers is closed" msgstr "" +"Interdire les nouvelles demandes de motions de procédure lorsque la liste " +"des orateurs est close" msgid "Display type" msgstr "Type d'écran" +msgid "Distribute overhang time" +msgstr "Distribuer le temps de surplomb" + msgid "Div" msgstr "Div" msgid "Divergent:" msgstr "Divergente :" -msgid "Do not concern" -msgstr "Ne pas concerner" - -msgid "Do not decide" -msgstr "Ne decidér pas" - msgid "Do not forget to save your changes!" msgstr "N'oubliez pas d'enregistrer vos modifications !" msgid "Do you accept?" -msgstr "" +msgstr "Acceptez-vous ?" msgid "Do you really want to delete this color set?" msgstr "Voulez-vous vraiment supprimer ce jeu de couleurs ?" @@ -1765,7 +1805,7 @@ msgid "Duration" msgstr "Durée" msgid "Duration in minutes" -msgstr "" +msgstr "Durée en minutes" msgid "Duration of all requests to speak" msgstr "Durée de toutes les demandes d'intervention" @@ -1789,6 +1829,9 @@ msgstr "" msgid "Edit" msgstr "Modifier" +msgid "Edit account" +msgstr "Modifier le compte" + msgid "Edit comment field" msgstr "Modifier le champ de commentaires" @@ -1804,15 +1847,27 @@ msgstr "Editer les détails de" msgid "Edit editorial final version" msgstr "Editer la version finale de l'éditorial" +msgid "Edit group" +msgstr "Modifier le groupe" + msgid "Edit meeting" msgstr "Modifier la réunion" -msgid "Edit name" -msgstr "Modifier le nom" +msgid "Edit moderation note" +msgstr "Modifier la note de modération" + +msgid "Edit point of order ..." +msgstr "" msgid "Edit projector" msgstr "Modifier le projecteur" +msgid "Edit queue" +msgstr "Éditer la file d'attente" + +msgid "Edit state" +msgstr "Modifier le status" + msgid "Edit statute paragraph" msgstr "Modifier le paragraphe sur les statuts" @@ -1828,6 +1883,12 @@ msgstr "Modifier pour saisir les votes." msgid "Edit topic" msgstr "Modifier le sujet" +msgid "Edit total time" +msgstr "Modifier le temps total" + +msgid "Edit workflow" +msgstr "Modifier le flux de travail" + msgid "Editorial final version" msgstr "Version éditoriale finale" @@ -1840,6 +1901,9 @@ msgstr "Documents relatifs aux élections" msgid "Elections" msgstr "Elections" +msgid "Element" +msgstr "Élément" + msgid "Email" msgstr "Courriel" @@ -1873,6 +1937,9 @@ msgstr "Permettre le vote électronique" msgid "Enable forspeech / counter speech" msgstr "Permettre le discours / contre-discours" +msgid "Enable interposed questions" +msgstr "Activer les questions interposées" + msgid "Enable numbering for agenda items" msgstr "Activer la numérotation pour les points de l'ordre du jour" @@ -1882,6 +1949,9 @@ msgstr "Activer la vue de présence des participants" msgid "Enable point of order" msgstr "Activer le point d'ordre" +msgid "Enable point of orders for other participants" +msgstr "" + msgid "Enable specifications and ranking for possible motions" msgstr "" "Permettre des spécifications et un classement pour les motions possibles" @@ -1995,6 +2065,9 @@ msgstr "" "Saisissez votre e-mail pour envoyer le lien de réinitialisation du mot de " "passe" +msgid "Entitled present users" +msgstr "" + msgid "Entitled to vote" msgstr "Ont le droit de vote" @@ -2086,7 +2159,7 @@ msgid "File" msgstr "Fichier" msgid "File is being used" -msgstr "" +msgstr "Le fichier est en cours d'utilisation" msgid "Filename" msgstr "Nom de fichier" @@ -2178,12 +2251,6 @@ msgstr "Transfert créé" msgid "Forwarding of motion" msgstr "Transmission de la motion" -msgid "Forwardings" -msgstr "Transmissions" - -msgid "Front page text" -msgstr "Texte de la première page" - msgid "Front page title" msgstr "Titre de la première page" @@ -2296,6 +2363,9 @@ msgstr "N'a pas d'odrateurs" msgid "Has not logged in yet" msgstr "Ne s'est pas encore connecté" +msgid "Has not voted" +msgstr "" + msgid "Has notes" msgstr "A des notes" @@ -2350,6 +2420,9 @@ msgstr "Le texte d'aide pour les données d'accès et PDF de bienvenue" msgid "Hidden item" msgstr "élément masqué" +msgid "Hide main menu" +msgstr "Masquer le menu principal" + msgid "Hide more text" msgstr "Cacher plus de texte" @@ -2375,9 +2448,14 @@ msgid "I know the risk" msgstr "Je connais le risque" msgid "" -"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here. \n" +"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here.\n" " To receive replies you have to enter a reply address in the next field. Please test the email dispatch in case of changes!" msgstr "" +"IMPORTANT : L'adresse de l'expéditeur (noreply@openslides.com) est définie dans les paramètres du serveur OpenSlides et ne peut pas être modifiée ici.\n" +"Pour recevoir des réponses, vous devez saisir une adresse de réponse dans le champ suivant. Veuillez tester l'envoi du courriel en cas de changement !" + +msgid "Identical with" +msgstr "" msgid "Identifier" msgstr "Identificateur" @@ -2392,6 +2470,9 @@ msgstr "" "S'il s'agit d'un amendement, vous pouvez sauvegarder son contenu lors de " "l'édition et le supprimer par la suite." +msgid "If the value is set to 0 the time counts up as stopwatch." +msgstr "" + msgid "Import" msgstr "Import" @@ -2417,10 +2498,10 @@ msgid "Import statute" msgstr "Importer les statuts" msgid "Import successful" -msgstr "" +msgstr "Import réussi" msgid "Import successful with some warnings" -msgstr "" +msgstr "Import réussi avec quelques avertissements" msgid "Import topics" msgstr "Importer les sujets" @@ -2433,7 +2514,7 @@ msgstr "" "Dans la liste des motions, dans les détails des motions et dans le PDF." msgid "In progress, please wait ..." -msgstr "" +msgstr "En cours, veuillez patienter..." msgid "In the election process" msgstr "Dans le processus électoral" @@ -2469,7 +2550,7 @@ msgid "Insertion" msgstr "Insertion" msgid "Insufficient material! It's a draw!" -msgstr "" +msgstr "Matériel insuffisant ! C'est un tirage au sort !" msgid "Internal" msgstr "Interne" @@ -2480,6 +2561,15 @@ msgstr "Element interne" msgid "Internal login" msgstr "Connexion interne" +msgid "Interposed question" +msgstr "Question interposée" + +msgid "Intervention" +msgstr "Intervention" + +msgid "Intervention speaking time in seconds" +msgstr "Temps de parole de l'intervention en secondes" + msgid "Invalid line number" msgstr "Numéro de ligne non valide" @@ -2588,10 +2678,10 @@ msgstr "" "liste des orateurs ou les sondages." msgid "It's a draw!" -msgstr "" +msgstr "C'est un tirage au sort !" msgid "It's your opponent's turn" -msgstr "" +msgstr "C'est au tour de votre adversaire" msgid "It's your turn!" msgstr "C'est à vous de jouer !" @@ -2680,8 +2770,8 @@ msgstr "Numérotation par ligne" msgid "Line spacing" msgstr "Espacement des lignes" -msgid "Linenumber" -msgstr "Numéro de ligne" +msgid "List of amendments: " +msgstr "Liste des amendements :" msgid "List of electronic votes" msgstr "Liste des votes électroniques" @@ -2707,11 +2797,6 @@ msgstr "Listes des orateurs" msgid "Live conference" msgstr "Conférence en direct" -msgid "Live conference has to be active. Choose 0 to disable auto connect." -msgstr "" -"La conférence en direct doit être active. Choisissez 0 pour désactiver la " -"connexion automatique." - msgid "Livestream" msgstr "Flux vidéo en direct" @@ -2725,7 +2810,7 @@ msgid "Loading data. Please wait ..." msgstr "Url de l'image de l'affiche de la diffusion en direct" msgid "Logged-in users" -msgstr "" +msgstr "Utilisateurs connectés" msgid "Login" msgstr "Connexion" @@ -2748,6 +2833,9 @@ msgstr "Nombre d'applaudissements le plus faible" msgid "Main motion and line number" msgstr "Motion principale et numéro de ligne" +msgid "Mandates switched sucessfully!" +msgstr "" + msgid "Mark as personal favorite" msgstr "Marquer comme favori personnel" @@ -2835,6 +2923,12 @@ msgstr "Nombre minimum de votes" msgid "Minimum number of digits for motion identifier" msgstr "Nombre minimum de chiffres pour l'identificateur de mouvement" +msgid "Moderation note" +msgstr "Note de modération" + +msgid "Modify design" +msgstr "Modifier le design" + msgid "Module" msgstr "Module" @@ -2877,6 +2971,12 @@ msgstr "Motion créée (transmise)" msgid "Motion deleted" msgstr "Motion suprimée" +msgid "Motion editor" +msgstr "" + +msgid "Motion editors" +msgstr "" + msgid "Motion forwarded to" msgstr "Proposition transmise à" @@ -2941,9 +3041,6 @@ msgstr "Mon profile" msgid "Name" msgstr "Nom" -msgid "Name exceeds 256 characters" -msgstr "Le nom dépasse 256 caractères" - msgid "Name of recommender" msgstr "Nom du conseiller" @@ -2956,18 +3053,12 @@ msgstr "Nom de la nouvelle catégorie" msgid "Natural person" msgstr "Personne physique" -msgid "Needs review" -msgstr "Doit être revu" - msgid "Negative votes are not allowed." msgstr "Negative votes are not allowed." msgid "Never" msgstr "Jamais" -msgid "New Projector" -msgstr "Nouveau projecteur" - msgid "New account" msgstr "Nouveau compte" @@ -2983,23 +3074,35 @@ msgstr "Nouvelle catégorie" msgid "New change recommendation" msgstr "Nouveau changement de recommandation" +msgid "New chat group" +msgstr "Nouveau groupe de chat" + msgid "New comment field" msgstr "Nouveau champ de commentaires" msgid "New committee" msgstr "Nouveau Comité" +msgid "New design" +msgstr "Nouveau design" + msgid "New directory" msgstr "Nouveau répertoire" msgid "New election" msgstr "Nouvelle élection" +msgid "New file" +msgstr "Nouveau fichier" + msgid "New file name" msgstr "Nouveau nom de fichier" -msgid "New group name" -msgstr "Nouveau nom de groupe" +msgid "New folder" +msgstr "Nouveau dossier" + +msgid "New group" +msgstr "Nouveau groupe" msgid "New meeting" msgstr "Nouvelle réunion" @@ -3019,6 +3122,9 @@ msgstr "Nouveau participant" msgid "New password" msgstr "Nouveau mot de passe" +msgid "New projector" +msgstr "Nouveau projecteur" + msgid "New state" msgstr "Nouveau status" @@ -3070,15 +3176,9 @@ msgstr "Aucun commentaire" msgid "No committee admin" msgstr "Pas d'administration de commission" -msgid "No concernment" -msgstr "Pas de concernment" - msgid "No data" msgstr "Pas de données" -msgid "No decision" -msgstr "Pas de décision" - msgid "No delegation of vote" msgstr "Pas de délégation de vote" @@ -3112,6 +3212,9 @@ msgstr "Pas de réunions a été selectionnées" msgid "No motion block set" msgstr "Pas de block de motions a été défini" +msgid "No motion editors" +msgstr "" + msgid "No one has voted for this poll" msgstr "Personne n'a voté pour ce sondage" @@ -3128,14 +3231,20 @@ msgid "No recommendation" msgstr "Aucune recommandation" msgid "No results found" -msgstr "" +msgstr "Aucun résultat trouvé" msgid "No results yet." msgstr "Aucun résultat pour l'instant." +msgid "No spokesperson" +msgstr "" + msgid "No statute paragraphs" msgstr "Aucun paragraphe du statut" +msgid "No structure level" +msgstr "" + msgid "No tags" msgstr "Pas de balises" @@ -3151,6 +3260,9 @@ msgstr "Liste des nominations" msgid "None" msgstr "Aucun" +msgid "None of the selected motions can be forwarded." +msgstr "Aucun des mouvements sélectionnés ne peut être transmis." + msgid "Not found" msgstr "Introuvable" @@ -3251,9 +3363,6 @@ msgstr "Ancien mot de passe" msgid "One email was send sucessfully." msgstr "Un courriel a été envoyé avec succès." -msgid "Only countdown" -msgstr "Compte à rebours uniquement" - msgid "Only for internal notes." msgstr "Seulement pour des notes internes." @@ -3265,6 +3374,9 @@ msgstr "" "Seuls les participants présents peuvent être ajoutés à la liste des " "orateurs." +msgid "Only time" +msgstr "" + msgid "Only traffic light" msgstr "Seul feu de circulation" @@ -3275,7 +3387,7 @@ msgid "Open a meeting to play \"Connect 4\"" msgstr "Ouvrir une réunion pour jouer à \"Connect 4\"" msgid "Open a meeting to play chess" -msgstr "" +msgstr "Ouvrez une réunion pour jouer aux échecs" msgid "Open items" msgstr "Eléments ouverts" @@ -3341,7 +3453,7 @@ msgid "Original version" msgstr "Version originale" msgid "Out of sync" -msgstr "" +msgstr "Désynchronisé" msgid "Outside" msgstr "À l'extérieur" @@ -3466,6 +3578,22 @@ msgstr "" "Les participants et les administrateurs sont copiés intégralement et ne " "peuvent pas être modifiés ici." +msgid "Participants created" +msgstr "Participants créés" + +msgid "Participants skipped" +msgstr "Les participants ont sauté" + +msgid "Participants updated" +msgstr "Participants mis à jour" + +msgid "Participants with errors" +msgstr "Participants avec des erreurs" + +msgid "Participants with warnings: affected cells will be skipped" +msgstr "" +"Participants avec avertissements : les cellules affectées seront ignorées" + msgid "Particles" msgstr "Particules" @@ -3484,15 +3612,12 @@ msgstr "Les mots de passe ne correspondent pas." msgid "Paste/write your topics in this textbox." msgstr "Collez/écrivez vos sujets dans cette zone de texte." -msgid "Permission" -msgstr "Permission" +msgid "Pause speech" +msgstr "Pause discours" msgid "Permissions" msgstr "Permissions" -msgid "Permit" -msgstr "Permettre" - msgid "Personal data changed" msgstr "Données personnelles modifiées" @@ -3509,7 +3634,7 @@ msgid "Phase" msgstr "Phase" msgid "Playing against" -msgstr "" +msgstr "Jouer contre" msgid "Please allow OpenSlides to access your microphone and/or camera" msgstr "" @@ -3522,9 +3647,6 @@ msgstr "Veuillez saisir un nom pour le nouveau répertoire :" msgid "Please enter a name for the new workflow:" msgstr "Veuillez saisir un nom pour le nouveau processus de travail :" -msgid "Please enter a new workflow name:" -msgstr "Veuillez entrer un nouveau nom de processus de travail : " - msgid "Please enter a valid email address!" msgstr "Veuillez saisir une adresse courriel valide !" @@ -3534,8 +3656,11 @@ msgstr "Veuillez saisir votre nouveau mot de passe" msgid "Please join the conference room now!" msgstr "Rejoignez la salle de conférence dès maintenant !" -msgid "Please select a vote weight bigger than zero." -msgstr "" +msgid "Please select a vote weight greater than or equal to 0.000001" +msgstr "Veuillez sélectionner un poids de vote supérieur ou égal à 0,000001" + +msgid "Please select a vote weight greater than zero." +msgstr "Veuillez sélectionner un poids de vote supérieur à zéro." msgid "Please select the directory:" msgstr " Rejoignez la salle de conférence dès maintenant !" @@ -3558,6 +3683,9 @@ msgstr "Rappel au règlement" msgid "Polls" msgstr "Sondages" +msgid "Possible options" +msgstr "Options possibles" + msgid "Possible points of order" msgstr "Motions de procédure possibles" @@ -3612,6 +3740,12 @@ msgstr "Traitement des processus" msgid "Project" msgstr "Projeter" +msgid "Project active structure level" +msgstr "Projet au niveau de la structure active" + +msgid "Project all structure levels" +msgstr "Projet tous les niveaux de structure" + msgid "Project selection?" msgstr "Projeter l'élection?" @@ -3676,7 +3810,7 @@ msgid "Re-add last speaker" msgstr "Ajouter le dernier orateur" msgid "Re-count logged-in users" -msgstr "" +msgstr "Re-compter les utilisateurs connectés" msgid "Reason" msgstr "Motivation" @@ -3684,6 +3818,9 @@ msgstr "Motivation" msgid "Reason required for creating new motion" msgstr "Raison requise pour la création d'une nouvelle motion" +msgid "Receipt of contributions" +msgstr "Réception des contributions" + msgid "Receive motions" msgstr "Recevoir des motions" @@ -3702,6 +3839,11 @@ msgstr "Recommandation modifiée" msgid "Recommendation label" msgstr "Etiquette de recommandation" +msgid "" +"Recommendation of motions in such a state can only be seen by motion " +"managers." +msgstr "" + msgid "Recommendation reset" msgstr "Recommandation réinitialisation" @@ -3711,12 +3853,6 @@ msgstr "Recommandation définie sur {}" msgid "Reenter to conference room" msgstr "Revenir dans la salle de conférence" -msgid "Refer to committee" -msgstr "Renvoyer à un comité." - -msgid "Referral to committee" -msgstr "Renvoi au comité" - msgid "Referring motions" msgstr "Motions de référence" @@ -3726,21 +3862,15 @@ msgstr "Recharger" msgid "Reject" msgstr "Rejeter" -msgid "Reject (not authorized)" -msgstr "Rejeter (non autorisé)" - msgid "Rejected" msgstr "Rejeté" -msgid "Rejection" -msgstr "Rejet" - -msgid "Rejection (not authorized)" -msgstr "Rejet (non autorisé)" - msgid "Relevant information could not be accessed" msgstr "Les informations nécessaires n'ont pas pu être obtenues." +msgid "Reload page" +msgstr "" + msgid "Remove" msgstr "Enlever" @@ -3781,9 +3911,6 @@ msgstr "Enlever moi-même" msgid "Remove option" msgstr "Supprimer l'option" -msgid "Rename state" -msgstr "Renommer le status" - msgid "Reopen" msgstr "reouvrir" @@ -3815,6 +3942,9 @@ msgstr "" msgid "Required permissions to view this page:" msgstr "Permissions requises pour voir cette page :" +msgid "Requires permission to manage lists of speakers" +msgstr "" + msgid "Reset" msgstr "Réinitialiser" @@ -3834,10 +3964,7 @@ msgid "Reset state" msgstr "Réinitialiser le status" msgid "Reset to default settings" -msgstr "" - -msgid "Reset your OpenSlides password" -msgstr "Réinitialiser votre mot de passe OpenSlides" +msgstr "Réinitialiser les paramètres par défaut" msgid "Resolution and size" msgstr "Résolution et dimensions" @@ -3854,6 +3981,9 @@ msgstr "Résultat" msgid "Results" msgstr "Résultats" +msgid "Resume speech" +msgstr "Reprise du discours" + msgid "Retrieving vote status... Please wait!" msgstr "Récupération de l'état des votes... Merci de patienter !" @@ -3864,7 +3994,7 @@ msgid "Roman" msgstr "Romain" msgid "Rows with warnings" -msgstr "" +msgstr "Lignes avec avertissements" msgid "SSO" msgstr "SSO" @@ -3873,7 +4003,7 @@ msgid "SSO Identification" msgstr "Identification SSO" msgid "SSO identification" -msgstr "" +msgstr "Identification SSO" msgid "Same email" msgstr "Même courriel" @@ -3926,24 +4056,24 @@ msgstr "Selectionner" msgid "Select all" msgstr "Désélectionner tout" +msgid "Select exactly two participants to swap mandates" +msgstr "" + msgid "Select file" msgstr "Sélectionner un fichier" msgid "Select meetings ..." msgstr "Sélectionner les réunions ..." -msgid "Select or search new candidate ..." -msgstr "Sélectionner ou rechercher un nouveau candidat…" - -msgid "Select or search new speaker ..." -msgstr "Sélectionner ou rechercher un nouveau orateur" - -msgid "Select or search new submitter ..." -msgstr "Selectionner ou rechercher un nouveau requérant ..." - msgid "Select paragraphs" msgstr "Sélectionner des paragraphes" +msgid "Select participant" +msgstr "" + +msgid "Select speaker" +msgstr "Sélectionner l'orateur" + msgid "Send" msgstr "Envoyer" @@ -4043,7 +4173,7 @@ msgid "Set status for selected participants:" msgstr "Définir le statut des participants sélectionnés :" msgid "Set submission timestamp" -msgstr "" +msgstr "Définir l'horodatage de soumission" msgid "Set submitters" msgstr "Définir les soumissionnaires" @@ -4123,6 +4253,9 @@ msgstr "Afficher la fenêtre de la conférence en direct" msgid "Show logo" msgstr "Afficher le logo" +msgid "Show main menu" +msgstr "Afficher le menu principal" + msgid "Show meta information box beside the title on projector" msgstr "" "Afficher une boîte de méta-information à côté du titre sur le projecteur" @@ -4150,6 +4283,9 @@ msgstr "Afficher le champ d'extension des recommandations" msgid "Show recommendation on projector" msgstr "Afficher des recommandations sur le projecteur" +msgid "Show recommendations not public" +msgstr "" + msgid "Show referring motions" msgstr "Afficher les motions de référence" @@ -4198,9 +4334,6 @@ msgstr "" "Affiche l'image donnée comme particule d'applaudissement. Format d'image " "recommandé : 24x24px, PNG, JPG ou SVG" -msgid "Simple Workflow" -msgstr "Flux de travail simple" - msgid "Single Sign-On settings" msgstr "Paramètres du Single Sign-On" @@ -4254,21 +4387,35 @@ msgstr "Orateur" msgid "Speakers" msgstr "Orateurs" -msgid "Speaking time" +msgid "Speaking times" msgstr "Temps de parole" -msgid "Staff" -msgstr "Personnel" +msgid "Speech start time" +msgstr "" -msgid "Stalemate! It's a draw!" +msgid "Speech type" +msgstr "Type de discours" + +msgid "Spokesperson" msgstr "" +msgid "Spokespersons" +msgstr "" + +msgid "Stalemate! It's a draw!" +msgstr "Impasse ! Tirage au sort !" + msgid "Start and end time must either both be set or both be empty" msgstr "" +"Les heures de début et de fin doivent être toutes les deux définies ou " +"toutes les deux vides" msgid "Start date" msgstr "Date de début" +msgid "Start line number" +msgstr "Numéro de ligne de départ" + msgid "Start time" msgstr "Heure de début" @@ -4323,6 +4470,9 @@ msgstr "Biffure" msgid "Structure level" msgstr "Niveau structurel" +msgid "Structure levels" +msgstr "Niveaus de structure" + msgid "Subcategory" msgstr "Sous-catégorie" @@ -4395,8 +4545,14 @@ msgstr "Les partisans ont changé" msgid "Surname" msgstr "Nom" -msgid "Table of contents" -msgstr "Table de matière" +msgid "Swap mandates ..." +msgstr "" + +msgid "Switch" +msgstr "" + +msgid "Table of contents" +msgstr "Table de matière" msgid "Tag" msgstr "Balise" @@ -4419,6 +4575,9 @@ msgstr "Séparateur de texte" msgid "The account is deactivated." msgstr "Le compte est désactivé." +msgid "The affected columns will not be imported." +msgstr "Les colonnes concernées ne seront pas importées." + msgid "The assembly may decide:" msgstr "Je demande à l'Assemblée de décider sûr," @@ -4432,7 +4591,7 @@ msgstr "" "confidentialité." msgid "The fields are defined as follows" -msgstr "" +msgstr "Les champs sont définis comme suit" msgid "The file has too few columns to be parsed properly." msgstr "Le fichier a trop peu de colonnes pour être analysé correctement." @@ -4452,9 +4611,11 @@ msgid "" "The import can not proceed. There is likely a problem with the import data, " "please check the preview for details." msgstr "" +"L'importation ne peut pas se faire. Il y a probablement un problème avec les" +" données d'importation, veuillez vérifier l'aperçu pour plus de détails." msgid "The import is in progress, please wait ..." -msgstr "" +msgstr "L'importation est en cours, veuillez patienter ..." msgid "" "The import returned warnings. This does not mean that it failed, but some " @@ -4462,1069 +4623,1283 @@ msgid "" "same as during the preview, but as there is a possibility that new ones have" " arisen, the relevant rows will be displayed below." msgstr "" +"L'importation a renvoyé des avertissements. Cela ne signifie pas qu'elle a " +"échoué, mais certaines données ont pu être importées différemment. En " +"général, les avertissements sont les mêmes que lors de la prévisualisation, " +"mais comme il est possible que de nouveaux avertissements soient apparus, " +"les lignes concernées sont affichées ci-dessous." msgid "The import was successful." -msgstr "" +msgstr "L'importation a été réussie." msgid "The input data for voting is invalid." -msgstr "" +msgstr "Les données d'entrée pour le vote sont invalides." msgid "The link is broken. Please contact your system administrator." -msgstr "" +msgstr "Le lien est cassé. Veuillez contacter votre administrateur système." msgid "The list of speakers is closed." -msgstr "" +msgstr "La liste des orateurs est fermée." msgid "The list of speakers is open." -msgstr "" +msgstr "La liste des orateurs est ouverte." msgid "" "The maximum number of characters per line. Relevant when line numbering is " "enabled. Min: 40" msgstr "" +"Nombre maximal de caractères par ligne. Relevant lorsque la numérotation des" +" lignes est activée. Min : 40 caractères." msgid "The number has to be greater than 0." -msgstr "" +msgstr "Le nombre doit être supérieur à 0." msgid "The parent motion is not available." -msgstr "" +msgstr "La motion parent n'est pas disponible." msgid "The process is still running. Please wait!" -msgstr "" +msgstr "Le processus est toujours en cours. Veuillez patienter !" msgid "The process may have stopped running." -msgstr "" +msgstr "Le processus peut avoir cessé de fonctionner." msgid "The process will be started. Please wait!" -msgstr "" +msgstr "Le processus sera lancé. Veuillez patienter !" msgid "The request could not be sent. Check your connection." -msgstr "" +msgstr "La demande n'a pas pu être envoyée. Vérifiez votre connexion." msgid "The server could not be reached." -msgstr "" +msgstr "Le serveur n'a pas pu être atteint." msgid "The server didn't respond." -msgstr "" +msgstr "Le serveur n'a pas répondu." msgid "" "The server may still be processing them, but you will probably not get a " "result." msgstr "" +"Le serveur peut encore les traiter, mais vous n'obtiendrez probablement pas " +"de résultat." msgid "The title is required" -msgstr "" +msgstr "Un titre est requis" msgid "" "The user %user% has no email, so the invitation email could not be sent." msgstr "" +"L'utilisateur %user% n'a pas de courriel, le courriel d'invitation n'a donc " +"pas pu être envoyé." msgid "" "The users %user% have no email, so the invitation emails could not be sent." msgstr "" +"Les utilisateurs %user% n'ont pas de courriel, les courriels d'invitation " +"n'ont donc pas pu être envoyés." msgid "There are not enough options." -msgstr "" +msgstr "Il n'y a pas assez d'options." msgid "There are some columns that do not match the template" -msgstr "" +msgstr "Il y a des colonnes qui ne correspondent pas au modèle." msgid "There is an error in your vote." -msgstr "" +msgstr "Il y a une erreur dans votre vote." msgid "There is an error with this amendment. Please edit it manually." msgstr "" +"Il y a une erreur avec cet amendement. Veuillez l'éditer manuellement." msgid "There is an unknown voting problem." -msgstr "" +msgstr "Il y a un problème de vote inconnu." msgid "There is an unspecified error in this line, which prevents the import." msgstr "" +"Il y a une erreur non spécifiée dans cette ligne, ce qui empêche " +"l'importation." msgid "" "There seems to be a problem connecting to our services. Check your " "connection or try again later." msgstr "" +"Il semble y avoir un problème de connexion à nos services. Vérifiez votre " +"connexion ou réessayez plus tard." msgid "There should be at least 2 options." -msgstr "" +msgstr "Il devrait y avoir au moins 2 options." msgid "Thereof point of orders" -msgstr "" +msgstr "Point d'ordre à ce sujet" msgid "These accounts will be deleted:" -msgstr "" +msgstr "Ces comptes seront supprimés :" msgid "These participants will be removed:" -msgstr "" +msgstr "Ces participants seront supprimés :" msgid "This account has relations to meetings or committees" -msgstr "" +msgstr "Ce compte a des relations avec des réunions ou des comités" msgid "" "This account is not linked as candidate, submitter or speaker in any meeting" " and is not manager of any committee" msgstr "" +"Ce compte n'est pas lié à un candidat, à un déposant ou à un orateur dans " +"une réunion et n'est pas responsable de comité." msgid "This action will diminish your organization management level" -msgstr "" +msgstr "Cette action diminuera votre niveau de gestion de l'organisation." msgid "This action will remove you from one or more groups." -msgstr "" +msgstr "Cette action vous retirera d'un ou plusieurs groupes." msgid "This action will remove you from one or more meetings." -msgstr "" +msgstr "Cette action vous retirera d'un ou plusieurs meetings." msgid "This ballot contains deleted users." -msgstr "" +msgstr "Ce bulletin de vote contient des utilisateurs supprimés." msgid "This change collides with another one." -msgstr "" +msgstr "Ce changement se heurte à un autre." msgid "This committee already exists" -msgstr "" +msgstr "Ce comité existe déjà" msgid "This committee has no managers!" -msgstr "" +msgstr "Ce comité n'a pas de gestionnaires !" msgid "This field is required." -msgstr "" +msgstr "Ce champ est obligatoire." msgid "This is not a number." -msgstr "" +msgstr "Ce n'est pas un nombre." msgid "" "This may diminish your ability to do things in this meeting and you may not " "be able to revert it by youself. Are you sure you want to do this?" msgstr "" +"Cela pourrait diminuer votre capacité à faire des choses dans cette réunion," +" et vous pourriez ne pas être en mesure de revenir en arrière par vous-même." +" Êtes-vous sûr de vouloir faire cela ?" msgid "This meeting" -msgstr "" +msgstr "Cette réunion" msgid "This meeting is archived" -msgstr "" +msgstr "Cette réunion est archivée" msgid "This paragraph does not exist in the main motion anymore:" -msgstr "" +msgstr "Ce paragraphe n'existe plus dans la motion principale." msgid "This participant will only be removed from this meeting" -msgstr "" +msgstr "Ce participant sera simplement supprimé de cette réunion" msgid "This prefix already exists" -msgstr "" +msgstr "Ce préfixe existe déjà" msgid "This prefix already exists." -msgstr "" +msgstr "Ce préfixe existe déjà." msgid "This prefix will be set if you run the automatic agenda numbering." msgstr "" +"Ce préfixe sera fixé si vous exécutez la numérotation automatique pour " +"l'ordre du jour." msgid "" "This projector is currently internal. Selecting such projectors as reference" " projectors will automatically set them to visible. Do you really want to do" " this?" msgstr "" +"Ce projecteur est actuellement interne. Sélectionner de tels projecteurs en " +"tant que projecteurs de référence les rendra automatiquement visibles. " +"Voulez-vous vraiment faire cela ?" -msgid "This row will not be imported, due to an unknown reason." +msgid "" +"This will add or remove the following groups for all selected participants:" msgstr "" +"Cela ajoutera ou supprimera les groupes suivants pour tous les participants " +"sélectionnés:" msgid "" -"This will add or remove the following groups for all selected participants:" +"This will add or remove the following structure levels for all selected " +"participants:" msgstr "" +"Cela ajoutera ou supprimera les niveaux de structure suivants pour tous les " +"participants sélectionnés:" msgid "" "This will add or remove the following submitters for all selected motions:" msgstr "" +"Cela ajoutera ou supprimera les soumetteurs suivants pour toutes les motions" +" sélectionnées." msgid "" "This will add or remove the following tags for all selected agenda items:" msgstr "" +"Cela ajoutera ou supprimera les balises suivantes pour tous les éléments " +"d'agenda sélectionnés." msgid "This will add or remove the following tags for all selected motions:" msgstr "" +"Cela ajoutera ou supprimera les balises suivantes pour toutes les motions " +"sélectionnées." msgid "This will add or remove the selected accounts to following meetings:" msgstr "" +"Cela ajoutera ou supprimera les comptes sélectionnés des réunions suivantes " +":" msgid "" "This will diminish your ability to do things on the organization level and " "you will not be able to revert this yourself." msgstr "" +"Cela diminuera votre capacité à faire des choses au niveau de l'organisation" +" et vous ne pourrez pas y remédier vous-même." msgid "This will move all selected motions as childs to:" msgstr "" +"Tous les motions sélectionnées seront ainsi déplacées en tant qu'enfants :" msgid "" "This will move all selected motions under or after the following motion in " "the call list:" msgstr "" +"Cette opération permet de déplacer toutes les motions sélectionnées sous ou " +"après la motion suivante dans la liste des appels :" msgid "This will reset all made changes and sort the call list." msgstr "" +"Cette opération réinitialisera toutes les modifications apportées et triera " +"la liste d'appels." msgid "This will set the favorite status for all selected motions:" msgstr "" +"Cette opération permet de définir le statut de favori pour toutes les " +"motions sélectionnées :" msgid "This will set the following category for all selected motions:" msgstr "" +"Cette opération permet de définir la catégorie suivante pour toutes les " +"motions sélectionnées :" msgid "This will set the following motion block for all selected motions:" msgstr "" +"Cette opération permet de définir le bloc de motion suivant pour toutes les " +"motions sélectionnées :" msgid "This will set the following recommendation for all selected motions:" msgstr "" +"La recommandation suivante s'appliquera à toutes les motions sélectionnées :" msgid "This will set the following state for all selected motions:" msgstr "" +"Cette opération permet de définir l'état suivant pour tous les motions " +"sélectionnés :" msgid "This will set the workflow for all selected motions:" msgstr "" +"Cette opération définit le flux de travail pour toutes les motions " +"sélectionnées :" msgid "Thoroughly check datastore (unsafe)" -msgstr "" +msgstr "Vérification approfondie du datastore (non sécurisé)" msgid "Threefold repetition! It's a draw!" -msgstr "" +msgstr "Triple répétition ! C'est un tirage au sort !" msgid "Tile view" -msgstr "" +msgstr "Vue en mosaïque" msgid "Time" +msgstr "Heure" + +msgid "Time and traffic light" msgstr "" -msgid "Timestamp" +msgid "Timer" msgstr "" -msgid "Title" +msgid "Timers" msgstr "" +msgid "Timestamp" +msgstr "Horodatage" + +msgid "Title" +msgstr "Titre" + msgid "Title for PDF document (all elections)" -msgstr "" +msgstr "Titre du document PDF (toutes les élections)" msgid "Title for PDF documents of motions" -msgstr "" +msgstr "Titre pour les documents PDF des motions" msgid "Title for access data and welcome PDF" -msgstr "" +msgstr "Titre pour les données d'accès et l'accueil PDF" msgid "To start your search press Enter or the search icon" msgstr "" +"Pour lancer votre recherche, appuyez sur la touche Entrée ou sur l'icône de " +"recherche." msgid "Toggle to list of speakers" -msgstr "" +msgstr "Passer à la liste des orateurs" msgid "Toggle to parent item" -msgstr "" +msgstr "Basculer vers l'élément parent" msgid "Too many votes on one option." -msgstr "" +msgstr "Trop de votes sur une seule option." msgid "Topic" -msgstr "" +msgstr "Sujet" msgid "Topics" -msgstr "" +msgstr "Les sujets" msgid "Topics created" -msgstr "" +msgstr "Sujets créés" msgid "Topics skipped" -msgstr "" +msgstr "Sujets sautés" msgid "Topics updated" -msgstr "" +msgstr "Sujets mis à jour" msgid "Topics with warnings (will be skipped)" -msgstr "" +msgstr "Les sujets avec des avertissements (seront ignorés)" msgid "Total accounts" -msgstr "" +msgstr "Comptes totaux" + +msgid "Total committees" +msgstr "Comités totaux" + +msgid "Total participants" +msgstr "Total participants" + +msgid "Total time" +msgstr "Temps total" msgid "Total topics" -msgstr "" +msgstr "Total des sujets" msgid "Total votes cast" -msgstr "" +msgstr "Total des votes exprimés" msgid "Touch the book icon to enter text" -msgstr "" +msgstr "Touchez l'icône du livre pour entrer du texte" msgid "Translation" -msgstr "" +msgstr "Traduction" msgid "Troubleshooting" -msgstr "" +msgstr "Dépannage" msgid "Try reconnect" -msgstr "" - -msgid "Type" -msgstr "" +msgstr "Essayez de vous reconnecter." msgid "Underline" -msgstr "" +msgstr "Souligner" msgid "Undone" -msgstr "" +msgstr "Défait" msgid "Unique speakers" -msgstr "" +msgstr "Orateurs uniques" msgid "Unknown participant" -msgstr "" +msgstr "Participant inconnu" msgid "Unsaved changes will not be applied." -msgstr "" +msgstr "Les modifications non enregistrées ne seront pas appliquées." msgid "Unsupport" -msgstr "" +msgstr "Ne plus soutenir" msgid "Upload" -msgstr "" - -msgid "Upload files" -msgstr "" +msgstr "Transférer" msgid "Upload to" -msgstr "" +msgstr "Télécharger sur" msgid "" "Use JSON key:value structure (key = OpenSlides attribute name, value = IdP " "attribute name)." msgstr "" +"Utilisez JSON key:value structure (key = OpenSlides attribute name, value = " +"IdP attribute name)." + +msgid "Use color" +msgstr "Utilisez la couleur" msgid "Use the following custom number" -msgstr "" +msgstr "Utilisez le nombre personnalisé suivant" msgid "" "Use these placeholders: {name}, {event_name}, {url}, {username}, {password}." " The url referrs to the system url." msgstr "" +"Utilisez les caractères génériques suivants : {name}, {event_name}, {url}," +" {username}, {password}.  L'url fait référence à l'url du système." msgid "Used for WLAN QRCode projection." -msgstr "" +msgstr "Utilisé pour la projection du code QR WLAN." msgid "Used for invitation emails and QRCode in PDF of access data." msgstr "" +"Utilisé pour les courriels d'invitation et le QRCode dans le PDF des données" +" d'accès." msgid "User not found." -msgstr "" +msgstr "Utilisateur non trouvé." msgid "Username" -msgstr "" +msgstr "Nom d'utilisateur" + +msgid "Username may not contain spaces" +msgstr "Le nom d'utilisateur ne peut pas contenir d'espaces" msgid "Username or password is incorrect." -msgstr "" +msgstr "Nom d'utilisateur ou mot de passe n'est pas correcte." msgid "Uses leading zeros to sort motions correctly by identifier." msgstr "" +"Utilisez des zéros en tête pour trier correctement les mouvements par " +"identifiant." msgid "" "Using OpenSlides over HTTP 1.1 or lower is not supported. Make sure you can " "use HTTP 2 to continue." msgstr "" +"Utiliser OpenSlides sur HTTP 1.1 ou une version inférieure n'est pas pris en" +" charge. Assurez-vous de pouvoir utiliser HTTP 2 pour continuer." msgid "Using OpenSlides over HTTP is not supported. Enable HTTPS to continue." msgstr "" +"Utiliser OpenSlides via HTTP n'est pas pris en charge. Activez HTTPS pour " +"continuer." msgid "Valid votes" -msgstr "" +msgstr "Votes valides" msgid "Virtual applause" -msgstr "" +msgstr "Applaudissements virtuels" msgid "Visibility" -msgstr "" +msgstr "Visibilité" msgid "Visibility on agenda" -msgstr "" +msgstr "Visibilité à l'ordre du jour" msgid "Vote" -msgstr "" +msgstr "Vote" + +msgid "Vote submitted" +msgstr "Vote soumis" msgid "Vote weight" -msgstr "" +msgstr "Poids du vote" msgid "Voted" -msgstr "" +msgstr "Voté" msgid "Votes" -msgstr "" - -msgid "Voting" -msgstr "" +msgstr "Votes" msgid "Voting and ballot papers" -msgstr "" +msgstr "Bulletins de vote et d'élection" msgid "Voting anonymized" -msgstr "" +msgstr "Voter anonymisé" msgid "Voting colors" -msgstr "" +msgstr "Couleurs de vote" msgid "Voting created" -msgstr "" +msgstr "Vote créé" msgid "Voting deleted" -msgstr "" +msgstr "Vote supprimé" msgid "Voting duration" -msgstr "" +msgstr "Durée de vote" msgid "" "Voting ends after short (some seconds/minutes) or long (some days/weeks) " "time period." msgstr "" +"Le vote se termine après une période courte (quelques secondes/minutes) ou " +"longue (quelques jours/semaines)." msgid "Voting is currently in progress." -msgstr "" +msgstr "Le vote est en cours." msgid "Voting method" -msgstr "" +msgstr "Méthode de vote" msgid "Voting opened" -msgstr "" +msgstr "Le vote a commencé" msgid "Voting published" -msgstr "" +msgstr "Voter publié" msgid "Voting reset" -msgstr "" +msgstr "Réinitialisation du vote" msgid "Voting result" -msgstr "" +msgstr "Résultat de la vote" msgid "Voting right delegated to (proxy)" -msgstr "" +msgstr "Le droit de vote délégué à (proxy)" msgid "Voting right for" -msgstr "" +msgstr "Droit de vote pour" msgid "Voting right received from (principals)" -msgstr "" +msgstr "Droit de vote reçu de (principaux)" msgid "Voting started" -msgstr "" +msgstr "Le vote a commencé" msgid "Voting stopped" -msgstr "" +msgstr "Le vote s'est arrêté." msgid "Voting stopped/published" -msgstr "" +msgstr "Le vote a été arrêté / publié" msgid "Voting successful." -msgstr "" +msgstr "Vote réussi." msgid "Voting type" -msgstr "" +msgstr "Type de vote" msgid "Votings" -msgstr "" +msgstr "Votes" msgid "WLAN encryption" -msgstr "" +msgstr "cryptage du réseau sans fil" msgid "WLAN name (SSID)" -msgstr "" +msgstr "Nom du réseau sans fil (SSID)" msgid "WLAN password" -msgstr "" +msgstr "Mot de passe du réseau sans fils" msgid "Wait" -msgstr "" +msgstr "Attendez" msgid "Wait for response ..." -msgstr "" +msgstr "Attendre la réponse ..." msgid "Waiting for response ..." -msgstr "" +msgstr "Attendre la réponse ..." msgid "Warn color" +msgstr "Couleur d'avertissement" + +msgid "" +"Warning: Amendments exist for at least one of the selected motions. Are you " +"sure you want to delete these motions regardless?" msgstr "" +"Attention : Des amendements existent pour au moins une des motions " +"sélectionnées. Êtes-vous sûr de vouloir supprimer ces motions malgré tout ?" + +msgid "" +"Warning: Amendments exist for this motion. Are you sure you want to delete " +"this motion regardless?" +msgstr "" +"Avertissement : Des amendements existent pour cette motion. Êtes-vous sûr de" +" vouloir supprimer cette motion malgré tout ?" msgid "" "Warning: Amendments exist for this motion. Editing this text will likely " "impact them negatively. Particularily, amendments might become unusable if " "the paragraph they affect is deleted." msgstr "" +"Avertissement : Des amendements ont été déposés pour cette motion. L'édition" +" de ce texte risque d'avoir un impact négatif sur eux. En particulier, les " +"amendements peuvent devenir inutilisables si le paragraphe qu'ils affectent " +"est supprimé." msgid "Warning: This projector will be set to visible" -msgstr "" +msgstr "Avertissement : Ce projecteur sera réglé pour être visible" msgid "Was forwarded to this meeting" -msgstr "" +msgstr "A été transmis à cette réunion" msgid "Web interface header logo" -msgstr "" +msgstr "Logo de l'en-tête de l'interface web" msgid "Welcome to OpenSlides" -msgstr "" +msgstr "Bienvenue sur OpenSlides" msgid "What is new?" -msgstr "" +msgstr "Quoi de neuf ?" msgid "Which version?" -msgstr "" +msgstr "Quelle version ?" msgid "Wifi" -msgstr "" +msgstr "Réseau sans fil (Wifi)" msgid "Wifi access data" -msgstr "" +msgstr "Données d'accès du réseau sans fil" msgid "Wifi name" -msgstr "" +msgstr "Nom du réseau sans fil" msgid "" "Will be displayed as label before selected recommendation in statute " "amendments." msgstr "" +"Sera affichée comme étiquette avant la recommandation sélectionnée dans les " +"amendements au statut." msgid "" "Will be displayed as label before selected recommendation. Use an empty " "value to disable the recommendation system." msgstr "" +"Affiché comme une étiquette avant la recommandation sélectionnée. Utilisez " +"une entrée vide pour désactiver le système de recommandation." msgid "Withdraw point of order" -msgstr "" +msgstr "Retrait de la demande de motion de procédure" msgid "Workflow" -msgstr "" +msgstr "Flux de travail" msgid "Workflow of new amendments" -msgstr "" +msgstr "Workflow des nouvelles modifications" msgid "Workflow of new motions" -msgstr "" +msgstr "Flux de travail des nouvelles motions" msgid "Workflow of new statute amendments" -msgstr "" +msgstr "Flux de travail pour les nouvelles modifications de statuts" msgid "Workflows" -msgstr "" +msgstr "Flux de travail" msgid "Yes" -msgstr "" +msgstr "Oui" msgid "Yes per candidate" -msgstr "" +msgstr "Oui par candidat" msgid "Yes per option" -msgstr "" +msgstr "Oui par option" msgid "Yes, inclusive meetings" -msgstr "" +msgstr "Oui, réunions inclusives" msgid "Yes/No" -msgstr "" +msgstr "Oui/Non" msgid "Yes/No per candidate" -msgstr "" +msgstr "Oui/Non par candidat" msgid "Yes/No/Abstain" -msgstr "" +msgstr "Oui / Non / Absence" msgid "Yes/No/Abstain per candidate" -msgstr "" +msgstr "Oui/Non/Abstention par candidat" msgid "Yes/No/Abstain per list" -msgstr "" +msgstr "Oui/Non/Abstention par liste" msgid "You are not allowed to see all entitled users." -msgstr "" +msgstr "Vous n'êtes pas autorisé à voir tous les utilisateurs autorisés." msgid "You are not allowed to see the livestream" -msgstr "" +msgstr "Vous n'êtes pas autorisé à voir la diffusion en direct" msgid "You are not supposed to be here..." -msgstr "" +msgstr "Vous n'êtes pas censé être ici..." -msgid "" -"You are receiving this email because you have requested a new password for your OpenSlides-account.\n" -"\n" -"Please open the following link and choose a new password:\n" -"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" -"\n" -"For completeness your username: {username}" +msgid "You are using an incompatible client version." msgstr "" msgid "" "You are using the history mode of OpenSlides. Changes will not be saved." msgstr "" +"Vous utilisez le mode historique d'OpenSlides. Les modifications ne seront " +"pas enregistrées." msgid "You can change this option only in the forwarding section." msgstr "" +"Vous pouvez changer cette option uniquement dans la section de transfert." msgid "You can not vote because this is an analog voting." -msgstr "" +msgstr "Vous ne pouvez pas voter car il s'agit d'un vote analogique." msgid "You can not vote right now because the voting has not yet started." msgstr "" +"Vous ne pouvez pas voter maintenant car le vote n'a pas encore commencé." msgid "You can only anonymize named polls." -msgstr "" +msgstr "Vous ne pouvez anonymiser que les sondages nommés." msgid "You can use {event_name} and {username} as placeholder." -msgstr "" +msgstr "Vous pouvez utiliser {event_name} et {username} comme espace réservé." msgid "" "You cannot change the recommendation of motions in different workflows!" msgstr "" +"Vous ne pouvez pas modifier la recommandation des motions dans différents " +"flux de travail !" msgid "You cannot delete the last workflow of a meeting." msgstr "" +"Vous ne pouvez pas supprimer le dernier flux de travail d'une réunion." msgid "" "You cannot delete the workflow as long as it is selected as default workflow" " for new amendments in the settings. Please set another workflow as default " "in the settings and try to delete the workflow again." msgstr "" +"Vous ne pouvez pas supprimer le flux de travail tant qu'il est sélectionné " +"comme flux de travail par défaut pour les nouvelles amendements dans les " +"paramètres. Veuillez définir un autre flux de travail par défaut dans les " +"paramètres et essayez de supprimer à nouveau le flux de travail." msgid "" "You cannot delete the workflow as long as it is selected as default workflow" " for new motions in the settings. Please set another workflow as default in " "the settings and try to delete the workflow again." msgstr "" +"Vous ne pouvez pas supprimer le flux de travail tant qu'il est sélectionné " +"comme flux de travail par défaut pour les nouvelles motions dans les " +"paramètres. Veuillez définir un autre flux de travail par défaut dans les " +"paramètres et essayez à nouveau de supprimer le flux de travail." msgid "" "You cannot delete the workflow as long as it is selected as default workflow" " for new statute amendments in the settings. Please set another workflow as " "default in the settings and try to delete the workflow again." msgstr "" +"Vous ne pouvez pas supprimer le flux de travail tant qu'il est sélectionné " +"comme flux de travail par défaut pour les nouvelles modifications de statuts" +" dans les paramètres. Veuillez définir un autre flux de travail par défaut " +"dans les paramètres et essayez à nouveau de supprimer le flux de travail." msgid "You cannot delete yourself." -msgstr "" +msgstr "Vous ne pouvez pas vous supprimer vous-même." msgid "" "You cannot enter this meeting because you are not assigned to any group." msgstr "" +"Vous ne pouvez pas entrer à cette réunion car vous n'êtes assigné à aucun " +"groupe." msgid "You cannot vote since your vote right is delegated." -msgstr "" +msgstr "Vous ne pouvez pas voter car votre droit de vote est délégué." msgid "You do not have the permission to vote." -msgstr "" +msgstr "Vous n'avez pas la permission de voter." msgid "You have already voted." -msgstr "" +msgstr "Vous avez déjà voté." msgid "You have to be logged in to be able to vote." -msgstr "" +msgstr "Vous devez être connecté pour pouvoir voter." msgid "You have to be present to add yourself." -msgstr "" +msgstr "Vous devez être présent pour vous ajouter vous meme. " msgid "You have to be present to vote." -msgstr "" +msgstr "Il faut être présent pour voter." msgid "You have to enter at least one character" -msgstr "" +msgstr "Vous devez entrer au moins un caractère" msgid "You have to enter six hexadecimal digits" -msgstr "" +msgstr "Vous devez entrer six chiffres hexadécimaux" msgid "You have to fill this field." -msgstr "" +msgstr "Vous devez remplir ce champ." msgid "You override the personally set password!" -msgstr "" +msgstr "Vous remplacez le mot de passe personnellement défini !" msgid "You reached the maximum amount of votes. Deselect one option first." msgstr "" +"Vous avez atteint le nombre maximum de votes. Désélectionnez d'abord une " +"option." msgid "You reached the maximum amount of votes. Deselect somebody first." msgstr "" +"Vous avez atteint le nombre maximum de votes. Désélectionnez quelqu'un en " +"premier." msgid "You won!" -msgstr "" +msgstr "Vous avez gagné!" msgid "Your browser" -msgstr "" +msgstr "Votre navigateur web" msgid "Your browser is not supported by OpenSlides!" -msgstr "" +msgstr "Votre navigateur web n'est pas pris en charge par OpenSlides!" msgid "Your decision cannot be changed afterwards." -msgstr "" +msgstr "Votre décision ne peut pas être modifiée par la suite." msgid "Your device has no microphone" -msgstr "" +msgstr "Votre appareil n'a pas de microphone" msgid "Your input does not match the following structure: \"hh:mm\"" -msgstr "" +msgstr "Votre saisie ne correspond pas à la structure suivante : \"hh:mm\"" msgid "Your opponent couldn't stand it anymore... You are the winner!" -msgstr "" +msgstr "Votre adversaire n'en pouvait plus... Vous êtes le gagnant !" msgid "Your opponent has won!" -msgstr "" +msgstr "Votre adversaire a gagné!" msgid "Your password has been reset successfully!" -msgstr "" +msgstr "Votre mot de passe a été réinitialisé avec succès!" msgid "Your votes" -msgstr "" +msgstr "Vos votes" msgid "Your voting right was delegated to another person." -msgstr "" +msgstr "Votre droit de vote a été délégué à une autre personne." msgid "Zoom in" -msgstr "" +msgstr "Zoom avant" msgid "Zoom out" -msgstr "" +msgstr "Zoom arrière" msgid "[Begin speech] starts the countdown, [End speech] stops the countdown." msgstr "" +"[Commencer discours] démarre le compte à rebours, [discours de fin] arrête " +"le compte à rebours." msgid "[Place for your welcome and help text.]" -msgstr "" - -msgid "[Place for your welcome text.]" -msgstr "" +msgstr "[Insérer votre texte de bienvenue ici.]" msgid "absent" -msgstr "" - -msgid "accepted" -msgstr "" +msgstr "absent" msgid "account-example" -msgstr "" +msgstr "compte-exemple" msgid "active" -msgstr "" +msgstr "actif" msgid "add group(s)" -msgstr "" - -msgid "adjourned" -msgstr "" +msgstr "ajouter groupe(s)" msgid "already exists" -msgstr "" +msgstr "Existe déjà." msgid "analog" -msgstr "" +msgstr "analog" msgid "and" -msgstr "" +msgstr "et" msgid "anonymized" -msgstr "" +msgstr "anonymisé" msgid "are required" -msgstr "" +msgstr "sont requis" msgid "ballot-paper" -msgstr "" +msgstr "bulletin de vote" msgid "by" -msgstr "" +msgstr "par" msgid "challenged you to a chess match!" -msgstr "" +msgstr "Défié vous à un match d'échecs!" msgid "committee-example" -msgstr "" +msgstr "comité-exemple" msgid "connecting ..." -msgstr "" +msgstr "connecter ..." msgid "connections" -msgstr "" +msgstr "connexions" msgid "contribution" -msgstr "" +msgstr "contribution" msgid "could not be created" -msgstr "" - -msgid "could not be defined" -msgstr "" - -msgid "could not be referenced" -msgstr "" +msgstr "n'a pas pu être créé" msgid "created" -msgstr "" +msgstr "créé" msgid "custom" -msgstr "" +msgstr "custom" msgid "dateless" -msgstr "" +msgstr "dateless" msgid "delete" -msgstr "" +msgstr "Supprimer" msgid "deleted" -msgstr "" +msgstr "Supprimé" msgid "disabled" -msgstr "" +msgstr "Desactivé" msgid "disconnected" -msgstr "" +msgstr "déconnecté" msgid "diverse" -msgstr "" +msgstr "diversifié" msgid "e.g. for online meetings" -msgstr "" +msgstr "e.g. pour les réunions en ligne" msgid "emails" -msgstr "" +msgstr "courriels" msgid "ended" -msgstr "" +msgstr "terminé" msgid "entries will be ommitted." -msgstr "" +msgstr "les entrées seront omises." msgid "example" -msgstr "" +msgstr "exemple" msgid "female" -msgstr "" +msgstr "Féminin" msgid "finished (unpublished)" -msgstr "" +msgstr "terminé (non publié)" msgid "fullscreen" -msgstr "" +msgstr "plein écran" msgid "future" -msgstr "" +msgstr "avenir" msgid "green" -msgstr "" +msgstr "vert" msgid "grey" -msgstr "" +msgstr "gris" msgid "has been imported" -msgstr "" +msgstr "a été importé" msgid "has saved his work on this motion." -msgstr "" +msgstr "a sauvegardé son travail sur cette motion." msgid "have been created" -msgstr "" - -msgid "have been referenced" -msgstr "" +msgstr "ont été créés" msgid "hidden" -msgstr "" - -msgid "in progress" -msgstr "" +msgstr "Caché" msgid "inactive" -msgstr "" +msgstr "inactif" msgid "inline" -msgstr "" +msgstr "en ligne" msgid "internal" -msgstr "" +msgstr "interne" msgid "is assigned to the following committees, meetings and groups" -msgstr "" +msgstr "est affecté aux comités, réunions et groupes suivants" msgid "is not assigned to any committees or meetings yet" -msgstr "" +msgstr "n'est pas encore affecté à des comités ou réunions" msgid "is now" -msgstr "" +msgstr "est maintenant" msgid "is required" -msgstr "" +msgstr "est requis" msgid "items" -msgstr "" +msgstr "éléments" msgid "items selected" -msgstr "" +msgstr " éléments sélectionnés" msgid "last updated" -msgstr "" +msgstr "dernière mise à jour" msgid "lightblue" -msgstr "" +msgstr "bleu clair" msgid "logged-in users" -msgstr "" +msgstr "Utilisateurs connectés" msgid "long running" -msgstr "" +msgstr "longue durée" msgid "majority" -msgstr "" +msgstr "majorité" msgid "male" -msgstr "" +msgstr "masculin" msgid "max. 32 characters allowed" -msgstr "" +msgstr "max. 32 caractères autorisés" msgid "modified" -msgstr "" +msgstr "modifié" msgid "motions" -msgstr "" +msgstr "motions" msgid "move ..." -msgstr "" - -msgid "name" -msgstr "" +msgstr "déplacer ..." msgid "natural person" -msgstr "" - -msgid "needs review" -msgstr "" +msgstr "Personne physique" msgid "no natural person" -msgstr "" +msgstr "N'est pas une personne naturelle" msgid "nominal" -msgstr "" +msgstr "nominal" msgid "non-binary" -msgstr "" +msgstr "non-binaire" msgid "non-nominal" -msgstr "" +msgstr "non-nominal" msgid "none" -msgstr "" +msgstr "aucun" -msgid "not concerned" -msgstr "" - -msgid "not decided" -msgstr "" +msgid "not specified" +msgstr "Non spécifié" msgid "of" -msgstr "" +msgstr "de" msgid "open votes" -msgstr "" +msgstr "votes ouverts" msgid "or" -msgstr "" +msgstr "ou" msgid "outside" -msgstr "" +msgstr "À l'extérieur" msgid "partially forwarded" -msgstr "" +msgstr "partiellement transmis" msgid "participants" -msgstr "" +msgstr "participants" msgid "participants-example" -msgstr "" - -msgid "permitted" -msgstr "" +msgstr "participants-exemple" msgid "present" -msgstr "" +msgstr "présent" msgid "public" -msgstr "" +msgstr "Publique" msgid "published" -msgstr "" +msgstr "publié" msgid "red" -msgstr "" - -msgid "referred to committee" -msgstr "" - -msgid "rejected" -msgstr "" - -msgid "rejected (not authorized)" -msgstr "" +msgstr "rouge" msgid "remove" -msgstr "" +msgstr "Enlever" msgid "remove group(s)" -msgstr "" +msgstr "supprimer le(s) groupe(s)" msgid "represented by" -msgstr "" +msgstr "représenté par" msgid "reset" -msgstr "" +msgstr "Réinitialiser" msgid "selected" -msgstr "" +msgstr "sélectionné" msgid "short running" -msgstr "" +msgstr "course à pied courte" msgid "started" -msgstr "" +msgstr "commencé" msgid "stopped" -msgstr "" - -msgid "submitted" -msgstr "" +msgstr "arrêté" msgid "successfully forwarded" -msgstr "" +msgstr "transmis avec succès" msgid "supporters" -msgstr "" +msgstr "partisants" msgid "to" -msgstr "" +msgstr "à" msgid "today" -msgstr "" +msgstr "aujourd'hui" msgid "undocumented" -msgstr "" - -msgid "unknown" -msgstr "" +msgstr "non documenté" msgid "updated" -msgstr "" +msgstr "mise à jour" msgid "version" -msgstr "" +msgstr "version" msgid "votes per candidate" -msgstr "" +msgstr "votes par candidat" msgid "will be created" -msgstr "" - -msgid "will be defined" -msgstr "" +msgstr "sera créé" msgid "will be imported" -msgstr "" - -msgid "will be referenced" -msgstr "" +msgstr "sera importé" msgid "will be updated" -msgstr "" +msgstr "sera mis à jour" -msgid "withdrawn" +msgid "yellow" +msgstr "jaune" + +msgid "{{amount}} interposed questions will be cleared" +msgstr "{{amount}} Les questions interposées seront effacées." + +msgid "{{amount}} of them will be saved with 'unknown' speaker" +msgstr "{{amount}} d'entre eux seront enregistrés avec un orateur 'inconnu'" + +msgid "{{amount}} will be saved" +msgstr "{{amount}} sera économisé." + +msgid "Acceptance" +msgstr "Acceptation" + +msgid "Adjournment" +msgstr "Ajournement" + +msgid "Admin" +msgstr "Administrateur" + +msgid "Complex Workflow" +msgstr "Flux de travail complexe" + +msgid "" +"Dear {name},\n" +"\n" +"this is your personal OpenSlides login:\n" +"\n" +"{url}\n" +"Username: {username}\n" +"Password: {password}\n" +"\n" +"\n" +"This email was generated automatically." msgstr "" +"Cher {nom},\n" +"\n" +"voici votre login personnel OpenSlides :\n" +"\n" +"{url}\n" +"Nom d'utilisateur : {nom d'utilisateur}\n" +"Mot de passe : {mot de passe}\n" +"\n" +"\n" +"Cet e-mail a été généré automatiquement." -msgid "yellow" +msgid "Default projector" +msgstr "Projecteur par défaut" + +msgid "Delegates" +msgstr "Délégués" + +msgid "No concernment" +msgstr "Pas de concernment" + +msgid "No decision" +msgstr "Pas de décision" + +msgid "Presentation and assembly system" +msgstr "Système de présentation et d'assemblée" + +msgid "Referral to" +msgstr "Référence à" + +msgid "Rejection" +msgstr "Rejet" + +msgid "Reset your OpenSlides password" +msgstr "Réinitialiser votre mot de passe OpenSlides" + +msgid "Simple Workflow" +msgstr "Flux de travail simple" + +msgid "Space for your welcome text." +msgstr "Espace pour votre texte de bienvenue ici." + +msgid "Speaking time" +msgstr "Temps de parole" + +msgid "Staff" +msgstr "Personnel" + +msgid "Voting" +msgstr "Vote" + +msgid "" +"You are receiving this email because you have requested a new password for your OpenSlides account.\n" +"\n" +"Please open the following link and choose a new password:\n" +"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" +"\n" +"The link will be valid for 10 minutes." msgstr "" +"Vous recevez cet courriel parce que vous avez demandé un nouveau mot de passe pour votre compte OpenSlides.\n" +"\n" +"Veuillez ouvrir le lien suivant et choisir un nouveau mot de passe :\n" +"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" +"\n" +"Le lien sera valide pendant 10 minutes." + +msgid "accepted" +msgstr "accepté" + +msgid "adjourned" +msgstr "ajourné" + +msgid "in progress" +msgstr "en cours" + +msgid "name" +msgstr "nom" + +msgid "not concerned" +msgstr "non concerné" + +msgid "not decided" +msgstr "ne pas decidé" + +msgid "not permitted" +msgstr "non autorisé" + +msgid "permitted" +msgstr "permis" + +msgid "referred to" +msgstr "référencé" + +msgid "rejected" +msgstr "rejeté" + +msgid "submitted" +msgstr "présenté" + +msgid "withdrawn" +msgstr "retiré" diff --git a/client/src/assets/i18n/it.po b/client/src/assets/i18n/it.po index 3dcac5d825..7ab2ba8234 100644 --- a/client/src/assets/i18n/it.po +++ b/client/src/assets/i18n/it.po @@ -76,6 +76,14 @@ msgstr "Serve un titolo" msgid "A topic needs a title" msgstr "" +msgid "A total time is required and must be greater than 0." +msgstr "" + +msgid "" +"A user with the username '%username%' and the first name '%first_name%' was " +"created." +msgstr "" + msgid "About me" msgstr "Su di me" @@ -88,9 +96,6 @@ msgstr "" msgid "Accept" msgstr "Accettare" -msgid "Acceptance" -msgstr "Accettazione" - msgid "Access data (PDF)" msgstr "Dati d'accesso (pdf)" @@ -121,7 +126,7 @@ msgstr "" msgid "Accounts with errors" msgstr "" -msgid "Accounts with warnings (will be skipped)" +msgid "Accounts with warnings: affected cells will be skipped" msgstr "" msgid "Activate" @@ -130,9 +135,18 @@ msgstr "Attivare" msgid "Activate amendments" msgstr "Attivare mozioni di modifica" +msgid "Activate design" +msgstr "" + msgid "Activate statute amendments" msgstr "Attivare modifiche di statuto" +msgid "Activate the selection field 'motion editor'" +msgstr "" + +msgid "Activate the selection field 'spokesman'" +msgstr "" + msgid "Activate vote delegations" msgstr "Attivare le deleghe di voto" @@ -177,9 +191,6 @@ msgstr "Riunioni attive" msgid "Add" msgstr "Aggiungere" -msgid "Add countdown" -msgstr "Aggiungere countdown" - msgid "Add me" msgstr "Aggiungimi" @@ -195,6 +206,9 @@ msgstr "" msgid "Add option" msgstr "Aggiungi opzioni" +msgid "Add timer" +msgstr "" + msgid "Add to agenda" msgstr "Aggiungere all´ordine del giorno" @@ -210,6 +224,9 @@ msgstr "Aggiungiti alla lista dei relatori per parteicpare alla conferenza" msgid "Add/remove groups ..." msgstr "Aggiungere / cancellare gruppi ..." +msgid "Add/remove structure levels ..." +msgstr "" + msgid "" "Additional columns after the required ones may be present and will not " "affect the import." @@ -217,24 +234,12 @@ msgstr "" "Potrebbero essere presenti altre colonne. Tali non hanno nessuna influenza " "all´importazione." -msgid "Adjourn" -msgstr "Rinviare" - -msgid "Adjournment" -msgstr "Rinvio" - -msgid "Admin" -msgstr "Administratore" - msgid "Administration roles" msgstr "Ruoli di amministrazione" msgid "Administration roles (at organization level)" msgstr "Ruoli di amministrazione (a livello organizzativo)" -msgid "Administrator" -msgstr "Ammministratore" - msgid "Administrators" msgstr "Amministratori" @@ -278,6 +283,12 @@ msgstr "" msgid "All other fields are optional and may be empty." msgstr "Tutti gli altri campi sono facoltativi e possono essere vuoti." +msgid "All present entitled users" +msgstr "" + +msgid "All structure levels" +msgstr "" + msgid "All topics will be deleted and won't be accessible afterwards." msgstr "Tutti i temi saranno cancellati e non più accessibili." @@ -299,6 +310,9 @@ msgstr "Permettere votazione" msgid "Allow forwarding of motions" msgstr "Consentire l'inoltro di mozioni" +msgid "Allow one participant multiple times on the same list" +msgstr "" + msgid "" "Allow only current speakers and list of speakers managers to enter the live " "conference" @@ -500,8 +514,8 @@ msgstr "Sicuro di voler cancellare il messaggio selezionato?" msgid "Are you sure you want to delete this motion block?" msgstr "Sicuro di voler cancellare questa sezione di mozione? " -msgid "Are you sure you want to delete this motion?" -msgstr "Sicuro di voler cancellare questa mozione?" +msgid "Are you sure you want to delete this motion? " +msgstr "" msgid "Are you sure you want to delete this projector?" msgstr "Sicuro di voler cancellare questo proiettore?" @@ -512,6 +526,9 @@ msgstr "" msgid "Are you sure you want to delete this statute paragraph?" msgstr "Sicuro di voler cancellare questa paragrafo dello statuto?" +msgid "Are you sure you want to delete this structure level?" +msgstr "" + msgid "Are you sure you want to delete this tag?" msgstr "Sicuro di voler cancellare questa parole chiave?" @@ -530,6 +547,11 @@ msgstr "Sicuro di voler respingere la modifica della mozione?" msgid "Are you sure you want to duplicate this meeting?" msgstr "È sicuro di voler duplicare questo incontro?" +msgid "" +"Are you sure you want to end this contribution which still has interposed " +"question(s)?" +msgstr "" + msgid "" "Are you sure you want to generate new passwords for all selected " "participants?" @@ -824,6 +846,9 @@ msgstr "" msgid "Can create, modify, start/stop and delete votings." msgstr "" +msgid "Can edit all moderation notes." +msgstr "" + msgid "" "Can edit and assign the following motion metadata: Submitter, state, " "recommendation, category, motion blocks and tags." @@ -859,6 +884,9 @@ msgstr "Può gestire la lista dei realtori" msgid "Can manage logos and fonts" msgstr "Può gestire i logo e caratteri" +msgid "Can manage moderation notes" +msgstr "" + msgid "Can manage motion metadata" msgstr "Può gestire mozioni metadata" @@ -922,6 +950,9 @@ msgstr "" msgid "Can see all lists of speakers" msgstr "" +msgid "Can see all moderation notes in each list of speakers." +msgstr "" + msgid "Can see elections" msgstr "Può vedere le elezioni" @@ -938,6 +969,9 @@ msgstr "" msgid "Can see list of speakers" msgstr "Può vedere la lista dei relatori" +msgid "Can see moderation notes" +msgstr "" + msgid "Can see motions" msgstr "Può vedere le mozioni" @@ -1144,9 +1178,17 @@ msgstr "" msgid "Choice" msgstr "Scelta" +msgid "Choose 0 to disable Intervention." +msgstr "" + msgid "Choose 0 to disable the supporting system." msgstr "Per disattivare il sistema di sostegno premere \"0\"." +msgid "" +"Choose a number greater than 0 to activate speaking times widget for " +"structure level countdowns." +msgstr "" + msgid "Chyron" msgstr "Fascetta" @@ -1168,6 +1210,9 @@ msgstr "Cancellare tutti filtri" msgid "Clear all list of speakers" msgstr "Cancellare tutte le liste dei relatori" +msgid "Clear current projection" +msgstr "" + msgid "Clear list" msgstr "Cancellare la lista" @@ -1186,6 +1231,9 @@ msgstr "Premere qui per votare!" msgid "Close" msgstr "" +msgid "Close edit mode" +msgstr "" + msgid "Close list of speakers" msgstr "Chiudere lista dei relatori" @@ -1261,8 +1309,17 @@ msgstr "Comitati" msgid "Committees and meetings" msgstr "Comitati e riunioni" -msgid "Complex Workflow" -msgstr "Ciclo di lavoro complesso" +msgid "Committees created" +msgstr "" + +msgid "Committees updated" +msgstr "" + +msgid "Committees with errors" +msgstr "" + +msgid "Committees with warnings: affected cells will be skipped" +msgstr "" msgid "Conference room" msgstr "Stanza delle conferenze." @@ -1298,6 +1355,9 @@ msgstr "Obiezione" msgid "Contribution" msgstr "Contributo" +msgid "Contributions" +msgstr "" + msgid "Copy report to clipboard" msgstr "" @@ -1310,18 +1370,6 @@ msgstr "" msgid "Countdown" msgstr "Countdown" -msgid "Countdown and traffic light" -msgstr "Countdown e semaforo" - -msgid "Countdown description" -msgstr "Descrizione Countdown" - -msgid "Countdown time" -msgstr "Tempo Countdown" - -msgid "Countdown title" -msgstr "Titolo Countdown" - msgid "Countdowns" msgstr "Countdown" @@ -1340,12 +1388,6 @@ msgstr "Creare" msgid "Create editorial final version" msgstr "" -msgid "Create new chat group" -msgstr "Creare un nuovo gruppo chat" - -msgid "Create new tag" -msgstr "Crea una nuova etichetta" - msgid "Create subitem" msgstr "" @@ -1373,6 +1415,9 @@ msgstr "" msgid "Current slide" msgstr "" +msgid "Current speaker" +msgstr "" + msgid "Current speaker chyron" msgstr "" @@ -1403,28 +1448,6 @@ msgstr "Il datastore è corrotto! Vedere la console per gli errori." msgid "Datastore is ok!" msgstr "Il datastore è ok!" -msgid "" -"Dear {name},\n" -"\n" -"this is your personal OpenSlides login:\n" -"\n" -"{url}\n" -"Username: {username}\n" -"Password: {password}\n" -"\n" -"\n" -"This email was generated automatically." -msgstr "" -"Caro {nome},\n" -"\n" -"questo è il tuo login personal di OpenSlides:\n" -"\n" -" {url}\n" -" Username: {username}\n" -" Password: {password}\n" -"\n" -"Quest'e-mail è generata in automatico." - msgid "Decision" msgstr "Decisione" @@ -1452,17 +1475,8 @@ msgstr "Gruppi preimpostati con diritto di voto" msgid "Default line numbering" msgstr "Numerazione di linea predefinita" -msgid "Default number" -msgstr "Numero predefinito" - -msgid "Default participant number" -msgstr "Numero di partecipanti predefinito" - -msgid "Default projector" -msgstr "Proiettore predefinito" - -msgid "Default structure level" -msgstr "Livello di struttura predefinito" +msgid "Default speaking time for structure levels in seconds" +msgstr "" msgid "" "Default text version for change recommendations and projection of motions" @@ -1521,9 +1535,6 @@ msgstr "" msgid "Defines which states can be selected next in the workflow." msgstr "" -msgid "Delegates" -msgstr "Delegati" - msgid "Delegation of vote" msgstr "Trasferimento diritto di voto" @@ -1542,6 +1553,11 @@ msgstr "Cancellare proiettore" msgid "Deleted user" msgstr "Utente cancellato" +msgid "" +"Deleting this motion will likely impact it's amendments negatively and they " +"could become unusable." +msgstr "" + msgid "Deletion" msgstr "Cancellazione" @@ -1575,18 +1591,15 @@ msgstr "" msgid "Display type" msgstr "Formato display" +msgid "Distribute overhang time" +msgstr "" + msgid "Div" msgstr "" msgid "Divergent:" msgstr "Divergente" -msgid "Do not concern" -msgstr "Non da trattare" - -msgid "Do not decide" -msgstr "Non da decidere" - msgid "Do not forget to save your changes!" msgstr "Non dimenticare di salvare modifiche!" @@ -1671,6 +1684,9 @@ msgstr "" msgid "Edit" msgstr "Modificare" +msgid "Edit account" +msgstr "" + msgid "Edit comment field" msgstr "Modificare campo commento" @@ -1686,15 +1702,27 @@ msgstr "Modificare dettagli per " msgid "Edit editorial final version" msgstr "" +msgid "Edit group" +msgstr "" + msgid "Edit meeting" msgstr "Modifica riunione" -msgid "Edit name" +msgid "Edit moderation note" +msgstr "" + +msgid "Edit point of order ..." msgstr "" msgid "Edit projector" msgstr "Modificare proiettore" +msgid "Edit queue" +msgstr "" + +msgid "Edit state" +msgstr "" + msgid "Edit statute paragraph" msgstr "Modificare paragrafo statuto" @@ -1710,6 +1738,12 @@ msgstr "Modificare per inserire voti" msgid "Edit topic" msgstr "Modifica argomento" +msgid "Edit total time" +msgstr "" + +msgid "Edit workflow" +msgstr "" + msgid "Editorial final version" msgstr "" @@ -1722,6 +1756,9 @@ msgstr "Documenti d´elezione" msgid "Elections" msgstr "Elezioni" +msgid "Element" +msgstr "" + msgid "Email" msgstr "E-mail" @@ -1755,6 +1792,9 @@ msgstr "Abilitare il voto elettronico" msgid "Enable forspeech / counter speech" msgstr "abilita intercessione / contro-parola" +msgid "Enable interposed questions" +msgstr "" + msgid "Enable numbering for agenda items" msgstr "Abilitare la numerazione dei punti dell'ordine del giorno" @@ -1764,6 +1804,9 @@ msgstr "Abilita la visualizzazione della presenza del partecipante" msgid "Enable point of order" msgstr "Abilitazione del punto d'ordine" +msgid "Enable point of orders for other participants" +msgstr "" + msgid "Enable specifications and ranking for possible motions" msgstr "" @@ -1856,6 +1899,9 @@ msgstr "Accedere alla modalità sviluppatore" msgid "Enter your email to send the password reset link" msgstr "Inserire l´e-mail per ricevere il link per resettare la password" +msgid "Entitled present users" +msgstr "" + msgid "Entitled to vote" msgstr "Avente diritto di voto" @@ -2037,12 +2083,6 @@ msgstr "Creato inoltro" msgid "Forwarding of motion" msgstr "Inoltro di mozione" -msgid "Forwardings" -msgstr "Inoltri" - -msgid "Front page text" -msgstr "Testo della prima pagina" - msgid "Front page title" msgstr "Titolo della prima pagina" @@ -2156,6 +2196,9 @@ msgstr "Nessuna richiesta di parola" msgid "Has not logged in yet" msgstr "" +msgid "Has not voted" +msgstr "" + msgid "Has notes" msgstr "Ha annotazioni" @@ -2210,6 +2253,9 @@ msgstr "Testo di aiuto per i dati di accesso e PDF di benvenuto" msgid "Hidden item" msgstr "Voce nascosta" +msgid "Hide main menu" +msgstr "" + msgid "Hide more text" msgstr "Dimostrare meno" @@ -2235,10 +2281,13 @@ msgid "I know the risk" msgstr "A conoscenza del rischio" msgid "" -"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here. \n" +"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here.\n" " To receive replies you have to enter a reply address in the next field. Please test the email dispatch in case of changes!" msgstr "" +msgid "Identical with" +msgstr "" + msgid "Identifier" msgstr "" @@ -2252,6 +2301,9 @@ msgstr "" "Se si tratta di una richiesta di modifica mozione si può salvare il contenuto\n" "durante la modifica e cancellare di seguito. " +msgid "If the value is set to 0 the time counts up as stopwatch." +msgstr "" + msgid "Import" msgstr "Importa" @@ -2339,6 +2391,15 @@ msgstr "Contributo interno" msgid "Internal login" msgstr "" +msgid "Interposed question" +msgstr "" + +msgid "Intervention" +msgstr "" + +msgid "Intervention speaking time in seconds" +msgstr "" + msgid "Invalid line number" msgstr "Numero di riga invalido" @@ -2535,8 +2596,8 @@ msgstr "Numerazione riga" msgid "Line spacing" msgstr "Interlinea" -msgid "Linenumber" -msgstr "Numero di linea" +msgid "List of amendments: " +msgstr "" msgid "List of electronic votes" msgstr "Votazioni elettroniche" @@ -2562,11 +2623,6 @@ msgstr "" msgid "Live conference" msgstr "Conferenza dal vivo." -msgid "Live conference has to be active. Choose 0 to disable auto connect." -msgstr "" -"La conferenza in diretta deve essere attivata. Selezionare \"0\" per deattivare la connessione \n" -"automatica. " - msgid "Livestream" msgstr "Livestream" @@ -2603,6 +2659,9 @@ msgstr "Valore minimo dell'applauso" msgid "Main motion and line number" msgstr "" +msgid "Mandates switched sucessfully!" +msgstr "" + msgid "Mark as personal favorite" msgstr "Evidenziare come preferito personale" @@ -2689,6 +2748,12 @@ msgstr "Numero minimo di voti" msgid "Minimum number of digits for motion identifier" msgstr "" +msgid "Moderation note" +msgstr "" + +msgid "Modify design" +msgstr "" + msgid "Module" msgstr "" @@ -2731,6 +2796,12 @@ msgstr "" msgid "Motion deleted" msgstr "Mozione cancellata" +msgid "Motion editor" +msgstr "" + +msgid "Motion editors" +msgstr "" + msgid "Motion forwarded to" msgstr "Mozione inoltrata a" @@ -2794,9 +2865,6 @@ msgstr "Il mio profilo" msgid "Name" msgstr "Nome" -msgid "Name exceeds 256 characters" -msgstr "Il numero eccede di 256 caratteri" - msgid "Name of recommender" msgstr "Nome del raccomandatore" @@ -2809,18 +2877,12 @@ msgstr "Nome della nuova categoria" msgid "Natural person" msgstr "Persona naturale" -msgid "Needs review" -msgstr "Richiede revisione" - msgid "Negative votes are not allowed." msgstr "Non sono ammessi voti negativi" msgid "Never" msgstr "Mai" -msgid "New Projector" -msgstr "Nuovo proiettore " - msgid "New account" msgstr "Nuovo account" @@ -2836,23 +2898,35 @@ msgstr "Nuova categoria" msgid "New change recommendation" msgstr "Nuova raccomandazione di modifica" +msgid "New chat group" +msgstr "" + msgid "New comment field" msgstr "Nuovo campo di commento" msgid "New committee" msgstr "Nuovo comitato" +msgid "New design" +msgstr "" + msgid "New directory" msgstr "Nuovo elenco" msgid "New election" msgstr "Nuova elezione" +msgid "New file" +msgstr "" + msgid "New file name" msgstr "Nuovo nome file" -msgid "New group name" -msgstr "Nuovo nome gruppo" +msgid "New folder" +msgstr "" + +msgid "New group" +msgstr "" msgid "New meeting" msgstr "Nuova mozione" @@ -2872,6 +2946,9 @@ msgstr "Nuovo partecipante" msgid "New password" msgstr "Nuova password" +msgid "New projector" +msgstr "" + msgid "New state" msgstr "Nuovo stato" @@ -2923,15 +3000,9 @@ msgstr "Nessun commento" msgid "No committee admin" msgstr "Nessun amministratore di comitato" -msgid "No concernment" -msgstr "Nessun trattamento" - msgid "No data" msgstr "Nessun dato" -msgid "No decision" -msgstr "Nessuna decisione" - msgid "No delegation of vote" msgstr "Nessuna delega del diritto di voto" @@ -2965,6 +3036,9 @@ msgstr "Non è stata selezionata alcuna riunione" msgid "No motion block set" msgstr "Nessuna sezione di mozione assegnato" +msgid "No motion editors" +msgstr "" + msgid "No one has voted for this poll" msgstr "Nessuno ha votato per questo sondaggio" @@ -2986,9 +3060,15 @@ msgstr "" msgid "No results yet." msgstr "Finora nessun risultato" +msgid "No spokesperson" +msgstr "" + msgid "No statute paragraphs" msgstr "Nessun paragrafo di statuto" +msgid "No structure level" +msgstr "" + msgid "No tags" msgstr "No etichette" @@ -3004,6 +3084,9 @@ msgstr "" msgid "None" msgstr "Nessuno" +msgid "None of the selected motions can be forwarded." +msgstr "" + msgid "Not found" msgstr "Non trovato" @@ -3102,9 +3185,6 @@ msgstr "Vecchia password" msgid "One email was send sucessfully." msgstr "" -msgid "Only countdown" -msgstr "Solo countdown" - msgid "Only for internal notes." msgstr "Solo per annotazioni interni." @@ -3115,6 +3195,9 @@ msgid "Only present participants can be added to the list of speakers" msgstr "" "Solo partecipanti presenti possono essere aggiunti alla lista dei relatori" +msgid "Only time" +msgstr "" + msgid "Only traffic light" msgstr "Solo semaforo" @@ -3314,6 +3397,21 @@ msgstr "" "I partecipanti e gli amministratori sono copiati completamente e non possono" " essere modificati qui." +msgid "Participants created" +msgstr "" + +msgid "Participants skipped" +msgstr "" + +msgid "Participants updated" +msgstr "" + +msgid "Participants with errors" +msgstr "" + +msgid "Participants with warnings: affected cells will be skipped" +msgstr "" + msgid "Particles" msgstr "Particelle" @@ -3332,15 +3430,12 @@ msgstr "Le password non corrispondono" msgid "Paste/write your topics in this textbox." msgstr "Copiare / scrivere i propri temi nel campo di testo." -msgid "Permission" -msgstr "Permesso" +msgid "Pause speech" +msgstr "" msgid "Permissions" msgstr "Permessi" -msgid "Permit" -msgstr "Permettere" - msgid "Personal data changed" msgstr "" @@ -3370,9 +3465,6 @@ msgstr "Prego, inserire un nome per il nuovo elenco:" msgid "Please enter a name for the new workflow:" msgstr "Prego, da inserire un nome per la nuova elaborazione: " -msgid "Please enter a new workflow name:" -msgstr "" - msgid "Please enter a valid email address!" msgstr "Prego, da inserire un indirizzo e-mail valido!" @@ -3382,7 +3474,10 @@ msgstr "Prego, da inserire la nuova password" msgid "Please join the conference room now!" msgstr "Prego entra nell'aula conferenza ora!" -msgid "Please select a vote weight bigger than zero." +msgid "Please select a vote weight greater than or equal to 0.000001" +msgstr "" + +msgid "Please select a vote weight greater than zero." msgstr "" msgid "Please select the directory:" @@ -3406,6 +3501,9 @@ msgstr "Richiesta riguardante il regolamento" msgid "Polls" msgstr "Sondaggio" +msgid "Possible options" +msgstr "" + msgid "Possible points of order" msgstr "" @@ -3460,6 +3558,12 @@ msgstr "" msgid "Project" msgstr "Proiettare" +msgid "Project active structure level" +msgstr "" + +msgid "Project all structure levels" +msgstr "" + msgid "Project selection?" msgstr "Proiettare selezione?" @@ -3532,6 +3636,9 @@ msgstr "Motivazione" msgid "Reason required for creating new motion" msgstr "Motivazione necessaria per creazione nuovo mozione" +msgid "Receipt of contributions" +msgstr "" + msgid "Receive motions" msgstr "Ricevere mozioni" @@ -3550,6 +3657,11 @@ msgstr "Raccomandazione modificata" msgid "Recommendation label" msgstr "Raccomandazione" +msgid "" +"Recommendation of motions in such a state can only be seen by motion " +"managers." +msgstr "" + msgid "Recommendation reset" msgstr "Ripristino raccomandazione" @@ -3559,12 +3671,6 @@ msgstr "Raccomandazione impostata su {}" msgid "Reenter to conference room" msgstr "Rientra nella stanza della conferenza" -msgid "Refer to committee" -msgstr "Fare rifermento al comitato" - -msgid "Referral to committee" -msgstr "Riferimento al comitato" - msgid "Referring motions" msgstr "Mozioni con riferimento a questa mozione" @@ -3574,21 +3680,15 @@ msgstr "Aggiornare" msgid "Reject" msgstr "Respingere" -msgid "Reject (not authorized)" -msgstr "Respingere (non autorizzato)" - msgid "Rejected" msgstr "Respinto" -msgid "Rejection" -msgstr "Rigetto" - -msgid "Rejection (not authorized)" -msgstr "Rigetto (non autorizzato)" - msgid "Relevant information could not be accessed" msgstr "" +msgid "Reload page" +msgstr "" + msgid "Remove" msgstr "Cancellare" @@ -3629,9 +3729,6 @@ msgstr "Cancellarmi" msgid "Remove option" msgstr "Rimuovere opzione" -msgid "Rename state" -msgstr "" - msgid "Reopen" msgstr "Riaprire" @@ -3663,6 +3760,9 @@ msgstr "" msgid "Required permissions to view this page:" msgstr "Permessi necessari per visualizzare questa pagina:" +msgid "Requires permission to manage lists of speakers" +msgstr "" + msgid "Reset" msgstr "Resettare" @@ -3684,9 +3784,6 @@ msgstr "Resettare stato" msgid "Reset to default settings" msgstr "" -msgid "Reset your OpenSlides password" -msgstr "" - msgid "Resolution and size" msgstr "Risoluzione e grandezza" @@ -3702,6 +3799,9 @@ msgstr "" msgid "Results" msgstr "Risultati" +msgid "Resume speech" +msgstr "" + msgid "Retrieving vote status... Please wait!" msgstr "" @@ -3774,24 +3874,24 @@ msgstr "Seleziona" msgid "Select all" msgstr "Selezionare tutto" +msgid "Select exactly two participants to swap mandates" +msgstr "" + msgid "Select file" msgstr "Selezionare file" msgid "Select meetings ..." msgstr "Seleziona la riunione" -msgid "Select or search new candidate ..." -msgstr "Seleziona o cerca un nuovo candidato o una nuova candidata" - -msgid "Select or search new speaker ..." -msgstr "Selezionare o cercare nuovo relatore ..." - -msgid "Select or search new submitter ..." -msgstr "Selezionare o ricercare nuovo richiedente mozione" - msgid "Select paragraphs" msgstr "Selezionare paragrafi" +msgid "Select participant" +msgstr "" + +msgid "Select speaker" +msgstr "" + msgid "Send" msgstr "Inviare" @@ -3972,6 +4072,9 @@ msgstr "Visualizzare finestre della conferenza in diretta" msgid "Show logo" msgstr "Visualizzare logo" +msgid "Show main menu" +msgstr "" + msgid "Show meta information box beside the title on projector" msgstr "" "Mostra il riquadro delle meta-informazioni accanto al titolo sul proiettore" @@ -3999,6 +4102,9 @@ msgstr "Visualizzare campo extra per raccomandazioni" msgid "Show recommendation on projector" msgstr "Mostra la raccomandazione sul proiettore" +msgid "Show recommendations not public" +msgstr "" + msgid "Show referring motions" msgstr "Mostra le mozioni di riferimento" @@ -4048,9 +4154,6 @@ msgstr "" "Visualizzare immagine impostato come particella d'applauso. Raccomandato " "image format: 24x24Px, PNG, JPG or SVG" -msgid "Simple Workflow" -msgstr "Lavorazione semplice" - msgid "Single Sign-On settings" msgstr "" @@ -4101,11 +4204,20 @@ msgstr "" msgid "Speakers" msgstr "Oratori" -msgid "Speaking time" -msgstr "Tempo per l'intervento" +msgid "Speaking times" +msgstr "" -msgid "Staff" -msgstr "Collaboratori" +msgid "Speech start time" +msgstr "" + +msgid "Speech type" +msgstr "" + +msgid "Spokesperson" +msgstr "" + +msgid "Spokespersons" +msgstr "" msgid "Stalemate! It's a draw!" msgstr "" @@ -4116,6 +4228,9 @@ msgstr "" msgid "Start date" msgstr "Data d'inizio" +msgid "Start line number" +msgstr "" + msgid "Start time" msgstr "Tempo di partenza" @@ -4170,6 +4285,9 @@ msgstr "" msgid "Structure level" msgstr "Livello struttura" +msgid "Structure levels" +msgstr "" + msgid "Subcategory" msgstr "Categoria secondaria" @@ -4242,6 +4360,12 @@ msgstr "Supportatori cambiati" msgid "Surname" msgstr "Cognome" +msgid "Swap mandates ..." +msgstr "" + +msgid "Switch" +msgstr "" + msgid "Table of contents" msgstr "Tabella dei contenuti." @@ -4266,6 +4390,9 @@ msgstr "Divisore testo" msgid "The account is deactivated." msgstr "L'account è disattivato" +msgid "The affected columns will not be imported." +msgstr "" + msgid "The assembly may decide:" msgstr "L'assemblea voglia decidere:" @@ -4474,15 +4601,17 @@ msgid "" " this?" msgstr "" -msgid "This row will not be imported, due to an unknown reason." -msgstr "" - msgid "" "This will add or remove the following groups for all selected participants:" msgstr "" "Questo aggiungerà o rimuoverà i seguenti gruppi per tutti i partecipanti " "selezionati:" +msgid "" +"This will add or remove the following structure levels for all selected " +"participants:" +msgstr "" + msgid "" "This will add or remove the following submitters for all selected motions:" msgstr "" @@ -4563,6 +4692,15 @@ msgstr "Visualizzazione in modalità gallery" msgid "Time" msgstr "" +msgid "Time and traffic light" +msgstr "" + +msgid "Timer" +msgstr "" + +msgid "Timers" +msgstr "" + msgid "Timestamp" msgstr "Data e ora" @@ -4611,6 +4749,15 @@ msgstr "" msgid "Total accounts" msgstr "" +msgid "Total committees" +msgstr "" + +msgid "Total participants" +msgstr "" + +msgid "Total time" +msgstr "" + msgid "Total topics" msgstr "" @@ -4629,9 +4776,6 @@ msgstr "Risoluzione dei problemi" msgid "Try reconnect" msgstr "Prova a ricollegare" -msgid "Type" -msgstr "Digita" - msgid "Underline" msgstr "" @@ -4653,9 +4797,6 @@ msgstr "Non supportato" msgid "Upload" msgstr "Scaricare" -msgid "Upload files" -msgstr "Scaricare files" - msgid "Upload to" msgstr "Scaricare a" @@ -4664,6 +4805,9 @@ msgid "" "attribute name)." msgstr "" +msgid "Use color" +msgstr "" + msgid "Use the following custom number" msgstr "Usa il seguente numero cliente" @@ -4688,6 +4832,9 @@ msgstr "Utente non trovato." msgid "Username" msgstr "Nome utente" +msgid "Username may not contain spaces" +msgstr "" + msgid "Username or password is incorrect." msgstr "Il nome utente o la password non sono corretti." @@ -4719,6 +4866,9 @@ msgstr "" msgid "Vote" msgstr "Voto" +msgid "Vote submitted" +msgstr "" + msgid "Vote weight" msgstr "Peso del voto" @@ -4728,9 +4878,6 @@ msgstr "Votato" msgid "Votes" msgstr "Voti" -msgid "Voting" -msgstr "Votazione" - msgid "Voting and ballot papers" msgstr "Voto e schede elettorali" @@ -4822,6 +4969,16 @@ msgstr "" msgid "Warn color" msgstr "" +msgid "" +"Warning: Amendments exist for at least one of the selected motions. Are you " +"sure you want to delete these motions regardless?" +msgstr "" + +msgid "" +"Warning: Amendments exist for this motion. Are you sure you want to delete " +"this motion regardless?" +msgstr "" + msgid "" "Warning: Amendments exist for this motion. Editing this text will likely " "impact them negatively. Particularily, amendments might become unusable if " @@ -4927,13 +5084,7 @@ msgstr "Non ti è permesso vedere il livestream" msgid "You are not supposed to be here..." msgstr "Non dovresti essere qui..." -msgid "" -"You are receiving this email because you have requested a new password for your OpenSlides-account.\n" -"\n" -"Please open the following link and choose a new password:\n" -"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" -"\n" -"For completeness your username: {username}" +msgid "You are using an incompatible client version." msgstr "" msgid "" @@ -5078,15 +5229,9 @@ msgstr "" msgid "[Place for your welcome and help text.]" msgstr "[Posto per il tuo testo di benvenuto e di aiuto]." -msgid "[Place for your welcome text.]" -msgstr "[Luogo per il testo di benvenuto]." - msgid "absent" msgstr "assente" -msgid "accepted" -msgstr "accettato" - msgid "account-example" msgstr "Esempio di account" @@ -5096,9 +5241,6 @@ msgstr "attivo" msgid "add group(s)" msgstr "aggiungere gruppo(i)" -msgid "adjourned" -msgstr "aggiornato" - msgid "already exists" msgstr "" @@ -5138,12 +5280,6 @@ msgstr "contribuzione" msgid "could not be created" msgstr "Non è stato possibile creare" -msgid "could not be defined" -msgstr "non è stato possibile definire" - -msgid "could not be referenced" -msgstr "" - msgid "created" msgstr "creato" @@ -5210,15 +5346,9 @@ msgstr "ha salvato il suo lavoro in questo mozione." msgid "have been created" msgstr "E' stato creato" -msgid "have been referenced" -msgstr "" - msgid "hidden" msgstr "nascosto" -msgid "in progress" -msgstr "in corso" - msgid "inactive" msgstr "non attivo" @@ -5276,15 +5406,9 @@ msgstr "mozioni" msgid "move ..." msgstr "spostare ..." -msgid "name" -msgstr "" - msgid "natural person" msgstr "Persona naturale" -msgid "needs review" -msgstr "Necessita di revisione" - msgid "no natural person" msgstr "Nessuna persona fisica" @@ -5300,11 +5424,8 @@ msgstr "non nominale" msgid "none" msgstr "niente" -msgid "not concerned" -msgstr "non elaborato" - -msgid "not decided" -msgstr "Non deciso" +msgid "not specified" +msgstr "" msgid "of" msgstr "di" @@ -5327,9 +5448,6 @@ msgstr "partecipanti" msgid "participants-example" msgstr "modello-particpanti" -msgid "permitted" -msgstr "permesso" - msgid "present" msgstr "presente" @@ -5342,15 +5460,6 @@ msgstr "pubblicato" msgid "red" msgstr "rosso" -msgid "referred to committee" -msgstr "Rinviata in commissione" - -msgid "rejected" -msgstr "rifiutato" - -msgid "rejected (not authorized)" -msgstr "rifiutato (non autorizzato)" - msgid "remove" msgstr "" @@ -5375,9 +5484,6 @@ msgstr "iniziato" msgid "stopped" msgstr "" -msgid "submitted" -msgstr "presentato" - msgid "successfully forwarded" msgstr "Inoltrato con successo" @@ -5393,9 +5499,6 @@ msgstr "Oggi" msgid "undocumented" msgstr "Non documentato" -msgid "unknown" -msgstr "sconosciuto" - msgid "updated" msgstr "" @@ -5408,20 +5511,138 @@ msgstr "Voti per candidato" msgid "will be created" msgstr "Sarà creato" -msgid "will be defined" -msgstr "Sarà definito" - msgid "will be imported" msgstr "Sarà importato" -msgid "will be referenced" -msgstr "verrà fatto riferimento" - msgid "will be updated" msgstr "" -msgid "withdrawn" -msgstr "Ritirato" - msgid "yellow" msgstr "giallo" + +msgid "{{amount}} interposed questions will be cleared" +msgstr "" + +msgid "{{amount}} of them will be saved with 'unknown' speaker" +msgstr "" + +msgid "{{amount}} will be saved" +msgstr "" + +msgid "Acceptance" +msgstr "Accettazione" + +msgid "Adjournment" +msgstr "Rinvio" + +msgid "Admin" +msgstr "Administratore" + +msgid "Complex Workflow" +msgstr "Ciclo di lavoro complesso" + +msgid "" +"Dear {name},\n" +"\n" +"this is your personal OpenSlides login:\n" +"\n" +"{url}\n" +"Username: {username}\n" +"Password: {password}\n" +"\n" +"\n" +"This email was generated automatically." +msgstr "" +"Caro {nome},\n" +"\n" +"questo è il tuo login personal di OpenSlides:\n" +"\n" +" {url}\n" +" Username: {username}\n" +" Password: {password}\n" +"\n" +"Quest'e-mail è generata in automatico." + +msgid "Default projector" +msgstr "Proiettore predefinito" + +msgid "Delegates" +msgstr "Delegati" + +msgid "No concernment" +msgstr "Nessun trattamento" + +msgid "No decision" +msgstr "Nessuna decisione" + +msgid "Presentation and assembly system" +msgstr "" + +msgid "Referral to" +msgstr "" + +msgid "Rejection" +msgstr "Rigetto" + +msgid "Reset your OpenSlides password" +msgstr "" + +msgid "Simple Workflow" +msgstr "Lavorazione semplice" + +msgid "Space for your welcome text." +msgstr "" + +msgid "Speaking time" +msgstr "Tempo per l'intervento" + +msgid "Staff" +msgstr "Collaboratori" + +msgid "Voting" +msgstr "Votazione" + +msgid "" +"You are receiving this email because you have requested a new password for your OpenSlides account.\n" +"\n" +"Please open the following link and choose a new password:\n" +"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" +"\n" +"The link will be valid for 10 minutes." +msgstr "" + +msgid "accepted" +msgstr "accettato" + +msgid "adjourned" +msgstr "aggiornato" + +msgid "in progress" +msgstr "in corso" + +msgid "name" +msgstr "" + +msgid "not concerned" +msgstr "non elaborato" + +msgid "not decided" +msgstr "Non deciso" + +msgid "not permitted" +msgstr "" + +msgid "permitted" +msgstr "permesso" + +msgid "referred to" +msgstr "" + +msgid "rejected" +msgstr "rifiutato" + +msgid "submitted" +msgstr "presentato" + +msgid "withdrawn" +msgstr "Ritirato" diff --git a/client/src/assets/i18n/ru.po b/client/src/assets/i18n/ru.po index e9b63dc174..bd10b20f93 100644 --- a/client/src/assets/i18n/ru.po +++ b/client/src/assets/i18n/ru.po @@ -74,6 +74,14 @@ msgstr "Требуется название" msgid "A topic needs a title" msgstr "" +msgid "A total time is required and must be greater than 0." +msgstr "" + +msgid "" +"A user with the username '%username%' and the first name '%first_name%' was " +"created." +msgstr "" + msgid "About me" msgstr "Обо мне" @@ -86,9 +94,6 @@ msgstr "" msgid "Accept" msgstr "Принять" -msgid "Acceptance" -msgstr "Принятие" - msgid "Access data (PDF)" msgstr "Доступ к данным (PDF)" @@ -119,7 +124,7 @@ msgstr "" msgid "Accounts with errors" msgstr "" -msgid "Accounts with warnings (will be skipped)" +msgid "Accounts with warnings: affected cells will be skipped" msgstr "" msgid "Activate" @@ -128,9 +133,18 @@ msgstr "" msgid "Activate amendments" msgstr "Активировать поправки" +msgid "Activate design" +msgstr "" + msgid "Activate statute amendments" msgstr "Активировать поправки к уставу" +msgid "Activate the selection field 'motion editor'" +msgstr "" + +msgid "Activate the selection field 'spokesman'" +msgstr "" + msgid "Activate vote delegations" msgstr "" @@ -175,9 +189,6 @@ msgstr "" msgid "Add" msgstr "Добавить" -msgid "Add countdown" -msgstr "Добавить обратный отсчет" - msgid "Add me" msgstr "Добавить меня" @@ -193,6 +204,9 @@ msgstr "" msgid "Add option" msgstr "" +msgid "Add timer" +msgstr "" + msgid "Add to agenda" msgstr "Добавить в повестку дня" @@ -209,6 +223,9 @@ msgstr "" msgid "Add/remove groups ..." msgstr "Добавить/удалить группы ..." +msgid "Add/remove structure levels ..." +msgstr "" + msgid "" "Additional columns after the required ones may be present and will not " "affect the import." @@ -216,24 +233,12 @@ msgstr "" "Дополнительные столбцы могут присутствовать после требуемых и не влияют на " "импорт." -msgid "Adjourn" -msgstr "Отложить" - -msgid "Adjournment" -msgstr "Перерыв" - -msgid "Admin" -msgstr "Администратор" - msgid "Administration roles" msgstr "" msgid "Administration roles (at organization level)" msgstr "" -msgid "Administrator" -msgstr "" - msgid "Administrators" msgstr "" @@ -277,6 +282,12 @@ msgstr "" msgid "All other fields are optional and may be empty." msgstr "" +msgid "All present entitled users" +msgstr "" + +msgid "All structure levels" +msgstr "" + msgid "All topics will be deleted and won't be accessible afterwards." msgstr "Все темы будут удалены и не будут впоследствии доступны." @@ -298,6 +309,9 @@ msgstr "Разрешить создание опроса" msgid "Allow forwarding of motions" msgstr "" +msgid "Allow one participant multiple times on the same list" +msgstr "" + msgid "" "Allow only current speakers and list of speakers managers to enter the live " "conference" @@ -497,8 +511,8 @@ msgstr "" msgid "Are you sure you want to delete this motion block?" msgstr "Вы уверены, что хотите удалить этот блок заявления?" -msgid "Are you sure you want to delete this motion?" -msgstr "Вы уверены, что хотите удалить это заявление?" +msgid "Are you sure you want to delete this motion? " +msgstr "" msgid "Are you sure you want to delete this projector?" msgstr "Вы уверены, что хотите удалить этот проектор?" @@ -509,6 +523,9 @@ msgstr "" msgid "Are you sure you want to delete this statute paragraph?" msgstr "Вы уверены, что хотите удалить этот пункт устава?" +msgid "Are you sure you want to delete this structure level?" +msgstr "" + msgid "Are you sure you want to delete this tag?" msgstr "Вы уверены, что хотите удалить этот тег?" @@ -527,6 +544,11 @@ msgstr "Вы уверены, что хотите отменить эту поп msgid "Are you sure you want to duplicate this meeting?" msgstr "" +msgid "" +"Are you sure you want to end this contribution which still has interposed " +"question(s)?" +msgstr "" + msgid "" "Are you sure you want to generate new passwords for all selected " "participants?" @@ -814,6 +836,9 @@ msgstr "" msgid "Can create, modify, start/stop and delete votings." msgstr "" +msgid "Can edit all moderation notes." +msgstr "" + msgid "" "Can edit and assign the following motion metadata: Submitter, state, " "recommendation, category, motion blocks and tags." @@ -849,6 +874,9 @@ msgstr "Может управлять списком спикеров" msgid "Can manage logos and fonts" msgstr "Может управлять логотипами и шрифтами" +msgid "Can manage moderation notes" +msgstr "" + msgid "Can manage motion metadata" msgstr "Может управлять метаданными заявления" @@ -912,6 +940,9 @@ msgstr "" msgid "Can see all lists of speakers" msgstr "" +msgid "Can see all moderation notes in each list of speakers." +msgstr "" + msgid "Can see elections" msgstr "Можно видеть выборы" @@ -927,6 +958,9 @@ msgstr "Может видеть внутренние элементы и вре msgid "Can see list of speakers" msgstr "Можно видеть список ораторов" +msgid "Can see moderation notes" +msgstr "" + msgid "Can see motions" msgstr "Можно видеть заявления" @@ -1133,9 +1167,17 @@ msgstr "" msgid "Choice" msgstr "" +msgid "Choose 0 to disable Intervention." +msgstr "" + msgid "Choose 0 to disable the supporting system." msgstr "Выберите 0, чтобы отключить систему поддержки." +msgid "" +"Choose a number greater than 0 to activate speaking times widget for " +"structure level countdowns." +msgstr "" + msgid "Chyron" msgstr "Хирон" @@ -1157,6 +1199,9 @@ msgstr "Очистить все фильтры" msgid "Clear all list of speakers" msgstr "Очистить весь список спикеров" +msgid "Clear current projection" +msgstr "" + msgid "Clear list" msgstr "Очистить список" @@ -1175,6 +1220,9 @@ msgstr "Нажмите здесь, чтобы проголосовать!" msgid "Close" msgstr "" +msgid "Close edit mode" +msgstr "" + msgid "Close list of speakers" msgstr "Закрыть список спикеров" @@ -1250,8 +1298,17 @@ msgstr "Комитеты" msgid "Committees and meetings" msgstr "" -msgid "Complex Workflow" -msgstr "Комплексный рабочий процесс" +msgid "Committees created" +msgstr "" + +msgid "Committees updated" +msgstr "" + +msgid "Committees with errors" +msgstr "" + +msgid "Committees with warnings: affected cells will be skipped" +msgstr "" msgid "Conference room" msgstr "" @@ -1286,6 +1343,9 @@ msgstr "" msgid "Contribution" msgstr "" +msgid "Contributions" +msgstr "" + msgid "Copy report to clipboard" msgstr "" @@ -1298,18 +1358,6 @@ msgstr "" msgid "Countdown" msgstr "Обратный отсчет" -msgid "Countdown and traffic light" -msgstr "Обратный отсчет и светофор" - -msgid "Countdown description" -msgstr "Описание обратного отсчета" - -msgid "Countdown time" -msgstr "Время обратного отсчета" - -msgid "Countdown title" -msgstr "Название обратного отсчета" - msgid "Countdowns" msgstr "Обратные отсчёты" @@ -1328,12 +1376,6 @@ msgstr "Создать" msgid "Create editorial final version" msgstr "" -msgid "Create new chat group" -msgstr "" - -msgid "Create new tag" -msgstr "" - msgid "Create subitem" msgstr "" @@ -1361,6 +1403,9 @@ msgstr "" msgid "Current slide" msgstr "" +msgid "Current speaker" +msgstr "" + msgid "Current speaker chyron" msgstr "" @@ -1391,29 +1436,6 @@ msgstr "" msgid "Datastore is ok!" msgstr "" -msgid "" -"Dear {name},\n" -"\n" -"this is your personal OpenSlides login:\n" -"\n" -"{url}\n" -"Username: {username}\n" -"Password: {password}\n" -"\n" -"\n" -"This email was generated automatically." -msgstr "" -"Уважаемый/-ая {name},\n" -"\n" -"это ваш личный логин OpenSlides:\n" -"\n" -" {url}\n" -" имя пользователя: {username}\n" -" пароль: {password}\n" -"\n" -"\n" -"Это письмо было сгенерировано автоматически." - msgid "Decision" msgstr "Решение" @@ -1441,16 +1463,7 @@ msgstr "Группы по умолчанию с правом голоса" msgid "Default line numbering" msgstr "Нумерация строк по умолчанию" -msgid "Default number" -msgstr "" - -msgid "Default participant number" -msgstr "" - -msgid "Default projector" -msgstr "Проектор по умолчанию" - -msgid "Default structure level" +msgid "Default speaking time for structure levels in seconds" msgstr "" msgid "" @@ -1504,9 +1517,6 @@ msgstr "" msgid "Defines which states can be selected next in the workflow." msgstr "" -msgid "Delegates" -msgstr "Делегаты" - msgid "Delegation of vote" msgstr "Делегирование голоса" @@ -1525,6 +1535,11 @@ msgstr "Удалить проектор" msgid "Deleted user" msgstr "" +msgid "" +"Deleting this motion will likely impact it's amendments negatively and they " +"could become unusable." +msgstr "" + msgid "Deletion" msgstr "Удаление" @@ -1558,18 +1573,15 @@ msgstr "" msgid "Display type" msgstr "Тип дисплея" +msgid "Distribute overhang time" +msgstr "" + msgid "Div" msgstr "" msgid "Divergent:" msgstr "Отклоняющийся:" -msgid "Do not concern" -msgstr "Не относятся" - -msgid "Do not decide" -msgstr "Не вздумайте" - msgid "Do not forget to save your changes!" msgstr "Не забудьте сохранить свои изменения!" @@ -1650,6 +1662,9 @@ msgstr "" msgid "Edit" msgstr "Редактировать" +msgid "Edit account" +msgstr "" + msgid "Edit comment field" msgstr "Редактировать поле комментария" @@ -1665,15 +1680,27 @@ msgstr "Редактировать детали для" msgid "Edit editorial final version" msgstr "" +msgid "Edit group" +msgstr "" + msgid "Edit meeting" msgstr "" -msgid "Edit name" +msgid "Edit moderation note" +msgstr "" + +msgid "Edit point of order ..." msgstr "" msgid "Edit projector" msgstr "Редактировать проектор" +msgid "Edit queue" +msgstr "" + +msgid "Edit state" +msgstr "" + msgid "Edit statute paragraph" msgstr "Редактировать пункт параграфа" @@ -1689,6 +1716,12 @@ msgstr "Отредактируйте, чтобы ввести голоса." msgid "Edit topic" msgstr "Редактировать тему" +msgid "Edit total time" +msgstr "" + +msgid "Edit workflow" +msgstr "" + msgid "Editorial final version" msgstr "" @@ -1701,6 +1734,9 @@ msgstr "Избирательные документы" msgid "Elections" msgstr "Выборы" +msgid "Element" +msgstr "" + msgid "Email" msgstr "Эл. адрес" @@ -1734,6 +1770,9 @@ msgstr "" msgid "Enable forspeech / counter speech" msgstr "" +msgid "Enable interposed questions" +msgstr "" + msgid "Enable numbering for agenda items" msgstr "Включить нумерацию пунктов повестки дня" @@ -1743,6 +1782,9 @@ msgstr "Включить просмотр присутствия участни msgid "Enable point of order" msgstr "" +msgid "Enable point of orders for other participants" +msgstr "" + msgid "Enable specifications and ranking for possible motions" msgstr "" @@ -1835,6 +1877,9 @@ msgid "Enter your email to send the password reset link" msgstr "" "Введите адрес электронной почты, чтобы отправить ссылку на сброс пароля" +msgid "Entitled present users" +msgstr "" + msgid "Entitled to vote" msgstr "Право голоса" @@ -2011,12 +2056,6 @@ msgstr "" msgid "Forwarding of motion" msgstr "" -msgid "Forwardings" -msgstr "" - -msgid "Front page text" -msgstr "Текст главной страницы" - msgid "Front page title" msgstr "Название главной страницы" @@ -2128,6 +2167,9 @@ msgstr "Не имеет спикеров" msgid "Has not logged in yet" msgstr "" +msgid "Has not voted" +msgstr "" + msgid "Has notes" msgstr "Имеет заметки" @@ -2182,6 +2224,9 @@ msgstr "Текст справки для доступа к данным и пр msgid "Hidden item" msgstr "Скрытый элемент" +msgid "Hide main menu" +msgstr "" + msgid "Hide more text" msgstr "Скрыть больше текста" @@ -2207,10 +2252,13 @@ msgid "I know the risk" msgstr "Я знаю риск" msgid "" -"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here. \n" +"IMPORTANT: The sender address (noreply@openslides.com) is defined in the OpenSlides server settings and cannot be changed here.\n" " To receive replies you have to enter a reply address in the next field. Please test the email dispatch in case of changes!" msgstr "" +msgid "Identical with" +msgstr "" + msgid "Identifier" msgstr "" @@ -2222,6 +2270,9 @@ msgid "" "delete it afterwards." msgstr "" +msgid "If the value is set to 0 the time counts up as stopwatch." +msgstr "" + msgid "Import" msgstr "Импортировать" @@ -2309,6 +2360,15 @@ msgstr "Внутренний элемент" msgid "Internal login" msgstr "" +msgid "Interposed question" +msgstr "" + +msgid "Intervention" +msgstr "" + +msgid "Intervention speaking time in seconds" +msgstr "" + msgid "Invalid line number" msgstr "Неверный номер строки" @@ -2503,7 +2563,7 @@ msgstr "Нумерация строк" msgid "Line spacing" msgstr "" -msgid "Linenumber" +msgid "List of amendments: " msgstr "" msgid "List of electronic votes" @@ -2530,9 +2590,6 @@ msgstr "" msgid "Live conference" msgstr "Живая конференция" -msgid "Live conference has to be active. Choose 0 to disable auto connect." -msgstr "" - msgid "Livestream" msgstr "Прямая трансляция" @@ -2569,6 +2626,9 @@ msgstr "" msgid "Main motion and line number" msgstr "" +msgid "Mandates switched sucessfully!" +msgstr "" + msgid "Mark as personal favorite" msgstr "Отметить как личное избранное" @@ -2652,6 +2712,12 @@ msgstr "" msgid "Minimum number of digits for motion identifier" msgstr "" +msgid "Moderation note" +msgstr "" + +msgid "Modify design" +msgstr "" + msgid "Module" msgstr "" @@ -2694,6 +2760,12 @@ msgstr "" msgid "Motion deleted" msgstr "Заявление удалено" +msgid "Motion editor" +msgstr "" + +msgid "Motion editors" +msgstr "" + msgid "Motion forwarded to" msgstr "" @@ -2757,9 +2829,6 @@ msgstr "" msgid "Name" msgstr "Имя" -msgid "Name exceeds 256 characters" -msgstr "" - msgid "Name of recommender" msgstr "имя рекомендателя" @@ -2772,18 +2841,12 @@ msgstr "" msgid "Natural person" msgstr "" -msgid "Needs review" -msgstr "Требует пересмотра" - msgid "Negative votes are not allowed." msgstr "" msgid "Never" msgstr "Никогда" -msgid "New Projector" -msgstr "Новый проектор" - msgid "New account" msgstr "" @@ -2799,23 +2862,35 @@ msgstr "Новая категория" msgid "New change recommendation" msgstr "Новое изменение рекомендации" +msgid "New chat group" +msgstr "" + msgid "New comment field" msgstr "Новое поле для комментариев" msgid "New committee" msgstr "" +msgid "New design" +msgstr "" + msgid "New directory" msgstr "Новый каталог" msgid "New election" msgstr "Новые выборы" +msgid "New file" +msgstr "" + msgid "New file name" msgstr "Новое имя файла" -msgid "New group name" -msgstr "Новое название группы" +msgid "New folder" +msgstr "" + +msgid "New group" +msgstr "" msgid "New meeting" msgstr "" @@ -2835,6 +2910,9 @@ msgstr "Новый участник" msgid "New password" msgstr "Новый пароль" +msgid "New projector" +msgstr "" + msgid "New state" msgstr "Новое состояние" @@ -2886,15 +2964,9 @@ msgstr "Без комментариев" msgid "No committee admin" msgstr "" -msgid "No concernment" -msgstr "Нет заинтересованных" - msgid "No data" msgstr "Нет данных" -msgid "No decision" -msgstr "Нет решения" - msgid "No delegation of vote" msgstr "Нет делегирования голоса" @@ -2928,6 +3000,9 @@ msgstr "" msgid "No motion block set" msgstr "Нет набора блока заявлений" +msgid "No motion editors" +msgstr "" + msgid "No one has voted for this poll" msgstr "" @@ -2949,9 +3024,15 @@ msgstr "" msgid "No results yet." msgstr "Пока результатов нет." +msgid "No spokesperson" +msgstr "" + msgid "No statute paragraphs" msgstr "Нет пункта параграфов" +msgid "No structure level" +msgstr "" + msgid "No tags" msgstr "Нет тегов" @@ -2967,6 +3048,9 @@ msgstr "" msgid "None" msgstr "Никто" +msgid "None of the selected motions can be forwarded." +msgstr "" + msgid "Not found" msgstr "" @@ -3066,9 +3150,6 @@ msgstr "Старый пароль" msgid "One email was send sucessfully." msgstr "" -msgid "Only countdown" -msgstr "Только обратный отсчет" - msgid "Only for internal notes." msgstr "Только для внутренних примечаний." @@ -3079,6 +3160,9 @@ msgid "Only present participants can be added to the list of speakers" msgstr "" "Только присутствующие участники могут быть добавлены в список спикеров." +msgid "Only time" +msgstr "" + msgid "Only traffic light" msgstr "Только светофор" @@ -3276,6 +3360,21 @@ msgid "" "here." msgstr "" +msgid "Participants created" +msgstr "" + +msgid "Participants skipped" +msgstr "" + +msgid "Participants updated" +msgstr "" + +msgid "Participants with errors" +msgstr "" + +msgid "Participants with warnings: affected cells will be skipped" +msgstr "" + msgid "Particles" msgstr "" @@ -3294,15 +3393,12 @@ msgstr "" msgid "Paste/write your topics in this textbox." msgstr "Вставьте/напишите ваши темы в этом текстовом поле." -msgid "Permission" -msgstr "Разрешение" +msgid "Pause speech" +msgstr "" msgid "Permissions" msgstr "Разрешения" -msgid "Permit" -msgstr "Разрешить" - msgid "Personal data changed" msgstr "" @@ -3330,9 +3426,6 @@ msgstr "Пожалуйста, введите имя для нового ката msgid "Please enter a name for the new workflow:" msgstr "Введите имя для нового рабочего процесса:" -msgid "Please enter a new workflow name:" -msgstr "" - msgid "Please enter a valid email address!" msgstr "Введите пожалуйста действительный адрес электронной почты!" @@ -3342,7 +3435,10 @@ msgstr "Введите пожалуйста новый пароль" msgid "Please join the conference room now!" msgstr "" -msgid "Please select a vote weight bigger than zero." +msgid "Please select a vote weight greater than or equal to 0.000001" +msgstr "" + +msgid "Please select a vote weight greater than zero." msgstr "" msgid "Please select the directory:" @@ -3363,6 +3459,9 @@ msgstr "Вопрос по порядку ведения заседания" msgid "Polls" msgstr "" +msgid "Possible options" +msgstr "" + msgid "Possible points of order" msgstr "" @@ -3417,6 +3516,12 @@ msgstr "" msgid "Project" msgstr "Проект" +msgid "Project active structure level" +msgstr "" + +msgid "Project all structure levels" +msgstr "" + msgid "Project selection?" msgstr "Выбор проецировать?" @@ -3489,6 +3594,9 @@ msgstr "Причина" msgid "Reason required for creating new motion" msgstr "Причина, необходимая для создания нового заявления" +msgid "Receipt of contributions" +msgstr "" + msgid "Receive motions" msgstr "" @@ -3507,6 +3615,11 @@ msgstr "" msgid "Recommendation label" msgstr "Рекомендованная этикетка" +msgid "" +"Recommendation of motions in such a state can only be seen by motion " +"managers." +msgstr "" + msgid "Recommendation reset" msgstr "" @@ -3516,12 +3629,6 @@ msgstr "" msgid "Reenter to conference room" msgstr "" -msgid "Refer to committee" -msgstr "Обратитесь в комитет" - -msgid "Referral to committee" -msgstr "Направление в комитет" - msgid "Referring motions" msgstr "Ссылающиеся заявления" @@ -3531,21 +3638,15 @@ msgstr "Обновить" msgid "Reject" msgstr "Отклонить" -msgid "Reject (not authorized)" -msgstr "Отклонено (не авторизован)" - msgid "Rejected" msgstr "Отклонено" -msgid "Rejection" -msgstr "Отказ" - -msgid "Rejection (not authorized)" -msgstr "Отказ (не авторизован)" - msgid "Relevant information could not be accessed" msgstr "" +msgid "Reload page" +msgstr "" + msgid "Remove" msgstr "Удалить" @@ -3586,9 +3687,6 @@ msgstr "Удалить меня" msgid "Remove option" msgstr "" -msgid "Rename state" -msgstr "" - msgid "Reopen" msgstr "" @@ -3620,6 +3718,9 @@ msgstr "" msgid "Required permissions to view this page:" msgstr "" +msgid "Requires permission to manage lists of speakers" +msgstr "" + msgid "Reset" msgstr "Сброс" @@ -3641,9 +3742,6 @@ msgstr "Сброс состояния" msgid "Reset to default settings" msgstr "" -msgid "Reset your OpenSlides password" -msgstr "" - msgid "Resolution and size" msgstr "Разрешение и размер" @@ -3659,6 +3757,9 @@ msgstr "" msgid "Results" msgstr "результаты" +msgid "Resume speech" +msgstr "" + msgid "Retrieving vote status... Please wait!" msgstr "" @@ -3731,24 +3832,24 @@ msgstr "" msgid "Select all" msgstr "Выбрать все" +msgid "Select exactly two participants to swap mandates" +msgstr "" + msgid "Select file" msgstr "Выберите файл" msgid "Select meetings ..." msgstr "" -msgid "Select or search new candidate ..." -msgstr "" - -msgid "Select or search new speaker ..." -msgstr "Выберите или найдите нового спикера ..." - -msgid "Select or search new submitter ..." -msgstr "Выберите или найдите нового подателя ..." - msgid "Select paragraphs" msgstr "Выберите параграф" +msgid "Select participant" +msgstr "" + +msgid "Select speaker" +msgstr "" + msgid "Send" msgstr "" @@ -3925,6 +4026,9 @@ msgstr "Показать окно прямой трансляции" msgid "Show logo" msgstr "Показать логотип" +msgid "Show main menu" +msgstr "" + msgid "Show meta information box beside the title on projector" msgstr "" @@ -3949,6 +4053,9 @@ msgstr "Показать поле расширения рекомендаций" msgid "Show recommendation on projector" msgstr "" +msgid "Show recommendations not public" +msgstr "" + msgid "Show referring motions" msgstr "" @@ -3990,9 +4097,6 @@ msgid "" "24x24px, PNG, JPG or SVG" msgstr "" -msgid "Simple Workflow" -msgstr "Простой рабочий процесс" - msgid "Single Sign-On settings" msgstr "" @@ -4043,11 +4147,20 @@ msgstr "" msgid "Speakers" msgstr "Спикеры" -msgid "Speaking time" +msgid "Speaking times" msgstr "" -msgid "Staff" -msgstr "Сотрудники" +msgid "Speech start time" +msgstr "" + +msgid "Speech type" +msgstr "" + +msgid "Spokesperson" +msgstr "" + +msgid "Spokespersons" +msgstr "" msgid "Stalemate! It's a draw!" msgstr "" @@ -4058,6 +4171,9 @@ msgstr "" msgid "Start date" msgstr "" +msgid "Start line number" +msgstr "" + msgid "Start time" msgstr "Время начала" @@ -4112,6 +4228,9 @@ msgstr "" msgid "Structure level" msgstr "Уровень структуры" +msgid "Structure levels" +msgstr "" + msgid "Subcategory" msgstr "Подкатегория" @@ -4184,6 +4303,12 @@ msgstr "Сторонники изменились" msgid "Surname" msgstr "Фамилия" +msgid "Swap mandates ..." +msgstr "" + +msgid "Switch" +msgstr "" + msgid "Table of contents" msgstr "Содержание" @@ -4208,6 +4333,9 @@ msgstr "Текстовый разделитель" msgid "The account is deactivated." msgstr "" +msgid "The affected columns will not be imported." +msgstr "" + msgid "The assembly may decide:" msgstr "Собрание может принять решение:" @@ -4415,14 +4543,16 @@ msgid "" " this?" msgstr "" -msgid "This row will not be imported, due to an unknown reason." -msgstr "" - msgid "" "This will add or remove the following groups for all selected participants:" msgstr "" "Это добавит или удалит следующие группы для всех выбранных участников:" +msgid "" +"This will add or remove the following structure levels for all selected " +"participants:" +msgstr "" + msgid "" "This will add or remove the following submitters for all selected motions:" msgstr "" @@ -4486,6 +4616,15 @@ msgstr "Вид плитки" msgid "Time" msgstr "" +msgid "Time and traffic light" +msgstr "" + +msgid "Timer" +msgstr "" + +msgid "Timers" +msgstr "" + msgid "Timestamp" msgstr "Отметка времени" @@ -4534,6 +4673,15 @@ msgstr "" msgid "Total accounts" msgstr "" +msgid "Total committees" +msgstr "" + +msgid "Total participants" +msgstr "" + +msgid "Total time" +msgstr "" + msgid "Total topics" msgstr "" @@ -4552,9 +4700,6 @@ msgstr "" msgid "Try reconnect" msgstr "" -msgid "Type" -msgstr "Тип" - msgid "Underline" msgstr "" @@ -4576,9 +4721,6 @@ msgstr "Не поддерживается" msgid "Upload" msgstr "Загрузить" -msgid "Upload files" -msgstr "Загрузить файлы" - msgid "Upload to" msgstr "Загрузить на" @@ -4587,6 +4729,9 @@ msgid "" "attribute name)." msgstr "" +msgid "Use color" +msgstr "" + msgid "Use the following custom number" msgstr "Использовать следующий пользовательский номер" @@ -4609,6 +4754,9 @@ msgstr "" msgid "Username" msgstr "Имя пользователя" +msgid "Username may not contain spaces" +msgstr "" + msgid "Username or password is incorrect." msgstr "" @@ -4638,6 +4786,9 @@ msgstr "" msgid "Vote" msgstr "Голос" +msgid "Vote submitted" +msgstr "" + msgid "Vote weight" msgstr "Вес голоса" @@ -4647,9 +4798,6 @@ msgstr "" msgid "Votes" msgstr "Голоса" -msgid "Voting" -msgstr "Голосование" - msgid "Voting and ballot papers" msgstr "Голосование и избирательные бюллетени" @@ -4739,6 +4887,16 @@ msgstr "" msgid "Warn color" msgstr "" +msgid "" +"Warning: Amendments exist for at least one of the selected motions. Are you " +"sure you want to delete these motions regardless?" +msgstr "" + +msgid "" +"Warning: Amendments exist for this motion. Are you sure you want to delete " +"this motion regardless?" +msgstr "" + msgid "" "Warning: Amendments exist for this motion. Editing this text will likely " "impact them negatively. Particularily, amendments might become unusable if " @@ -4840,13 +4998,7 @@ msgstr "" msgid "You are not supposed to be here..." msgstr "Вы не должны быть здесь..." -msgid "" -"You are receiving this email because you have requested a new password for your OpenSlides-account.\n" -"\n" -"Please open the following link and choose a new password:\n" -"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" -"\n" -"For completeness your username: {username}" +msgid "You are using an incompatible client version." msgstr "" msgid "" @@ -4990,15 +5142,9 @@ msgstr "" msgid "[Place for your welcome and help text.]" msgstr "[Место для приветствия и текста справки.]" -msgid "[Place for your welcome text.]" -msgstr "[Место для вашего текста приветствия.]" - msgid "absent" msgstr "отсутствует" -msgid "accepted" -msgstr "принято" - msgid "account-example" msgstr "" @@ -5008,9 +5154,6 @@ msgstr "активный" msgid "add group(s)" msgstr "добавить группу(ы)" -msgid "adjourned" -msgstr "отложено" - msgid "already exists" msgstr "" @@ -5050,12 +5193,6 @@ msgstr "вклад" msgid "could not be created" msgstr "" -msgid "could not be defined" -msgstr "" - -msgid "could not be referenced" -msgstr "" - msgid "created" msgstr "создан" @@ -5122,15 +5259,9 @@ msgstr "сохранил свою работу над этим движение msgid "have been created" msgstr "" -msgid "have been referenced" -msgstr "" - msgid "hidden" msgstr "скрытый" -msgid "in progress" -msgstr "в ходе выполнения" - msgid "inactive" msgstr "неактивный" @@ -5188,15 +5319,9 @@ msgstr "заявления" msgid "move ..." msgstr "перенести ..." -msgid "name" -msgstr "" - msgid "natural person" msgstr "" -msgid "needs review" -msgstr "требует пересмотра" - msgid "no natural person" msgstr "" @@ -5212,11 +5337,8 @@ msgstr "не номинальный" msgid "none" msgstr "никто" -msgid "not concerned" -msgstr "не касается" - -msgid "not decided" -msgstr "не решено" +msgid "not specified" +msgstr "" msgid "of" msgstr "из" @@ -5239,9 +5361,6 @@ msgstr "участники" msgid "participants-example" msgstr "пример участников" -msgid "permitted" -msgstr "разрешено" - msgid "present" msgstr "присутствует" @@ -5254,15 +5373,6 @@ msgstr "опубликовано" msgid "red" msgstr "красный" -msgid "referred to committee" -msgstr "отнесено к комитету" - -msgid "rejected" -msgstr "отклонено" - -msgid "rejected (not authorized)" -msgstr "отклонено (не авторизован)" - msgid "remove" msgstr "" @@ -5287,9 +5397,6 @@ msgstr "началось" msgid "stopped" msgstr "" -msgid "submitted" -msgstr "Отправлено" - msgid "successfully forwarded" msgstr "" @@ -5305,9 +5412,6 @@ msgstr "сегодня" msgid "undocumented" msgstr "недокументированный" -msgid "unknown" -msgstr "неизвестный" - msgid "updated" msgstr "" @@ -5320,20 +5424,139 @@ msgstr "" msgid "will be created" msgstr "" -msgid "will be defined" +msgid "will be imported" +msgstr "" + +msgid "will be updated" msgstr "" -msgid "will be imported" +msgid "yellow" +msgstr "желтый" + +msgid "{{amount}} interposed questions will be cleared" msgstr "" -msgid "will be referenced" +msgid "{{amount}} of them will be saved with 'unknown' speaker" msgstr "" -msgid "will be updated" +msgid "{{amount}} will be saved" msgstr "" -msgid "withdrawn" +msgid "Acceptance" +msgstr "Принятие" + +msgid "Adjournment" +msgstr "Перерыв" + +msgid "Admin" +msgstr "Администратор" + +msgid "Complex Workflow" +msgstr "Комплексный рабочий процесс" + +msgid "" +"Dear {name},\n" +"\n" +"this is your personal OpenSlides login:\n" +"\n" +"{url}\n" +"Username: {username}\n" +"Password: {password}\n" +"\n" +"\n" +"This email was generated automatically." msgstr "" +"Уважаемый/-ая {name},\n" +"\n" +"это ваш личный логин OpenSlides:\n" +"\n" +" {url}\n" +" имя пользователя: {username}\n" +" пароль: {password}\n" +"\n" +"\n" +"Это письмо было сгенерировано автоматически." -msgid "yellow" -msgstr "желтый" +msgid "Default projector" +msgstr "Проектор по умолчанию" + +msgid "Delegates" +msgstr "Делегаты" + +msgid "No concernment" +msgstr "Нет заинтересованных" + +msgid "No decision" +msgstr "Нет решения" + +msgid "Presentation and assembly system" +msgstr "" + +msgid "Referral to" +msgstr "" + +msgid "Rejection" +msgstr "Отказ" + +msgid "Reset your OpenSlides password" +msgstr "" + +msgid "Simple Workflow" +msgstr "Простой рабочий процесс" + +msgid "Space for your welcome text." +msgstr "" + +msgid "Speaking time" +msgstr "" + +msgid "Staff" +msgstr "Сотрудники" + +msgid "Voting" +msgstr "Голосование" + +msgid "" +"You are receiving this email because you have requested a new password for your OpenSlides account.\n" +"\n" +"Please open the following link and choose a new password:\n" +"{url}/login/forget-password-confirm?user_id={user_id}&token={token}\n" +"\n" +"The link will be valid for 10 minutes." +msgstr "" + +msgid "accepted" +msgstr "принято" + +msgid "adjourned" +msgstr "отложено" + +msgid "in progress" +msgstr "в ходе выполнения" + +msgid "name" +msgstr "" + +msgid "not concerned" +msgstr "не касается" + +msgid "not decided" +msgstr "не решено" + +msgid "not permitted" +msgstr "" + +msgid "permitted" +msgstr "разрешено" + +msgid "referred to" +msgstr "" + +msgid "rejected" +msgstr "отклонено" + +msgid "submitted" +msgstr "Отправлено" + +msgid "withdrawn" +msgstr "" diff --git a/client/src/assets/i18n/template-en.pot b/client/src/assets/i18n/template-en.pot index e3c7768e6b..498e31555c 100644 --- a/client/src/assets/i18n/template-en.pot +++ b/client/src/assets/i18n/template-en.pot @@ -1,3 +1,4 @@ +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html msgid "" msgstr "" "mime-version: 1.0\n" @@ -39,10 +40,6 @@ msgstr "" msgid "A client error occurred. Please contact your system administrator." msgstr "" -#: /app/src/app/site/pages/meetings/pages/participants/pages/structure-levels/components/structure-level-list/structure-level-list.component.html -msgid "A color is required" -msgstr "" - msgid "A conference is already running in your OpenSlides session." msgstr "" @@ -136,6 +133,14 @@ msgstr "" msgid "Activate statute amendments" msgstr "" +#: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +msgid "Activate the selection field 'motion editor'" +msgstr "" + +#: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +msgid "Activate the selection field 'spokesperson'" +msgstr "" + msgid "Activate vote delegations" msgstr "" @@ -182,9 +187,6 @@ msgstr "" msgid "Add" msgstr "" -msgid "Add countdown" -msgstr "" - msgid "Add me" msgstr "" @@ -200,6 +202,10 @@ msgstr "" msgid "Add option" msgstr "" +#: /app/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html +msgid "Add timer" +msgstr "" + msgid "Add to agenda" msgstr "" @@ -271,6 +277,10 @@ msgstr "" msgid "All other fields are optional and may be empty." msgstr "" +#: /app/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/definitions/index.ts +msgid "All present entitled users" +msgstr "" + #: /app/src/app/gateways/repositories/meeting-repository.service.ts msgid "All structure levels" msgstr "" @@ -296,6 +306,10 @@ msgstr "" msgid "Allow forwarding of motions" msgstr "" +#: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +msgid "Allow one participant multiple times on the same list" +msgstr "" + msgid "" "Allow only current speakers and list of speakers managers to enter the live " "conference" @@ -380,6 +394,10 @@ msgstr "" msgid "Applause visualization" msgstr "" +#: /app/src/app/site/modules/global-spinner/components/global-spinner/global-spinner.component.ts +msgid "Application update in progress." +msgstr "" + msgid "Apply" msgstr "" @@ -1358,18 +1376,6 @@ msgstr "" msgid "Countdown" msgstr "" -msgid "Countdown and traffic light" -msgstr "" - -msgid "Countdown description" -msgstr "" - -msgid "Countdown time" -msgstr "" - -msgid "Countdown title" -msgstr "" - msgid "Countdowns" msgstr "" @@ -1480,9 +1486,6 @@ msgstr "" msgid "Default speaking time for structure levels in seconds" msgstr "" -msgid "Default structure level" -msgstr "" - #: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts msgid "Default text version for change recommendations and projection of motions" msgstr "" @@ -1558,9 +1561,7 @@ msgid "Deleted user" msgstr "" #: /app/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts -msgid "" -"Deleting this motion will likely impact it's amendments negatively and they " -"could become unusable." +msgid "Deleting this motion will also delete the amendments." msgstr "" msgid "Deletion" @@ -1711,6 +1712,10 @@ msgstr "" msgid "Edit moderation note" msgstr "" +#: /app/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html +msgid "Edit point of order ..." +msgstr "" + msgid "Edit projector" msgstr "" @@ -1808,6 +1813,10 @@ msgstr "" msgid "Enable point of order" msgstr "" +#: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +msgid "Enable point of orders for other participants" +msgstr "" + msgid "Enable specifications and ranking for possible motions" msgstr "" @@ -1899,6 +1908,10 @@ msgstr "" msgid "Enter your email to send the password reset link" msgstr "" +#: /app/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-detail-content/assignment-poll-detail-content.component.html +msgid "Entitled present users" +msgstr "" + msgid "Entitled to vote" msgstr "" @@ -2189,6 +2202,10 @@ msgstr "" msgid "Has not logged in yet" msgstr "" +#: /app/src/app/site/pages/meetings/modules/poll/services/entitled-user-filter.service.ts +msgid "Has not voted" +msgstr "" + msgid "Has notes" msgstr "" @@ -2280,6 +2297,10 @@ msgid "" "changes!" msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-meta-data/motion-meta-data.component.html +msgid "Identical with" +msgstr "" + msgid "Identifier" msgstr "" @@ -2291,6 +2312,10 @@ msgid "" "delete it afterwards." msgstr "" +#: /app/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.html +msgid "If the value is set to 0 the time counts up as stopwatch." +msgstr "" + msgid "Import" msgstr "" @@ -2653,6 +2678,10 @@ msgstr "" msgid "Main motion and line number" msgstr "" +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.ts +msgid "Mandates switched sucessfully!" +msgstr "" + msgid "Mark as personal favorite" msgstr "" @@ -2786,6 +2815,14 @@ msgstr "" msgid "Motion deleted" msgstr "" +#: /app/src/app/gateways/repositories/motions/motion-editor-repository/motion-editor-repository.service.ts +msgid "Motion editor" +msgstr "" + +#: /app/src/app/site/pages/meetings/pages/motions/services/list/motion-list-filter.service/motion-list-filter.service.ts +msgid "Motion editors" +msgstr "" + msgid "Motion forwarded to" msgstr "" @@ -3029,6 +3066,10 @@ msgstr "" msgid "No motion block set" msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/services/list/motion-list-filter.service/motion-list-filter.service.ts +msgid "No motion editors" +msgstr "" + msgid "No one has voted for this poll" msgstr "" @@ -3050,9 +3091,17 @@ msgstr "" msgid "No results yet." msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/services/list/motion-list-filter.service/motion-list-filter.service.ts +msgid "No spokesperson" +msgstr "" + msgid "No statute paragraphs" msgstr "" +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-filter.service/participant-speaker-list-filter.service.ts +msgid "No structure level" +msgstr "" + msgid "No tags" msgstr "" @@ -3164,9 +3213,6 @@ msgstr "" msgid "One email was send sucessfully." msgstr "" -msgid "Only countdown" -msgstr "" - msgid "Only for internal notes." msgstr "" @@ -3176,6 +3222,10 @@ msgstr "" msgid "Only present participants can be added to the list of speakers" msgstr "" +#: /app/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts +msgid "Only time" +msgstr "" + msgid "Only traffic light" msgstr "" @@ -3642,6 +3692,12 @@ msgstr "" msgid "Recommendation label" msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/pages/workflows/components/workflow-detail/workflow-detail.component.ts +msgid "" +"Recommendation of motions in such a state can only be seen by motion " +"managers." +msgstr "" + msgid "Recommendation reset" msgstr "" @@ -3666,6 +3722,10 @@ msgstr "" msgid "Relevant information could not be accessed" msgstr "" +#: /app/src/app/site/services/autoupdate/autoupdate-communication.service.ts +msgid "Reload page" +msgstr "" + msgid "Remove" msgstr "" @@ -3733,6 +3793,10 @@ msgstr "" msgid "Required permissions to view this page:" msgstr "" +#: /app/src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts +msgid "Requires permission to manage lists of speakers" +msgstr "" + msgid "Reset" msgstr "" @@ -3848,22 +3912,21 @@ msgstr "" msgid "Select all" msgstr "" -msgid "Select file" +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html +msgid "Select exactly two participants to swap mandates" msgstr "" -msgid "Select meetings ..." +msgid "Select file" msgstr "" -msgid "Select or search new candidate ..." +msgid "Select meetings ..." msgstr "" -msgid "Select or search new speaker ..." +msgid "Select paragraphs" msgstr "" -msgid "Select or search new submitter ..." -msgstr "" - -msgid "Select paragraphs" +#: /app/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-manage-motion-meeting-users/motion-manage-motion-meeting-users.component.html +msgid "Select participant" msgstr "" #: /app/src/app/site/pages/meetings/modules/list-of-speakers-content/components/list-of-speakers-content/list-of-speakers-content.component.html @@ -4072,6 +4135,10 @@ msgstr "" msgid "Show recommendation on projector" msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/pages/workflows/components/workflow-detail/workflow-detail.component.ts +msgid "Show recommendations not public" +msgstr "" + msgid "Show referring motions" msgstr "" @@ -4155,10 +4222,6 @@ msgstr "" msgid "Sort workflow" msgstr "" -#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts -msgid "Speak end time" -msgstr "" - msgid "Speaker" msgstr "" @@ -4169,10 +4232,22 @@ msgstr "" msgid "Speaking times" msgstr "" +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-speaker-list/services/participant-speaker-list-sort.service/participant-speaker-list-sort.service.ts +msgid "Speech start time" +msgstr "" + #: /app/src/app/site/pages/meetings/pages/participants/export/speaker-csv-export.service/speaker-csv-export.service.ts msgid "Speech type" msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/services/list/motion-list-filter.service/motion-list-filter.service.ts +msgid "Spokesperson" +msgstr "" + +#: /app/src/app/gateways/repositories/motions/motion-working-group-speaker-repository/motion-working-group-speaker-repository.service.ts +msgid "Spokespersons" +msgstr "" + #: /app/src/app/ui/modules/sidenav/modules/easter-egg/modules/chess-dialog/components/chess-dialog/chess-dialog.component.ts msgid "Stalemate! It's a draw!" msgstr "" @@ -4317,6 +4392,14 @@ msgstr "" msgid "Surname" msgstr "" +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html +msgid "Swap mandates ..." +msgstr "" + +#: /app/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-switch-dialog/participant-switch-dialog.component.html +msgid "Switch" +msgstr "" + msgid "Table of contents" msgstr "" @@ -4610,6 +4693,18 @@ msgstr "" msgid "Time" msgstr "" +#: /app/src/app/site/pages/meetings/pages/projectors/view-models/view-projector-countdown.ts +msgid "Time and traffic light" +msgstr "" + +#: /app/src/app/site/pages/meetings/pages/projectors/components/projector-countdown-dialog/components/projector-countdown-dialog/projector-countdown-dialog.component.ts +msgid "Timer" +msgstr "" + +#: /app/src/app/site/pages/meetings/pages/projectors/modules/projector-detail/components/projector-detail/projector-detail.component.html +msgid "Timers" +msgstr "" + msgid "Timestamp" msgstr "" @@ -4879,12 +4974,6 @@ msgstr "" msgid "Warn color" msgstr "" -#: /app/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts -msgid "" -"Warning: Amendments exist for at least one of the selected motions. Are you " -"sure you want to delete these motions regardless?" -msgstr "" - #: /app/src/app/site/pages/meetings/pages/motions/pages/motion-detail/components/motion-detail-view/motion-detail-view.component.ts msgid "" "Warning: Amendments exist for this motion. Are you sure you want to delete " @@ -4897,6 +4986,12 @@ msgid "" "the paragraph they affect is deleted." msgstr "" +#: /app/src/app/site/pages/meetings/pages/motions/components/motion-multiselect/services/motion-multiselect.service.ts +msgid "" +"Warning: At least one of the selected motions has amendments, these will be " +"deleted as well. Do you want to delete anyway?" +msgstr "" + msgid "Warning: This projector will be set to visible" msgstr "" @@ -4988,6 +5083,10 @@ msgstr "" msgid "You are not supposed to be here..." msgstr "" +#: /app/src/app/site/services/autoupdate/autoupdate-communication.service.ts +msgid "You are using an incompatible client version." +msgstr "" + msgid "You are using the history mode of OpenSlides. Changes will not be saved." msgstr "" From bcf2046fcb54f3c728fa8b5281584046a4e962a5 Mon Sep 17 00:00:00 2001 From: Elblinator <69210919+Elblinator@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:10:53 +0100 Subject: [PATCH 57/59] Update mdc dialog (#3397) --- .../account-button.component.ts | 5 +- .../account-dialog.component.html | 84 +++--- .../account-dialog.component.scss | 14 +- .../account-dialog.component.spec.ts | 5 +- .../account-dialog.component.ts | 2 +- .../global-headbar.component.ts | 2 +- .../global-search.component.html | 9 +- .../global-search.component.scss | 10 +- .../global-headbar/global-headbar.module.ts | 2 +- .../user-delete-dialog.component.html | 8 +- .../user-delete-dialog.component.ts | 2 +- .../services/user-delete-dialog.service.ts | 2 +- .../user-components/user-components.module.ts | 2 +- ...d-waiting-for-action-dialog.component.html | 8 +- .../wait-for-action-dialog.service.ts | 2 +- .../wait-for-action-dialog.module.ts | 2 +- .../speaking-times.component.html | 8 +- .../point-of-order-dialog.component.ts | 5 +- .../point-of-order-dialog.module.ts | 2 +- .../services/point-of-order-dialog.service.ts | 2 +- .../speaker-user-select-dialog.component.ts | 5 +- .../speaker-user-select-dialog.service.ts | 2 +- .../speaker-user-select-dialog.module.ts | 2 +- .../attachment-control.component.ts | 2 +- .../projection-dialog.component.html | 6 +- .../projection-dialog.component.scss | 1 + .../projection-dialog.component.ts | 5 +- .../projection-dialog.module.ts | 2 +- .../services/projection-dialog.service.ts | 2 +- .../poll/base/base-poll-dialog.component.ts | 5 +- .../poll/base/base-poll-dialog.service.ts | 2 +- ...ting-privacy-warning-dialog.component.html | 8 +- .../voting-privacy-warning-dialog.service.ts | 2 +- .../voting-privacy-dialog.module.ts | 2 +- .../poll-dialog.service.ts | 2 +- .../topic-poll-dialog.component.html | 130 ++++----- .../topic-poll-dialog.component.ts | 2 +- .../modules/topic-poll/topic-poll.module.ts | 2 +- .../agenda-item-list.module.ts | 2 + .../agenda-item-info-dialog.component.html | 8 +- .../agenda-item-info-dialog.component.spec.ts | 5 +- .../agenda-item-info-dialog.component.ts | 5 +- .../agenda-item-list.component.ts | 2 +- .../assignment-poll/assignment-poll.module.ts | 2 +- .../assignment-poll-dialog.component.html | 108 ++++---- .../assignment-poll-dialog.component.ts | 2 +- .../chat-group-dialog.module.ts | 2 +- .../chat-group-dialog.component.html | 8 +- .../chat-group-dialog.component.ts | 2 +- .../services/chat-group-dialog.service.ts | 2 +- .../mediafile-list.component.html | 16 +- .../mediafile-list/mediafile-list.module.ts | 2 +- .../services/mediafile-common.service.ts | 2 +- .../motion-export-dialog.component.html | 246 +++++++++--------- .../motion-export-dialog.component.ts | 2 +- .../motion-export-dialog.module.ts | 2 +- .../services/motion-export-dialog.service.ts | 2 +- .../motion-forward-dialog.component.html | 8 +- .../motion-forward-dialog.component.ts | 5 +- .../motion-forward-dialog.module.ts | 2 +- .../services/motion-forward-dialog.service.ts | 2 +- .../motion-poll-dialog.component.html | 100 +++---- .../motion-poll-dialog.component.ts | 2 +- .../modules/motion-poll/motion-poll.module.ts | 2 +- .../pages/categories/categories.module.ts | 2 +- .../category-detail.component.html | 8 +- .../category-detail.component.ts | 2 +- .../category-list.component.html | 8 +- .../category-list/category-list.component.ts | 2 +- .../motions/pages/comments/comments.module.ts | 2 +- .../comment-section-list.component.html | 8 +- .../comment-section-list.component.ts | 2 +- .../motion-block-create-dialog.component.html | 12 +- .../motion-block-create-dialog.component.ts | 2 +- .../motion-block-create-dialog.module.ts | 2 +- .../motion-block-create-dialog.service.ts | 2 +- .../motion-block-detail.component.ts | 2 +- .../motion-block-edit-dialog.component.html | 12 +- .../motion-block-edit-dialog.component.ts | 5 +- .../motion-block-edit-dialog.module.ts | 2 +- .../motion-block-edit-dialog.service.ts | 2 +- .../motion-block-list.component.scss | 4 +- ...-change-recommendation-dialog.component.ts | 5 +- ...hange-recommendation-dialog.component.html | 8 +- ...hange-recommendation-dialog.component.scss | 2 +- ...ion-change-recommendation-dialog.module.ts | 2 +- ...on-change-recommendation-dialog.service.ts | 2 +- .../motion-list-info-dialog.component.html | 12 +- .../motion-list-info-dialog.component.ts | 2 +- .../motion-list-info-dialog.module.ts | 2 +- .../motion-list-info-dialog.service.ts | 2 +- .../statute-paragraph-list.component.html | 8 +- .../statute-paragraph-list.component.ts | 2 +- .../statute-paragraphs.module.ts | 2 +- .../tag-list/tag-list.component.html | 8 +- .../components/tag-list/tag-list.component.ts | 2 +- .../pages/motions/pages/tags/tags.module.ts | 2 +- .../workflow-detail.component.html | 8 +- .../workflow-detail.component.ts | 2 +- .../workflow-list.component.html | 8 +- .../workflow-list/workflow-list.component.ts | 2 +- .../pages/workflows/workflows.module.ts | 2 +- .../group-list/group-list.component.html | 8 +- .../group-list/group-list.component.ts | 2 +- .../modules/groups/groups.module.ts | 2 +- .../participant-switch-dialog.component.html | 8 +- ...articipant-list-info-dialog.component.html | 8 +- .../participant-list-info-dialog.component.ts | 2 +- .../participant-list-info-dialog.module.ts | 2 +- .../participant-list-info-dialog.service.ts | 2 +- .../structure-level-list.component.html | 8 +- .../projector-countdown-dialog.component.html | 8 +- .../projector-countdown-dialog.component.ts | 2 +- .../projector-countdown-dialog.module.ts | 2 +- .../projector-countdown-dialog.service.ts | 2 +- .../projector-edit-dialog.component.html | 14 +- .../projector-edit-dialog.component.scss | 4 +- .../projector-edit-dialog.component.ts | 5 +- .../projector-edit-dialog.module.ts | 2 +- .../services/projector-edit-dialog.service.ts | 2 +- .../projector-message-dialog.component.html | 8 +- .../projector-message-dialog.component.ts | 2 +- .../projector-message-dialog.module.ts | 2 +- .../projector-message-dialog.service.ts | 2 +- .../projector-list.component.html | 8 +- .../projector-list.component.ts | 2 +- .../projector-list/projector-list.module.ts | 2 +- .../pages/designs/designs.module.ts | 2 +- .../theme-builder-dialog.component.html | 14 +- .../theme-builder-dialog.component.scss | 12 +- .../theme-builder-dialog.component.ts | 5 +- .../services/theme-builder-dialog.service.ts | 2 +- .../theme-builder-dialog.module.ts | 2 +- ...organization-mediafile-list.component.html | 16 +- .../organization-mediafile-list.module.ts | 2 +- .../organization-tag-dialog.component.html | 8 +- .../organization-tag-dialog.component.ts | 5 +- .../organization-tag-dialog.module.ts | 2 +- .../organization-tag-dialog.service.ts | 2 +- .../organization-tags.module.ts | 2 +- client/src/app/ui/base/base-dialog-service.ts | 2 +- .../choice-dialog/choice-dialog.module.ts | 2 +- .../choice-dialog.component.html | 10 +- .../choice-dialog/choice-dialog.component.ts | 5 +- .../choice-dialog/services/choice.service.ts | 2 +- .../file-list/file-list.component.html | 16 +- .../file-list/file-list.component.ts | 2 +- .../ui/modules/file-list/file-list.module.ts | 2 +- .../import-list/import-list.component.html | 4 +- .../import-list/import-list.component.ts | 2 +- .../backend-import-list.component.html | 12 +- .../backend-import-list.component.ts | 2 +- .../modules/import-list/import-list.module.ts | 2 +- .../prompt-dialog/prompt-dialog.component.ts | 5 +- .../prompt-dialog/prompt-dialog.module.ts | 2 +- .../prompt-dialog/services/prompt.service.ts | 2 +- ...egg-content-platform-dialog.component.html | 4 +- ...egg-content-platform-dialog.component.scss | 2 +- .../modules/easter-egg/easter-egg.module.ts | 2 +- .../modules/c4-dialog/c4-dialog.module.ts | 2 +- .../chess-dialog/chess-dialog.module.ts | 2 +- .../chess-dialog/chess-dialog.component.html | 17 +- .../chess-dialog/chess-dialog.component.scss | 10 +- .../chess-dialog/chess-dialog.component.ts | 2 +- .../services/chess-challenge.service.ts | 2 +- .../easter-egg-content-platform.service.ts | 2 +- .../app/ui/modules/sidenav/sidenav.module.ts | 2 +- client/src/assets/i18n/template-en.pot | 50 +++- client/src/styles.scss | 2 +- 169 files changed, 721 insertions(+), 694 deletions(-) diff --git a/client/src/app/site/modules/global-headbar/components/account-button/account-button.component.ts b/client/src/app/site/modules/global-headbar/components/account-button/account-button.component.ts index 7539210eb2..c166dec015 100644 --- a/client/src/app/site/modules/global-headbar/components/account-button/account-button.component.ts +++ b/client/src/app/site/modules/global-headbar/components/account-button/account-button.component.ts @@ -1,8 +1,5 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { - MatLegacyDialog as MatDialog, - MatLegacyDialogConfig as MatDialogConfig -} from '@angular/material/legacy-dialog'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; import { MatLegacyMenuTrigger as MatMenuTrigger } from '@angular/material/legacy-menu'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; diff --git a/client/src/app/site/modules/global-headbar/components/account-dialog/account-dialog.component.html b/client/src/app/site/modules/global-headbar/components/account-dialog/account-dialog.component.html index 71f2126dfb..5ba3a070af 100644 --- a/client/src/app/site/modules/global-headbar/components/account-dialog/account-dialog.component.html +++ b/client/src/app/site/modules/global-headbar/components/account-dialog/account-dialog.component.html @@ -1,50 +1,48 @@ -
-