From 0a5b84f97e05f88645c634c12892aae3fa6adba0 Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Tue, 30 Apr 2013 12:18:00 +0000
Subject: [PATCH] SP-607 SP-621 BIS-398: Added new form to create entity types
 for all 4 entity types with save functionality.

SVN: 28938
---
 .../framework/ComponentProvider.java          |  38 +++
 .../application/ui/data/DataSetTypeGrid.java  |  14 +-
 .../entity_type/AbstractEntityTypeGrid.java   |  57 ++--
 .../ui/entity_type/NewEntityTypeForm.java     | 264 ++++++++++++++++++
 .../ui/experiment/ExperimentTypeGrid.java     |  10 +-
 .../ui/material/MaterialTypeGrid.java         |  10 +-
 .../application/ui/sample/SampleTypeGrid.java |  13 +-
 7 files changed, 370 insertions(+), 36 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/NewEntityTypeForm.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index df7214d9a93..537c1e90578 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -37,6 +37,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.Da
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetUploadForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.deletion.DeletionGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type.NewEntityTypeForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBatchRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentRegistrationPanel;
@@ -1435,6 +1436,43 @@ public final class ComponentProvider
             };
     }
 
+    public AbstractTabItemFactory getNewEntityTypeForm(final EntityKind kind)
+    {
+        return new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    DatabaseModificationAwareComponent component = NewEntityTypeForm.create(kind, viewContext);
+                    return createRegistrationTab(getTabTitle(), component);
+                }
+
+                @Override
+                public String getId()
+                {
+                    return NewEntityTypeForm.BROWSER_ID + "-" + kind.name();
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.ADMINISTRATION, HelpPageAction.VIEW);
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return "New "+kind.name()+" Type";
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    return null;
+                }
+            };
+    }
+    
     public AbstractTabItemFactory getExperimentTypeBrowser()
     {
         return new AbstractTabItemFactory()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetTypeGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetTypeGrid.java
index 46453ccca49..acd47b06a17 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetTypeGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetTypeGrid.java
@@ -16,10 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
-import com.extjs.gxt.ui.client.widget.Window;
-import com.extjs.gxt.ui.client.widget.form.TextField;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -47,6 +43,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 /**
  * Grid displaying data set types.
  * 
@@ -270,4 +270,10 @@ public class DataSetTypeGrid extends AbstractEntityTypeGrid<DataSetType>
         GWTUtils.setToolTip(field, viewContext.getMessage(Dict.DELETION_DISALLOW_TOOLTIP));
         return field;
     }
+
+    @Override
+    public AddEntityTypeDialog<DataSetType> getNewDialog(DataSetType newType)
+    {
+        return (AddEntityTypeDialog<DataSetType>) createRegisterEntityTypeDialog("New DataSet", newType, newType.getEntityKind());
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/AbstractEntityTypeGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/AbstractEntityTypeGrid.java
index 6527ec3aaf1..05f566ecbaa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/AbstractEntityTypeGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/AbstractEntityTypeGrid.java
@@ -20,12 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import com.extjs.gxt.ui.client.event.ButtonEvent;
-import com.extjs.gxt.ui.client.event.SelectionListener;
-import com.extjs.gxt.ui.client.widget.Window;
-import com.extjs.gxt.ui.client.widget.button.Button;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -52,6 +46,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 /**
  * Abstract grid displaying entity types.
  * 
@@ -67,7 +67,6 @@ abstract public class AbstractEntityTypeGrid<T extends EntityType> extends Typed
             String browserId, String gridId)
     {
         super(viewContext, browserId, true, DisplayTypeIDGenerator.TYPE_BROWSER_GRID);
-
         postRegistrationCallback = createRefreshGridAction();
         extendBottomToolbar();
         allowMultipleSelection();
@@ -79,32 +78,42 @@ abstract public class AbstractEntityTypeGrid<T extends EntityType> extends Typed
         return createGridDisplayTypeID("-" + getEntityKindOrNull().toString());
     }
 
+    public abstract AddEntityTypeDialog<T> getNewDialog(T newType);
+    
     private void extendBottomToolbar()
     {
         addEntityOperationsLabel();
 
         final EntityKind entityKind = getEntityKindOrNull();
 
-        Button buttonProperties =
-                createSelectedItemButton(
-                        viewContext.getMessage(Dict.BUTTON_PROPERTIES_ASSIGNMENTS), // "Properties"
-                        new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<T>>>()
-                            {
-                                @Override
-                                public void invoke(
-                                        BaseEntityModel<TableModelRowWithObject<T>> selectedItem,
-                                        boolean keyPressed)
-                                {
-                                    T entityType = selectedItem.getBaseObject().getObjectOrNull();
-                                    DispatcherHelper.dispatchNaviEvent(new ComponentProvider(
-                                            viewContext)
-                                            .getPropertyTypeAssignmentBrowser(entityType));
-                                }
+        Button buttonNew = new TextToolItem("New",
+                new SelectionListener<ButtonEvent>()
+                    {
+                        @Override
+                        public void componentSelected(ButtonEvent ce)
+                        {
+                            DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getNewEntityTypeForm(entityKind));
+                        }
+                    });
+        buttonNew.setId("add-entity-type-new-" + getEntityKindOrNull());
+        addButton(buttonNew);
+        
+        Button buttonProperties = createSelectedItemButton(viewContext.getMessage(Dict.PROPERTY_TYPE_ASSIGNMENTS), // "Properties"
+                new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<T>>>()
+                    {
+                        @Override
+                        public void invoke(
+                                BaseEntityModel<TableModelRowWithObject<T>> selectedItem,
+                                boolean keyPressed)
+                        {
+                            T entityType = selectedItem.getBaseObject().getObjectOrNull();
+                            DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getPropertyTypeAssignmentBrowser(entityType));
+                        }
 
-                            });
+                    });
         buttonProperties.setId("property-types-" + getEntityKindOrNull());
         addButton(buttonProperties);
-
+        
         Button button = new TextToolItem(viewContext.getMessage(Dict.ADD_NEW_TYPE_BUTTON),
                 new SelectionListener<ButtonEvent>()
                     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/NewEntityTypeForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/NewEntityTypeForm.java
new file mode 100644
index 00000000000..25dca49822c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/entity_type/NewEntityTypeForm.java
@@ -0,0 +1,264 @@
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.BorderLayoutDataFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.MaterialTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeAssignmentGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.button.ButtonBar;
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+public class NewEntityTypeForm extends ContentPanel
+{
+    public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "new-entity-type-form";
+
+    private final IViewContext<ICommonClientServiceAsync> viewContext;
+    
+    //
+    // Entity Type
+    //
+    private final EntityKind kind;
+
+    private EntityType newType;
+
+    //
+    // Entity Form Related
+    //
+    private AbstractEntityTypeGrid<? extends EntityType> typeGrid;
+
+    private FormPanel dialogForm = null;
+
+    private NewEntityTypeForm(EntityKind kind, IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        this.kind = kind;
+        this.viewContext = viewContext;
+        
+        // Main panel
+        setLayout(new BorderLayout());
+        this.setHeaderVisible(false);
+        this.setBorders(false);
+        this.setBodyBorder(false);
+        
+        initForm();
+    }
+
+    public static DatabaseModificationAwareComponent create(EntityKind kind,
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        NewEntityTypeForm form = new NewEntityTypeForm(kind, viewContext);
+        return new DatabaseModificationAwareComponent(form, null);
+    }
+
+    private void initForm()
+    {
+        this.removeAll();
+
+        // Top panel
+        initEntityTypeForm();
+        dialogForm.setHeaderVisible(false);
+        dialogForm.setBorders(false);
+        dialogForm.setBodyBorder(false);
+        dialogForm.setLabelWidth(180);
+        add(dialogForm, BorderLayoutDataFactory.create(LayoutRegion.NORTH, 350));
+
+        // Central panel
+        PropertyTypeAssignmentGrid grid = (PropertyTypeAssignmentGrid) PropertyTypeAssignmentGrid.create(viewContext, newType).getComponent();
+        final Component centerPanel = grid;
+        add(centerPanel, BorderLayoutDataFactory.create(LayoutRegion.CENTER, 170));
+
+        // Bottom panel
+        final FormPanel bottomPanel = getSaveButton();
+        add(bottomPanel, BorderLayoutDataFactory.create(LayoutRegion.SOUTH, 70));
+
+        layout();
+    }
+
+    private void initEntityTypeForm()
+    {
+        AddEntityTypeDialog<? extends EntityType> dialog = null;
+
+        switch (kind)
+        {
+            case SAMPLE:
+                newType = new SampleType();
+                typeGrid = (SampleTypeGrid) SampleTypeGrid.create(viewContext).getComponent();
+                dialog = ((SampleTypeGrid) typeGrid).getNewDialog((SampleType) newType);
+                break;
+            case DATA_SET:
+                newType = new DataSetType();
+                typeGrid = (DataSetTypeGrid) DataSetTypeGrid.create(viewContext).getComponent();
+                dialog = ((DataSetTypeGrid) typeGrid).getNewDialog((DataSetType) newType);
+                break;
+            case EXPERIMENT:
+                newType = new ExperimentType();
+                typeGrid = (ExperimentTypeGrid) ExperimentTypeGrid.create(viewContext).getComponent();
+                dialog = ((ExperimentTypeGrid) typeGrid).getNewDialog((ExperimentType) newType);
+                break;
+            case MATERIAL:
+                newType = new MaterialType();
+                typeGrid = (MaterialTypeGrid) MaterialTypeGrid.create(viewContext).getComponent();
+                dialog = (AddEntityTypeDialog<MaterialType>) ((MaterialTypeGrid) typeGrid).getNewDialog((MaterialType) newType);
+                break;
+        }
+
+        newType.setCode("" + System.currentTimeMillis()); // Just needed so the grid don't break
+                                                          // afterwards
+        List<Component> dialogFormIntoList = dialog.getItems();
+        dialogForm = (FormPanel) dialogFormIntoList.get(0);
+    }
+
+    private FormPanel getSaveButton()
+    {
+        final FormPanel formWithButtons = new FormPanel();
+        formWithButtons.setHeaderVisible(false);
+        formWithButtons.setBorders(false);
+        formWithButtons.setBodyBorder(false);
+
+        ButtonBar buttonBar = new ButtonBar();
+        buttonBar.setMinButtonWidth(100);
+        buttonBar.setAlignment(HorizontalAlignment.RIGHT);
+        formWithButtons.add(buttonBar);
+
+        final Button save = new Button("Save", new SelectionListener<ButtonEvent>()
+            {
+                @Override
+                public final void componentSelected(final ButtonEvent ce)
+                {
+                    if (dialogForm.isValid())
+                    {
+                        setEntityFromForm();
+                        createUpdateEntity();
+                    }
+                }
+            });
+        save.setWidth("100px");
+        save.setHeight("20px");
+        buttonBar.add(save);
+
+        return formWithButtons;
+    }
+
+    private class AsyncCallbackEntityType implements AsyncCallback<Void>
+    {
+        @Override
+        public void onFailure(Throwable throwable)
+        {
+            String message = "Error";
+            if (throwable instanceof UserFailureException)
+            {
+                UserFailureException userException = (UserFailureException) throwable;
+                String details = GWTUtils.translateToHtmlLineBreaks(userException.getMessage());
+                if (details != null)
+                {
+                    message = details;
+                } 
+            }
+            MessageBox.alert("Error", message, null);
+        }
+
+        @Override
+        public void onSuccess(Void result)
+        {
+            initForm();
+        }
+    }
+
+    private void createUpdateEntity()
+    {
+        AsyncCallbackEntityType callback = new AsyncCallbackEntityType();
+        
+        switch (kind)
+        {
+            case SAMPLE:
+                viewContext.getService().registerSampleType((SampleType) newType, callback);
+                break;
+            case DATA_SET:
+                viewContext.getService().registerDataSetType((DataSetType) newType, callback);
+                break;
+            case EXPERIMENT:
+                viewContext.getService().registerExperimentType((ExperimentType) newType, callback);
+                break;
+            case MATERIAL:
+                viewContext.getService().registerMaterialType((MaterialType) newType, callback);
+                break;
+        }
+    }
+
+    private void setEntityFromForm()
+    {
+        List<Field<?>> formFields = dialogForm.getFields();
+
+        switch (kind)
+        {
+            case SAMPLE:
+                SampleType toSaveSample = new SampleType();
+                toSaveSample.setCode((String) formFields.get(0).getValue());
+                toSaveSample.setDescription((String) formFields.get(1).getValue());
+                toSaveSample.setValidationScript((Script) formFields.get(2).getValue());
+                toSaveSample.setListable((Boolean) formFields.get(3).getValue());
+                toSaveSample.setShowContainer((Boolean) formFields.get(4).getValue());
+                toSaveSample.setShowParents((Boolean) formFields.get(5).getValue());
+                toSaveSample.setSubcodeUnique((Boolean) formFields.get(6).getValue());
+                toSaveSample.setAutoGeneratedCode((Boolean) formFields.get(7).getValue());
+                toSaveSample.setShowParentMetadata((Boolean) formFields.get(8).getValue());
+                toSaveSample.setGeneratedCodePrefix((String) formFields.get(9).getValue());
+                newType = toSaveSample;
+                break;
+            case DATA_SET:
+                DataSetType toSaveDataSet = new DataSetType();
+                toSaveDataSet.setCode((String) formFields.get(0).getValue());
+                toSaveDataSet.setDescription((String) formFields.get(1).getValue());
+                toSaveDataSet.setValidationScript((Script) formFields.get(2).getValue());
+                toSaveDataSet.setDataSetKind((DataSetKind) formFields.get(3).getValue());
+                toSaveDataSet.setDeletionDisallow((Boolean) formFields.get(4).getValue());
+                toSaveDataSet.setMainDataSetPattern((String) formFields.get(5).getValue());
+                toSaveDataSet.setMainDataSetPath((String) formFields.get(6).getValue());
+                newType = toSaveDataSet;
+                break;
+            case EXPERIMENT:
+                ExperimentType toSaveExperiment = new ExperimentType();
+                toSaveExperiment.setCode((String) formFields.get(0).getValue());
+                toSaveExperiment.setDescription((String) formFields.get(1).getValue());
+                toSaveExperiment.setValidationScript((Script) formFields.get(2).getValue());
+                newType = toSaveExperiment;
+                break;
+            case MATERIAL:
+                MaterialType toSaveMaterial = new MaterialType();
+                toSaveMaterial.setCode((String) formFields.get(0).getValue());
+                toSaveMaterial.setDescription((String) formFields.get(1).getValue());
+                toSaveMaterial.setValidationScript((Script) formFields.get(2).getValue());
+                newType = toSaveMaterial;
+                break;
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeGrid.java
index 344f8a1f8b4..1fdf34c68a0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeGrid.java
@@ -16,14 +16,13 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment;
 
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type.AbstractEntityTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type.AddEntityTypeDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
@@ -32,6 +31,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 /**
  * Grid displaying experiment types.
  * 
@@ -55,6 +56,11 @@ public class ExperimentTypeGrid extends AbstractEntityTypeGrid<ExperimentType>
         super(viewContext, BROWSER_ID, GRID_ID);
     }
 
+    @Override
+    public AddEntityTypeDialog<ExperimentType> getNewDialog(ExperimentType newType) {
+        return (AddEntityTypeDialog<ExperimentType>) createRegisterEntityTypeDialog("New Experiment", newType, newType.getEntityKind());
+    }
+    
     @Override
     protected void listTableRows(
             DefaultResultSetConfig<String, TableModelRowWithObject<ExperimentType>> resultSetConfig,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialTypeGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialTypeGrid.java
index 322dd40fca4..4bef76e19f7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialTypeGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialTypeGrid.java
@@ -16,14 +16,13 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material;
 
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type.AbstractEntityTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.entity_type.AddEntityTypeDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
@@ -32,6 +31,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 /**
  * Grid displaying material types.
  * 
@@ -55,6 +56,11 @@ public class MaterialTypeGrid extends AbstractEntityTypeGrid<MaterialType>
         super(viewContext, BROWSER_ID, GRID_ID);
     }
 
+    @Override
+    public AddEntityTypeDialog<MaterialType> getNewDialog(MaterialType newType) {
+        return (AddEntityTypeDialog<MaterialType>) createRegisterEntityTypeDialog("New Material", newType, newType.getEntityKind());
+    }
+    
     @Override
     protected void listTableRows(
             DefaultResultSetConfig<String, TableModelRowWithObject<MaterialType>> resultSetConfig,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeGrid.java
index b5ae5e3139d..dcac16375ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleTypeGrid.java
@@ -16,10 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
 
-import com.extjs.gxt.ui.client.widget.Window;
-import com.extjs.gxt.ui.client.widget.form.TextField;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -43,6 +39,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 /**
  * Grid displaying sample types.
  * 
@@ -81,6 +81,11 @@ public class SampleTypeGrid extends AbstractEntityTypeGrid<SampleType>
         super(viewContext, BROWSER_ID, GRID_ID);
     }
 
+    @Override
+    public AddEntityTypeDialog<SampleType> getNewDialog(SampleType newType) {
+        return (AddEntityTypeDialog<SampleType>) createRegisterEntityTypeDialog("New Sample", newType, newType.getEntityKind());
+    }
+    
     @Override
     protected void listTableRows(
             DefaultResultSetConfig<String, TableModelRowWithObject<SampleType>> resultSetConfig,
-- 
GitLab