ref #8192 unlock button to allow curator and admin to edit published Registrations
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Fri, 22 Mar 2019 20:32:14 +0000 (21:32 +0100)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Mon, 25 Mar 2019 13:56:26 +0000 (14:56 +0100)
src/main/java/eu/etaxonomy/cdm/vaadin/component/registration/RegistrationItemNameAndTypeButtons.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationWorksetViewBean.java

index 73ace9a668de849505f15b84b3fca5b1a87f2a78..3f4c05d0bf22f31d2bd63077f01354de64ea922b 100644 (file)
@@ -16,6 +16,7 @@ import java.util.UUID;
 import org.apache.log4j.Logger;
 
 import com.vaadin.server.ExternalResource;
+import com.vaadin.server.FontAwesome;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Link;
@@ -59,15 +60,21 @@ public class RegistrationItemNameAndTypeButtons extends CompositeStyledComponent
 
     private List<Label> labels = new ArrayList<>();
 
+    private List<ButtonWithUserEditPermission> editButtons = new ArrayList<>();
+
     private Button addTypeDesignationButton;
 
     private Label nameLabel = null;
 
     private Link identifierLink;
 
+    private boolean isRegistrationLocked;
+
+    private boolean isLockOverride;
+
     public RegistrationItemNameAndTypeButtons(RegistrationDTO regDto, ICdmEntityUuidCacher entitiyCacher) {
 
-        boolean isRegistrationLocked = EnumSet.of(
+        isRegistrationLocked = EnumSet.of(
                 RegistrationStatus.PUBLISHED, RegistrationStatus.REJECTED)
                 .contains(regDto.getStatus());
 
@@ -87,7 +94,7 @@ public class RegistrationItemNameAndTypeButtons extends CompositeStyledComponent
             Label nameLabel = new Label(regDto.getNameRef().getLabel());
             nameLabel.setWidthUndefined();
             boolean userHasPermission = userHelper.userHasPermission(regDto.registration().getName(), CRUD.UPDATE);
-            nameButton.setReadOnly(isRegistrationLocked || ! userHasPermission);
+            editButtons.add(new ButtonWithUserEditPermission(nameButton, userHasPermission));
 
             addComponent(nameIdButton.getButton());
             PermissionDebugUtils.addGainPerEntityPermissionButton(this, TaxonName.class, regDto.getNameRef().getUuid(),
@@ -109,7 +116,7 @@ public class RegistrationItemNameAndTypeButtons extends CompositeStyledComponent
                 Button tdButton = new Button(buttonLabel + ":");
                 tdButton.setDescription("Edit the type designation working set");
                 boolean userHasUpdatePermission = userHelper.userHasPermission(baseEntityRef.getType(), baseEntityRef.getUuid(), CRUD.UPDATE, CRUD.DELETE);
-                tdButton.setReadOnly(isRegistrationLocked || !userHasUpdatePermission);
+                editButtons.add(new ButtonWithUserEditPermission(tdButton, userHasUpdatePermission));
                 addComponent(tdButton);
 
                 PermissionDebugUtils.addGainPerEntityPermissionButton(this, SpecimenOrObservationBase.class,
@@ -149,10 +156,23 @@ public class RegistrationItemNameAndTypeButtons extends CompositeStyledComponent
         }
 
         iterator().forEachRemaining(c -> addStyledComponent(c));
+        updateEditorButtonReadonlyStates();
         addDefaultStyles();
 
     }
 
+
+    private void updateEditorButtonReadonlyStates() {
+        for(ButtonWithUserEditPermission b : editButtons){
+            boolean impossibleToUnlock = !b.userCanEdit && isLockOverride && isRegistrationLocked;
+            b.button.setReadOnly((isRegistrationLocked && !isLockOverride) || !b.userCanEdit);
+            b.button.setEnabled(!impossibleToUnlock);
+            b.button.setDescription(impossibleToUnlock ? "Unlock failed due to missing permissions!" : "");
+            b.button.setIcon(isLockOverride ? FontAwesome.UNLOCK_ALT : null);
+        }
+
+    }
+
     public IdButton<TaxonName> getNameButton() {
         return nameIdButton;
     }
@@ -250,4 +270,43 @@ public class RegistrationItemNameAndTypeButtons extends CompositeStyledComponent
 
     }
 
+    public class ButtonWithUserEditPermission {
+
+        Button button;
+        boolean userCanEdit;
+        /**
+         * @param button
+         * @param userCanEdit
+         */
+        public ButtonWithUserEditPermission(Button button, boolean userCanEdit) {
+            super();
+            this.button = button;
+            this.userCanEdit = userCanEdit;
+        }
+
+
+
+    }
+    public boolean isRegistrationLocked() {
+        return isRegistrationLocked;
+    }
+
+
+    /**
+     * @return the isLockOverride
+     */
+    public boolean isLockOverride() {
+        return isLockOverride;
+    }
+
+    /**
+     * @param isLockOverride the isLockOverride to set
+     */
+    public void setLockOverride(boolean isLockOverride) {
+        if(this.isLockOverride != isLockOverride){
+            this.isLockOverride = isLockOverride;
+            updateEditorButtonReadonlyStates();
+        }
+    }
+
 }
index f2507eeca8fe3d61e3d682eaa5b6e8f49953e8bb..ddf51cfa4d3136ff1111ce414a0f33d4836ecde3 100644 (file)
@@ -438,6 +438,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
 
 
         if(UserHelperAccess.userHelper().userIs(new RoleProber(RolesAndPermissions.ROLE_CURATION)) || UserHelperAccess.userHelper().userIsAdmin()) {
+
             Button editRegistrationButton = new Button(FontAwesome.COG);
             editRegistrationButton.setStyleName(ValoTheme.BUTTON_TINY);
             editRegistrationButton.setDescription("Edit registration");
@@ -448,7 +449,19 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
                 null,
                 this
                 )));
-            regItemButtons.addComponent(editRegistrationButton);
+
+            Button unlockButton = new Button(FontAwesome.LOCK);
+            unlockButton.setStyleName(ValoTheme.BUTTON_TINY);
+            unlockButton.setDescription("Unlock");
+            unlockButton.addClickListener(e -> {
+                regItemButtonGroup.setLockOverride(!regItemButtonGroup.isLockOverride());
+                if(regItemButtonGroup.isRegistrationLocked()){
+                    unlockButton.setIcon(regItemButtonGroup.isLockOverride() ? FontAwesome.UNLOCK_ALT : FontAwesome.LOCK);
+                    unlockButton.setDescription(regItemButtonGroup.isLockOverride() ? "Click to unlock editing" : "Click to lock editing");
+                }
+            });
+            unlockButton.setEnabled(regItemButtonGroup.isRegistrationLocked());
+            regItemButtons.addComponents(unlockButton, editRegistrationButton);
         }
 
         PermissionDebugUtils.addGainPerEntityPermissionButton(regItemButtons, Registration.class, dto.getUuid(),