[MGNLUI-4152] Twin-column field in a Multivalue composite field Created: 20/Feb/17 Updated: 11/May/17 Resolved: 11/May/17 |
|
| Status: | Closed |
| Project: | Magnolia UI |
| Component/s: | None |
| Affects Version/s: | 5.5 |
| Fix Version/s: | None |
| Type: | Bug | Priority: | Neutral |
| Reporter: | Sven Bach | Assignee: | Unassigned |
| Resolution: | Not an issue | Votes: | 0 |
| Labels: | None | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Environment: |
Windows 10 10.0 (amd64), Development Notebook |
||
| Attachments: |
|
||||
| Issue Links: |
|
||||
| Template: |
|
||||
| Acceptance criteria: |
Empty
|
||||
| Task DoD: |
[ ]*
Doc/release notes changes? Comment present?
[ ]*
Downstream builds green?
[ ]*
Solution information and context easily available?
[ ]*
Tests
[ ]*
FixVersion filled and not yet released
[ ] 
Architecture Decision Record (ADR)
|
||||
| Bug DoR: |
[ ]*
Steps to reproduce, expected, and actual results filled
[ ]*
Affected version filled
|
||||
| Date of First Response: | |||||
| Description |
|
Editing of the "Multivalue field -> with Composite field -> with Twin-column field" causes following error: 2017-02-16 16:03:51,239 ERROR info.magnolia.pages.app.editor.PageEditorPresenter: An error occurred while executing action [editComponent] info.magnolia.ui.api.action.ActionExecutionException: Action execution failed for action: editComponent at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:64) at info.magnolia.pages.app.editor.PageEditorPresenter.onAction(PageEditorPresenter.java:175) at info.magnolia.ui.vaadin.editor.PageEditor$1.editComponent(PageEditor.java:103) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118) at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:437) at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408) at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273) at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1414) at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:365) at info.magnolia.ui.admincentral.AdmincentralVaadinServlet.service(AdmincentralVaadinServlet.java:131) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:148) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:69) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58) at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67) at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:219) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:74) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:84) at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94) at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73) at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:64) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:155) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65) at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107) at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67) at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108) at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1156) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1088) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) at org.eclipse.jetty.server.Server.handle(Server.java:517) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) at java.lang.Thread.run(Thread.java:745) Caused by: com.vaadin.data.Buffered$SourceException at com.vaadin.ui.AbstractField.setPropertyDataSource(AbstractField.java:665) at info.magnolia.ui.form.field.AbstractCustomMultiField.createLocalField(AbstractCustomMultiField.java:176) at info.magnolia.ui.form.field.CompositeField.initFields(CompositeField.java:95) at info.magnolia.ui.form.field.CompositeField.initFields(CompositeField.java:57) at info.magnolia.ui.form.field.AbstractCustomMultiField.initFields(AbstractCustomMultiField.java:135) at info.magnolia.ui.form.field.CompositeField.initContent(CompositeField.java:82) at com.vaadin.ui.CustomField.getContent(CustomField.java:92) at com.vaadin.ui.CustomField.attach(CustomField.java:82) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.ui.AbstractComponent.setParent(AbstractComponent.java:584) at com.vaadin.ui.CustomField.getContent(CustomField.java:93) at com.vaadin.ui.CustomField.attach(CustomField.java:82) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at info.magnolia.ui.dialog.BaseDialogViewImpl.attach(BaseDialogViewImpl.java:186) at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:619) at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:677) at com.vaadin.ui.AbstractComponent.setParent(AbstractComponent.java:584) at info.magnolia.ui.vaadin.magnoliashell.MagnoliaShell.addOverlay(MagnoliaShell.java:233) at info.magnolia.ui.vaadin.magnoliashell.MagnoliaShell.openOverlay(MagnoliaShell.java:203) at info.magnolia.ui.framework.shell.ShellImpl.openOverlayOnView(ShellImpl.java:221) at info.magnolia.ui.framework.app.SubAppContextImpl$1.openOverlay(SubAppContextImpl.java:150) at info.magnolia.ui.framework.context.AbstractUIContext.openOverlay(AbstractUIContext.java:66) at info.magnolia.ui.dialog.formdialog.FormDialogPresenterImpl.start(FormDialogPresenterImpl.java:154) at info.magnolia.ui.dialog.formdialog.FormDialogPresenterImpl.start(FormDialogPresenterImpl.java:129) at info.magnolia.pages.app.action.EditElementAction.execute(EditElementAction.java:120) at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:62) ... 106 more Caused by: com.vaadin.data.util.converter.Converter$ConversionException: Unable to convert value of type java.util.LinkedList to presentation type interface java.util.Set. No converter is set and the types are not compatible. at com.vaadin.data.util.converter.ConverterUtil.convertFromModel(ConverterUtil.java:118) at com.vaadin.ui.AbstractField.convertFromModel(AbstractField.java:736) at com.vaadin.ui.AbstractField.convertFromModel(AbstractField.java:721) at com.vaadin.ui.AbstractField.setPropertyDataSource(AbstractField.java:657) ... 145 more multivaluecompositetwincolumfield.yaml I can add the component to a page, create a title, choose tags and save it. When I delete the twin-column field from the yaml file the component works fine. |
| Comments |
| Comment by Ervin Vystup [ 20/Feb/17 ] |
|
Tested with the "Twin-column" and "Option group" fields
form:
tabs:
- name: tabGroups
label: Groups
fields:
- name: groups
class: info.magnolia.ui.form.field.definition.MultiValueFieldDefinition
transformerClass: info.magnolia.ui.form.field.transformer.multi.MultiValueSubChildrenNodePropertiesTransformer
label: title and tags
field:
name: groupField
class: info.magnolia.ui.form.field.definition.CompositeFieldDefinition
transformerClass: info.magnolia.ui.form.field.transformer.composite.NoOpCompositeTransformer
layout: vertical
fields:
- name: groupTitle
class: info.magnolia.ui.form.field.definition.TextFieldDefinition
label: group title
- name: tags
class: info.magnolia.ui.form.field.definition.TwinColSelectFieldDefinition
type: String
label: Tags
options:
- name: news
label: News
selected: true
- name: sports
label: Sports
value: sports
- name: celebrities
label: Celebrities
value: celebrities
#- name: titleSelect
# class: info.magnolia.ui.form.field.definition.OptionGroupFieldDefinition
# multiselect: true
# type: String
# label: Title to use
# options:
# - name: pageTitle
# label: Page title
# selected: true
# - name: navigationTitle
# label: Navigation title
# value: navigationTitle
# - name: none
# label: None
# value: none
actions:
commit:
class: info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition
cancel:
class: info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition
And also with using following transformers:
|
| Comment by Mikaël Geljić [ 11/May/17 ] |
|
Hi sbach, A. As Ervín hinted, doing more than one level of nesting typically requires delegating transformers. Meanwhile, the use case seems a little bit complicated—if only visually. Here's a couple options you might consider to simplify it, or gain more control: B. Your group entity looks like it could be managed in a Content app and workspace of its own, with a simple form (textfield + twin-column select). Then on the component dialog side, you would only have the multi-value field, with an inner LinkField pointing to your group workspace. C. For complex editing UIs, I can also suggest a Vaadin CustomField, paired with a new Magnolia FieldFactory. Lastly, I will only keep this ticket open if there is confirmation that the delegating-transformers approach does not work. Otherwise it's more "traditional support". Hope this helps nonetheless. Cheers, |
| Comment by Sven Bach [ 11/May/17 ] |
|
Hey there, so if i use this:
fields:
groups:
class: info.magnolia.ui.form.field.definition.MultiValueFieldDefinition
transformerClass: info.magnolia.ui.form.field.transformer.multi.DelegatingMultiValueFieldTransformer
label: Titel und Reisethemen
field:
name: groupField
class: info.magnolia.ui.form.field.definition.CompositeFieldDefinition
transformerClass: info.magnolia.ui.form.field.transformer.composite.DelegatingCompositeFieldTransformer
I get no error, the nodes get saved in the jcr and i can edit the component. And the title field works with i18n. We use this component to group categories, so that the author / user could add groups with different titles on different pages without creating all this groups in a extra app. But the Vaadin CustomField is an god advice. I think docs for Multivaluefield and Transforming field has confused me. Thanks for the help, the advice and your time. For me this issue can be closed |
| Comment by Mikaël Geljić [ 11/May/17 ] |
|
I agree some parts of the docs could be confusing, I made a suggestion to clarify the choice of transformers. Thank you for your quick feedback, glad this worked for you. |