From 69bae437212942d7f4a23e753e7a0b20b4bf6b41 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Thu, 7 May 2026 18:01:37 +0200 Subject: [PATCH 1/9] New vote service (#5534) * implement new data model * uncommment/remove old code * create approval/selection vote method things * add new `translationKey` pipe --- .../models/meeting-users/meeting-user.ts | 2 + .../src/app/domain/models/meetings/meeting.ts | 31 +- .../poll-candidate-list.ts | 22 - .../poll-candidate-lists/poll-candidate.ts | 25 - client/src/app/domain/models/poll/ballot.ts | 40 ++ .../domain/models/poll/base-poll-config.ts | 6 + .../app/domain/models/poll/generic-poll.ts | 30 +- client/src/app/domain/models/poll/index.ts | 3 +- client/src/app/domain/models/poll/option.ts | 42 -- .../models/poll/poll-config-approval.ts | 25 + .../poll/poll-config-rating-approval.ts | 29 + .../models/poll/poll-config-rating-score.ts | 33 + .../models/poll/poll-config-selection.ts | 39 + .../models/poll/poll-config-stv-scottish.ts | 16 + .../domain/models/poll/poll-config-types.ts | 1 + .../app/domain/models/poll/poll-constants.ts | 122 +--- .../src/app/domain/models/poll/poll-option.ts | 27 + client/src/app/domain/models/poll/poll.ts | 159 ++--- client/src/app/domain/models/poll/vote.ts | 42 -- client/src/app/domain/models/users/user.ts | 4 - client/src/app/domain/translations/index.ts | 5 + client/src/app/domain/translations/poll.ts | 23 + .../poll-candidate-list/index.ts | 1 - ...-candidate-list-repository.service.spec.ts | 16 - .../poll-candidate-list-repository.service.ts | 40 -- .../poll-candidate/index.ts | 1 - .../poll-candidate-repository.service.spec.ts | 16 - .../poll-candidate-repository.service.ts | 36 - .../ballot-repository.service.spec.ts} | 8 +- .../ballot-repository.service.ts | 53 ++ .../polls/ballot-repository.service/index.ts | 1 + .../polls/option-repository.service/index.ts | 1 - .../option-repository.service.ts | 19 - ...poll-config-approval-repository.service.ts | 23 + ...nfig-rating-approval-repository.service.ts | 24 + ...-config-rating-score-repository.service.ts | 23 + ...oll-config-selection-repository.service.ts | 23 + ...-config-stv-scottish-repository.service.ts | 23 + .../polls/poll-option-repository.service.ts | 20 + .../poll-repository.service.ts | 309 ++------ .../polls/vote-repository.service/index.ts | 1 - .../vote-repository.service.spec.ts | 16 - .../vote-repository.service.ts | 143 ---- client/src/app/gateways/vote-api.service.ts | 70 ++ .../definitions/relations/relations.ts | 132 ++-- .../services/voting-banner.service.ts | 8 +- .../poll/base/base-poll-detail.component.ts | 14 +- .../poll/base/base-poll-dialog.component.ts | 372 +--------- .../poll/base/base-poll-dialog.service.ts | 22 +- .../base-poll-meta-information.component.ts | 11 - .../poll/base/base-poll-pdf.service.ts | 29 +- .../modules/poll/base/base-poll.component.ts | 18 +- .../base-poll-form.component.html | 196 ----- .../base-poll-form.component.ts | 671 ------------------ .../base-poll-vote.component.html | 397 ----------- .../base-poll-vote.component.scss | 271 ------- .../base-poll-vote.component.ts | 542 -------------- .../components/chart/chart.component.spec.ts | 24 - .../check-input/check-input.component.spec.ts | 24 - .../entitled-users-table.component.spec.ts | 24 - .../poll-cannot-vote-message.component.html | 28 +- ...poll-cannot-vote-message.component.spec.ts | 22 - .../poll-cannot-vote-message.component.ts | 72 +- .../poll-filtered-votes-chart.component.ts | 10 +- .../poll-form-approval.component.html | 22 + .../poll-form-approval.component.scss} | 0 .../poll-form-approval.component.ts | 57 ++ .../poll-form-rating-approval.component.html | 34 + .../poll-form-rating-approval.component.scss} | 0 .../poll-form-rating-approval.component.ts | 52 ++ .../poll-form-selection.component.html | 46 ++ .../poll-form-selection.component.scss | 9 + .../poll-form-selection.component.ts | 59 ++ .../poll-form/poll-form.component.html | 75 ++ .../poll-form.component.scss} | 4 + .../poll-form/poll-form.component.ts | 163 +++++ .../poll-meta/poll-meta.component.html | 126 ++++ .../poll-meta/poll-meta.component.scss} | 0 .../poll-meta/poll-meta.component.ts | 76 ++ .../poll-progress.component.html | 6 +- .../poll-progress.component.spec.ts | 24 - .../poll-progress/poll-progress.component.ts | 131 ++-- .../poll-result-approval.component.html | 47 ++ .../poll-result-approval.component.scss | 83 +++ .../poll-result-approval.component.ts | 110 +++ ...poll-result-rating-approval.component.html | 1 + ...poll-result-rating-approval.component.scss | 0 .../poll-result-rating-approval.component.ts | 14 + .../poll-result-selection.component.html | 41 ++ .../poll-result-selection.component.scss | 83 +++ .../poll-result-selection.component.ts | 120 ++++ .../poll-result/poll-result.component.html | 11 + .../poll-result/poll-result.component.scss | 0 .../poll-result/poll-result.component.ts | 26 + .../poll-vote-approval.component.html | 16 + .../poll-vote-approval.component.scss | 60 ++ .../poll-vote-approval.component.ts | 110 +++ .../poll-vote-button.component.html | 14 + .../poll-vote-button.component.scss | 40 ++ .../poll-vote-button.component.ts | 30 + .../poll-vote-option.component.html | 12 + .../poll-vote-option.component.scss | 4 + .../poll-vote-option.component.ts | 15 + .../poll-vote-rating-approval.component.html | 1 + .../poll-vote-rating-approval.component.scss | 0 .../poll-vote-rating-approval.component.ts | 19 + .../poll-vote-selection.component.html | 132 ++++ .../poll-vote-selection.component.scss | 69 ++ .../poll-vote-selection.component.ts | 144 ++++ .../poll-vote/poll-vote.component.html | 45 ++ .../poll-vote/poll-vote.component.scss | 7 + .../poll-vote/poll-vote.component.ts | 57 ++ .../poll/components/poll/poll.component.html | 158 +++++ .../poll/components/poll/poll.component.scss | 35 + .../poll/components/poll/poll.component.ts | 173 +++++ .../single-option-chart-table.component.html | 24 +- ...ingle-option-chart-table.component.spec.ts | 24 - .../single-option-chart-table.component.ts | 48 +- .../votes-table/votes-table.component.html | 2 +- .../votes-table/votes-table.component.spec.ts | 22 - ...ting-privacy-warning-dialog.component.html | 0 ...ting-privacy-warning-dialog.component.scss | 0 ...voting-privacy-warning-dialog.component.ts | 5 +- .../poll/definitions/poll-dialog-data.ts | 14 +- ...g-privacy-warning-dialog.component.spec.ts | 24 - .../modules/voting-privacy-dialog/index.ts | 1 - ...ing-privacy-warning-dialog.service.spec.ts | 16 - .../voting-privacy-warning-dialog.service.ts | 20 - .../voting-privacy-dialog.module.ts | 16 - .../poll-percent-base.pipe.spec.ts | 36 +- .../poll-percent-base.pipe.ts | 19 +- .../meetings/modules/poll/poll.module.ts | 22 +- .../poll-controller.service.ts | 60 +- .../services/poll.service/poll.service.ts | 121 ++-- ...c.ts => ballot-controller.service.spec.ts} | 6 +- .../ballot-controller.service.ts | 41 ++ .../services/vote-controller.service/index.ts | 2 +- .../vote-controller.service.ts | 68 -- .../poll/services/votes-filter.service.ts | 9 +- .../services/voting.service/voting.service.ts | 92 ++- .../topic-poll-detail-content.component.ts | 22 +- .../topic-poll-dialog.component.html | 89 +-- .../topic-poll-dialog.component.ts | 262 +------ .../topic-poll-form.component.spec.ts | 24 - .../topic-poll-form.component.ts | 25 - .../topic-poll-meta-info.component.html | 83 --- .../topic-poll-meta-info.component.spec.ts | 24 - .../topic-poll-meta-info.component.ts | 35 - .../topic-poll-vote.component.spec.ts | 24 - .../topic-poll-vote.component.ts | 135 ---- .../topic-poll/topic-poll.component.html | 120 +--- .../topic-poll/topic-poll.component.ts | 76 +- .../topic-poll/services/topic-poll.service.ts | 167 +---- .../modules/topic-poll/topic-poll.module.ts | 16 +- .../topic-detail/topic-detail.component.html | 4 +- .../topic-detail/topic-detail.component.ts | 6 +- .../pages/topic-detail/topic-detail.module.ts | 2 + .../topic-pdf.service/topic-pdf.service.ts | 8 +- .../agenda-pdf-catalog-export.service.ts | 10 +- .../assignment-poll/assignment-poll.module.ts | 16 +- ...ssignment-poll-detail-content.component.ts | 161 +---- .../assignment-poll-dialog.component.html | 87 +-- .../assignment-poll-dialog.component.scss | 4 + .../assignment-poll-dialog.component.ts | 150 ++-- .../assignment-poll-form.component.spec.ts | 24 - .../assignment-poll-form.component.ts | 52 -- .../assignment-poll-meta-info.component.html | 120 ---- ...ssignment-poll-meta-info.component.spec.ts | 24 - .../assignment-poll-meta-info.component.ts | 52 -- .../assignment-poll-vote.component.spec.ts | 24 - .../assignment-poll-vote.component.ts | 155 ---- .../assignment-poll.component.html | 130 +--- .../assignment-poll.component.ts | 83 +-- .../assignment-poll-pdf.service.ts | 9 +- .../services/assignment-poll.service.ts | 93 +-- .../assignment-detail.component.html | 12 +- .../assignment-detail.component.scss | 10 +- .../assignment-detail.component.ts | 4 +- .../assignment-poll-detail.component.html | 14 +- .../assignment-poll-detail.component.ts | 14 +- .../services/assignment-pdf.service.ts | 7 +- .../pages/autopilot/autopilot.module.ts | 3 +- .../poll-collection.component.html | 65 +- .../poll-collection.component.ts | 12 +- .../motion-poll-detail-content.component.html | 6 +- ...tion-poll-detail-content.component.spec.ts | 24 - .../motion-poll-detail-content.component.ts | 21 +- .../motion-poll-dialog.component.html | 62 +- .../motion-poll-dialog.component.ts | 83 +-- .../motion-poll-form.component.html | 1 + .../motion-poll-form.component.ts | 30 +- ...otion-poll-meta-information.component.html | 19 - ...otion-poll-meta-information.component.scss | 5 - ...on-poll-meta-information.component.spec.ts | 24 - .../motion-poll-meta-information.component.ts | 10 - .../motion-poll-vote.component.spec.ts | 24 - .../motion-poll-vote.component.ts | 61 -- .../motion-poll/motion-poll.component.html | 159 +---- .../motion-poll/motion-poll.component.ts | 78 +- .../modules/motion-poll/motion-poll.module.ts | 15 +- .../motion-poll-controller.service.ts | 3 +- .../motion-poll.service.ts | 125 +--- .../motion-add-poll-button.component.ts | 3 +- .../motion-poll-detail.component.html | 18 +- .../motion-poll-detail.component.ts | 9 +- .../pages/motion-polls/motion-polls.module.ts | 2 + .../poll-list/poll-list.component.html | 2 +- .../poll-list/poll-list.component.ts | 2 +- .../modules/poll-list/poll-list.module.ts | 6 +- .../poll-list-filter.service.ts | 4 +- .../meetings/pages/polls/polls.config.ts | 79 ++- .../pages/polls/polls.subscription.ts | 73 +- .../pages/polls/view-models/has-polls.ts | 3 + .../meetings/pages/polls/view-models/index.ts | 9 +- .../polls/view-models/poll-config-approval.ts | 18 + .../poll-config-rating-approval.ts | 18 + .../view-models/poll-config-rating-score.ts | 18 + .../view-models/poll-config-selection.ts | 18 + .../view-models/poll-config-stv-scottish.ts | 18 + .../pages/polls/view-models/poll-option.ts | 34 + .../{view-vote.ts => view-ballot.ts} | 18 +- .../pages/polls/view-models/view-option.ts | 67 -- .../view-models/view-poll-candidate-list.ts | 36 - .../polls/view-models/view-poll-candidate.ts | 25 - .../pages/polls/view-models/view-poll.ts | 108 +-- .../meeting-settings-definitions.ts | 61 +- .../meetings/view-models/view-meeting-user.ts | 6 +- .../meetings/view-models/view-meeting.ts | 9 +- .../pages/meetings/view-models/view-user.ts | 10 +- .../editable-list.component.html | 25 + .../editable-list.component.scss | 55 ++ .../editable-list/editable-list.component.ts | 60 ++ .../src/app/ui/modules/editable-list/index.ts | 1 + client/src/app/ui/pipes/pipes.module.ts | 5 +- .../pipes/translate-key/translate-key.pipe.ts | 16 + .../src/assets/styles/poll-styles-common.scss | 7 + .../meeting/motion/history.spec.ts | 21 +- meta | 2 +- 238 files changed, 4442 insertions(+), 7364 deletions(-) delete mode 100644 client/src/app/domain/models/poll-candidate-lists/poll-candidate-list.ts delete mode 100644 client/src/app/domain/models/poll-candidate-lists/poll-candidate.ts create mode 100644 client/src/app/domain/models/poll/ballot.ts create mode 100644 client/src/app/domain/models/poll/base-poll-config.ts delete mode 100644 client/src/app/domain/models/poll/option.ts create mode 100644 client/src/app/domain/models/poll/poll-config-approval.ts create mode 100644 client/src/app/domain/models/poll/poll-config-rating-approval.ts create mode 100644 client/src/app/domain/models/poll/poll-config-rating-score.ts create mode 100644 client/src/app/domain/models/poll/poll-config-selection.ts create mode 100644 client/src/app/domain/models/poll/poll-config-stv-scottish.ts create mode 100644 client/src/app/domain/models/poll/poll-config-types.ts create mode 100644 client/src/app/domain/models/poll/poll-option.ts delete mode 100644 client/src/app/domain/models/poll/vote.ts create mode 100644 client/src/app/domain/translations/index.ts create mode 100644 client/src/app/domain/translations/poll.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate-list/index.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate-list/poll-candidate-list-repository.service.spec.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate-list/poll-candidate-list-repository.service.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate/index.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate/poll-candidate-repository.service.spec.ts delete mode 100644 client/src/app/gateways/repositories/poll-candidate-lists/poll-candidate/poll-candidate-repository.service.ts rename client/src/app/gateways/repositories/polls/{option-repository.service/option-repository.service.spec.ts => ballot-repository.service/ballot-repository.service.spec.ts} (51%) create mode 100644 client/src/app/gateways/repositories/polls/ballot-repository.service/ballot-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/ballot-repository.service/index.ts delete mode 100644 client/src/app/gateways/repositories/polls/option-repository.service/index.ts delete mode 100644 client/src/app/gateways/repositories/polls/option-repository.service/option-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-config-approval-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-config-rating-approval-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-config-rating-score-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-config-selection-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-config-stv-scottish-repository.service.ts create mode 100644 client/src/app/gateways/repositories/polls/poll-option-repository.service.ts delete mode 100644 client/src/app/gateways/repositories/polls/vote-repository.service/index.ts delete mode 100644 client/src/app/gateways/repositories/polls/vote-repository.service/vote-repository.service.spec.ts delete mode 100644 client/src/app/gateways/repositories/polls/vote-repository.service/vote-repository.service.ts create mode 100644 client/src/app/gateways/vote-api.service.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/base/base-poll-meta-information.component.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/base-poll-form/base-poll-form.component.html delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/base-poll-form/base-poll-form.component.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/base-poll-vote/base-poll-vote.component.html delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/base-poll-vote/base-poll-vote.component.scss delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/base-poll-vote/base-poll-vote.component.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/chart/chart.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/check-input/check-input.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/entitled-users-table/entitled-users-table.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-cannot-vote-message/poll-cannot-vote-message.component.spec.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-approval/poll-form-approval.component.html rename client/src/app/site/pages/meetings/modules/poll/{modules/voting-privacy-dialog/components/voting-privacy-warning-dialog/voting-privacy-warning-dialog.component.scss => components/poll-form-approval/poll-form-approval.component.scss} (100%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-approval/poll-form-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-rating-approval/poll-form-rating-approval.component.html rename client/src/app/site/pages/meetings/{pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-meta-info/topic-poll-meta-info.component.scss => modules/poll/components/poll-form-rating-approval/poll-form-rating-approval.component.scss} (100%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-rating-approval/poll-form-rating-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-selection/poll-form-selection.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-selection/poll-form-selection.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form-selection/poll-form-selection.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form/poll-form.component.html rename client/src/app/site/pages/meetings/modules/poll/components/{base-poll-form/base-poll-form.component.scss => poll-form/poll-form.component.scss} (95%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-form/poll-form.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-meta/poll-meta.component.html rename client/src/app/site/pages/meetings/{pages/assignments/modules/assignment-poll/components/assignment-poll-meta-info/assignment-poll-meta-info.component.scss => modules/poll/components/poll-meta/poll-meta.component.scss} (100%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-meta/poll-meta.component.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-progress/poll-progress.component.spec.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-approval/poll-result-approval.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-approval/poll-result-approval.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-approval/poll-result-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-rating-approval/poll-result-rating-approval.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-rating-approval/poll-result-rating-approval.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-rating-approval/poll-result-rating-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-selection/poll-result-selection.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-selection/poll-result-selection.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result-selection/poll-result-selection.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result/poll-result.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result/poll-result.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-result/poll-result.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-approval/poll-vote-approval.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-approval/poll-vote-approval.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-approval/poll-vote-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-button/poll-vote-button.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-button/poll-vote-button.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-button/poll-vote-button.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-option/poll-vote-option.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-option/poll-vote-option.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-option/poll-vote-option.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-rating-approval/poll-vote-rating-approval.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-rating-approval/poll-vote-rating-approval.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-rating-approval/poll-vote-rating-approval.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-selection/poll-vote-selection.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-selection/poll-vote-selection.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote-selection/poll-vote-selection.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote/poll-vote.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote/poll-vote.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll-vote/poll-vote.component.ts create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll/poll.component.html create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll/poll.component.scss create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/poll/poll.component.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/single-option-chart-table/single-option-chart-table.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/components/votes-table/votes-table.component.spec.ts rename client/src/app/site/pages/meetings/modules/poll/{modules/voting-privacy-dialog/components/voting-privacy-warning-dialog => components/voting-privacy-warning}/voting-privacy-warning-dialog.component.html (100%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/components/voting-privacy-warning/voting-privacy-warning-dialog.component.scss rename client/src/app/site/pages/meetings/modules/poll/{modules/voting-privacy-dialog/components/voting-privacy-warning-dialog => components/voting-privacy-warning}/voting-privacy-warning-dialog.component.ts (55%) delete mode 100644 client/src/app/site/pages/meetings/modules/poll/modules/voting-privacy-dialog/components/voting-privacy-warning-dialog/voting-privacy-warning-dialog.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/modules/voting-privacy-dialog/index.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/modules/voting-privacy-dialog/services/voting-privacy-warning-dialog.service.spec.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/modules/voting-privacy-dialog/services/voting-privacy-warning-dialog.service.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/modules/voting-privacy-dialog/voting-privacy-dialog.module.ts rename client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/{vote-controller.service.spec.ts => ballot-controller.service.spec.ts} (59%) create mode 100644 client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/ballot-controller.service.ts delete mode 100644 client/src/app/site/pages/meetings/modules/poll/services/vote-controller.service/vote-controller.service.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-form/topic-poll-form.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-form/topic-poll-form.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-meta-info/topic-poll-meta-info.component.html delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-meta-info/topic-poll-meta-info.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-meta-info/topic-poll-meta-info.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/agenda/modules/topics/modules/topic-poll/components/topic-poll-vote/topic-poll-vote.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-form/assignment-poll-form.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-form/assignment-poll-form.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-meta-info/assignment-poll-meta-info.component.html delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-meta-info/assignment-poll-meta-info.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-meta-info/assignment-poll-meta-info.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/assignments/modules/assignment-poll/components/assignment-poll-vote/assignment-poll-vote.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-detail-content/motion-poll-detail-content.component.spec.ts create mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-form/motion-poll-form.component.html delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-meta-information/motion-poll-meta-information.component.html delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-meta-information/motion-poll-meta-information.component.scss delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-meta-information/motion-poll-meta-information.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-meta-information/motion-poll-meta-information.component.ts delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.spec.ts delete mode 100644 client/src/app/site/pages/meetings/pages/motions/modules/motion-poll/components/motion-poll-vote/motion-poll-vote.component.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-config-approval.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-config-rating-approval.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-config-rating-score.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-config-selection.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-config-stv-scottish.ts create mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/poll-option.ts rename client/src/app/site/pages/meetings/pages/polls/view-models/{view-vote.ts => view-ballot.ts} (58%) delete mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/view-option.ts delete mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/view-poll-candidate-list.ts delete mode 100644 client/src/app/site/pages/meetings/pages/polls/view-models/view-poll-candidate.ts create mode 100644 client/src/app/ui/modules/editable-list/components/editable-list/editable-list.component.html create mode 100644 client/src/app/ui/modules/editable-list/components/editable-list/editable-list.component.scss create mode 100644 client/src/app/ui/modules/editable-list/components/editable-list/editable-list.component.ts create mode 100644 client/src/app/ui/modules/editable-list/index.ts create mode 100644 client/src/app/ui/pipes/translate-key/translate-key.pipe.ts diff --git a/client/src/app/domain/models/meeting-users/meeting-user.ts b/client/src/app/domain/models/meeting-users/meeting-user.ts index 29169c6bf1..c3743d54f4 100644 --- a/client/src/app/domain/models/meeting-users/meeting-user.ts +++ b/client/src/app/domain/models/meeting-users/meeting-user.ts @@ -18,6 +18,7 @@ export class MeetingUser extends BaseDecimalModel { public vote_delegated_to_id!: Id; // meeting_user/vote_delegations_from_ids; + public poll_voted_ids: Id[]; public group_ids!: Id[]; // (group/meeting_user_ids)[]; public speaker_ids!: Id[]; // (speaker/meeting_user_id)[]; public personal_note_ids!: Id[]; // (personal_note/meeting_user_id)[]; @@ -52,6 +53,7 @@ export class MeetingUser extends BaseDecimalModel { `assignment_candidate_ids`, `vote_delegated_to_id`, `vote_delegations_from_ids`, + `poll_voted_ids`, `chat_message_ids`, `group_ids`, `structure_level_ids` diff --git a/client/src/app/domain/models/meetings/meeting.ts b/client/src/app/domain/models/meetings/meeting.ts index f88342a09d..26ad9c2d0c 100644 --- a/client/src/app/domain/models/meetings/meeting.ts +++ b/client/src/app/domain/models/meetings/meeting.ts @@ -4,7 +4,8 @@ import { HasProperties } from '../../interfaces/has-properties'; import { AgendaItemCreation, AgendaItemType } from '../agenda/agenda-item'; import { BaseModel } from '../base/base-model'; import { ChangeRecoMode, LineNumberingMode } from '../motions/motions.constants'; -import { PollBackendDurationType, PollMethod, PollPercentBase, PollType } from '../poll/poll-constants'; +import { PollVisibility } from '../poll'; +import { BaseOnehundredPercentBase } from '../poll/poll-config-types'; import { ApplauseType } from './applause'; import { BallotPaperSelection, @@ -147,11 +148,9 @@ 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_onehundred_percent_base!: PollPercentBase; + public motion_poll_default_type!: PollVisibility; + public motion_poll_default_onehundred_percent_base!: BaseOnehundredPercentBase; public motion_poll_default_group_ids!: Id[]; // (group/used_as_motion_poll_default_id)[]; - public motion_poll_default_backend!: PollBackendDurationType; - public motion_poll_default_method!: PollMethod; public motion_poll_projection_name_order_first!: `first_name` | `last_name`; public motion_poll_projection_max_columns!: number; @@ -183,11 +182,9 @@ export class Settings { public assignment_poll_add_candidates_to_list_of_speakers!: boolean; public assignment_poll_enable_max_votes_per_option!: boolean; 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_onehundred_percent_base!: PollPercentBase; + public assignment_poll_default_type!: PollVisibility; + public assignment_poll_default_onehundred_percent_base!: BaseOnehundredPercentBase; public assignment_poll_default_group_ids!: Id[]; // (group/used_as_assignment_poll_default_id)[]; - public assignment_poll_default_backend!: PollBackendDurationType; // topic poll public topic_poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; @@ -196,11 +193,9 @@ export class Settings { 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_type: PollVisibility; + public poll_default_onehundred_percent_base: BaseOnehundredPercentBase; public poll_default_group_ids: Id[]; // (group/used_as_poll_default_id)[]; - public poll_default_backend: PollBackendDurationType; public poll_default_live_voting_enabled: boolean; // SSO @@ -414,14 +409,10 @@ export class Meeting extends BaseModel { `motion_poll_ballot_paper_selection`, `motion_poll_ballot_paper_number`, `motion_poll_default_type`, - `motion_poll_default_method`, `motion_poll_default_onehundred_percent_base`, `motion_poll_default_group_ids`, - `motion_poll_default_backend`, `motion_poll_projection_name_order_first`, `motion_poll_projection_max_columns`, - `poll_candidate_list_ids`, - `poll_candidate_ids`, `meeting_user_ids`, `users_enable_presence_view`, `users_enable_vote_weight`, @@ -448,18 +439,14 @@ export class Meeting extends BaseModel { `assignment_poll_enable_max_votes_per_option`, `assignment_poll_sort_poll_result_by_votes`, `assignment_poll_default_type`, - `assignment_poll_default_method`, `assignment_poll_default_onehundred_percent_base`, `assignment_poll_default_group_ids`, - `assignment_poll_default_backend`, `poll_ballot_paper_selection`, `poll_ballot_paper_number`, `poll_sort_poll_result_by_votes`, `poll_default_type`, - `poll_default_method`, `poll_default_onehundred_percent_base`, `poll_default_group_ids`, - `poll_default_backend`, `poll_default_live_voting_enabled`, `topic_poll_default_group_ids`, `projector_ids`, @@ -490,8 +477,6 @@ export class Meeting extends BaseModel { `motion_change_recommendation_ids`, `motion_state_ids`, `poll_ids`, - `option_ids`, - `vote_ids`, `assignment_ids`, `assignment_candidate_ids`, `personal_note_ids`, diff --git a/client/src/app/domain/models/poll-candidate-lists/poll-candidate-list.ts b/client/src/app/domain/models/poll-candidate-lists/poll-candidate-list.ts deleted file mode 100644 index fbfeff3909..0000000000 --- a/client/src/app/domain/models/poll-candidate-lists/poll-candidate-list.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Id } from '../../definitions/key-types'; -import { HasMeetingId } from '../../interfaces'; -import { BaseModel } from '../base/base-model'; - -export class PollCandidateList extends BaseModel { - public static COLLECTION = `poll_candidate_list`; - - public option_id!: Id; // option/content_object_id; - public poll_candidate_ids!: Id[]; // poll_candidate/poll_candidate_list_id; - - public constructor(input?: any) { - super(PollCandidateList.COLLECTION, input); - } - - public static readonly REQUESTABLE_FIELDS: (keyof PollCandidateList)[] = [ - `id`, - `poll_candidate_ids`, - `meeting_id`, - `option_id` - ]; -} -export interface PollCandidateList extends HasMeetingId {} diff --git a/client/src/app/domain/models/poll-candidate-lists/poll-candidate.ts b/client/src/app/domain/models/poll-candidate-lists/poll-candidate.ts deleted file mode 100644 index 5b879d2774..0000000000 --- a/client/src/app/domain/models/poll-candidate-lists/poll-candidate.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Id } from '../../definitions/key-types'; -import { HasMeetingId } from '../../interfaces'; -import { BaseModel } from '../base/base-model'; - -export class PollCandidate extends BaseModel { - public static COLLECTION = `poll_candidate`; - - public weight!: number; - - public poll_candidate_list_id!: Id; // poll_candidate_list/poll_candidate_ids; - public user_id!: Id; // user/poll_candidate_ids; - - public constructor(input?: any) { - super(PollCandidate.COLLECTION, input); - } - - public static readonly REQUESTABLE_FIELDS: (keyof PollCandidate)[] = [ - `id`, - `poll_candidate_list_id`, - `user_id`, - `weight`, - `meeting_id` - ]; -} -export interface PollCandidate extends HasMeetingId {} diff --git a/client/src/app/domain/models/poll/ballot.ts b/client/src/app/domain/models/poll/ballot.ts new file mode 100644 index 0000000000..9cf38e5a8a --- /dev/null +++ b/client/src/app/domain/models/poll/ballot.ts @@ -0,0 +1,40 @@ +import { Id } from '../../definitions/key-types'; +import { HasMeetingId } from '../../interfaces'; +import { BaseModel } from '../base/base-model'; +import { VoteValue, VoteValueVerbose } from './vote-constants'; + +export class Ballot extends BaseModel { + public static COLLECTION = `ballot`; + + public weight: number; + public split: boolean; + public value: VoteValue; + + public poll_id!: Id; + public acting_meeting_user_id: Id; + public represented_meeting_user_id: Id; + + public get valueVerbose(): string { + return VoteValueVerbose[this.value]; + } + + public constructor(input?: Partial) { + super(Ballot.COLLECTION, input); + } + + protected getDecimalFields(): string[] { + return [`weight`]; + } + + public static readonly REQUESTABLE_FIELDS: (keyof Ballot)[] = [ + `id`, + `weight`, + `split`, + `value`, + `poll_id`, + `acting_meeting_user_id`, + `represented_meeting_user_id` + ]; +} + +export interface Ballot extends HasMeetingId {} diff --git a/client/src/app/domain/models/poll/base-poll-config.ts b/client/src/app/domain/models/poll/base-poll-config.ts new file mode 100644 index 0000000000..0b4fa7c023 --- /dev/null +++ b/client/src/app/domain/models/poll/base-poll-config.ts @@ -0,0 +1,6 @@ +import { Id } from '../../definitions/key-types'; +import { BaseModel } from '../base/base-model'; + +export abstract class BasePollConfigModel extends BaseModel { + public poll_id!: Id; +} diff --git a/client/src/app/domain/models/poll/generic-poll.ts b/client/src/app/domain/models/poll/generic-poll.ts index b35cdefc33..55cb09439a 100644 --- a/client/src/app/domain/models/poll/generic-poll.ts +++ b/client/src/app/domain/models/poll/generic-poll.ts @@ -1,11 +1,7 @@ -import { Observable } from 'rxjs'; import { ViewTopic } from 'src/app/site/pages/meetings/pages/agenda'; import { ViewAssignment } from 'src/app/site/pages/meetings/pages/assignments'; import { ViewMotion } from 'src/app/site/pages/meetings/pages/motions'; -import { ViewPollCandidateList } from 'src/app/site/pages/meetings/pages/polls/view-models/view-poll-candidate-list'; -import { ViewUser } from 'src/app/site/pages/meetings/view-models/view-user'; - -import { EntitledUsersEntry, PollClassType, PollMethod, PollPercentBase, PollState, PollType } from './poll-constants'; +import { ViewMeetingUser } from 'src/app/site/pages/meetings/view-models/view-meeting-user'; export type PollContentObject = ViewAssignment | ViewMotion | ViewTopic; @@ -14,27 +10,6 @@ export type PollContentObject = ViewAssignment | ViewMotion | ViewTopic; * This is a unification of the data received in the projector and ViewPoll; both * use this interface, so the poll services can work on this shared view on the data. */ -export interface PollData { - pollClassType?: PollClassType; - pollmethod: PollMethod; - state: PollState; - onehundred_percent_base: PollPercentBase; - votesvalid: number; - votesinvalid: number; - votescast: number; - type: PollType; - entitled_users_at_stop: EntitledUsersEntry[]; - options: OptionData[]; - options$: Observable; - global_option: OptionData; - global_yes?: boolean; - global_no?: boolean; - global_abstain?: boolean; - content_object?: PollContentObject; - getContentObjectTitle: () => string | null; -} - -export type PollDataKey = keyof PollData; export interface OptionTitle { title: string; @@ -53,7 +28,8 @@ export interface OptionData { amount_global_yes?: number; amount_global_no?: number; amount_global_abstain?: number; - content_object?: ViewUser | ViewMotion | ViewPollCandidateList; + meeting_user?: ViewMeetingUser; + text?: string; entries_amount?: number; } diff --git a/client/src/app/domain/models/poll/index.ts b/client/src/app/domain/models/poll/index.ts index 316a36a5fe..a379463e24 100644 --- a/client/src/app/domain/models/poll/index.ts +++ b/client/src/app/domain/models/poll/index.ts @@ -1,6 +1,5 @@ +export * from './ballot'; export * from './generic-poll'; -export * from './option'; export * from './poll'; export * from './poll-constants'; -export * from './vote'; export * from './vote-constants'; diff --git a/client/src/app/domain/models/poll/option.ts b/client/src/app/domain/models/poll/option.ts deleted file mode 100644 index afd8cd32dc..0000000000 --- a/client/src/app/domain/models/poll/option.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Fqid, Id, Ids } from '../../definitions/key-types'; -import { BaseDecimalModel } from '../base/base-decimal-model'; - -export class Option extends BaseDecimalModel