From a313f025d9059ab451f1214db0404805e0e084b6 Mon Sep 17 00:00:00 2001
From: Thomas Hackl <hackl@data-quest.de>
Date: Mon, 25 Nov 2024 12:01:11 +0000
Subject: [PATCH] Resolve "Einer Massenmail zugeordnete Filter werden nicht
 gespeichert"

Closes #4901

Merge request studip/studip!3675
---
 app/controllers/massmail/message.php          | 74 ++++++++++---------
 .../form_inputs/UserFilterInput.vue           |  5 ++
 2 files changed, 43 insertions(+), 36 deletions(-)

diff --git a/app/controllers/massmail/message.php b/app/controllers/massmail/message.php
index 3f7a009d4c3..62778db8cf8 100644
--- a/app/controllers/massmail/message.php
+++ b/app/controllers/massmail/message.php
@@ -48,28 +48,29 @@ class Massmail_MessageController extends \AuthenticatedController
                         'if' => 'target === "students"',
                         'context' => 'MassMail',
                         'target' => 'students',
-                        ':key' => 'NaN',
                         'store' => function($value, $input) {
-                            $filters = [];
-                            foreach ($value as $one) {
-                                $filter = new UserFilter($one['id'] ?? '');
-                                $filter->fields = [];
-                                foreach ($one['attributes']['fields'] as $field) {
-                                    $classname = $field['attributes']['type'];
-                                    $f = new $classname();
-                                    if (!empty($fiele['id'])) {
-                                        $f->setId($field['id']);
+                            if ($input->getContextObject()->target === 'students') {
+                                $filters = [];
+                                foreach ($value as $one) {
+                                    $filter = new UserFilter($one['id'] ?? '');
+                                    $filter->fields = [];
+                                    foreach ($one['attributes']['fields'] as $field) {
+                                        $classname = $field['attributes']['type'];
+                                        $f = new $classname();
+                                        if (!empty($fiele['id'])) {
+                                            $f->setId($field['id']);
+                                        }
+                                        $f->setCompareOperator($field['attributes']['compare-operator']);
+                                        $f->setValue($field['attributes']['value']);
+                                        $filter->addField($f);
                                     }
-                                    $f->setCompareOperator($field['attributes']['compare-operator']);
-                                    $f->setValue($field['attributes']['value']);
-                                    $filter->addField($f);
+                                    $filter->store();
+                                    $connection = new \MassMail\MassMailFilter();
+                                    $connection->filter_id = $filter->getId();
+                                    $filters[] = $connection;
                                 }
-                                $filter->store();
-                                $connection = new \MassMail\MassMailFilter();
-                                $connection->filter_id = $filter->getId();
-                                $filters[] = $connection;
+                                $input->getContextObject()->filters = $filters;
                             }
-                            $input->getContextObject()->filters = $filters;
                         }
                     ],
                     'employee_filters' => [
@@ -78,28 +79,29 @@ class Massmail_MessageController extends \AuthenticatedController
                         'if' => 'target === "employees"',
                         'context' => 'MassMail',
                         'target' => 'employees',
-                        ':key' => 'NaN',
                         'store' => function($value, $input) {
-                            $filters = [];
-                            foreach ($value as $one) {
-                                $filter = new UserFilter($one['id'] ?? '');
-                                $filter->fields = [];
-                                foreach ($one['attributes']['fields'] as $field) {
-                                    $classname = $field['attributes']['type'];
-                                    $f = new $classname();
-                                    if (!empty($fiele['id'])) {
-                                        $f->setId($field['id']);
+                            if ($input->getContextObject()->target === 'employees') {
+                                $filters = [];
+                                foreach ($value as $one) {
+                                    $filter = new UserFilter($one['id'] ?? '');
+                                    $filter->fields = [];
+                                    foreach ($one['attributes']['fields'] as $field) {
+                                        $classname = $field['attributes']['type'];
+                                        $f = new $classname();
+                                        if (!empty($fiele['id'])) {
+                                            $f->setId($field['id']);
+                                        }
+                                        $f->setCompareOperator($field['attributes']['compare-operator']);
+                                        $f->setValue($field['attributes']['value']);
+                                        $filter->addField($f);
                                     }
-                                    $f->setCompareOperator($field['attributes']['compare-operator']);
-                                    $f->setValue($field['attributes']['value']);
-                                    $filter->addField($f);
+                                    $filter->store();
+                                    $connection = new \MassMail\MassMailFilter();
+                                    $connection->filter_id = $filter->getId();
+                                    $filters[] = $connection;
                                 }
-                                $filter->store();
-                                $connection = new \MassMail\MassMailFilter();
-                                $connection->filter_id = $filter->getId();
-                                $filters[] = $connection;
+                                $input->getContextObject()->filters = $filters;
                             }
-                            $input->getContextObject()->filters = $filters;
                         }
                     ],
                     'semester' => [
diff --git a/resources/vue/components/form_inputs/UserFilterInput.vue b/resources/vue/components/form_inputs/UserFilterInput.vue
index d63e97b2f22..2d481433c97 100644
--- a/resources/vue/components/form_inputs/UserFilterInput.vue
+++ b/resources/vue/components/form_inputs/UserFilterInput.vue
@@ -126,6 +126,11 @@ export default {
             this.$emit('input', this.stringified);
         }
     },
+    watch: {
+        target() {
+            this.filters = [];
+        }
+    },
     mounted() {
         if (this.value) {
             this.filters = JSON.parse(this.value);
-- 
GitLab