Skip to content

Commit 55202e7

Browse files
committed
Merge remote-tracking branch 'origin/MAUT-11515' into beta
2 parents ab56e32 + 26960c3 commit 55202e7

File tree

4 files changed

+160
-21
lines changed

4 files changed

+160
-21
lines changed

CustomFieldType/DateOperatorTrait.php

+5
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,9 @@ public function getOperators(): array
3030

3131
return array_intersect_key($allOperators, $allowedOperators);
3232
}
33+
34+
public function getOperatorsForSegment(): array
35+
{
36+
return parent::getOperators();
37+
}
3338
}

EventListener/SegmentFiltersChoicesGenerateSubscriber.php

+11-2
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,20 @@ function (CustomObject $customObject) use ($event, $fieldTypes): void {
9191

9292
/** @var CustomField $customField */
9393
foreach ($customObject->getCustomFields()->getIterator() as $customField) {
94-
if ($customField->getType() === $fieldTypes[HiddenType::NAME]) { // We don't want to show hidden types in filter list
94+
if ($customField->getType() === $fieldTypes[HiddenType::NAME]) {
95+
// We don't want to show hidden types in filter list
9596
continue;
9697
}
9798

98-
$allowedOperators = $customField->getTypeObject()->getOperators();
99+
if (method_exists($this->typeOperatorProvider, 'getContext') &&
100+
'segment' === $this->typeOperatorProvider->getContext() &&
101+
method_exists($customField->getTypeObject(), 'getOperatorsForSegment')
102+
) {
103+
$allowedOperators = $customField->getTypeObject()->getOperatorsForSegment();
104+
} else {
105+
$allowedOperators = $customField->getTypeObject()->getOperators();
106+
}
107+
99108
$typeOperators = $this->typeOperatorProvider->getOperatorsForFieldType($customField->getType());
100109
$availableOperators = array_flip($typeOperators);
101110
$operators = array_intersect_key($availableOperators, $allowedOperators);

Tests/Functional/EventListener/FilterOperatorSubscriberTest.php

+74-19
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,25 @@
66

77
use Mautic\CoreBundle\Test\MauticMysqlTestCase;
88
use Mautic\LeadBundle\Entity\Lead;
9+
use Mautic\LeadBundle\Entity\LeadField;
910
use Mautic\LeadBundle\Entity\LeadList;
1011
use Mautic\LeadBundle\Entity\ListLead;
12+
use MauticPlugin\CustomObjectsBundle\CustomFieldType\CustomFieldTypeInterface;
13+
use MauticPlugin\CustomObjectsBundle\Entity\CustomField;
1114
use MauticPlugin\CustomObjectsBundle\Entity\CustomItem;
1215
use MauticPlugin\CustomObjectsBundle\Entity\CustomObject;
16+
use MauticPlugin\CustomObjectsBundle\Provider\CustomFieldTypeProvider;
17+
use MauticPlugin\CustomObjectsBundle\Tests\ProjectVersionTrait;
1318
use Symfony\Component\HttpFoundation\Request;
1419

1520
class FilterOperatorSubscriberTest extends MauticMysqlTestCase
1621
{
22+
use ProjectVersionTrait;
23+
1724
public function testIfNewOperatorNotInCustomObjectsAddedinSegmentFilter()
1825
{
19-
// Create a segment
20-
$segment = new LeadList();
21-
$segment->setName('Test Segment A');
22-
$segment->setPublicName('Test Segment A');
23-
$segment->setAlias('test-segment-a');
24-
25-
$this->em->persist($segment);
26-
$this->em->flush();
27-
28-
$crawler = $this->client->request(Request::METHOD_GET, '/s/segments/edit/'.$segment->getId());
29-
26+
$crawler = $this->client->request(Request::METHOD_GET, '/s/segments/new/');
3027
$segment_filters = $crawler->filter('#available_segment_filters')->html();
31-
3228
$this->assertStringContainsString('not in custom objects', $segment_filters);
3329
}
3430

@@ -44,13 +40,7 @@ public function testIfProperContactsAreAddedinSegmentWithNotInCustomObjectsFilte
4440
$this->em->persist($contact2);
4541

4642
// 2) create custom object "Email List" with "[email protected]" and "[email protected]" as items
47-
$customObject = new CustomObject();
48-
$customObject->setNameSingular('Email List');
49-
$customObject->setNamePlural('Emai List');
50-
$customObject->setAlias('emails');
51-
$customObject->setType(CustomObject::TYPE_MASTER);
52-
$this->em->persist($customObject);
53-
43+
$customObject = $this->createCustomObject('emails');
5444
$customItem1 = new CustomItem($customObject);
5545
$customItem1->setName('[email protected]');
5646
$this->em->persist($customItem1);
@@ -94,4 +84,69 @@ public function testIfProperContactsAreAddedinSegmentWithNotInCustomObjectsFilte
9484
$this->assertSame($contact2->getLastname(), $leads[0]->getLead()->getLastname());
9585
$this->assertSame($contact2->getEmail(), $leads[0]->getLead()->getEmail());
9686
}
87+
88+
public function testCustomObjectSegmentFilterOperatorForDateField(): void
89+
{
90+
if (!$this->isCloudProject()) {
91+
$this->markTestSkipped('As context is not available for segment only in 4.4');
92+
}
93+
94+
$leadField = $this->createField('date_field', 'date');
95+
96+
$fieldTypeProvider = self::$container->get('custom_field.type.provider');
97+
\assert($fieldTypeProvider instanceof CustomFieldTypeProvider);
98+
$objectType = $fieldTypeProvider->getType('date');
99+
$dateField = $this->createCustomField('co_date_field', $objectType);
100+
101+
$this->createCustomObject('obj', $dateField);
102+
103+
$this->em->flush();
104+
$crawler = $this->client->request(Request::METHOD_GET, '/s/segments/new/');
105+
106+
$coDateFilterOperators = $crawler
107+
->filter('#available_segment_filters option[id="available_custom_object_cmf_'.$dateField->getId().'"]')
108+
->attr('data-field-operators');
109+
110+
$leadDateFilterOperators = $crawler
111+
->filter('#available_segment_filters option[id="available_lead_'.$leadField->getAlias().'"]')
112+
->attr('data-field-operators');
113+
114+
$this->assertSame($coDateFilterOperators, $leadDateFilterOperators);
115+
}
116+
117+
private function createField(string $alias, string $type): LeadField
118+
{
119+
$field = new LeadField();
120+
$field->setName($alias);
121+
$field->setAlias($alias);
122+
$field->setType($type);
123+
$this->em->persist($field);
124+
125+
return $field;
126+
}
127+
128+
private function createCustomObject(string $alias, ?CustomField $dateField = null): CustomObject
129+
{
130+
$customObject = new CustomObject();
131+
$customObject->setNameSingular($alias);
132+
$customObject->setNamePlural($alias.'s');
133+
$customObject->setAlias($alias);
134+
if ($dateField) {
135+
$customObject->addCustomField($dateField);
136+
}
137+
$this->em->persist($customObject);
138+
139+
return $customObject;
140+
}
141+
142+
private function createCustomField(string $alias, CustomFieldTypeInterface $objectType): CustomField
143+
{
144+
$dateField = new CustomField();
145+
$dateField->setTypeObject($objectType);
146+
$dateField->setType($objectType->getKey());
147+
$dateField->setLabel($alias);
148+
$dateField->setAlias($alias);
149+
150+
return $dateField;
151+
}
97152
}

Tests/Functional/Helper/QueryFilterHelperTest.php

+70
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,76 @@ public function testGetCustomValueValueExpression(): void
147147
]
148148
);
149149

150+
$this->assertMatchWhere(
151+
'test_value.value LIKE :par5',
152+
[
153+
'glue' => 'and',
154+
'field' => 'cmf_'.$this->getFixtureById('custom_field1')->getId(),
155+
'object' => 'custom_object',
156+
'type' => 'datetime',
157+
'operator' => 'like',
158+
'properties' => [
159+
'filter' => '2024',
160+
],
161+
]
162+
);
163+
164+
$this->assertMatchWhere(
165+
'test_value.value REGEXP :par6',
166+
[
167+
'glue' => 'and',
168+
'field' => 'cmf_'.$this->getFixtureById('custom_field1')->getId(),
169+
'object' => 'custom_object',
170+
'type' => 'datetime',
171+
'operator' => 'regexp',
172+
'properties' => [
173+
'filter' => '2024',
174+
],
175+
]
176+
);
177+
178+
$this->assertMatchWhere(
179+
'test_value.value LIKE :par7',
180+
[
181+
'glue' => 'and',
182+
'field' => 'cmf_'.$this->getFixtureById('custom_field1')->getId(),
183+
'object' => 'custom_object',
184+
'type' => 'datetime',
185+
'operator' => 'startsWith',
186+
'properties' => [
187+
'filter' => '2024',
188+
],
189+
]
190+
);
191+
192+
$this->assertMatchWhere(
193+
'test_value.value LIKE :par8',
194+
[
195+
'glue' => 'and',
196+
'field' => 'cmf_'.$this->getFixtureById('custom_field1')->getId(),
197+
'object' => 'custom_object',
198+
'type' => 'datetime',
199+
'operator' => 'endsWith',
200+
'properties' => [
201+
'filter' => '2024',
202+
],
203+
]
204+
);
205+
206+
$this->assertMatchWhere(
207+
'test_value.value LIKE :par9',
208+
[
209+
'glue' => 'and',
210+
'field' => 'cmf_'.$this->getFixtureById('custom_field1')->getId(),
211+
'object' => 'custom_object',
212+
'type' => 'datetime',
213+
'operator' => 'contains',
214+
'properties' => [
215+
'filter' => '2024',
216+
],
217+
]
218+
);
219+
150220
$this->assertMatchWhere(
151221
'test_value.value IS NULL',
152222
[

0 commit comments

Comments
 (0)