diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java index 62bdfed5797c6d3f9026d1e9784e5d385ff220e6..ce3f7842535463f9c4943cf93d986435a0cecfcd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java @@ -166,14 +166,6 @@ public abstract class Dict public static final String TOO_GENERIC = "too_generic"; - // - // Sample & Experiment Browsers - // - - public static final String BUTTON_ASSIGN_PROPERTY = "button_assign_property"; - - public static final String BUTTON_INVALIDATE = "button_invalidate"; - // // Sample Browser // @@ -204,6 +196,8 @@ public abstract class Dict public static final String PART_OF = "part_of"; + public static final String BUTTON_INVALIDATE = "button_invalidate"; + // // Experiment Browser // 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 00c308ffc01eb9e9fb8e2891f43a6bbed02fa0ee..59ef502ad7317df611388d188ae9166ce47bfa9e 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 @@ -86,8 +86,8 @@ final class ComponentProvider { public ITabItem create() { - return new DefaultTabItem("Not implemented feature", new DummyComponent(), - false); + return new DefaultTabItem(getMessage(Dict.NOT_IMPLEMENTED), + new DummyComponent(), false); } public String getId() @@ -343,30 +343,18 @@ final class ComponentProvider public ITabItemFactory getPropertyTypeExperimentTypeAssignmentForm() { - return new ITabItemFactory() - { - EntityKind entityKind = EntityKind.EXPERIMENT; - - public ITabItem create() - { - Component component = new PropertyTypeAssignmentForm(viewContext, entityKind); - return new DefaultTabItem(getMessage(Dict.ASSIGN_EXPERIMENT_PROPERTY_TYPE), - component, true); - } - - public String getId() - { - return PropertyTypeAssignmentForm.createId(entityKind); - } - }; + return getPropertyTypeAssignmentForm(EntityKind.EXPERIMENT); } public ITabItemFactory getPropertyTypeSampleTypeAssignmentForm() + { + return getPropertyTypeAssignmentForm(EntityKind.SAMPLE); + } + + private ITabItemFactory getPropertyTypeAssignmentForm(final EntityKind entityKind) { return new ITabItemFactory() { - EntityKind entityKind = EntityKind.SAMPLE; - public ITabItem create() { Component component = new PropertyTypeAssignmentForm(viewContext, entityKind); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java index 6a01633ae2f85cd0fb9fc16ee0f6ea49e50fa1f4..630e6647fbbbf10834072908b0435447bdd36bfe 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java @@ -20,11 +20,16 @@ import java.util.List; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import ch.systemsx.cisd.openbis.generic.client.shared.EntityKind; import ch.systemsx.cisd.openbis.generic.client.shared.ExperimentType; 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; 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.DispatcherHelper; @@ -71,9 +76,25 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, { super(viewContext, GRID_ID); this.topToolbar = topToolbar; + extendToolbar(); + setId(BROWSER_ID); + } + + private void extendToolbar() + { SelectionChangedListener<?> refreshButtonListener = addRefreshButton(topToolbar); this.topToolbar.setCriteriaChangedListener(refreshButtonListener); - setId(BROWSER_ID); + this.topToolbar.add(new FillToolItem()); + + String showDetailsTitle = viewContext.getMessage(Dict.BUTTON_SHOW_DETAILS); + Button showDetailsButton = + createSelectedItemButton(showDetailsTitle, asShowEntityInvoker()); + this.topToolbar.add(new AdapterToolItem(showDetailsButton)); + + this.topToolbar.add(new SeparatorToolItem()); + String invalidateTitle = viewContext.getMessage(Dict.BUTTON_INVALIDATE); + Button invalidateButton = createSelectedItemDummyButton(invalidateTitle); + this.topToolbar.add(new AdapterToolItem(invalidateButton)); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java index 2bdd68656df467ad3726c9aa12931fbd6313f104..f56e55db3fb7e93d9383349460df7391d87ef82e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java @@ -30,14 +30,18 @@ import com.extjs.gxt.ui.client.data.PagingLoadConfig; import com.extjs.gxt.ui.client.data.PagingLoadResult; import com.extjs.gxt.ui.client.data.PagingLoader; import com.extjs.gxt.ui.client.data.RpcProxy; +import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.GridEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.event.SelectionEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; @@ -462,6 +466,85 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex }; } + protected interface ISelectedEntityInvoker<M> + { + void invoke(M selectedItem); + } + + protected final ISelectedEntityInvoker<M> asShowEntityInvoker() + { + return new ISelectedEntityInvoker<M>() + { + public void invoke(M selectedItem) + { + showEntityViewer(selectedItem); + } + }; + } + + private ISelectedEntityInvoker<M> createNotImplementedInvoker() + { + return new ISelectedEntityInvoker<M>() + { + public void invoke(M selectedItem) + { + MessageBox.alert(viewContext.getMessage(Dict.MESSAGEBOX_WARNING), viewContext + .getMessage(Dict.NOT_IMPLEMENTED), null); + } + }; + } + + /** + * @return a button which has no action but is enabled only when one entity in the grid is + * selected. Useful only for writing prototypes. + */ + protected final Button createSelectedItemDummyButton(final String title) + { + return createSelectedItemButton(title, createNotImplementedInvoker()); + } + + /** + * @return a button which is enabled only when one entity in the grid is selected. When button + * is pressed, the specified invoker action is performed. + */ + protected final Button createSelectedItemButton(final String title, + final ISelectedEntityInvoker<M> invoker) + { + final Button button = new Button(title, new SelectionListener<ButtonEvent>() + { + @Override + public void componentSelected(ButtonEvent ce) + { + M selectedItem = tryGetSelectedItem(); + if (selectedItem != null) + { + invoker.invoke(selectedItem); + } + } + }); + button.setEnabled(false); + grid.getSelectionModel().addListener(Events.SelectionChange, + new Listener<SelectionEvent<ModelData>>() + { + public void handleEvent(SelectionEvent<ModelData> se) + { + boolean enabled = (se.selection.size() > 0); + button.setEnabled(enabled); + } + + }); + return button; + } + + /** + * @return item selected in the grid or null if nothing is selected (can happen when a grid is + * empty) + */ + protected final M tryGetSelectedItem() + { + return grid.getSelectionModel().getSelectedItem(); + } + protected final SelectionChangedListener<?> addRefreshButton(ToolBar container) { String title = viewContext.getMessage(Dict.BUTTON_SHOW); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java index 4de44ddfb035b1de11da42046283a433aab494fe..ed404d63291bc3c3d0f301b7a5fe67ae866126f2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java @@ -20,11 +20,16 @@ import java.util.List; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import ch.systemsx.cisd.openbis.generic.client.shared.EntityKind; import ch.systemsx.cisd.openbis.generic.client.shared.SampleType; 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; 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.DispatcherHelper; @@ -85,9 +90,25 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM { super(viewContext, GRID_ID + idSuffix); this.topToolbar = topToolbar; + extendToolbar(); + setId(BROWSER_ID); + } + + private void extendToolbar() + { SelectionChangedListener<?> refreshButtonListener = addRefreshButton(topToolbar); this.topToolbar.setCriteriaChangedListener(refreshButtonListener); - setId(BROWSER_ID); + this.topToolbar.add(new FillToolItem()); + + String showDetailsTitle = viewContext.getMessage(Dict.BUTTON_SHOW_DETAILS); + Button showDetailsButton = + createSelectedItemButton(showDetailsTitle, asShowEntityInvoker()); + this.topToolbar.add(new AdapterToolItem(showDetailsButton)); + + this.topToolbar.add(new SeparatorToolItem()); + String invalidateTitle = viewContext.getMessage(Dict.BUTTON_INVALIDATE); + Button invalidateButton = createSelectedItemDummyButton(invalidateTitle); + this.topToolbar.add(new AdapterToolItem(invalidateButton)); } private SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js index 3b355a3a378f29b23400efa1697ab11e45e1d174..a46c9081f0fe7809fb27a7f889f3f7010475926d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js @@ -13,6 +13,7 @@ var common = { registrator: "Registrator", registration_date: "Registration Date", filter: "Filter", + not_implemented: "Sorry, feature has not been implemented yet!", // // Field @@ -43,6 +44,8 @@ var common = { button_show: "Show", button_exportData: "Export Data", button_add_group: "Add Group", + button_show_details: "Show Details", + tooltip_refresh_disabled: "To activate select appropriate criteria first.", tooltip_refresh_enabled: "Load or update the table.", tooltip_export_enabled: "Export the table visible on the screen to an Excel file", @@ -114,7 +117,7 @@ var common = { part_of: "Container {0}", invalidation: "Invalidation", invalidation_template: "Invalidated by: {0}<br>Invalidation Date: {1}<br>Invalidation Reason: {2}", - + button_invalidate: "Invalidate", // // Experiment Browser