Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions client/src/app/domain/models/meeting-users/meeting-user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class MeetingUser extends BaseDecimalModel<MeetingUser> {
public user_id!: Id;
public meeting_id!: Id;

public vote_delegated_to_id!: Id; // meeting_user/vote_delegations_from_ids;
public vote_delegated_to_ids!: Id[]; // meeting_user/vote_delegations_from_ids;

public group_ids!: Id[]; // (group/meeting_user_ids)[];
public speaker_ids!: Id[]; // (speaker/meeting_user_id)[];
Expand Down Expand Up @@ -51,7 +51,7 @@ export class MeetingUser extends BaseDecimalModel<MeetingUser> {
`speaker_ids`,
`motion_supporter_ids`,
`assignment_candidate_ids`,
`vote_delegated_to_id`,
`vote_delegated_to_ids`,
`vote_delegations_from_ids`,
`acting_ballot_ids`,
`represented_ballot_ids`,
Expand Down
2 changes: 2 additions & 0 deletions client/src/app/domain/models/meetings/meeting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ export class Settings {
public users_enable_presence_view!: boolean;
public users_enable_vote_weight!: boolean;
public users_enable_vote_delegations!: boolean;
public users_vote_delegations_max_amount: boolean;
public users_allow_self_set_present!: boolean;
public users_pdf_welcometitle!: string;
public users_pdf_welcometext!: string;
Expand Down Expand Up @@ -403,6 +404,7 @@ export class Meeting extends BaseModel<Meeting> {
`users_email_subject`,
`users_email_body`,
`users_enable_vote_delegations`,
`users_vote_delegations_max_amount`,
`users_forbid_delegator_in_list_of_speakers`,
`users_forbid_delegator_as_submitter`,
`users_forbid_delegator_as_supporter`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class MeetingUserRepositoryService extends BaseMeetingRelatedRepository<V
public override getFieldsets(): Fieldsets<MeetingUser> {
const groupFields: TypedFieldset<MeetingUser> = [`group_ids`, `meeting_id`, `user_id`];
const participantListFieldsMinimal: TypedFieldset<MeetingUser> = groupFields.concat([
`vote_delegated_to_id`,
`vote_delegated_to_ids`,
`vote_delegations_from_ids`,
`structure_level_ids`,
`vote_weight`,
Expand Down Expand Up @@ -49,7 +49,7 @@ export class MeetingUserRepositoryService extends BaseMeetingRelatedRepository<V
about_me: partialUser.about_me,
vote_weight: toDecimal(partialUser.vote_weight, false) as any,
comment: partialUser.comment,
vote_delegated_to_id: partialUser.vote_delegated_to_id,
vote_delegated_to_ids: partialUser.vote_delegated_to_ids,
vote_delegations_from_ids: partialUser.vote_delegations_from_ids,
structure_level_ids: partialUser.structure_level_ids,
group_ids: partialUser.group_ids,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ export class UserRepositoryService extends BaseRepository<ViewUser, User> {
const update = typeof patch === `function` ? patch(user) : patch;
const payload: any = {
username: update.username,
vote_delegated_to_id: update.vote_delegated_to_id,
vote_delegated_to_ids: update.vote_delegated_to_ids,
vote_delegations_from_ids: update.vote_delegations_from_ids,
meeting_id: update.meeting_id ?? this.meetingUserRepo.getActiveMeetingId()
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,16 +315,16 @@ export const RELATIONS: Relation[] = [
OField: `users`
}),
// Vote delegations
// vote_delegated_to_id -> vote_delegations_from_ids
// vote_delegated_to_ids -> vote_delegations_from_ids
{
ownViewModels: [ViewMeetingUser],
foreignViewModel: ViewMeetingUser,
ownField: `vote_delegated_to`,
ownIdField: `vote_delegated_to_id`,
many: false,
ownIdField: `vote_delegated_to_ids`,
many: true,
generic: false
},
// vote_delegations_from_ids -> vote_delegated_to_id
// vote_delegations_from_ids -> vote_delegated_to_ids
{
ownViewModels: [ViewMeetingUser],
foreignViewModel: ViewMeetingUser,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export class MotionManageSupportersComponent extends BaseComponent implements On
return (
supporter.meeting_user?.groups?.filter(g => g.hasPermission(Permission.motionCanSupport)).length > 0 &&
!(
supporter.meeting_user?.vote_delegated_to_id &&
supporter.meeting_user?.vote_delegated_to_ids?.length &&
this.activeMeetingService.meeting.users_forbid_delegator_as_supporter &&
this.activeMeetingService.meeting.users_enable_vote_delegations
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ <h2>{{ 'Meeting specific information' | translate }}</h2>
<mat-form-field class="form100 force-min-with">
<mat-label>{{ 'Voting right delegated to (proxy)' | translate }}</mat-label>
<os-repo-search-selector
formControlName="vote_delegated_to_id"
[includeNone]="true"
formControlName="vote_delegated_to_ids"
[multiple]="true"
[repo]="repo"
[sortService]="sortService"
[subscriptionConfig]="participantSubscriptionConfig"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export class ParticipantDetailEditComponent extends BaseMeetingComponent impleme
comment: [``],
group_ids: [``],
vote_delegations_from_ids: [``],
vote_delegated_to_id: [``],
vote_delegated_to_ids: [``],
is_present: [``],
locked_out: [``],
external: [``],
Expand Down Expand Up @@ -312,14 +312,13 @@ export class ParticipantDetailEditComponent extends BaseMeetingComponent impleme
if (this.operator.hasPerms(Permission.userCanUpdate)) {
this.checkForGroups(this.personalInfoFormValue);
const isPresent = this.personalInfoFormValue.is_present || false;
if (this.personalInfoFormValue.vote_delegated_to_id === 0) {
this.personalInfoFormValue.vote_delegated_to_id = null;
}
const payload = {
...this.personalInfoFormValue,
vote_delegated_to_id: this.personalInfoFormValue.vote_delegated_to_id
? this.repo.getViewModel(this.personalInfoFormValue.vote_delegated_to_id).getMeetingUser().id
: null,
vote_delegated_to_ids: this.personalInfoFormValue.vote_delegated_to_ids
? this.personalInfoFormValue.vote_delegated_to_ids
.map(id => this.repo.getViewModel(id).getMeetingUser().id)
.filter(id => !!id)
: [],
vote_delegations_from_ids: this.personalInfoFormValue.vote_delegations_from_ids
? this.personalInfoFormValue.vote_delegations_from_ids
.map(id => this.repo.getViewModel(id).getMeetingUser().id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export class ParticipantDetailViewComponent extends BaseMeetingComponent {
comment: [``],
group_ids: [``],
vote_delegations_from_ids: [``],
vote_delegated_to_id: [``],
vote_delegated_to_ids: [``],
is_present: [``],
locked_out: [``],
home_committee_id: [``],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ <h2>{{ 'Meeting specific information' | translate }}</h2>
{{ 'Voting right delegated to (proxy)' | translate }}
</mat-label>
<os-repo-search-selector
formControlName="vote_delegated_to_id"
formControlName="vote_delegated_to_ids"
[includeNone]="true"
[multiple]="false"
[repo]="repo"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export class ParticipantCreateWizardComponent extends BaseMeetingComponent imple
comment: [``],
group_ids: [``],
vote_delegations_from_ids: [``],
vote_delegated_to_id: [``],
vote_delegated_to_ids: [``],
is_present: [``],
locked_out: [``],
home_committee_id: [``],
Expand Down Expand Up @@ -270,9 +270,11 @@ export class ParticipantCreateWizardComponent extends BaseMeetingComponent imple
return async () => {
const payload = {
...this.personalInfoFormValue,
vote_delegated_to_id: this.personalInfoFormValue.vote_delegated_to_id
? this.repo.getViewModel(this.personalInfoFormValue.vote_delegated_to_id).getMeetingUser().id
: undefined,
vote_delegated_to_ids: this.personalInfoFormValue.vote_delegated_to_ids
? this.personalInfoFormValue.vote_delegated_to_ids
.map((id: Id) => this.repo.getViewModel(id).getMeetingUser().id)
.filter((id: Id) => !!id)
: [],
vote_delegations_from_ids: this.personalInfoFormValue.vote_delegations_from_ids
? this.personalInfoFormValue.vote_delegations_from_ids
.map((id: Id) => this.repo.getViewModel(id).getMeetingUser().id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -371,17 +371,14 @@ export class ParticipantListComponent extends BaseMeetingListViewComponent<ViewU
number: user.number(),
structure_level_ids: user.structure_level_ids(),
vote_delegations_from_ids: user.vote_delegations_from_meeting_user_ids(),
vote_delegated_to_id: user.vote_delegated_to_meeting_user_id()
vote_delegated_to_ids: user.vote_delegated_to_meeting_user_ids()
});

dialogRef.afterClosed().subscribe(async result => {
if (result) {
if (!result.group_ids?.length) {
result.group_ids = [this.activeMeeting!.default_group_id];
}
if (result.vote_delegated_to_id === 0) {
result.vote_delegated_to_id = null;
}
if (
!(
user.id === this.operator.operatorId &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ <h1 mat-dialog-title>
<os-list-search-selector
[includeNone]="true"
[inputListValues]="otherParticipantsObservable"
[multiple]="true"
[sortFn]="false"
[(ngModel)]="infoDialog.vote_delegated_to_id"
[(ngModel)]="infoDialog.vote_delegated_to_ids"
/>
</mat-form-field>
}
Expand All @@ -57,7 +58,7 @@ <h1 mat-dialog-title>
[mat-dialog-close]="{
group_ids: infoDialog.group_ids,
vote_delegations_from_ids: infoDialog.vote_delegations_from_ids,
vote_delegated_to_id: infoDialog.vote_delegated_to_id,
vote_delegated_to_ids: infoDialog.vote_delegated_to_ids,
number: infoDialog.number,
structure_level_ids: infoDialog.structure_level_ids
}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export interface InfoDialog {
/**
* Transfer voting rights to
*/
vote_delegated_to_id: number;
vote_delegated_to_ids: number[];
}

@Service()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export const getParticipantVoteInfoSubscriptionConfig: SubscriptionConfigGenerat
]
},
{
idField: `vote_delegated_to_id`,
idField: `vote_delegated_to_ids`,
fieldset: [`meeting_id`],
follow: [{ idField: `user_id`, fieldset: [`is_present_in_meeting_ids`] }]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export const MEETING_RELATED_FORM_CONTROLS = [
`comment`,
`group_ids`,
`vote_delegations_from_ids`,
`vote_delegated_to_id`,
`vote_delegated_to_ids`,
`is_present`,
`locked_out`
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const pollModelRequest: BaseSimplifiedModelRequest = {
follow: [
{
idField: `meeting_user_id`,
fieldset: [...MeetingUserFieldsets.FullNameSubscription.fieldset, `vote_delegated_to_id`],
fieldset: [...MeetingUserFieldsets.FullNameSubscription.fieldset, `vote_delegated_to_ids`],
follow: MeetingUserFieldsets.FullNameSubscription.follow
}
]
Expand Down
8 changes: 4 additions & 4 deletions client/src/app/site/pages/meetings/view-models/view-user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,12 +236,12 @@ export class ViewUser extends BaseViewModel<User> /* implements Searchable */ {
return this.getMeetingUser(meetingId)?.chat_message_ids;
}

public vote_delegated_to_id(meetingId?: Id): Id {
public vote_delegated_to_ids(meetingId?: Id): Id {
return this.getMeetingUser(meetingId)?.vote_delegated_to?.user_id;
}

public vote_delegated_to_meeting_user_id(meetingId?: Id): Id {
return this.getMeetingUser(meetingId)?.vote_delegated_to_id;
public vote_delegated_to_meeting_user_ids(meetingId?: Id): Id[] {
return this.getMeetingUser(meetingId)?.vote_delegated_to_ids;
}

public vote_delegations_from_ids(meetingId?: Id): Id[] {
Expand Down Expand Up @@ -303,7 +303,7 @@ export class ViewUser extends BaseViewModel<User> /* implements Searchable */ {
}

public get isVoteRightDelegated(): boolean {
return !!this.vote_delegated_to_id(this.getEnsuredActiveMeetingId());
return !!this.vote_delegated_to_ids(this.getEnsuredActiveMeetingId());
}

public get voteWeight(): number {
Expand Down
4 changes: 2 additions & 2 deletions client/src/app/site/services/operator.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ export class OperatorService {

public isAllowedWithDelegation(...appliedSettings: DelegationSetting[]): boolean {
return (
!this.user.getMeetingUser(this.activeMeetingId)?.vote_delegated_to_id ||
!this.user.getMeetingUser(this.activeMeetingId)?.vote_delegated_to_ids?.length ||
!appliedSettings.some(appliedSetting => this.meetingSettings.instant(appliedSetting as keyof Settings))
);
}
Expand Down Expand Up @@ -833,7 +833,7 @@ export class OperatorService {
fieldset: `all`,
follow: [
{
idField: `vote_delegated_to_id`,
idField: `vote_delegated_to_ids`,
fieldset: [`meeting_id`, `group_ids`],
follow: [
{
Expand Down
2 changes: 1 addition & 1 deletion meta
Loading