You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/02/02 01:36:00 UTC

[03/15] isis git commit: ISIS-993: use a single layoutMetadata hint in EntityModel, rather than many different hints. Also, moved FC classes under a new "fixedcols" layout.

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/PropertyGroup.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/PropertyGroup.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/PropertyGroup.java
new file mode 100644
index 0000000..d2fd5ec
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/PropertyGroup.java
@@ -0,0 +1,122 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.layout.fixedcols;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.RepeatingView;
+
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class PropertyGroup extends PanelAbstract<EntityModel> {
+
+    private static final String ID_MEMBER_GROUP_NAME = "memberGroupName";
+
+    private static final String ID_ASSOCIATED_ACTION_LINKS_PANEL = "associatedActionLinksPanel";
+    private static final String ID_ASSOCIATED_ACTION_LINKS_PANEL_DROPDOWN = "associatedActionLinksPanelDropDown";
+
+    private static final String ID_PROPERTIES = "properties";
+    private static final String ID_PROPERTY = "property";
+
+    private final FieldSet fieldSet;
+
+    public PropertyGroup(final String id, final EntityModel model) {
+        super(id, model);
+        fieldSet = (FieldSet) model.getLayoutMetadata();
+
+        buildGui();
+    }
+
+    public EntityModel getModel() {
+        return (EntityModel) getDefaultModel();
+    }
+
+    private void buildGui() {
+        String groupName = fieldSet.getName();
+        final ObjectAdapter adapter = getModel().getObject();
+
+        add(new Label(ID_MEMBER_GROUP_NAME, groupName));
+
+        final List<LinkAndLabel> memberGroupActions = Lists.newArrayList();
+
+        final RepeatingView propertyRv = new RepeatingView(ID_PROPERTIES);
+        add(propertyRv);
+
+        final List<PropertyLayoutData> properties = fieldSet.getProperties();
+        for (PropertyLayoutData property : properties) {
+            final ObjectAssociation association = adapter.getSpecification().getAssociation(property.getId());
+
+            final WebMarkupContainer propertyRvContainer = new WebMarkupContainer(propertyRv.newChildId());
+            propertyRv.add(propertyRvContainer);
+
+            addPropertyToForm(getModel(), (OneToOneAssociation) association, propertyRvContainer,
+                    memberGroupActions);
+        }
+
+        final List<LinkAndLabel> actionsPanel = LinkAndLabel
+                .positioned(memberGroupActions, ActionLayout.Position.PANEL);
+        final List<LinkAndLabel> actionsPanelDropDown = LinkAndLabel
+                .positioned(memberGroupActions, ActionLayout.Position.PANEL_DROPDOWN);
+
+        AdditionalLinksPanel.addAdditionalLinks(
+                this, ID_ASSOCIATED_ACTION_LINKS_PANEL,
+                actionsPanel,
+                AdditionalLinksPanel.Style.INLINE_LIST);
+        AdditionalLinksPanel.addAdditionalLinks(
+                this, ID_ASSOCIATED_ACTION_LINKS_PANEL_DROPDOWN,
+                actionsPanelDropDown,
+                AdditionalLinksPanel.Style.DROPDOWN);
+    }
+
+    private void addPropertyToForm(
+            final EntityModel entityModel,
+            final OneToOneAssociation otoa,
+            final WebMarkupContainer container,
+            final List<LinkAndLabel> entityActions) {
+        final PropertyMemento pm = new PropertyMemento(otoa);
+
+        final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
+        getComponentFactoryRegistry()
+                .addOrReplaceComponent(container, ID_PROPERTY, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
+
+        final List<ObjectAction> associatedActions =
+                EntityActionUtil.getObjectActionsForAssociation(entityModel, otoa, getDeploymentCategory());
+
+        entityActions.addAll(
+                EntityActionUtil.asLinkAndLabelsForAdditionalLinksPanel(entityModel, associatedActions));
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.html
new file mode 100644
index 0000000..6699518
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.html
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<body>
+<wicket:panel>
+    <div wicket:id="tabGroups">
+        <div wicket:id="tabGroup">[tabbed panel will be here]</div>
+    </div>
+</wicket:panel>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.java
new file mode 100644
index 0000000..7a07082
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupListPanel.java
@@ -0,0 +1,66 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.layout.fixedcols;
+
+import java.util.List;
+
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class TabGroupListPanel extends PanelAbstract<EntityModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_TAB_GROUPS = "tabGroups";
+
+    // the view metadata
+    private final List<FCTabGroup> tabGroups;
+
+    public TabGroupListPanel(final String id, final EntityModel entityModel) {
+        super(id, entityModel);
+
+        this.tabGroups = (List<FCTabGroup>) entityModel.getLayoutMetadata();
+
+        buildGui();
+    }
+
+    private void buildGui() {
+        final EntityModel model = getModel();
+
+        final ListView<FCTabGroup> tabGroupsList = new ListView<FCTabGroup>(ID_TAB_GROUPS, this.tabGroups) {
+
+            @Override
+            protected void populateItem(final ListItem<FCTabGroup> item) {
+
+                final FCTabGroup tabGroup = item.getModelObject();
+                final EntityModel entityModelWithHints = model.cloneWithLayoutMetadata(tabGroup);
+                final TabGroupPanel tabGroupPanel = new TabGroupPanel(entityModelWithHints);
+                item.add(tabGroupPanel);
+            }
+        };
+
+        add(tabGroupsList);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupPanel.java
new file mode 100644
index 0000000..d0fe9a0
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabGroupPanel.java
@@ -0,0 +1,103 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.layout.fixedcols;
+
+import java.util.List;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.util.ScopedSessionAttribute;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+
+public class TabGroupPanel extends AjaxBootstrapTabbedPanel {
+
+    public static final String SESSION_ATTR_SELECTED_TAB = "selectedTab";
+    private final EntityModel entityModel;
+    // the view metadata
+    private final FCTabGroup tabGroup;
+    private final ScopedSessionAttribute<Integer> selectedTabInSession;
+
+    private static final String ID_TAB_GROUP = "tabGroup";
+
+    private static List<ITab> tabsFor(final EntityModel entityModel) {
+        final List<ITab> tabs = Lists.newArrayList();
+
+        final FCTabGroup tabGroup = (FCTabGroup) entityModel.getLayoutMetadata();
+        final List<FCTab> FCTabList = FluentIterable
+                .from(tabGroup.getTabs())
+                .filter(FCTab.Predicates.notEmpty())
+                .toList();
+
+        for (final FCTab FCTab : FCTabList) {
+            tabs.add(new AbstractTab(Model.of(FCTab.getName())) {
+                private static final long serialVersionUID1 = 1L;
+
+                @Override
+                public Panel getPanel(String panelId) {
+                    return new TabPanel(panelId, entityModel, FCTab);
+                }
+            });
+        }
+        return tabs;
+    }
+
+    public TabGroupPanel(final EntityModel entityModel) {
+        super(ID_TAB_GROUP, tabsFor(entityModel));
+
+        this.entityModel = entityModel;
+        this.tabGroup = (FCTabGroup) entityModel.getLayoutMetadata();
+        this.selectedTabInSession = ScopedSessionAttribute.create(entityModel, this, SESSION_ATTR_SELECTED_TAB);
+
+    }
+
+    @Override
+    protected void onInitialize() {
+        setSelectedTabFromSessionIfAny(this);
+        super.onInitialize();
+    }
+
+    @Override
+    public TabbedPanel setSelectedTab(final int index) {
+        selectedTabInSession.set(index);
+        return super.setSelectedTab(index);
+    }
+
+    private void setSelectedTabFromSessionIfAny(
+            final AjaxBootstrapTabbedPanel ajaxBootstrapTabbedPanel) {
+        final Integer tabIndex = selectedTabInSession.get();
+        if (tabIndex != null) {
+            final int numTabs = ajaxBootstrapTabbedPanel.getTabs().size();
+            if (tabIndex < numTabs) {
+                // to support dynamic reloading; the data in the session might not be compatible with current layout.
+                ajaxBootstrapTabbedPanel.setSelectedTab(tabIndex);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.html
new file mode 100644
index 0000000..111fc68
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.html
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<body>
+<wicket:panel>
+	<div class="tabPanel">
+		<form class="inputForm" role="form">
+			<div wicket:id="column">
+			</div>
+		</form>
+	</div>
+</wicket:panel>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.java
new file mode 100644
index 0000000..70dcb03
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/fixedcols/TabPanel.java
@@ -0,0 +1,24 @@
+package org.apache.isis.viewer.wicket.ui.components.layout.fixedcols;
+
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class TabPanel extends PanelAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_COLUMN = "column";
+
+    public TabPanel(String id, final EntityModel model, final FCTab FCTab) {
+        super(id);
+
+        final EntityModel modelWithTabHints = model.cloneWithLayoutMetadata(FCTab);
+
+        getComponentFactoryRegistry()
+                .addOrReplaceComponent(this,
+                        ID_COLUMN, ComponentType.ENTITY_PROPERTIES, modelWithTabHints);
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
index 7bc7d20..1697575 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<bs3:page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/common http://isis.apache.org/schema/applib/layout/common/common.xsd http://isis.apache.org/schema/applib/layout/bootstrap3 http://isis.apache.org/schema/applib/layout/bootstrap3/bootstrap3.xsd" xmlns:common="http://isis.apache.org/schema/applib/layout/common" xmlns:bs3="http://isis.apache.org/schema/applib/layout/bootstrap3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<bs3:page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/common http://isis.apache.org/schema/applib/layout/common/common.xsd http://isis.apache.org/schema/applib/layout/bootstrap3 http://isis.apache.org/schema/applib/layout/bootstrap3/bootstrap3.xsd" xmlns:c="http://isis.apache.org/schema/applib/layout/common" xmlns:bs3="http://isis.apache.org/schema/applib/layout/bootstrap3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
     <bs3:row>
         <bs3:col span="12">
-            <common:domainObject/>
-            <common:action id="delete"/>
+            <c:domainObject/>
+            <c:action id="delete"/>
         </bs3:col>
     </bs3:row>
 
@@ -14,15 +14,15 @@
                 <bs3:tab name="Metadata">
                     <bs3:row>
                         <bs3:col span="7">
-                            <common:fieldSet name="General">
-                                <common:action id="downloadJdoMetadata" position="PANEL"/>
-                                <common:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
-                                <common:property id="name" labelPosition="TOP">
-                                    <common:action id="updateName">
-                                        <common:describedAs>This allows the name to be updated</common:describedAs>
-                                    </common:action>
-                                </common:property>
-                            </common:fieldSet>
+                            <c:fieldSet name="General">
+                                <c:action id="downloadJdoMetadata" position="PANEL"/>
+                                <c:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+                                <c:property id="name" labelPosition="TOP">
+                                    <c:action id="updateName">
+                                        <c:describedAs>This allows the name to be updated</c:describedAs>
+                                    </c:action>
+                                </c:property>
+                            </c:fieldSet>
                         </bs3:col>
                     </bs3:row>
                 </bs3:tab>
@@ -31,8 +31,8 @@
                 <bs3:tab name="SimilarTo">
                     <bs3:row>
                         <bs3:col span="12">
-                            <common:collection id="similarTo" defaultView="table"/>
-                            <common:collection id="others" defaultView="hide"/>
+                            <c:collection id="similarTo" defaultView="table"/>
+                            <c:collection id="others" defaultView="hide"/>
                         </bs3:col>
                     </bs3:row>
                 </bs3:tab>

http://git-wip-us.apache.org/repos/asf/isis/blob/84c9cf75/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
index 9e6d5ac..da9fc4c 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
@@ -24,6 +24,8 @@
                 </c:fieldSet>
             </middle>
         </tab>
+    </tabGroup>
+    <tabGroup>
         <tab name="Collections">
             <left span="6">
                 <c:collection id="similarTo" defaultView="table"/>