diff --git a/README.md b/README.md
index 104eebf8e8..b3fafc9f41 100644
--- a/README.md
+++ b/README.md
@@ -65,15 +65,7 @@ Generally, please work in your own fork, make branches and make a pull request i
## Commit messages
-Write your commit messages like they could appear in a change log.
-
-- Separate subject from body with a blank line
-- Limit the subject line to 50 characters
-- Capitalize the subject line
-- Do not end the subject line with a period
-- Use the imperative mood in the subject line
-- Wrap the body at 72 characters
-- Use the body to explain what and why vs. how
+See https://github.com/OpenSlides/OpenSlides/wiki/Development-organization#pull-request-titles-and-commit-messages.
## Code alignment
diff --git a/client/src/app/domain/definitions/meeting-settings-defaults.ts b/client/src/app/domain/definitions/meeting-settings-defaults.ts
index 110affd292..1021586ef9 100644
--- a/client/src/app/domain/definitions/meeting-settings-defaults.ts
+++ b/client/src/app/domain/definitions/meeting-settings-defaults.ts
@@ -58,7 +58,7 @@ export const meetingSettingsDefaults: { [key: string]: any } = {
motions_supporters_min_amount: 0,
motions_block_slide_columns: 3,
motion_poll_default_type: `pseudoanonymous`,
- motion_poll_default_100_percent_base: `YNA`,
+ motion_poll_default_onehundred_percent_base: `YNA`,
motion_poll_ballot_paper_selection: `CUSTOM_NUMBER`,
motion_poll_ballot_paper_number: 8,
motion_poll_default_backend: `fast`,
@@ -67,7 +67,7 @@ export const meetingSettingsDefaults: { [key: string]: any } = {
motions_export_follow_recommendation: false,
assignment_poll_default_method: `Y`,
assignment_poll_default_type: `pseudoanonymous`,
- assignment_poll_default_100_percent_base: `valid`,
+ assignment_poll_default_onehundred_percent_base: `valid`,
assignment_poll_sort_poll_result_by_votes: true,
assignment_poll_add_candidates_to_list_of_speakers: false,
assignment_poll_enable_max_votes_per_option: false,
diff --git a/client/src/app/domain/models/meetings/meeting.ts b/client/src/app/domain/models/meetings/meeting.ts
index 4781885960..d4593c3ad1 100644
--- a/client/src/app/domain/models/meetings/meeting.ts
+++ b/client/src/app/domain/models/meetings/meeting.ts
@@ -141,7 +141,7 @@ export class Settings {
public motion_poll_ballot_paper_selection!: BallotPaperSelection;
public motion_poll_ballot_paper_number!: number;
public motion_poll_default_type!: PollType;
- public motion_poll_default_100_percent_base!: PollPercentBase;
+ public motion_poll_default_onehundred_percent_base!: PollPercentBase;
public motion_poll_default_group_ids!: Id[]; // (group/used_as_motion_poll_default_id)[];
public motion_poll_default_backend!: PollBackendDurationType;
@@ -171,7 +171,7 @@ export class Settings {
public assignment_poll_sort_poll_result_by_votes!: boolean;
public assignment_poll_default_type!: PollType;
public assignment_poll_default_method!: PollMethod;
- public assignment_poll_default_100_percent_base!: PollPercentBase;
+ public assignment_poll_default_onehundred_percent_base!: PollPercentBase;
public assignment_poll_default_group_ids!: Id[]; // (group/used_as_assignment_poll_default_id)[];
public assignment_poll_default_backend!: PollBackendDurationType;
@@ -183,7 +183,7 @@ export class Settings {
topic_poll_sort_poll_result_by_votes: boolean;
topic_poll_default_type: PollType;
topic_poll_default_method: PollMethod;
- topic_poll_default_100_percent_base: PollPercentBase;
+ topic_poll_default_onehundred_percent_base: PollPercentBase;
topic_poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[];
topic_poll_default_backend: PollBackendDurationType;
@@ -195,7 +195,7 @@ export class Settings {
poll_sort_poll_result_by_votes: boolean;
poll_default_type: PollType;
poll_default_method: PollMethod;
- poll_default_100_percent_base: PollPercentBase;
+ poll_default_onehundred_percent_base: PollPercentBase;
poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[];
poll_default_backend: PollBackendDurationType;
}
@@ -378,7 +378,7 @@ export class Meeting extends BaseModel {
`motion_poll_ballot_paper_selection`,
`motion_poll_ballot_paper_number`,
`motion_poll_default_type`,
- `motion_poll_default_100_percent_base`,
+ `motion_poll_default_onehundred_percent_base`,
`motion_poll_default_group_ids`,
`motion_poll_default_backend`,
`poll_candidate_list_ids`,
@@ -405,7 +405,7 @@ export class Meeting extends BaseModel {
`assignment_poll_sort_poll_result_by_votes`,
`assignment_poll_default_type`,
`assignment_poll_default_method`,
- `assignment_poll_default_100_percent_base`,
+ `assignment_poll_default_onehundred_percent_base`,
`assignment_poll_default_group_ids`,
`assignment_poll_default_backend`,
`poll_ballot_paper_selection`,
@@ -413,7 +413,7 @@ export class Meeting extends BaseModel {
`poll_sort_poll_result_by_votes`,
`poll_default_type`,
`poll_default_method`,
- `poll_default_100_percent_base`,
+ `poll_default_onehundred_percent_base`,
`poll_default_group_ids`,
`poll_default_backend`,
`topic_poll_default_group_ids`,
diff --git a/client/src/app/domain/models/users/user.ts b/client/src/app/domain/models/users/user.ts
index fc90829b50..c1353a55e4 100644
--- a/client/src/app/domain/models/users/user.ts
+++ b/client/src/app/domain/models/users/user.ts
@@ -12,7 +12,7 @@ export type UserSortProperty = 'first_name' | 'last_name' | 'number';
/**
* Iterable pre selection of genders
*/
-export const GENDERS = [_(`female`), _(`male`), _(`diverse`)];
+export const GENDERS = [_(`female`), _(`male`), _(`diverse`), _(`non-binary`)];
/**
* Representation of a user in contrast to the operator.
@@ -37,7 +37,7 @@ export class User extends BaseDecimalModel {
public readonly default_structure_level!: string;
public readonly structure_level_$!: string[];
public readonly email!: string;
- public readonly last_email_send!: number; // comes in seconds
+ public readonly last_email_sent!: number; // comes in seconds
public readonly last_login!: number; // comes in seconds
public readonly vote_weight_$!: number[];
public readonly default_vote_weight!: number;
@@ -193,7 +193,7 @@ export class User extends BaseDecimalModel {
`default_number`,
`default_structure_level`,
`default_vote_weight`,
- `last_email_send`,
+ `last_email_sent`,
`is_demo_user`,
`last_login`,
`organization_management_level`,
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 2a5bc547aa..20678bb7fb 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
@@ -309,9 +309,19 @@ export class HtmlToPdfService {
* Can be overwritten by subclasses for more specific functionality.
*/
protected createListParagraph(data: CreateSpecificParagraphPayload): any {
- const children = this.parseChildren(data.element, data.styles);
+ let children = this.parseChildren(data.element, data.styles);
const list = this.create(data.nodeName);
+ // Fixes nested lists being placed inside `text` elements
+ if (
+ children.length === 1 &&
+ (children[0])?.text.length &&
+ (children[0])?.text.find((el: any) => !!el.ul)
+ ) {
+ // @ts-ignore
+ children = [{ stack: (children[0]).text }];
+ }
+
// keep the numbers of the ol list
if (data.nodeName === `ol`) {
const start = data.element.getAttribute(`start`);
diff --git a/client/src/app/gateways/repositories/users/user-repository.service.ts b/client/src/app/gateways/repositories/users/user-repository.service.ts
index 40eeb17063..36b942d250 100644
--- a/client/src/app/gateways/repositories/users/user-repository.service.ts
+++ b/client/src/app/gateways/repositories/users/user-repository.service.ts
@@ -95,7 +95,7 @@ export class UserRepositoryService extends BaseRepository {
const filterableListFields: TypedFieldset = listFields.concat([
`email`,
- `last_email_send`,
+ `last_email_sent`,
`last_login`,
`organization_management_level`
]);
diff --git a/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.html b/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.html
index eeda1d464a..522063dcb4 100644
--- a/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.html
+++ b/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.html
@@ -12,3 +12,5 @@
+
+
diff --git a/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.ts b/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.ts
index 4346c5e00f..7c26bc3093 100644
--- a/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.ts
+++ b/client/src/app/site/modules/global-headbar/components/global-headbar/global-headbar.component.ts
@@ -3,6 +3,7 @@ import { MatDialog } from '@angular/material/dialog';
import { ActiveMeetingService } from 'src/app/site/pages/meetings/services/active-meeting.service';
import { OrganizationService } from 'src/app/site/pages/organization/services/organization.service';
+import { GlobalHeadbarService } from '../../global-headbar.service';
import { GlobalSearchComponent } from '../global-search/global-search.component';
@Component({
@@ -26,7 +27,8 @@ export class GlobalHeadbarComponent {
public constructor(
private activeMeeting: ActiveMeetingService,
private orgaService: OrganizationService,
- private dialog: MatDialog
+ private dialog: MatDialog,
+ public headbarService: GlobalHeadbarService
) {}
public openSearch(): void {
diff --git a/client/src/app/site/modules/global-headbar/global-headbar.module.ts b/client/src/app/site/modules/global-headbar/global-headbar.module.ts
index 81cc39a458..0469cc9396 100644
--- a/client/src/app/site/modules/global-headbar/global-headbar.module.ts
+++ b/client/src/app/site/modules/global-headbar/global-headbar.module.ts
@@ -1,3 +1,4 @@
+import { PortalModule } from '@angular/cdk/portal';
import { ScrollingModule } from '@angular/cdk/scrolling';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@@ -31,7 +32,8 @@ const MODULES = [
MatTooltipModule,
MatDialogModule,
MatCheckboxModule,
- MatBadgeModule
+ MatBadgeModule,
+ PortalModule
];
const DECLARATIONS = [GlobalHeadbarComponent];
diff --git a/client/src/app/site/modules/global-headbar/global-headbar.service.ts b/client/src/app/site/modules/global-headbar/global-headbar.service.ts
new file mode 100644
index 0000000000..1cfb1922f4
--- /dev/null
+++ b/client/src/app/site/modules/global-headbar/global-headbar.service.ts
@@ -0,0 +1,15 @@
+import { TemplatePortal } from '@angular/cdk/portal';
+import { Injectable } from '@angular/core';
+
+@Injectable({ providedIn: `root` })
+export class GlobalHeadbarService {
+ private _headbar: TemplatePortal = null;
+
+ public get headbar() {
+ return this._headbar;
+ }
+
+ public set headbar(portal: TemplatePortal) {
+ this._headbar = portal;
+ }
+}
diff --git a/client/src/app/site/modules/site-wrapper/components/site-wrapper/site-wrapper.component.scss b/client/src/app/site/modules/site-wrapper/components/site-wrapper/site-wrapper.component.scss
index 9aa9b5836d..dfb2826a4e 100644
--- a/client/src/app/site/modules/site-wrapper/components/site-wrapper/site-wrapper.component.scss
+++ b/client/src/app/site/modules/site-wrapper/components/site-wrapper/site-wrapper.component.scss
@@ -9,5 +9,6 @@
.os-router-outlet-container {
flex-grow: 1;
+ overflow: auto;
}
}
diff --git a/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.html b/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.html
index 6f203c1a37..687889e25f 100644
--- a/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.html
+++ b/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.html
@@ -85,6 +85,7 @@ {{ 'Personal information' | translate }}
+ {{ 'Pronoun can only have 32 letters' | translate }}
diff --git a/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.ts b/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.ts
index fb0783ae14..696fe624ca 100644
--- a/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.ts
+++ b/client/src/app/site/modules/user-components/components/user-detail-view/user-detail-view.component.ts
@@ -258,13 +258,13 @@ export class UserDetailViewComponent extends BaseUiComponent implements OnInit,
this.personalInfoForm = this.fb.group(
{
username: [``, this.isNewUser ? [] : [Validators.required]],
- pronoun: [``],
+ pronoun: [``, Validators.maxLength(32)],
title: [``],
first_name: [``],
last_name: [``],
gender: [``],
email: [``],
- last_email_send: [``],
+ last_email_sent: [``],
default_password: [``],
is_active: [true],
is_physical_person: [true],
diff --git a/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/components/agenda-content-object-form/agenda-content-object-form.component.ts b/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/components/agenda-content-object-form/agenda-content-object-form.component.ts
index 3d43c1bd83..3a729bca04 100644
--- a/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/components/agenda-content-object-form/agenda-content-object-form.component.ts
+++ b/client/src/app/site/pages/meetings/modules/meetings-component-collector/agenda-content-object-form/components/agenda-content-object-form/agenda-content-object-form.component.ts
@@ -27,7 +27,7 @@ export class AgendaContentObjectFormComponent
}
public get itemObserver(): Observable {
- return this._itemsSubject.asObservable();
+ return this._itemsSubject;
}
public permission = Permission;
diff --git a/client/src/app/site/pages/meetings/modules/meetings-navigation/components/meetings-navigation-wrapper/meetings-navigation-wrapper.component.html b/client/src/app/site/pages/meetings/modules/meetings-navigation/components/meetings-navigation-wrapper/meetings-navigation-wrapper.component.html
index e6d4ad5147..7d7e8f1817 100644
--- a/client/src/app/site/pages/meetings/modules/meetings-navigation/components/meetings-navigation-wrapper/meetings-navigation-wrapper.component.html
+++ b/client/src/app/site/pages/meetings/modules/meetings-navigation/components/meetings-navigation-wrapper/meetings-navigation-wrapper.component.html
@@ -59,14 +59,8 @@
diff --git a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/services/topic-poll.service.ts b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/services/topic-poll.service.ts
index e545da0807..65c7e41a11 100644
--- a/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/services/topic-poll.service.ts
+++ b/client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/services/topic-poll.service.ts
@@ -49,7 +49,7 @@ export class TopicPollService extends PollService {
) {
super(organizationSettingsService, translate, pollKeyVerbose, parsePollNumber, themeService);
this.meetingSettingsService
- .get(`topic_poll_default_100_percent_base`)
+ .get(`topic_poll_default_onehundred_percent_base`)
.subscribe(base => (this.defaultPercentBase = base ?? PollPercentBase.Y));
this.meetingSettingsService
diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/agenda-sort.module.ts b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/agenda-sort.module.ts
index 207356381a..9b67aff2e6 100644
--- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/agenda-sort.module.ts
+++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/agenda-sort.module.ts
@@ -4,6 +4,8 @@ import { FormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon';
+import { MatListModule } from '@angular/material/list';
+import { MatMenuModule } from '@angular/material/menu';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatTooltipModule } from '@angular/material/tooltip';
import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations';
@@ -26,6 +28,8 @@ import { AgendaSortComponent } from './components/agenda-sort/agenda-sort.compon
MatCheckboxModule,
MatCardModule,
MatTooltipModule,
+ MatMenuModule,
+ MatListModule,
SortingModule
]
})
diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.html b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.html
index d627bdbe66..7734d4c6f2 100644
--- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.html
+++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.html
@@ -22,31 +22,21 @@
{{ 'Sort agenda' | translate }}
diff --git a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.scss b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.scss
index 7e28eb5070..4ef29a1a07 100644
--- a/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.scss
+++ b/client/src/app/site/pages/meetings/pages/agenda/pages/agenda-sort/components/agenda-sort/agenda-sort.component.scss
@@ -1,8 +1,11 @@
+.filter-hint {
+ padding: 0 16px;
+}
+
.sort-header {
display: block;
padding: 0 8px;
width: auto;
- position: relative;
text-align: center;
.button-menu {
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 e7fc9c71b0..df4f59f374 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
@@ -1,4 +1,5 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { MatListOption, MatSelectionList } from '@angular/material/list';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { AgendaItemType, ItemTypeChoices } from 'src/app/domain/models/agenda/agenda-item';
@@ -23,6 +24,8 @@ export class AgendaSortComponent extends BaseSortTreeViewComponent;
+ @ViewChild(`visibilities`) visibilitiesEl: MatSelectionList;
+
/**
* These are the available options for filtering the nodes.
* Adds the property `state` to identify if the option is marked as active.
@@ -56,14 +59,8 @@ export class AgendaSortComponent extends BaseSortTreeViewComponent f.value));
}
/**
@@ -89,6 +86,7 @@ export class AgendaSortComponent extends BaseSortTreeViewComponent (this.defaultPercentBase = base));
this.meetingSettingsService
.get(`assignment_poll_default_group_ids`)
diff --git a/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.scss b/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.scss
index de49c55d6e..9016b498c5 100644
--- a/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.scss
+++ b/client/src/app/site/pages/meetings/pages/autopilot/components/autopilot/autopilot.component.scss
@@ -1,3 +1,7 @@
.projector {
border: 1px solid #d3d3d3;
}
+
+.content-container {
+ min-height: calc(100vh - 77px);
+}
diff --git a/client/src/app/site/pages/meetings/pages/interaction/services/operator-media-permission.service.ts b/client/src/app/site/pages/meetings/pages/interaction/services/operator-media-permission.service.ts
index 1f2eebc742..73025b87aa 100644
--- a/client/src/app/site/pages/meetings/pages/interaction/services/operator-media-permission.service.ts
+++ b/client/src/app/site/pages/meetings/pages/interaction/services/operator-media-permission.service.ts
@@ -80,10 +80,8 @@ export class OperatorMediaPermissionService {
});
}
} catch (e) {
- if (e instanceof DOMException) {
- if (e.message === `Permission denied`) {
- this.throwPermError();
- }
+ if (e instanceof DOMException && e.name === `NotAllowedError`) {
+ this.throwPermError();
} else {
this.throwPermError(e as any);
}
diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-export-dialog/services/motion-export-dialog.service.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-export-dialog/services/motion-export-dialog.service.ts
index 216aaeec4e..ac8ca72fe7 100644
--- a/client/src/app/site/pages/meetings/pages/motions/components/motion-export-dialog/services/motion-export-dialog.service.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-export-dialog/services/motion-export-dialog.service.ts
@@ -7,6 +7,8 @@ import { ModelRequestService } from 'src/app/site/services/model-request.service
import { BaseDialogService } from 'src/app/ui/base/base-dialog-service';
import { getMotionDetailSubscriptionConfig } from '../../../motions.subscription';
+import { AmendmentControllerService } from '../../../services/common/amendment-controller.service';
+import { MotionLineNumberingService } from '../../../services/common/motion-line-numbering.service';
import { MotionExportInfo } from '../../../services/export/motion-export.service';
import { MotionExportService } from '../../../services/export/motion-export.service';
import { ViewMotion } from '../../../view-models';
@@ -25,7 +27,9 @@ export class MotionExportDialogService extends BaseDialogService<
dialog: MatDialog,
private exportService: MotionExportService,
private modelRequestService: ModelRequestService,
- private motionRepo: MotionRepositoryService
+ private motionRepo: MotionRepositoryService,
+ private amendmentRepo: AmendmentControllerService,
+ private motionLineNumbering: MotionLineNumberingService
) {
super(dialog);
}
@@ -38,12 +42,19 @@ export class MotionExportDialogService extends BaseDialogService<
public async export(motions: ViewMotion[]): Promise {
const dialogRef = await this.open(motions);
const exportInfo = await firstValueFrom(dialogRef.afterClosed());
+
if (exportInfo) {
await this.modelRequestService.fetch(getMotionDetailSubscriptionConfig(...motions.map(m => m.id)));
- this.exportService.evaluateExportRequest(
- exportInfo,
- motions.map(m => this.motionRepo.getViewModel(m.id))
- );
+ const amendments = this.amendmentRepo.getViewModelList();
+ this.motionLineNumbering.resetAmendmentChangeRecoListeners(amendments);
+
+ // The timeout is needed for the repos to update their view model list subjects
+ setTimeout(() => {
+ this.exportService.evaluateExportRequest(
+ exportInfo,
+ motions.map(m => this.motionRepo.getViewModel(m.id))
+ );
+ }, 2000);
}
}
}
diff --git a/client/src/app/site/pages/meetings/pages/motions/components/motion-main/motion-main.component.ts b/client/src/app/site/pages/meetings/pages/motions/components/motion-main/motion-main.component.ts
index 4e86e56417..b9fb932736 100644
--- a/client/src/app/site/pages/meetings/pages/motions/components/motion-main/motion-main.component.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/components/motion-main/motion-main.component.ts
@@ -16,7 +16,7 @@ import {
export class MotionMainComponent extends BaseModelRequestHandlerComponent {
protected override onNextMeetingId(id: number | null): void {
if (id) {
- this.subscribeTo(
+ this.updateSubscribeTo(
[
getMotionListSubscriptionConfig(id),
getMotionBlockSubscriptionConfig(id),
diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts
index 9c4928dae4..7a1734757f 100644
--- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts
@@ -865,7 +865,7 @@ describe(`MotionDiffService`, () => {
expect(diff).toBe(expected);
}));
- it(`handles insterted paragraphs infront of list`, inject([MotionDiffService], (service: MotionDiffService) => {
+ it(`handles inserted paragraphs in front of list`, inject([MotionDiffService], (service: MotionDiffService) => {
// Hint: line number should be moved into first element
const before = ``,
after = `Add before UL
`,
@@ -875,6 +875,81 @@ describe(`MotionDiffService`, () => {
expect(diff).toBe(expected);
}));
+ it(`handles inserted list items at the end of nested lists`, inject(
+ [MotionDiffService],
+ (service: MotionDiffService) => {
+ // Hint: line number should be moved into first element
+ const before =
+ ``,
+ after =
+ `` +
+ ` c ` +
+ `d ` +
+ `e ` +
+ ` `,
+ expected =
+ `` +
+ ` c ` +
+ `d ` +
+ `e ` +
+ ` `;
+
+ const diff = service.diff(before, after);
+ expect(diff).toBe(expected);
+ }
+ ));
+
+ it(`handles changed text within nested lists`, inject([MotionDiffService], (service: MotionDiffService) => {
+ // Hint: line number should be moved into first element
+ const before =
+ ``,
+ after =
+ ``,
+ expected =
+ ` Ebene 1` +
+ ` Ebene 2` +
+ ` ` +
+ `Ebene 3Ebene 3a ` +
+ ` `;
+
+ const diff = service.diff(before, after);
+ expect(diff).toBe(expected);
+ }));
+
+ it(`handles replaced text at the end of nested lists`, inject(
+ [MotionDiffService],
+ (service: MotionDiffService) => {
+ // Hint: line number should be moved into first element
+ const before =
+ ``,
+ after =
+ ``,
+ expected =
+ `` +
+ ` ` +
+ `Test 12 ` +
+ ` `;
+
+ const diff = service.diff(before, after);
+ expect(diff).toBe(expected);
+ }
+ ));
+
it(`handles completely deleted paragraphs`, inject([MotionDiffService], (service: MotionDiffService) => {
const before = `Ihr könnt ohne Sorge fortgehen.'Da meckerte die Alte und machte sich getrost auf den Weg.
`,
after = ``;
diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts
index 80f77ffccf..7d8d9c089b 100644
--- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts
@@ -1576,7 +1576,7 @@ export class MotionDiffService {
(whole: string, insDel: string): string => {
const modificationClass = insDel.toLowerCase() === `ins` ? `insert` : `delete`;
return whole.replace(
- /(<(p|div|blockquote|li)[^>]*>)([\s\S]*?)(<\/\2>)/gi,
+ /(<(p|div|blockquote|ul|ol|li)[^>]*>)([\s\S]*?)(<\/\2>)/gi,
(_whole2: string, opening: string, _blockTag: string, content: string, closing: string): string => {
const modifiedTag = DomHelpers.addClassToHtmlTag(opening, modificationClass);
return `` + insDel + `>` + modifiedTag + content + closing + `<` + insDel + `>`;
@@ -1585,7 +1585,7 @@ export class MotionDiffService {
}
);
- // deleted text inserted. => deleted tetinserted.
+ // deleted textinserted. => deleted textinserted.
diffUnnormalized = diffUnnormalized.replace(
/([^<]*)<\/(p|div|blockquote|li)><\/del>([^<]*)<\/\2>(\s*)<\/ins>/gi,
(_whole: string, deleted: string, tag: string, inserted: string, white: string): string =>
@@ -1680,6 +1680,14 @@ export class MotionDiffService {
` `
);
+ // Ebene 3 Ebene 3a
+ // => Ebene 3 Ebene 3a
+ diffUnnormalized = diffUnnormalized.replace(
+ /([^<]+)((?:<(?:ul|ol|li)>)+)<\/del>(]*os-line-number[^>]*>(?: |\s)<\/span>)?([^<]+)\2<\/ins>/gi,
+ (_whole: string, del: string, block: string, ln: string, ins: string): string =>
+ `` + del + `` + ins + ` ` + block + ln
+ );
+
// ->
diffUnnormalized = diffUnnormalized.replace(
/(<\/(p|div|blockquote|li)>)(\s*)<\/(ins|del)>/gi,
@@ -1687,6 +1695,21 @@ export class MotionDiffService {
`` + insdel + `>` + ending + space
);
+ // d e
+ // =>
+ diffUnnormalized = diffUnnormalized.replace(
+ /((<\/(li|ul|ol)>)+)<\/del>((.*?<\/li>)*)\1<\/ins>/i,
+ (_whole: string, ending: string, _e1: string, _e2: string, insertedLis: string, _e3: string) =>
+ insertedLis + ending
+ );
+
+ // Ebene 5
+ // =>
+ diffUnnormalized = diffUnnormalized.replace(
+ /([^<>]*)((<\/(li|ul|ol)>)+)<\/del>([^<>]*)\2<\/ins>/i,
+ (_whole, del, end, _ul, _u2, ins) => `` + del + `` + ins + ` ` + end
+ );
+
let diff: string;
if (this.diffDetectBrokenDiffHtml(diffUnnormalized)) {
diff = this.diffParagraphs(htmlOld, htmlNew, lineLength!, firstLineNumber!);
diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll.service/motion-poll.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll.service/motion-poll.service.ts
index a6cd94f8d9..c4f5156d1a 100644
--- a/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll.service/motion-poll.service.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/services/motion-poll.service/motion-poll.service.ts
@@ -55,7 +55,7 @@ export class MotionPollService extends PollService {
) {
super(organizationSettingsService, translate, pollKeyVerbose, parsePollNumber, themeService);
this.meetingSettingsService
- .get(`motion_poll_default_100_percent_base`)
+ .get(`motion_poll_default_onehundred_percent_base`)
.subscribe(base => (this.defaultPercentBase = base));
this.meetingSettingsService.get(`motion_poll_default_type`).subscribe(type => (this.defaultPollType = type));
this.meetingSettingsService.get(`motion_poll_default_group_ids`).subscribe(ids => (this.defaultGroupIds = ids));
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 22d567467f..0e407341b6 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
@@ -174,7 +174,8 @@ export const getMotionDetailSubscriptionConfig: SubscriptionConfigGenerator = (.
{ idField: `lead_motion_id`, fieldset: [`text`] },
{
idField: `amendment_ids`,
- fieldset: [`text`, `modified_final_version`, { templateField: `amendment_paragraph_$` }]
+ fieldset: [`text`, `modified_final_version`, { templateField: `amendment_paragraph_$` }],
+ follow: [{ idField: `change_recommendation_ids`, fieldset: FULL_FIELDSET }]
},
{ idField: `comment_ids`, fieldset: FULL_FIELDSET },
{ idField: `supporter_ids`, ...UserFieldsets.FullNameSubscription }
@@ -215,7 +216,10 @@ export const getAmendmentListSubscriptionConfig: SubscriptionConfigGenerator = (
{
idField: `amendment_ids`,
fieldset: [`text`, { templateField: `amendment_paragraph_$` }],
- follow: [{ idField: `lead_motion_id`, fieldset: [`text`, `modified_final_version`] }]
+ follow: [
+ { idField: `change_recommendation_ids`, fieldset: FULL_FIELDSET },
+ { idField: `lead_motion_id`, fieldset: [`text`, `modified_final_version`] }
+ ]
}
]
}
diff --git a/client/src/app/site/pages/meetings/pages/motions/services/common/motion-format.service/motion-format.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/common/motion-format.service/motion-format.service.ts
index 44fda79e29..f96610fcfe 100644
--- a/client/src/app/site/pages/meetings/pages/motions/services/common/motion-format.service/motion-format.service.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/services/common/motion-format.service/motion-format.service.ts
@@ -121,12 +121,25 @@ export class MotionFormatService {
return {
origin_id: motion.id,
- title: motion.title,
+ title: this.getFinalTitle(motion, lineLength),
reason: motion.reason || ``,
text: textWithoutLines
};
}
+ private getFinalTitle(motion: ViewMotion, lineLength: number): string {
+ const titleChange = this.getUnifiedChanges(motion, lineLength).find((obj: ViewUnifiedChange) =>
+ obj.isTitleChange()
+ )!;
+ const crMode = !!motion.modified_final_version ? ChangeRecoMode.ModifiedFinal : ChangeRecoMode.Final;
+
+ if (titleChange) {
+ return this.changeRecoRepo.getTitleWithChanges(motion.title, titleChange, crMode);
+ }
+
+ return motion.title;
+ }
+
/**
* returns the most recent motion text version: Either the modified final version (if present)
* otherwise final version
diff --git a/client/src/app/site/pages/meetings/pages/motions/services/common/motion-line-numbering.service/motion-line-numbering.service.ts b/client/src/app/site/pages/meetings/pages/motions/services/common/motion-line-numbering.service/motion-line-numbering.service.ts
index 5586133501..c425ca13bc 100644
--- a/client/src/app/site/pages/meetings/pages/motions/services/common/motion-line-numbering.service/motion-line-numbering.service.ts
+++ b/client/src/app/site/pages/meetings/pages/motions/services/common/motion-line-numbering.service/motion-line-numbering.service.ts
@@ -268,17 +268,17 @@ export class MotionLineNumberingService {
const baseParagraphs = this.getTextParagraphs(motion, true, lineLength);
let amendmentParagraphs: string[] = [];
- if (crMode === ChangeRecoMode.Changed) {
+ if (crMode === ChangeRecoMode.Original) {
+ amendmentParagraphs = baseParagraphs.map(
+ (_: string, paraNo: number) => amendment.amendment_paragraph(paraNo) as string
+ );
+ } else {
amendmentParagraphs = this.applyChangesToAmendment(
amendment,
lineLength,
changeRecommendations,
true
) as string[];
- } else {
- amendmentParagraphs = baseParagraphs.map(
- (_: string, paraNo: number) => amendment.amendment_paragraph(paraNo) as string
- );
}
return amendmentParagraphs
diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.html b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.html
index d183c136d5..ac07b22588 100644
--- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.html
+++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-detail/components/participant-detail-view/participant-detail-view.component.html
@@ -186,10 +186,10 @@ {{ 'About me' | translate }}
{{ 'Meeting specific information' | translate }}
-
+
{{ 'Last email sent' | translate }}
- {{ user.last_email_send | localizedDate }}
+ {{ user.last_email_sent | localizedDate }}
diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html
index e8c0d12ed9..c93be0e0eb 100644
--- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html
+++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/components/participant-list/participant-list.component.html
@@ -106,8 +106,8 @@
{{ 'Participants' | translate }}
mail
diff --git a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/services/participant-list-filter.service/participant-list-filter.service.ts b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/services/participant-list-filter.service/participant-list-filter.service.ts
index f939c48dc7..b2497e267e 100644
--- a/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/services/participant-list-filter.service/participant-list-filter.service.ts
+++ b/client/src/app/site/pages/meetings/pages/participants/pages/participant-list/services/participant-list-filter.service/participant-list-filter.service.ts
@@ -75,7 +75,7 @@ export class ParticipantListFilterService extends BaseMeetingFilterListService
{
{ property: `structure_level`, label: _(`Structure level`) },
{ property: `voteWeight`, label: _(`Vote weight`) },
{ property: `comment` },
- { property: `last_email_send`, label: _(`Last email sent`) },
+ { property: `last_email_sent`, label: _(`Last email sent`) },
{ property: `last_login`, label: _(`Last login`) }
];
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 189f148d7d..047700c8fc 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
@@ -627,7 +627,7 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([
}
},
{
- key: `motion_poll_default_100_percent_base`,
+ key: `motion_poll_default_onehundred_percent_base`,
label: _(`Default 100 % base of a voting result`),
type: `choice`,
choices: PollPercentBaseVerbose
@@ -727,7 +727,7 @@ export const meetingSettings: SettingsGroup[] = fillInSettingsDefaults([
}
},
{
- key: `assignment_poll_default_100_percent_base`,
+ key: `assignment_poll_default_onehundred_percent_base`,
label: _(`Default 100 % base of an election result`),
type: `choice`,
choices: PollPercentBaseVerbose
diff --git a/client/src/app/site/pages/meetings/view-models/view-user.ts b/client/src/app/site/pages/meetings/view-models/view-user.ts
index 27ddb02d8f..35584a6b45 100644
--- a/client/src/app/site/pages/meetings/view-models/view-user.ts
+++ b/client/src/app/site/pages/meetings/view-models/view-user.ts
@@ -35,8 +35,8 @@ export class ViewUser extends BaseViewModel /* implements Searchable */ {
return this._model;
}
- public get isLastEmailSend(): boolean {
- return !!this.last_email_send;
+ public get isLastEmailSent(): boolean {
+ return !!this.last_email_sent;
}
public get isLastLogin(): boolean {
diff --git a/client/src/app/site/pages/organization/modules/navigation/organization-navigation-wrapper/organization-navigation-wrapper.component.scss b/client/src/app/site/pages/organization/modules/navigation/organization-navigation-wrapper/organization-navigation-wrapper.component.scss
index 8136bcebcd..a8181f2818 100644
--- a/client/src/app/site/pages/organization/modules/navigation/organization-navigation-wrapper/organization-navigation-wrapper.component.scss
+++ b/client/src/app/site/pages/organization/modules/navigation/organization-navigation-wrapper/organization-navigation-wrapper.component.scss
@@ -1,5 +1,5 @@
.scrollable-content {
- height: calc(100% - var(--global-headbar-height));
+ height: 100%;
width: 100%;
overflow: auto;
}
diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html
index ccd5991102..3513717c67 100644
--- a/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html
+++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-detail/components/account-detail/account-detail.component.html
@@ -130,10 +130,10 @@ {{ 'Administration roles (at organization level)' | translate }}
{{ getOmlVerboseName(user.organization_management_level) | translate }}
-
+
{{ 'Last email sent' | translate }}
- {{ user.last_email_send | localizedDate }}
+ {{ user.last_email_sent | localizedDate }}
diff --git a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/components/account-list/account-list.component.html b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/components/account-list/account-list.component.html
index 548ab050c3..21ecc359aa 100644
--- a/client/src/app/site/pages/organization/pages/accounts/pages/account-list/components/account-list/account-list.component.html
+++ b/client/src/app/site/pages/organization/pages/accounts/pages/account-list/components/account-list/account-list.component.html
@@ -76,8 +76,8 @@
{{ 'Accounts' | translate }}
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 4ab6b54379..c51f211ac3 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
@@ -24,7 +24,7 @@ export class AccountSortService extends BaseSortListService
{
{ property: `gender`, label: _(`Gender`) },
{ property: `id`, label: _(`Sequential number`) },
{ property: `numberOfMeetings`, label: _(`Amount of meetings`) },
- { property: `last_email_send`, label: _(`Last email sent`) },
+ { property: `last_email_sent`, label: _(`Last email sent`) },
{ property: `last_login`, label: _(`Last login`) }
];
diff --git a/client/src/app/site/pages/organization/pages/accounts/services/common/account-filter.service.ts b/client/src/app/site/pages/organization/pages/accounts/services/common/account-filter.service.ts
index 8d7b3ce446..ad56ae7c51 100644
--- a/client/src/app/site/pages/organization/pages/accounts/services/common/account-filter.service.ts
+++ b/client/src/app/site/pages/organization/pages/accounts/services/common/account-filter.service.ts
@@ -89,6 +89,7 @@ export class AccountFilterService extends BaseFilterListService {
{ condition: `female`, label: this.translate.instant(`female`) },
{ condition: `male`, label: this.translate.instant(`male`) },
{ condition: `diverse`, label: this.translate.instant(`diverse`) },
+ { condition: `non-binary`, label: this.translate.instant(`non-binary`) },
{ condition: null, label: this.translate.instant(`unknown`) }
]
},
@@ -101,7 +102,7 @@ export class AccountFilterService extends BaseFilterListService {
]
},
{
- property: `isLastEmailSend`,
+ property: `isLastEmailSent`,
label: this.translate.instant(`Last email sent`),
options: [
{ condition: true, label: this.translate.instant(`Got an email`) },
diff --git a/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.html b/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.html
index e408bd1830..16319ca007 100644
--- a/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.html
+++ b/client/src/app/ui/modules/head-bar/components/head-bar/head-bar.component.html
@@ -1,100 +1,102 @@
-
-