Skip to content

Commit 128e574

Browse files
committed
use entity display helper where appropriate
1 parent 9734136 commit 128e574

11 files changed

Lines changed: 160 additions & 53 deletions

File tree

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/config/ConfigureActions.xtend

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import de.guite.modulestudio.metamodel.Entity
44
import org.zikula.modulestudio.generator.cartridges.symfony.controller.ControllerMethodInterface
55
import org.zikula.modulestudio.generator.extensions.ControllerExtensions
66
import org.zikula.modulestudio.generator.extensions.FormattingExtensions
7+
import org.zikula.modulestudio.generator.extensions.ModelJoinExtensions
78

89
class ConfigureActions implements ControllerMethodInterface {
910

1011
extension ControllerExtensions = new ControllerExtensions
1112
extension FormattingExtensions = new FormattingExtensions
13+
extension ModelJoinExtensions = new ModelJoinExtensions
1214

1315
override void init(Entity it) {}
1416

@@ -22,6 +24,12 @@ class ConfigureActions implements ControllerMethodInterface {
2224
if (hasIndexAction) {
2325
imports.add('EasyCorp\\Bundle\\EasyAdminBundle\\Dto\\BatchActionDto')
2426
}
27+
if (!getIncomingRelationsWithAutocomplete.empty || !getOutcomingRelationsWithAutocomplete.empty) {
28+
imports.addAll(#[
29+
'EasyCorp\\Bundle\\EasyAdminBundle\\Context\\AdminContext',
30+
'Symfony\\Component\\HttpFoundation\\JsonResponse'
31+
])
32+
}
2533
imports
2634
}
2735

@@ -44,6 +52,7 @@ class ConfigureActions implements ControllerMethodInterface {
4452
;
4553
«ENDIF»
4654
}
55+
«autocomplete»
4756
'''
4857
4958
def private methodBody(Entity it) '''
@@ -109,4 +118,63 @@ class ConfigureActions implements ControllerMethodInterface {
109118
)
110119
«ENDIF»
111120
'''
121+
122+
def private autocomplete(Entity it) {
123+
if (!getIncomingRelationsWithAutocomplete.empty || !getOutcomingRelationsWithAutocomplete.empty) '''
124+
public function autocomplete(AdminContext $context): JsonResponse
125+
{
126+
$response = parent::autocomplete($context);
127+
128+
$payload = json_decode($response->getContent() ?? '[]', true, flags: \JSON_THROW_ON_ERROR);
129+
130+
if (!isset($payload['results']) || !is_array($payload['results'])) {
131+
return $response;
132+
}
133+
134+
$ids = [];
135+
foreach ($payload['results'] as $row) {
136+
if (isset($row['id']) && '' !== $row['id']) {
137+
$ids[] = $row['id'];
138+
}
139+
}
140+
141+
if ([] === $ids) {
142+
return $response;
143+
}
144+
145+
$entities = $this->em->getRepository(«name.formatForCodeCapital»::class)->createQueryBuilder('p')
146+
->andWhere('p.id IN (:ids)')
147+
->setParameter('ids', $ids)
148+
->getQuery()
149+
->getResult();
150+
151+
$byId = [];
152+
foreach ($entities as $entity) {
153+
$byId[(string) $entity->getId()] = $entity;
154+
}
155+
156+
foreach ($payload['results'] as &$row) {
157+
$id = isset($row['id']) ? (string) $row['id'] : null;
158+
if ($id && isset($byId[$id])) {
159+
$row['text'] = $this->entityDisplayHelper->format«name.formatForCodeCapital»($byId[$id]);
160+
}
161+
}
162+
unset($row);
163+
164+
return new JsonResponse(
165+
$payload,
166+
$response->getStatusCode(),
167+
$response->headers->all()
168+
);
169+
}
170+
'''
171+
}
172+
173+
def private getIncomingRelationsWithAutocomplete(Entity it) {
174+
getCommonRelations(true).filter[usesAutoCompletion(false)]
175+
}
176+
177+
def private getOutcomingRelationsWithAutocomplete(Entity it) {
178+
getCommonRelations(false).filter[usesAutoCompletion(true)]
179+
}
112180
}

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/config/ConfigureCrud.xtend

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ class ConfigureCrud implements ControllerMethodInterface {
5656
->setPageTitle(Crud::PAGE_NEW, t('Add %entity_label_singular%'))
5757
«ENDIF»
5858
«IF hasDetailAction»
59-
->setPageTitle(Crud::PAGE_DETAIL, fn («name.formatForCodeCapital» $«name.formatForCode») => «/*(string) $«name.formatForCode»*/»$this->entityDisplayHelper->getFormattedTitle($«name.formatForCode»))
59+
->setPageTitle(Crud::PAGE_DETAIL, fn («name.formatForCodeCapital» $«name.formatForCode») => $this->entityDisplayHelper->getFormattedTitle($«name.formatForCode»))
6060
«ENDIF»
6161
«IF hasEditAction»
62-
->setPageTitle(Crud::PAGE_EDIT, fn («name.formatForCodeCapital» $«name.formatForCode») => t('Edit %entity%', ['%entity%' => «/*(string) $«name.formatForCode»*/»$this->entityDisplayHelper->getFormattedTitle($«name.formatForCode»)]))
62+
->setPageTitle(Crud::PAGE_EDIT, fn («name.formatForCodeCapital» $«name.formatForCode») => t('Edit %entity%', ['%entity%' => $this->entityDisplayHelper->getFormattedTitle($«name.formatForCode»)]))
6363
«ENDIF»
6464
«IF hasIndexAction»
6565
«IF null !== documentation && !documentation.replaceAll('\\s+', '').empty»

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/config/ConfigureFields.xtend

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ class ConfigureFields implements ControllerMethodInterface {
100100
}
101101
}
102102

103+
// related entities (TODO filter)
104+
for (entity : application.entities) {
105+
imports.add(application.appNamespace + '\\Entity\\' + entity.name.formatForCodeCapital)
106+
}
107+
103108
// TODO refactor following imports
104109
val importsUNUSED = newArrayList
105110
if (!formFields.filter[!mandatory && !nullable].empty) {
@@ -787,19 +792,33 @@ class ConfigureFields implements ControllerMethodInterface {
787792

788793
def private options(Relationship it, Boolean outgoing, String relationFieldType, Boolean autoComplete) {
789794
val expanded = (!outgoing && expandedSource) || (outgoing && expandedTarget)
795+
val thisEntity = if (outgoing) source else target
796+
val relatedEntity = if (outgoing) target else source
790797
var calls = ''
791798
if ('Association' == relationFieldType) {
792799
if (autoComplete) {
793800
calls += '''->autocomplete()'''
794801
} else if (!expanded) {
795802
calls += '''->renderAsNativeWidget()'''
796803
}
804+
// renderAsEmbeddedForm
805+
if (thisEntity.hasEditAction) {
806+
calls += '''->setFormTypeOption('choice_label', fn («relatedEntity.name.formatForCodeCapital» $entity): string => $this->entityDisplayHelper->format«relatedEntity.name.formatForCodeCapital»($entity))'''
807+
}
797808
} else if ('Collection' == relationFieldType) {
798809
calls += '''->setEntryIsComplex()'''
810+
// setEntryType
811+
// useEntryCrudForm
812+
if (thisEntity.hasEditAction) {
813+
calls += '''->setEntryToStringMethod(fn («relatedEntity.name.formatForCodeCapital» $entity, TranslatorInterface $translator): string => $this->entityDisplayHelper->format«relatedEntity.name.formatForCodeCapital»($entity))'''
814+
}
799815
}
800816
if (expanded) {
801817
calls += '''->renderExpanded()'''
802818
}
819+
if (thisEntity.hasIndexAction || thisEntity.hasDetailAction) {
820+
calls += '''->setTemplatePath('@«application.vendor.formatForCodeCapital + application.name.formatForCodeCapital»/admin/crud/field/association.html.twig')'''
821+
}
803822
calls
804823
}
805824

@@ -827,7 +846,7 @@ class ConfigureFields implements ControllerMethodInterface {
827846
],
828847
]);
829848
«ELSE»
830-
$queryBuilder = function (EntityRepository $er) {«/* get repo from entity factory to ensure CollectionFilterHelper is set return $er->getListQueryBuilder('', '', false);* /»
849+
$queryBuilder = function (EntityRepository $er) {«/* return $er->getListQueryBuilder('', '', false);* /»
831850
return $this->«relatedEntity.name.formatForCode»Repository->getListQueryBuilder('', '', false);
832851
};
833852
«IF (relatedEntity as Entity).ownerPermission»
@@ -842,10 +861,7 @@ class ConfigureFields implements ControllerMethodInterface {
842861
}
843862
«ENDIF»
844863
«IF !autoComplete»
845-
$entityDisplayHelper = $this->entityDisplayHelper;
846-
$choiceLabelClosure = function ($entity) use ($entityDisplayHelper) {
847-
return $entityDisplayHelper->getFormattedTitle($entity);
848-
};
864+
$choiceLabelClosure = fn ($entity) => $this->entityDisplayHelper->getFormattedTitle($entity);
849865
«ENDIF»
850866
... already removed code ...
851867
«ENDIF»

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/formtype/EditEntityType.xtend

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,27 @@ class EditEntityType {
105105
«ENDIF»
106106
public function __construct(
107107
«IF !fields.filter(StringField).filter[#[StringRole.COUNTRY, StringRole.CURRENCY, StringRole.LANGUAGE, StringRole.LOCALE, StringRole.TIME_ZONE].contains(role)].empty»
108-
protected readonly RequestStack $requestStack«IF !incoming.empty || !outgoing.empty»,«ENDIF»
109-
«ENDIF»«IF !incoming.empty || !outgoing.empty»
110-
protected readonly CollectionFilterHelper $collectionFilterHelper,
111-
protected readonly EntityDisplayHelper $entityDisplayHelper«ENDIF»«IF isTranslatable || hasLocaleFieldsEntity»,
112-
protected readonly LocaleApiInterface $localeApi«ENDIF»«IF isTranslatable»,
113-
protected readonly TranslatableHelper $translatableHelper«ENDIF»«IF hasListFieldsEntity»,
114-
protected readonly ListEntriesHelper $listHelper«ENDIF»«IF hasUploadFieldsEntity»,
115-
protected readonly UploadHelper $uploadHelper«ENDIF»«IF app.needsFeatureActivationHelper»,
116-
protected readonly FeatureActivationHelper $featureActivationHelper«ENDIF»
108+
protected readonly RequestStack $requestStack,
109+
«ENDIF»
110+
«IF !incoming.empty || !outgoing.empty»
111+
protected readonly CollectionFilterHelper $collectionFilterHelper,
112+
protected readonly EntityDisplayHelper $entityDisplayHelper,
113+
«ENDIF»
114+
«IF isTranslatable || hasLocaleFieldsEntity»
115+
protected readonly LocaleApiInterface $localeApi,
116+
«ENDIF»
117+
«IF isTranslatable»
118+
protected readonly TranslatableHelper $translatableHelper,
119+
«ENDIF»
120+
«IF hasListFieldsEntity»
121+
protected readonly ListEntriesHelper $listHelper,
122+
«ENDIF»
123+
«IF hasUploadFieldsEntity»
124+
protected readonly UploadHelper $uploadHelper,
125+
«ENDIF»
126+
«IF app.needsFeatureActivationHelper»
127+
protected readonly FeatureActivationHelper $featureActivationHelper,
128+
«ENDIF»
117129
) {
118130
}
119131

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/helper/EntityDisplayHelper.xtend

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,13 @@ class EntityDisplayHelper {
8383
«ENDIF»
8484

8585
public function __construct(
86-
protected readonly TranslatorInterface $translator«IF hasListFields»,
87-
protected readonly ListEntriesHelper $listEntriesHelper«ENDIF»«IF hasAnyDateTimeFields || hasNumberFields»,
88-
RequestStack $requestStack«ENDIF»
86+
protected readonly TranslatorInterface $translator,
87+
«IF hasListFields»
88+
protected readonly ListEntriesHelper $listEntriesHelper,
89+
«ENDIF»
90+
«IF hasAnyDateTimeFields || hasNumberFields»
91+
RequestStack $requestStack,
92+
«ENDIF»
8993
) {
9094
«IF hasAnyDateTimeFields || hasNumberFields»
9195
$locale = null !== $requestStack->getCurrentRequest() ? $requestStack->getCurrentRequest()->getLocale() : 'en';
@@ -140,7 +144,7 @@ class EntityDisplayHelper {
140144
/**
141145
* Returns the formatted title for a given «name.formatForDisplay».
142146
*/
143-
protected function format«name.formatForCodeCapital»(«name.formatForCodeCapital» $entity): string
147+
public function format«name.formatForCodeCapital»(«name.formatForCodeCapital» $entity): string
144148
{
145149
«IF displayPatternParts.length < 2»«/* no field references, just pass to translator */»
146150
return $this->translator->trans('«getUsedDisplayPattern.formatForCodeCapital»', [], '«name.formatForCode»');
@@ -160,7 +164,7 @@ class EntityDisplayHelper {
160164
/**
161165
* Returns an additional description for a given «name.formatForDisplay».
162166
*/
163-
protected function get«name.formatForCodeCapital»Description(«name.formatForCodeCapital» $entity): string
167+
public function get«name.formatForCodeCapital»Description(«name.formatForCodeCapital» $entity): string
164168
{
165169
$descriptionFieldName = $this->getDescriptionFieldName($entity->get_objectType());
166170
$getter = 'get' . ucfirst($descriptionFieldName);
@@ -177,8 +181,6 @@ class EntityDisplayHelper {
177181

178182
«getPreviewFieldName»
179183
«ENDIF»
180-
181-
«getStartDateFieldName»
182184
'''
183185
184186
def private getTitleFieldName(Application it) '''
@@ -242,23 +244,6 @@ class EntityDisplayHelper {
242244
}
243245
'''
244246
245-
def private getStartDateFieldName(Application it) '''
246-
/**
247-
* Returns name of the date(time) field to be used for representing the start
248-
* of this object. Used for providing meta data to the tag module.
249-
*/
250-
public function getStartDateFieldName(string $objectType = ''): string
251-
{
252-
«FOR entity : entities»
253-
if ('«entity.name.formatForCode»' === $objectType) {
254-
return '«IF null !== entity.getStartDateField»«entity.getStartDateField.name.formatForCode»«ELSEIF entity.standardFields»createdDate«ENDIF»';
255-
}
256-
«ENDFOR»
257-
258-
return '';
259-
}
260-
'''
261-
262247
def private displayPatternArguments(Entity it) {
263248
var result = ''
264249
for (patternPart : displayPatternParts) {

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/menu/MenuBuilder.xtend

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,13 @@ class MenuBuilder {
6969
«IF hasLoggable»
7070
protected readonly LoggableHelper $loggableHelper,
7171
«ENDIF»
72-
protected readonly Security $security«IF hasIndexActions && hasEditActions»,
73-
protected readonly ModelHelper $modelHelper«ENDIF»«IF hasIndexActions»,
74-
protected readonly array $listViewConfig«ENDIF»
75-
72+
protected readonly Security $security,
73+
«IF hasIndexActions && hasEditActions»
74+
protected readonly ModelHelper $modelHelper,
75+
«ENDIF»
76+
«IF hasIndexActions»
77+
protected readonly array $listViewConfig,
78+
«ENDIF»
7679
) {
7780
}
7881

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/controller/subscriber/LoggableSubscriber.xtend

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class LoggableSubscriber {
77
def generate(Application it) '''
88
public function __construct(
99
protected readonly EntityDisplayHelper $entityDisplayHelper,
10-
protected readonly LoggableHelper $loggableHelper
10+
protected readonly LoggableHelper $loggableHelper,
1111
) {
1212
parent::__construct();
1313
}

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/models/Repository.xtend

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ class Repository {
261261
def private constructorInit(Entity it) '''
262262
«IF hasTranslatableFields»
263263
$this->setTranslationsEnabled(
264-
$featureActivationHelper->isEnabled(FeatureActivationHelper::TRANSLATIONS, $objectType)
264+
$featureActivationHelper->isEnabled(FeatureActivationHelper::TRANSLATIONS, '«name.formatForCode»')
265265
);
266266
«ENDIF»
267267
'''

bundles/org.zikula.modulestudio.generator/src/org/zikula/modulestudio/generator/cartridges/symfony/view/Layout.xtend

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ class Layout {
4040

4141
fileName = 'raw.html.twig'
4242
fsa.generateFile(templatePath + fileName, rawPageImpl)
43+
44+
if (!relations.empty) {
45+
fileName = 'admin/crud/field/association.html.twig'
46+
fsa.generateFile(templatePath + fileName, associationFieldTemplateImpl)
47+
}
4348
}
4449

4550
def baseTemplate(Application it) '''
@@ -144,4 +149,20 @@ class Layout {
144149
def private rawJsInit(Application it) '''
145150
{{ pageAddAsset('javascript', zasset('@«appName»:js/«appName».RawPage.js')) }}
146151
'''
152+
153+
def private associationFieldTemplateImpl(Application it) '''
154+
{# based on association.html.twig #}
155+
{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
156+
{# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #}
157+
{# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #}
158+
{% if 'toMany' == field.customOptions.get('associationType') %}
159+
<span class="badge badge-secondary">{{ field.formattedValue }}</span>
160+
{% else %}
161+
{% if field.customOptions.get('relatedUrl') is not null %}
162+
<a href="{{ field.customOptions.get('relatedUrl') }}">{{ field.value ? field.value|«appName.formatForDB»_formattedTitle : '' }}</a>
163+
{% else %}
164+
{{ field.value ? field.value|«appName.formatForDB»_formattedTitle : '' }}
165+
{% endif %}
166+
{% endif %}
167+
'''
147168
}

0 commit comments

Comments
 (0)