--- /dev/null
+/**
+* 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);
+ }
+
+}
--- /dev/null
+/**
+* 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
+ }
+
+}
--- /dev/null
+/**
+* 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);
+ }
+
+
+}
--- /dev/null
+/**
+* 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);
+ }
+
+
+
+}
--- /dev/null
+/**
+* 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;
+ }
+}
--- /dev/null
+/**
+* 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();
+
+}