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/04 08:52:11 UTC
isis git commit: ISIS-993: Now allow unreferenced collections to be
associated with columns. Also sorting out hints for collection selection
under tabs.
Repository: isis
Updated Branches:
refs/heads/ISIS-993 8fcac9648 -> 20faf33a0
ISIS-993: Now allow unreferenced collections to be associated with columns. Also sorting out hints for collection selection under tabs.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/20faf33a
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/20faf33a
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/20faf33a
Branch: refs/heads/ISIS-993
Commit: 20faf33a050b10e0085b01cc027d6d0ef6dd4386
Parents: 8fcac96
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 4 07:51:22 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 4 07:51:22 2016 +0000
----------------------------------------------------------------------
.../applib/layout/bootstrap3/bootstrap3.xsd | 1 +
.../isis/applib/layout/bootstrap3/BS3Col.java | 22 +++++++++++-
.../applib/layout/bootstrap3/BS3TabGroup.java | 4 +--
.../isis/applib/layout/common/FieldSet.java | 3 +-
.../bootstrap3/GridNormalizerServiceBS3.java | 38 +++++++++++++++++---
.../model/hints/HasUiHintDisambiguator.java | 24 +++++++++++++
.../wicket/model/hints/UiHintContainer.java | 16 +++++++--
.../model/models/EntityCollectionModel.java | 13 +++++++
.../collection/EntityCollectionPanel.java | 18 +++++++---
.../ui/components/layout/bs3/tabs/TabPanel.java | 11 +++++-
.../dom/simple/SimpleObject.layout.xml | 21 +++++++++--
11 files changed, 152 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
index 12c9de7..39ca5fa 100644
--- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
@@ -55,6 +55,7 @@
<xs:attribute name="id" type="xs:string"/>
<xs:attribute name="span" type="xs:int" use="required"/>
<xs:attribute name="unreferencedActions" type="xs:boolean"/>
+ <xs:attribute name="unreferencedCollections" type="xs:boolean"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
index f51fcba..0f00364 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
@@ -105,7 +105,7 @@ public class BS3Col extends BS3RowContent
* Whether this column should be used to hold any unreferenced actions (contributed or "native").
*
* <p>
- * Any layout must have precisely one column that has this attribute set.
+ * Any layout must have precisely one column or {@link FieldSet} that has this attribute set.
* </p>
*/
@XmlAttribute(required = false)
@@ -118,6 +118,26 @@ public class BS3Col extends BS3RowContent
}
+ private Boolean unreferencedCollections;
+ /**
+ * Whether this column should be used to hold any unreferenced collections (contributed or "native").
+ *
+ * <p>
+ * Any layout must have precisely one column or {@link BS3TabGroup tabgroup} that has this attribute set.
+ * </p>
+ */
+ @XmlAttribute(required = false)
+ public Boolean isUnreferencedCollections() {
+ return unreferencedCollections;
+ }
+
+ public void setUnreferencedCollections(final Boolean unreferencedCollections) {
+ this.unreferencedCollections = unreferencedCollections;
+ }
+
+
+
+
private DomainObjectLayoutData domainObject;
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
index 6f65bf7..434c2ae 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
@@ -45,10 +45,10 @@ public class BS3TabGroup extends BS3ElementAbstract implements BS3TabOwner {
private Boolean unreferencedCollections;
/**
- * Whether this column should be used to hold any unreferenced collections (contributed or "native").
+ * Whether this tab group should be used to hold any unreferenced collections (contributed or "native").
*
* <p>
- * Any layout must have precisely one column that has this attribute set.
+ * Any layout must have precisely one tab group or {@link BS3Col col} that has this attribute set.
* </p>
*/
@XmlAttribute(required = false)
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
index 40769eb..fe8bf65 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
@@ -33,6 +33,7 @@ import com.google.common.collect.Lists;
import org.apache.isis.applib.annotation.MemberOrder;
import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.bootstrap3.BS3Col;
/**
* A {@link MemberRegion region} of the page containing a set of
@@ -86,7 +87,7 @@ public class FieldSet implements MemberRegion, ActionLayoutDataOwner, Serializab
* Whether this fieldset should be used to hold any unreferenced actions (contributed or "native").
*
* <p>
- * Any layout must have precisely one fieldset that has this attribute set.
+ * Any layout must have precisely one fieldset or {@link BS3Col col} that has this attribute set.
* </p>
*/
@XmlAttribute(required = false)
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
index 5761965..c0e0fa9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
@@ -122,11 +122,13 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
// unreferencedActions, unreferencedProperties and unreferencedCollections attribute set.
final AtomicReference<BS3Col> colForUnreferencedActionsRef = new AtomicReference<>();
+ final AtomicReference<BS3Col> colForUnreferencedCollectionsRef = new AtomicReference<>();
final AtomicReference<FieldSet> fieldSetForUnreferencedActionsRef = new AtomicReference<>();
final AtomicReference<FieldSet> fieldSetForUnreferencedPropertiesRef = new AtomicReference<>();
final AtomicReference<BS3TabGroup> tabGroupForUnreferencedCollectionsRef = new AtomicReference<>();
bs3Grid.visit(new BS3Grid.VisitorAdapter(){
+
@Override
public void visit(final BS3Col bs3Col) {
if(isSet(bs3Col.isUnreferencedActions())) {
@@ -138,6 +140,15 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
colForUnreferencedActionsRef.set(bs3Col);
}
}
+ if(isSet(bs3Col.isUnreferencedCollections())) {
+ if(colForUnreferencedCollectionsRef.get() != null) {
+ bs3Col.setMetadataError("More than one col with 'unreferencedCollections' attribute set");
+ } else if(tabGroupForUnreferencedCollectionsRef.get() != null) {
+ bs3Col.setMetadataError("Already found a tabgroup with 'unreferencedCollections' attribute set");
+ } else {
+ colForUnreferencedCollectionsRef.set(bs3Col);
+ }
+ }
}
@Override
@@ -165,6 +176,8 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
if(isSet(bs3TabGroup.isUnreferencedCollections())) {
if(tabGroupForUnreferencedCollectionsRef.get() != null) {
bs3TabGroup.setMetadataError("More than one tabgroup with 'unreferencedCollections' attribute set");
+ } else if(colForUnreferencedCollectionsRef.get() != null) {
+ bs3TabGroup.setMetadataError("Already found a column with 'unreferencedCollections' attribute set");
} else {
tabGroupForUnreferencedCollectionsRef.set(bs3TabGroup);
}
@@ -173,18 +186,18 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
});
if(colForUnreferencedActionsRef.get() == null && fieldSetForUnreferencedActionsRef.get() == null) {
- bs3Grid.getMetadataErrors().add("No column and no fieldset has the 'unreferencedActions' attribute set");
+ bs3Grid.getMetadataErrors().add("No column and also no fieldset found with the 'unreferencedActions' attribute set");
}
if(fieldSetForUnreferencedPropertiesRef.get() == null) {
- bs3Grid.getMetadataErrors().add("No fieldset has the 'unreferencedProperties' attribute set");
+ bs3Grid.getMetadataErrors().add("No fieldset found with the 'unreferencedProperties' attribute set");
}
- if(tabGroupForUnreferencedCollectionsRef.get() == null) {
- bs3Grid.getMetadataErrors().add("No tabgroup has the 'unreferencedCollections' attribute set");
+ if(colForUnreferencedCollectionsRef.get() == null && tabGroupForUnreferencedCollectionsRef.get() == null) {
+ bs3Grid.getMetadataErrors().add("No column and also no tabgroup found with the 'unreferencedCollections' attribute set");
}
if( colForUnreferencedActionsRef.get() == null && fieldSetForUnreferencedActionsRef.get() == null ||
fieldSetForUnreferencedPropertiesRef.get() == null ||
- tabGroupForUnreferencedCollectionsRef.get() == null) {
+ colForUnreferencedCollectionsRef.get() == null && tabGroupForUnreferencedCollectionsRef.get() == null) {
return false;
}
@@ -219,6 +232,11 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
final BS3TabGroup bs3TabGroup = tabGroupForUnreferencedCollectionsRef.get();
if(bs3TabGroup != null) {
addMissingCollectionsTo(bs3TabGroup, missingCollectionIds, objectSpec);
+ } else {
+ final BS3Col bs3Col = colForUnreferencedCollectionsRef.get();
+ if(bs3Col != null) {
+ addMissingCollectionsTo(bs3Col, missingCollectionIds);
+ }
}
}
@@ -294,6 +312,16 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
}
protected void addMissingCollectionsTo(
+ final BS3Col tabRowCol,
+ final List<String> missingCollectionIds) {
+ for (final String collectionId : missingCollectionIds) {
+ final CollectionLayoutData layoutMetadata = new CollectionLayoutData(collectionId);
+ layoutMetadata.setDefaultView("table");
+ tabRowCol.getCollections().add(layoutMetadata);
+ }
+ }
+
+ protected void addMissingCollectionsTo(
final BS3TabGroup tabGroup,
final List<String> missingCollectionIds,
final ObjectSpecification objectSpec) {
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/HasUiHintDisambiguator.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/HasUiHintDisambiguator.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/HasUiHintDisambiguator.java
new file mode 100644
index 0000000..2ce0153
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/HasUiHintDisambiguator.java
@@ -0,0 +1,24 @@
+/**
+ * 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.model.hints;
+
+public interface HasUiHintDisambiguator {
+
+ String getHintDisambiguator();
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintContainer.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintContainer.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintContainer.java
index ed93f16..4b65489 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintContainer.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintContainer.java
@@ -51,7 +51,10 @@ public interface UiHintContainer {
public static String hintPathFor(Component component) {
- return Strings.afterFirstPathComponent(fullHintPathFor(component), Component.PATH_SEPARATOR);
+ final String fullHintPath = fullHintPathFor(component);
+ final String firstPathComponent =
+ Strings.afterFirstPathComponent(fullHintPath, Component.PATH_SEPARATOR);
+ return firstPathComponent;
}
private static String fullHintPathFor(Component component) {
@@ -60,11 +63,20 @@ public interface UiHintContainer {
if (buffer.length() > 0) {
buffer.prepend(Component.PATH_SEPARATOR);
}
+ final Class<? extends Component> aClass = c.getClass();
+ if(HasUiHintDisambiguator.class.isAssignableFrom(aClass)) {
+ final HasUiHintDisambiguator hasUiHintDisambiguator = (HasUiHintDisambiguator) c;
+ buffer.prepend(hasUiHintDisambiguator.getHintDisambiguator());
+ buffer.prepend("-");
+ }
buffer.prepend(c.getId());
}
- return buffer.toString();
+ final String fullHintPath = buffer.toString();
+ return fullHintPath;
}
}
+
+
}
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 76ed8bc..17c6fc9 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -486,6 +486,19 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
}
+ @Override
+ protected void doSetHint(final String scopeKey, final String attributeName, final String value) {
+ if(isParented()) {
+ // same logic as in EntityModel's similar override
+ ScopedSessionAttribute scopedSessionAttribute = scopedSessionAttributeByName.get(attributeName);
+ if(scopedSessionAttribute == null) {
+ scopedSessionAttribute = ScopedSessionAttribute.create(parentObjectAdapterMemento, scopeKey, attributeName);
+ }
+ scopedSessionAttribute.set(value);
+ }
+ }
+
+
// //////////////////////////////////////
private static AdapterManager getAdapterManagerStatic() {
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index e6b3743..f5a6c16 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -63,8 +63,15 @@ public class EntityCollectionPanel extends PanelAbstract<EntityModel> {
super(id, entityModel);
selectedItemSessionAttribute = ScopedSessionAttribute.create(
- entityModel, this, EntityCollectionModel.SESSION_ATTRIBUTE_SELECTED_ITEM);
+ entityModel, this, EntityCollectionModel.SESSION_ATTRIBUTE_SELECTED_ITEM);
+ }
+
+ /**
+ * Build UI only after added to parent.
+ */
+ public void onInitialize() {
+ super.onInitialize();
buildGui();
}
@@ -86,7 +93,6 @@ public class EntityCollectionPanel extends PanelAbstract<EntityModel> {
collectionRvContainer.add(fieldSet);
final CollectionPanel collectionPanel = new CollectionPanel(ID_COLLECTION, entityCollectionModel);
- fieldSet.addOrReplace(collectionPanel);
Label labelComponent = collectionPanel.createLabel(ID_COLLECTION_NAME, association.getName());
final NamedFacet namedFacet = association.getFacet(NamedFacet.class);
@@ -110,8 +116,9 @@ public class EntityCollectionPanel extends PanelAbstract<EntityModel> {
if (componentFactories.size() <= 1) {
permanentlyHide(ID_SELECTOR_DROPDOWN);
} else {
- CollectionSelectorPanel selectorDropdownPanel;
- selectorDropdownPanel = new CollectionSelectorPanel(ID_SELECTOR_DROPDOWN, entityCollectionModel, selectedItemSessionAttribute);
+ CollectionSelectorPanel selectorDropdownPanel =
+ new CollectionSelectorPanel(ID_SELECTOR_DROPDOWN,
+ entityCollectionModel, selectedItemSessionAttribute);
final Model<ComponentFactory> componentFactoryModel = new Model<>();
@@ -125,5 +132,8 @@ public class EntityCollectionPanel extends PanelAbstract<EntityModel> {
collectionPanel.setSelectorDropdownPanel(selectorDropdownPanel);
}
+ fieldSet.addOrReplace(collectionPanel);
}
+
+
}
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabPanel.java
index 994fb4b..4d2de72 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabPanel.java
@@ -5,12 +5,13 @@ import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.isis.applib.layout.bootstrap3.BS3Row;
import org.apache.isis.applib.layout.bootstrap3.BS3Tab;
+import org.apache.isis.viewer.wicket.model.hints.HasUiHintDisambiguator;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.components.layout.bs3.Util;
import org.apache.isis.viewer.wicket.ui.components.layout.bs3.row.Row;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-public class TabPanel extends PanelAbstract {
+public class TabPanel extends PanelAbstract implements HasUiHintDisambiguator {
private static final long serialVersionUID = 1L;
private final BS3Tab bs3Tab;
@@ -22,6 +23,14 @@ public class TabPanel extends PanelAbstract {
buildGui(model, bs3Tab);
}
+ /**
+ * when tabs are rendered, they don't distinguish within the path hierarchy: even if on different tabs, the first
+ * panel will have the same Wicket path hierarchy. This property allows us to distinguish.
+ */
+ public String getHintDisambiguator() {
+ return bs3Tab.getName();
+ }
+
protected void buildGui(final EntityModel model, final BS3Tab bs3Tab) {
Util.appendCssClassIfRequired(this, bs3Tab);
http://git-wip-us.apache.org/repos/asf/isis/blob/20faf33a/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 34bbb54..4201dfd 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
@@ -40,11 +40,26 @@
</bs3:col>
</bs3:row>
<bs3:row>
- <bs3:col span="6">
+ <bs3:col span="4">
<c:fieldSet name="Properties" unreferencedProperties="true"/>
</bs3:col>
- <bs3:col span="6">
- <bs3:tabGroup unreferencedCollections="true"/>
+ <bs3:col span="8">
+ <bs3:tabGroup unreferencedCollections="true">
+ <bs3:tab name="Others">
+ <bs3:row>
+ <bs3:col span="12">
+ <c:collection id="others" defaultView="table"/>
+ </bs3:col>
+ </bs3:row>
+ </bs3:tab>
+ <bs3:tab name="Similar To">
+ <bs3:row>
+ <bs3:col span="12">
+ <c:collection id="similarTo"/>
+ </bs3:col>
+ </bs3:row>
+ </bs3:tab>
+ </bs3:tabGroup>
</bs3:col>
</bs3:row>
</bs3:grid>