You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/03/04 13:11:06 UTC

[isis] branch master updated: ISIS-2877: allow text based components to replace inline prompt label with edit link icon

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new e7aa0761 ISIS-2877: allow text based components to replace inline prompt label with edit link icon
e7aa0761 is described below

commit e7aa0761562cc867204b384341dbf231ffc32101
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Mar 4 14:10:51 2022 +0100

    ISIS-2877: allow text based components to replace inline prompt label
    with edit link icon
---
 .../ui/components/scalars/ScalarPanelAbstract.java | 36 ++++++++++++----------
 .../scalars/ScalarPanelTextFieldAbstract.html      |  7 +++++
 .../scalars/ScalarPanelTextFieldAbstract.java      | 12 +++++++-
 .../blobclob/IsisBlobOrClobPanelAbstract.java      | 18 +++--------
 .../scalars/markup/ParentedMarkupPanel.java        |  5 +++
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  1 -
 .../wicket/ui/panels/PromptFormAbstract.java       |  6 ++--
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java |  3 +-
 8 files changed, 53 insertions(+), 35 deletions(-)

diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index e0c4070..28eaef4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -76,6 +76,7 @@ import org.apache.isis.viewer.wicket.ui.util.Wkt.EventTopic;
 
 import lombok.Getter;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.experimental.Accessors;
 
@@ -118,9 +119,11 @@ implements ScalarModelSubscriber, HasScalarModel {
         NOTHING
     }
 
+    @RequiredArgsConstructor
     public static class InlinePromptConfig {
-        private final boolean supported;
-        private final Component componentToHideIfAny;
+        @Getter private final boolean supported;
+        @Getter private final Component componentToHideIfAny;
+        @Getter private final boolean useEditIconWithLink;
 
         public static InlinePromptConfig supported() {
             return new InlinePromptConfig(true, null);
@@ -137,14 +140,11 @@ implements ScalarModelSubscriber, HasScalarModel {
         private InlinePromptConfig(final boolean supported, final Component componentToHideIfAny) {
             this.supported = supported;
             this.componentToHideIfAny = componentToHideIfAny;
+            this.useEditIconWithLink = false;
         }
 
-        boolean isSupported() {
-            return supported;
-        }
-
-        Component getComponentToHideIfAny() {
-            return componentToHideIfAny;
+        public InlinePromptConfig withEditIcon() {
+            return new InlinePromptConfig(supported, componentToHideIfAny, true);
         }
     }
 
@@ -264,7 +264,7 @@ implements ScalarModelSubscriber, HasScalarModel {
     private void buildGuiAndCallHooks() {
         buildGui();
 
-        final ScalarModel scalarModel = getModel();
+        final ScalarModel scalarModel = scalarModel();
 
         final String disableReasonIfAny = scalarModel.disableReasonIfAny();
         final boolean mustBeEditable = scalarModel.mustBeEditable();
@@ -372,6 +372,7 @@ implements ScalarModelSubscriber, HasScalarModel {
 
             if (scalarModel.getPromptStyle().isInline()
                     && scalarModel.canEnterEditMode()) {
+
                 // we configure the prompt link if _this_ property is configured for inline edits...
                 Wkt.behaviorAddOnClick(inlinePromptLink, this::onPropertyInlineEditClick);
                 componentToHideRef.setValue(inlinePromptConfig.getComponentToHideIfAny());
@@ -398,6 +399,11 @@ implements ScalarModelSubscriber, HasScalarModel {
             .ifPresent(componentToHide->componentToHide.setVisibilityAllowed(false));
         }
 
+        addEditPropertyIf(
+                scalarModel.canEnterEditMode()
+                && (scalarModel.getPromptStyle().isDialog()
+                        || !inlinePromptConfig.isSupported()));
+
         // prevent from tabbing into non-editable widgets.
         if(scalarModel.isProperty()
                 && scalarModel.getMode() == ScalarRepresentation.VIEWING
@@ -407,7 +413,6 @@ implements ScalarModelSubscriber, HasScalarModel {
             Wkt.noTabbing(getValidationFeedbackReceiver());
         }
 
-        addEditProperty();
         addCssFromMetaModel();
 
         notifyOnChange(this);
@@ -682,18 +687,17 @@ implements ScalarModelSubscriber, HasScalarModel {
             final AjaxRequestTarget target) {
     }
 
-    // ///////////////////////////////////////////////////////////////////
-
-    protected void addEditProperty() {
+    // -- EDIT PROPERTY ICON
 
-        if(scalarModel.canEnterEditMode() &&
-                (scalarModel.getPromptStyle().isDialog() ||
-                        !getInlinePromptConfig().isSupported())) {
+    protected WebMarkupContainer addEditPropertyIf(final boolean condition) {
+        if(condition) {
             val editProperty = Wkt.containerAdd(componentIfRegular, ID_EDIT_PROPERTY);
             Wkt.behaviorAddOnClick(editProperty, this::onPropertyEditClick);
             Tooltips.addTooltip(editProperty, "edit");
+            return editProperty;
         } else {
             Components.permanentlyHide(componentIfRegular, ID_EDIT_PROPERTY);
+            return null;
         }
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
index f5d172f..3334082 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
@@ -83,6 +83,13 @@
                 wicket:id="scalarValue" />
     </wicket:fragment>
 
+	<wicket:fragment wicket:id="editIconAsInlinePrompt">
+        <button class="edit btn btn-sm btn-link" 
+                wicket:id="scalarValue">
+             	<span class="editIcon fa fa-edit"></span>
+        </button>
+    </wicket:fragment>
+
     <wicket:fragment wicket:id="textInlinePrompt">
         <span wicket:id="scalarValue"></span>
     </wicket:fragment>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index e9931f1..f800a7c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -25,6 +25,7 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
+import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.markup.html.panel.Fragment;
@@ -44,6 +45,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.Tooltips;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.AccessLevel;
@@ -170,6 +172,14 @@ extends ScalarPanelWithFormFieldAbstract<T> {
             final String id,
             final IModel<String> inlinePromptModel) {
 
+        if(getInlinePromptConfig().isUseEditIconWithLink()) {
+            val fragment = Wkt.fragmentAddNoTab(this, id, "editIconAsInlinePrompt");
+            val editPromptLink = new Button("scalarValue");
+            fragment.add(editPromptLink);
+            Tooltips.addTooltip(editPromptLink, "edit");
+            return fragment;
+        }
+
         switch(getTextFieldVariant()) {
         case SINGLE_LINE:{
             val fragment = Wkt.fragmentAddNoTab(this, id, "textInlinePrompt");
@@ -177,7 +187,7 @@ extends ScalarPanelWithFormFieldAbstract<T> {
             return fragment;
         }
         case MULTI_LINE:{
-            val fragment = new Fragment(id, "textareaInlinePrompt", this);
+            val fragment = Wkt.fragmentAddNoTab(this, id, "textareaInlinePrompt");
             val inlinePromptTextArea = Wkt.textAreaAddNoTab(fragment, "scalarValue", inlinePromptModel);
             setRowsAndMaxLengthAttributesOn(inlinePromptTextArea);
             return fragment;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
index 495e833..d88ac31 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
@@ -38,7 +38,6 @@ import org.springframework.lang.Nullable;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.NamedWithMimeType;
 import org.apache.isis.core.metamodel.render.ScalarRenderMode;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelWithFormFieldAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.image.WicketImageUtil;
@@ -68,9 +67,11 @@ extends ScalarPanelWithFormFieldAbstract<T> {
     private Image wicketImage;
     private FileUploadField fileUploadField;
     private Label fileNameLabel;
+    private IModel<T> unwrapped;
 
     protected IsisBlobOrClobPanelAbstract(final String id, final ScalarModel scalarModel, final Class<T> type) {
         super(id, scalarModel, type);
+        this.unwrapped = scalarModel.unwrapped(type);
     }
 
     // generic type mismatch; no issue as long as we don't use conversion
@@ -144,9 +145,7 @@ extends ScalarPanelWithFormFieldAbstract<T> {
     }
 
     private FileUploadField createFileUploadField(final String componentId) {
-        val fileUploadField = new BootstrapFileInputField(
-                componentId, fileUploadModel());
-
+        val fileUploadField = new BootstrapFileInputField(componentId, fileUploadModel());
         fileUploadField.getConfig().showUpload(false).mainClass("input-group-sm");
         return fileUploadField;
     }
@@ -161,13 +160,6 @@ extends ScalarPanelWithFormFieldAbstract<T> {
         updateRegularFormComponents(ScalarRenderMode.VIEWING, null, target);
     }
 
-    @SuppressWarnings("unchecked")
-    private Optional<T> getBlobOrClob(final ScalarModel model) {
-        val adapter = model.getObject();
-        val pojo = ManagedObjects.UnwrapUtil.single(adapter);
-        return Optional.ofNullable((T)pojo);
-    }
-
     protected abstract IModel<List<FileUpload>> fileUploadModel();
     protected abstract IResource newResource(final T namedWithMimeType);
 
@@ -236,7 +228,6 @@ extends ScalarPanelWithFormFieldAbstract<T> {
     }
 
     private Label createFileNameLabel(final String idFileName, final MarkupContainer formComponent) {
-
         val fileNameLabel = Wkt.labelAdd(formComponent, idFileName, ()->
             getBlobOrClobFromModel()
             .map(NamedWithMimeType::getName)
@@ -271,7 +262,6 @@ extends ScalarPanelWithFormFieldAbstract<T> {
             ajax.add(clearButton);
             ajax.add(ajaxLink);
         });
-
     }
 
     private MarkupContainer createDownloadLink(final String id, final MarkupContainer parent) {
@@ -289,7 +279,7 @@ extends ScalarPanelWithFormFieldAbstract<T> {
     }
 
     private Optional<T> getBlobOrClobFromModel() {
-        return getBlobOrClob(getModel());
+        return Optional.ofNullable(unwrapped.getObject());
     }
 
     private Image asWicketImage(final String id) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/ParentedMarkupPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/ParentedMarkupPanel.java
index 36bddfd..dcaacc8 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/ParentedMarkupPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/ParentedMarkupPanel.java
@@ -57,6 +57,11 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
     }
 
     @Override
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return super.getInlinePromptConfig().withEditIcon();
+    }
+
+    @Override
     protected Component createComponentForCompact() {
         return createMarkupComponent(ID_SCALAR_IF_COMPACT);
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 8f23f0e..ed48ce6 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -288,7 +288,6 @@ implements ActionPromptProvider {
                 if(childComponent != null) {
                     markupId = childComponent.getMarkupId();
                 }
-
             }
         }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index 61d6cf8..07f70dc 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -172,9 +172,11 @@ implements ScalarModelSubscriber {
             return;
         }
         final MarkupContainer parentContainer = this.parentPanel.getParent();
-        if (parentContainer != null) {
-            entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, parentContainer.getPageRelativePath());
+        if (parentContainer == null) {
+            return;
+
         }
+        entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, parentContainer.getPageRelativePath());
     }
 
     private UiHintContainer pageUiHintContainerIfAny() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
index 4623bc0..9772e8a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
@@ -728,10 +728,11 @@ public class Wkt {
 
     // -- TABBING UTILITY
 
-    public static void noTabbing(final @Nullable Component component) {
+    public Component noTabbing(final @Nullable Component component) {
         if(component != null) {
             component.add(new AttributeAppender("tabindex", "-1"));
         }
+        return component;
     }