fix #7570 implementing intitution editor with basic set of fields
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 25 Jul 2018 14:17:55 +0000 (16:17 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 25 Jul 2018 14:17:55 +0000 (16:17 +0200)
src/main/java/eu/etaxonomy/cdm/vaadin/event/InstitutionEditorAction.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/model/common/AgentBaseDTO.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/model/common/InstitutionDTO.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionEditorPresenter.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditor.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditorView.java [new file with mode: 0644]

diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/event/InstitutionEditorAction.java b/src/main/java/eu/etaxonomy/cdm/vaadin/event/InstitutionEditorAction.java
new file mode 100644 (file)
index 0000000..949e881
--- /dev/null
@@ -0,0 +1,51 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.event;
+
+import java.util.UUID;
+
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Field;
+
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.vaadin.event.EditorActionType;
+import eu.etaxonomy.vaadin.mvp.AbstractView;
+
+/**
+ * @author a.kohlbecker
+ * @since Mar 22, 2017
+ */
+public class InstitutionEditorAction extends AbstractEditorAction<Institution> {
+
+    /**
+     * @param eventType
+     */
+    public InstitutionEditorAction(EditorActionType type) {
+        super(type);
+    }
+
+    /**
+     * @param action
+     * @param source
+     */
+    public InstitutionEditorAction(EditorActionType action, Button source, Field<Institution> target, AbstractView sourceView) {
+        super(action, source, target, sourceView);
+    }
+
+    /**
+     * @param action
+     * @param entityId
+     * @param source
+     * @param sourceView
+     */
+    public InstitutionEditorAction(EditorActionType action, UUID entityUuid, Button source, Field<Institution> target, AbstractView sourceView) {
+        super(action, entityUuid, source, target, sourceView);
+    }
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/model/common/AgentBaseDTO.java b/src/main/java/eu/etaxonomy/cdm/vaadin/model/common/AgentBaseDTO.java
new file mode 100644 (file)
index 0000000..9164c2a
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.model.common;
+
+import eu.etaxonomy.cdm.model.agent.AgentBase;
+import eu.etaxonomy.cdm.vaadin.model.CdmEntityAdapterDTO;
+
+/**
+ * @author a.kohlbecker
+ * @since Jul 25, 2018
+ *
+ */
+public class AgentBaseDTO extends CdmEntityAdapterDTO<AgentBase<?>> {
+
+    private static final long serialVersionUID = 8457280951445449327L;
+
+    /**
+     * @param entity
+     */
+    public AgentBaseDTO(AgentBase<?> entity) {
+        super(entity);
+        // TODO Auto-generated constructor stub
+    }
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/model/common/InstitutionDTO.java b/src/main/java/eu/etaxonomy/cdm/vaadin/model/common/InstitutionDTO.java
new file mode 100644 (file)
index 0000000..59a9d7b
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.model.common;
+
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.cdm.vaadin.model.CdmEntityAdapterDTO;
+
+/**
+ * @author a.kohlbecker
+ * @since Jul 25, 2018
+ *
+ */
+public class InstitutionDTO extends CdmEntityAdapterDTO<Institution> {
+
+    private static final long serialVersionUID = 8457280951445449327L;
+
+    /**
+     * @param entity
+     */
+    public InstitutionDTO(Institution entity) {
+        super(entity);
+    }
+
+    public void setCode(String code){
+        entity.setCode(code);
+    }
+
+    public String getCode(){
+        return entity.getCode();
+    }
+
+    /**
+     * Returns the full name, as distinct from a code, an acronym or initials,
+     * by which this institution is generally known.
+     */
+    public String getName(){
+        return entity.getName();
+    }
+    /**
+     * @see    #getName()
+     */
+    public void setName(String name){
+        entity.setName(name);
+    }
+
+    /**
+     * Returns the parent institution of this institution.
+     * This is for instance the case when this institution is a herbarium
+     * belonging to a parent institution such as a museum.
+     */
+    public Institution getIsPartOf(){
+        return entity.getIsPartOf();
+    }
+
+    /**
+     * Assigns a parent institution to which this institution belongs.
+     *
+     * @param  isPartOf  the parent institution
+     * @see    #getIsPartOf()
+     */
+    public void setIsPartOf(Institution parentInstitution){
+        entity.setIsPartOf(parentInstitution);
+    }
+
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionEditorPresenter.java b/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionEditorPresenter.java
new file mode 100644 (file)
index 0000000..b839594
--- /dev/null
@@ -0,0 +1,174 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.view.common;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
+
+import com.vaadin.spring.annotation.SpringComponent;
+
+import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.model.agent.AgentBase;
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
+import eu.etaxonomy.cdm.service.UserHelperAccess;
+import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
+import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
+import eu.etaxonomy.cdm.vaadin.event.InstitutionEditorAction;
+import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
+import eu.etaxonomy.cdm.vaadin.model.common.InstitutionDTO;
+import eu.etaxonomy.vaadin.mvp.AbstractCdmDTOEditorPresenter;
+import eu.etaxonomy.vaadin.mvp.BoundField;
+import eu.etaxonomy.vaadin.ui.view.PopupView;
+
+/**
+ * @author a.kohlbecker
+ * @since Dec 21, 2017
+ *
+ */
+@SpringComponent
+@Scope("prototype")
+public class InstitutionEditorPresenter extends AbstractCdmDTOEditorPresenter<InstitutionDTO, Institution, InstitutionPopupEditorView> {
+
+    private static final long serialVersionUID = -1996365248431425021L;
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected Institution loadCdmEntity(UUID identifier) {
+
+        List<String> initStrategy = Arrays.asList(new String []{
+
+                "$",
+                "contact.$",
+                "isPartOf.$",
+                }
+        );
+
+        Institution bean;
+        if(identifier != null){
+            bean = (Institution) getRepo().getAgentService().load(identifier, initStrategy);
+        } else {
+            bean = Institution.NewInstance();
+        }
+        return bean;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void guaranteePerEntityCRUDPermissions(UUID identifier) {
+        if(crud != null){
+            newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(Collection.class, identifier, crud, null);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void guaranteePerEntityCRUDPermissions(Institution bean) {
+        if(crud != null){
+            newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(bean, crud, null);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected IService<Institution> getService() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void handleViewEntered() {
+        super.handleViewEntered();
+
+        CdmFilterablePagingProvider<AgentBase, Institution> collectionPagingProvider = new CdmFilterablePagingProvider<AgentBase, Institution>(getRepo().getAgentService(), Institution.class);
+        getView().getPartOfCombobox().getSelect().loadFrom(collectionPagingProvider, collectionPagingProvider, collectionPagingProvider.getPageSize());
+        getView().getPartOfCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<Institution>(getView().getPartOfCombobox(), this));
+
+    }
+
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
+    public void onInstitutionEditorActionAdd(InstitutionEditorAction event) {
+
+        if(!checkFromOwnView(event)){
+            return;
+        }
+
+        InstitutionPopupEditor intitutionPopuEditor = openPopupEditor(InstitutionPopupEditor.class, event);
+
+        intitutionPopuEditor.grantToCurrentUser(this.crud);
+        intitutionPopuEditor.withDeleteButton(true);
+        intitutionPopuEditor.loadInEditor(null);
+    }
+
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
+    public void onCollectionEditorActionEdit(InstitutionEditorAction event) {
+
+        if(!checkFromOwnView(event)){
+            return;
+        }
+
+        InstitutionPopupEditor intitutionPopuEditor = openPopupEditor(InstitutionPopupEditor.class, event);
+
+        intitutionPopuEditor.grantToCurrentUser(this.crud);
+        intitutionPopuEditor.withDeleteButton(true);
+        intitutionPopuEditor.loadInEditor(event.getEntityUuid());
+    }
+
+    @EventBusListenerMethod()
+    public void onEntityChangeEvent(EntityChangeEvent<?> event){
+
+        BoundField boundTargetField = boundTargetField((PopupView) event.getSourceView());
+
+        if(boundTargetField != null){
+            if(boundTargetField.matchesPropertyIdPath("isPartOf")){
+                if(event.isCreateOrModifiedType()){
+
+                    Institution newInstitution = (Institution) event.getEntity();
+                    getCache().load(newInstitution);
+                    if(event.isCreatedType()){
+                        getView().getPartOfCombobox().setValue(newInstitution);
+                    } else {
+                        getView().getPartOfCombobox().reload();
+                    }
+                }
+
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected InstitutionDTO createDTODecorator(Institution cdmEntitiy) {
+        return new InstitutionDTO(cdmEntitiy);
+    }
+
+
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditor.java b/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditor.java
new file mode 100644 (file)
index 0000000..3339dee
--- /dev/null
@@ -0,0 +1,167 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.view.common;
+
+import org.springframework.context.annotation.Scope;
+import org.springframework.security.core.GrantedAuthority;
+
+import com.vaadin.spring.annotation.SpringComponent;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.TextField;
+
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.cdm.vaadin.event.InstitutionEditorAction;
+import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
+import eu.etaxonomy.cdm.vaadin.model.common.InstitutionDTO;
+import eu.etaxonomy.cdm.vaadin.permission.AccessRestrictedView;
+import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator;
+import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
+import eu.etaxonomy.vaadin.event.EditorActionType;
+import eu.etaxonomy.vaadin.mvp.AbstractCdmDTOPopupEditor;
+
+/**
+ * @author a.kohlbecker
+ * @since Dec 21, 2017
+ *
+ */
+@SpringComponent
+@Scope("prototype")
+public class InstitutionPopupEditor extends AbstractCdmDTOPopupEditor<InstitutionDTO, Institution, InstitutionEditorPresenter> implements InstitutionPopupEditorView, AccessRestrictedView {
+
+    private static final long serialVersionUID = 2019724189877425882L;
+
+    private static final int GRID_COLS = 3;
+
+    private static final int GRID_ROWS = 3;
+
+    TextField codeField;
+    TextField codeStandardField;
+    TextField townOrLocationField;
+    ToOneRelatedEntityCombobox<Institution> partOfCombobox;
+
+
+    /**
+     * @param layout
+     * @param dtoType
+     */
+    public InstitutionPopupEditor() {
+        super(new GridLayout(GRID_COLS, GRID_ROWS), InstitutionDTO.class);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getWindowCaption() {
+        return "Institution editor";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getWindowWidth() {
+        return 500;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void focusFirst() {
+        codeField.focus();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean allowAnonymousAccess() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public java.util.Collection<java.util.Collection<GrantedAuthority>> allowedGrantedAuthorities() {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getDefaultComponentStyles() {
+        return "tiny";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void initContent() {
+
+        GridLayout grid = (GridLayout)getFieldLayout();
+        grid.setSizeFull();
+        grid.setSpacing(true);
+
+        int row = 0;
+        codeField = addTextField("Code", "code", 0, row, 0, row);
+        codeField.setWidth(100, Unit.PIXELS);
+
+        townOrLocationField = addTextField("Name", "name", 1, row, 2, row);
+        townOrLocationField.setWidth(200, Unit.PIXELS);
+
+        row++;
+
+        partOfCombobox = new ToOneRelatedEntityCombobox<Institution>("Part of", Institution.class);
+
+
+        partOfCombobox.setWidth(300, Unit.PIXELS);
+        addField(partOfCombobox, "isPartOf", 0, row, 1, row);
+
+        partOfCombobox.getSelect().setCaptionGenerator(
+                new CdmTitleCacheCaptionGenerator<Institution>()
+                );
+        partOfCombobox.getSelect().addValueChangeListener(
+                new ToOneRelatedEntityButtonUpdater<Institution>(partOfCombobox)
+                );
+
+
+        partOfCombobox.addClickListenerAddEntity( e -> getViewEventBus().publish(this,
+                new InstitutionEditorAction(
+                        EditorActionType.ADD,
+                        null,
+                        partOfCombobox,
+                        this)
+                ));
+        partOfCombobox.addClickListenerEditEntity(e -> {
+                if(partOfCombobox.getValue() != null){
+                    getViewEventBus().publish(this,
+                            new InstitutionEditorAction(
+                                EditorActionType.EDIT,
+                                partOfCombobox.getValue().getUuid(),
+                                e.getButton(),
+                                partOfCombobox,
+                                this
+                            )
+                    );
+                }
+            });
+
+    }
+
+    /* ------------------ View Interface methods -------------------- */
+
+    @Override
+    public ToOneRelatedEntityCombobox<Institution> getPartOfCombobox(){
+        return partOfCombobox;
+    }
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditorView.java b/src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditorView.java
new file mode 100644 (file)
index 0000000..0ab93f9
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.view.common;
+
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
+import eu.etaxonomy.vaadin.mvp.ApplicationView;
+
+/**
+ * @author a.kohlbecker
+ * @since Dec 21, 2017
+ *
+ */
+public interface InstitutionPopupEditorView extends ApplicationView<InstitutionEditorPresenter> {
+
+    ToOneRelatedEntityCombobox<Institution> getPartOfCombobox();
+
+}