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/03 13:41:28 UTC

[isis] branch master updated (9e6232f -> 160728c)

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

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


    from 9e6232f  ISIS-2877: regression: fixes missing tree theme
     new 05128d5  ISIS-2877: improve wkt utilities
     new 160728c  ISIS-2877: some refactoring around scalar panels

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../ui/components/scalars/ScalarPanelAbstract.java | 183 ++++++++-------------
 .../scalars/ScalarPanelSelectAbstract.java         |  31 +---
 .../scalars/ScalarPanelTextFieldAbstract.java      |  93 +----------
 .../scalars/ScalarPanelWithFormFieldAbstract.java  |  96 ++++++++++-
 .../isis/viewer/wicket/ui/util/Tooltips.java       |  16 +-
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java |   5 +-
 6 files changed, 181 insertions(+), 243 deletions(-)

[isis] 02/02: ISIS-2877: some refactoring around scalar panels

Posted by ah...@apache.org.
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

commit 160728cd9cd8e4729cf03cd590a25fd74eb8ea41
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 3 14:13:06 2022 +0100

    ISIS-2877: some refactoring around scalar panels
---
 .../ui/components/scalars/ScalarPanelAbstract.java | 183 ++++++++-------------
 .../scalars/ScalarPanelSelectAbstract.java         |  31 +---
 .../scalars/ScalarPanelTextFieldAbstract.java      |  93 +----------
 .../scalars/ScalarPanelWithFormFieldAbstract.java  |  96 ++++++++++-
 4 files changed, 167 insertions(+), 236 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 3c05472..59ecf50 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
@@ -30,7 +30,6 @@ import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.LabeledWebMarkupContainer;
 import org.apache.wicket.model.IModel;
 import org.springframework.lang.Nullable;
 
@@ -55,7 +54,6 @@ import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.InlinePromptContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
@@ -71,6 +69,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueCho
 import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLink;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
+import org.apache.isis.viewer.wicket.ui.util.Tooltips;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 import org.apache.isis.viewer.wicket.ui.util.Wkt.EventTopic;
 
@@ -119,6 +118,36 @@ implements ScalarModelSubscriber {
         NOTHING
     }
 
+    public static class InlinePromptConfig {
+        private final boolean supported;
+        private final Component componentToHideIfAny;
+
+        public static InlinePromptConfig supported() {
+            return new InlinePromptConfig(true, null);
+        }
+
+        public static InlinePromptConfig notSupported() {
+            return new InlinePromptConfig(false, null);
+        }
+
+        public static InlinePromptConfig supportedAndHide(final Component componentToHideIfAny) {
+            return new InlinePromptConfig(true, componentToHideIfAny);
+        }
+
+        private InlinePromptConfig(final boolean supported, final Component componentToHideIfAny) {
+            this.supported = supported;
+            this.componentToHideIfAny = componentToHideIfAny;
+        }
+
+        boolean isSupported() {
+            return supported;
+        }
+
+        Component getComponentToHideIfAny() {
+            return componentToHideIfAny;
+        }
+    }
+
     /**
      *
      * @param paramModel - the action being invoked
@@ -175,36 +204,6 @@ implements ScalarModelSubscriber {
                 : Repaint.NOTHING;
     }
 
-    public static class InlinePromptConfig {
-        private final boolean supported;
-        private final Component componentToHideIfAny;
-
-        public static InlinePromptConfig supported() {
-            return new InlinePromptConfig(true, null);
-        }
-
-        public static InlinePromptConfig notSupported() {
-            return new InlinePromptConfig(false, null);
-        }
-
-        public static InlinePromptConfig supportedAndHide(final Component componentToHideIfAny) {
-            return new InlinePromptConfig(true, componentToHideIfAny);
-        }
-
-        private InlinePromptConfig(final boolean supported, final Component componentToHideIfAny) {
-            this.supported = supported;
-            this.componentToHideIfAny = componentToHideIfAny;
-        }
-
-        boolean isSupported() {
-            return supported;
-        }
-
-        Component getComponentToHideIfAny() {
-            return componentToHideIfAny;
-        }
-    }
-
     // -- CONSTRUCTION
 
     /**
@@ -218,7 +217,7 @@ implements ScalarModelSubscriber {
     private Component componentIfCompact;
     protected final Component getComponentForCompact() { return componentIfCompact; }
     /**
-     * Builds the component to render the model when in {@link Rendering#COMPACT compact} format.
+     * Builds the component to render the model when in COMPACT format.
      * <p>Is added to {@link #scalarTypeContainer}.
      */
     protected abstract Component createComponentForCompact();
@@ -228,7 +227,7 @@ implements ScalarModelSubscriber {
     private MarkupContainer componentIfRegular;
     protected final MarkupContainer getComponentForRegular() { return componentIfRegular; }
     /**
-     * Builds the component to render the model when in {@link Rendering#REGULAR regular} format.
+     * Builds the component to render the model when in REGULAR format.
      * <p>Is added to {@link #scalarTypeContainer}.
      */
     protected abstract MarkupContainer createComponentForRegular();
@@ -258,15 +257,11 @@ implements ScalarModelSubscriber {
     @Override
     protected void onInitialize() {
         super.onInitialize();
-
         buildGuiAndCallHooks();
-
         setOutputMarkupId(true);
-
     }
 
     private void buildGuiAndCallHooks() {
-
         buildGui();
 
         final ScalarModel scalarModel = getModel();
@@ -286,7 +281,6 @@ implements ScalarModelSubscriber {
                 onInitializeEditable();
             }
         }
-
     }
 
     /**
@@ -327,9 +321,10 @@ implements ScalarModelSubscriber {
         scalarTypeContainer = Wkt.containerAdd(this, ID_SCALAR_TYPE_CONTAINER);
         Wkt.cssAppend(scalarTypeContainer, getCssClassName());
 
-        this.componentIfCompact = createComponentForCompact();
-        this.componentIfRegular = createComponentForRegular();
-        componentIfRegular.setOutputMarkupId(true);
+        componentIfRegular = createComponentForRegular();
+        componentIfCompact = createComponentForCompact();
+
+        componentIfRegular.setOutputMarkupId(true); // enable as AJAX target
 
         scalarTypeContainer.addOrReplace(componentIfCompact, componentIfRegular);
 
@@ -345,13 +340,13 @@ implements ScalarModelSubscriber {
         .map(LinkAndLabelFactory.forPropertyOrParameter(scalarModel))
         .collect(Can.toCan());
 
-        final InlinePromptConfig inlinePromptConfig = getInlinePromptConfig();
+        val inlinePromptConfig = getInlinePromptConfig();
         if(inlinePromptConfig.isSupported()) {
 
-            this.scalarIfRegularInlinePromptForm = createInlinePromptForm();
-            scalarTypeContainer.addOrReplace(scalarIfRegularInlinePromptForm);
-            inlinePromptLink = createInlinePromptLink();
-            componentIfRegular.add(inlinePromptLink);
+            scalarTypeContainer
+                .addOrReplace(scalarIfRegularInlinePromptForm = createInlinePromptForm());
+            componentIfRegular
+                .add(inlinePromptLink = createInlinePromptLink());
 
             // even if this particular scalarModel (property) is not configured for inline edits,
             // it's possible that one of the associated actions is.  Thus we set the prompt context
@@ -405,7 +400,22 @@ implements ScalarModelSubscriber {
         addEditPropertyTo(componentIfRegular);
         addFeedbackOnlyTo(componentIfRegular, getValidationFeedbackReceiver());
 
-        getRendering().buildGui(this);
+        switch(scalarModel.getRenderingHint()) {
+        case REGULAR:
+            //componentIfRegular = createComponentForRegular();
+            //componentIfCompact = Wkt.container(ID_SCALAR_IF_COMPACT); // empty component
+            componentIfRegular.setVisible(true);
+            componentIfCompact.setVisible(false);
+            break;
+        default:
+            //componentIfRegular = Wkt.container(ID_SCALAR_IF_REGULAR); // empty component
+            //componentIfCompact = createComponentForCompact();
+            componentIfRegular.setVisible(false);
+            componentIfCompact.setVisible(true);
+            Components.permanentlyHide(componentIfRegular, ID_SCALAR_NAME);
+            break;
+        }
+
         addCssFromMetaModel();
 
         notifyOnChange(this);
@@ -473,12 +483,8 @@ implements ScalarModelSubscriber {
      */
     @Override
     protected void onConfigure() {
-
-        final ScalarModel scalarModel = getModel();
-
-        final boolean hidden = scalarModel.whetherHidden();
+        final boolean hidden = scalarModel().whetherHidden();
         setVisibilityAllowed(!hidden);
-
         super.onConfigure();
     }
 
@@ -548,72 +554,22 @@ implements ScalarModelSubscriber {
     public void onError(final AjaxRequestTarget target, final ScalarPanelAbstract scalarPanel) {
     }
 
-
-    // ///////////////////////////////////////////////////////////////////
-
-
-    public enum Rendering {
-        /**
-         * Does not show labels, eg for use in tables
-         */
-        COMPACT {
-            @Override
-            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
-                return "";
-            }
-
-            @Override
-            public void buildGui(final ScalarPanelAbstract panel) {
-                panel.componentIfCompact.setVisible(true);
-                panel.componentIfRegular.setVisible(false);
-                Components.permanentlyHide(panel.componentIfRegular, ID_SCALAR_NAME);
-            }
-
-        },
-        /**
-         * Does show labels, eg for use in forms.
-         */
-        REGULAR {
-            @Override
-            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
-                return labeledContainer.getLabel().getObject();
-            }
-
-            @Override
-            public void buildGui(final ScalarPanelAbstract panel) {
-                panel.componentIfRegular.setVisible(true);
-                panel.componentIfCompact.setVisible(false);
-            }
-
-        };
-
-        public abstract String getLabelCaption(LabeledWebMarkupContainer labeledContainer);
-
-        public abstract void buildGui(ScalarPanelAbstract panel);
-
-        private static Rendering renderingFor(final EntityModel.RenderingHint renderingHint) {
-            return renderingHint.isRegular()? Rendering.REGULAR :Rendering.COMPACT;
-        }
-    }
-
-    protected Rendering getRendering() {
-        return Rendering.renderingFor(scalarModel.getRenderingHint());
-    }
-
     // ///////////////////////////////////////////////////////////////////
 
-    protected Label createScalarName(final String id, final String labelCaption) {
-        final Label scalarName = Wkt.label(id, labelCaption);
-        final ScalarModel scalarModel = getModel();
+    protected Label createScalarNameLabel(final String id, final IModel<String> labelCaption) {
+        final Label scalarNameLabel = Wkt.label(id, labelCaption);
+        val scalarModel = scalarModel();
         if(scalarModel.isRequired()
                 && scalarModel.isEnabled()) {
-            final String label = scalarName.getDefaultModelObjectAsString();
+            final String label = scalarNameLabel.getDefaultModelObjectAsString();
             if(!_Strings.isNullOrEmpty(label)) {
-                Wkt.cssAppend(scalarName, "mandatory");
+                Wkt.cssAppend(scalarNameLabel, "mandatory");
             }
         }
-        scalarName.setEscapeModelStrings(true);
-        return scalarName;
+        scalarNameLabel.setEscapeModelStrings(true);
+        scalarModel.getDescribedAs()
+            .ifPresent(describedAs->Tooltips.addTooltip(scalarNameLabel, describedAs));
+        return scalarNameLabel;
     }
 
     /**
@@ -686,7 +642,6 @@ implements ScalarModelSubscriber {
         target.add(scalarTypeContainer);
 
         Wkt.focusOnMarkerAttribute(scalarIfRegularInlinePromptForm, target);
-
     }
 
     private void switchFormForInlinePrompt(final AjaxRequestTarget target) {
@@ -706,10 +661,8 @@ implements ScalarModelSubscriber {
     protected void onSwitchFormForInlinePrompt(
             final WebMarkupContainer inlinePromptForm,
             final AjaxRequestTarget target) {
-
     }
 
-
     // ///////////////////////////////////////////////////////////////////
 
     protected void addEditPropertyTo(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
index de11472..0f8c985 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
@@ -68,36 +68,21 @@ extends ScalarPanelAbstract {
         return select2;
     }
 
-    protected FormGroup createFormGroupAndName(
-            final FormComponent<?> component,
-            final String formGroupId, final String nameId) {
-        final FormGroup formGroup = new FormGroup(formGroupId, component);
-        formGroup.add(component);
-
-        final String labelCaption = getRendering().getLabelCaption(select2.asComponent());
-        final Label scalarName = createScalarName(nameId, labelCaption);
-
-        getModel()
-        .getDescribedAs()
-        .ifPresent(describedAs->Tooltips.addTooltip(scalarName, describedAs));
-
-        formGroup.addOrReplace(scalarName);
-        return formGroup;
-    }
-
     protected FormGroup createFormGroup(final FormComponent<?> formComponent) {
+        val scalarModel = scalarModel();
+        val friendlyNameModel = Model.of(scalarModel.getFriendlyName());
+
         setOutputMarkupId(true);
         select2.asComponent().setOutputMarkupId(true);
+        select2.setLabel(friendlyNameModel);
 
-        final String name = scalarModel().getFriendlyName();
-        select2.setLabel(Model.of(name));
-
-        final FormGroup formGroup = createFormGroupAndName(formComponent, ID_SCALAR_IF_REGULAR, ID_SCALAR_NAME);
+        final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, formComponent);
+        formGroup.add(formComponent);
+        formGroup.addOrReplace(createScalarNameLabel(ID_SCALAR_NAME, friendlyNameModel));
 
         addStandardSemantics();
 
-        final ScalarModel model = getModel();
-        if(model.isRequired() && model.isEnabled()) {
+        if(scalarModel.isRequired() && scalarModel.isEnabled()) {
             Wkt.cssAppend(formGroup, "mandatory");
         }
         return formGroup;
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 fa8595e..b6c668b 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
@@ -20,11 +20,9 @@ package org.apache.isis.viewer.wicket.ui.components.scalars;
 
 import java.io.Serializable;
 import java.util.Locale;
-import java.util.Optional;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.FormComponent;
@@ -46,7 +44,6 @@ 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;
@@ -57,18 +54,12 @@ import lombok.val;
 /**
  * Adapter for {@link PanelAbstract panel}s that use a {@link ScalarModel} as
  * their backing model.
- *
  * <p>
  * Supports the concept of being
- * {@link org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Rendering#COMPACT}
- * (eg within a table) or
- * {@link org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Rendering#REGULAR regular}
- * (eg within a form).
- * </p>
- *
+ * COMPACT (eg within a table) or
+ * REGULAR (eg within a form).
  * <p>
  * This implementation is for panels that use a textfield/text area.
- * </p>
  */
 public abstract class ScalarPanelTextFieldAbstract<T extends Serializable>
 extends ScalarPanelWithFormFieldAbstract
@@ -230,9 +221,7 @@ implements TextFieldValueModel.ScalarModelProvider {
     // --
 
     /**
-     * Builds the component to render the model when in
-     * {@link org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Rendering#COMPACT}
-     * format.
+     * Builds the component to render the model when in COMPACT format.
      * <p>
      * The (textual) default implementation uses a {@link Label}.
      * However, it may be overridden if required.
@@ -269,11 +258,6 @@ implements TextFieldValueModel.ScalarModelProvider {
     // //////////////////////////////////////
 
     @Override
-    protected InlinePromptConfig getInlinePromptConfig() {
-        return InlinePromptConfig.supportedAndHide(getFormComponent());
-    }
-
-    @Override
     protected IModel<String> obtainInlinePromptModel() {
         IModel<?> model = getFormComponent().getModel();
         // must be "live", for ajax updates.
@@ -307,77 +291,6 @@ implements TextFieldValueModel.ScalarModelProvider {
 
     // //////////////////////////////////////
 
-
-    @Override
-    protected void onInitializeNotEditable() {
-        super.onInitializeNotEditable();
-
-        getFormComponent().setEnabled(false);
-
-        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
-            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(getFormComponent());
-        }
-
-        clearTooltip();
-    }
-
-    @Override
-    protected void onInitializeReadonly(final String disableReason) {
-        super.onInitializeReadonly(disableReason);
-
-        getFormComponent().setEnabled(false);
-
-        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
-            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(getFormComponent());
-        }
-
-        inlinePromptLink.setEnabled(false);
-
-        setTooltip(disableReason);
-    }
-
-    @Override
-    protected void onInitializeEditable() {
-        super.onInitializeEditable();
-        getFormComponent().setEnabled(true);
-        inlinePromptLink.setEnabled(true);
-        clearTooltip();
-    }
-
-    @Override
-    protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) {
-        getFormComponent().setEnabled(false);
-        inlinePromptLink.setEnabled(false);
-        setTooltip(disableReason);
-        target.ifPresent(ajax->{
-            ajax.add(getFormComponent());
-            ajax.add(inlinePromptLink);
-        });
-    }
-
-    @Override
-    protected void onEditable(final Optional<AjaxRequestTarget> target) {
-        getFormComponent().setEnabled(true);
-        inlinePromptLink.setEnabled(true);
-        clearTooltip();
-        target.ifPresent(ajax->{
-            ajax.add(getFormComponent());
-            ajax.add(inlinePromptLink);
-        });
-    }
-
-    private void setTooltip(final String tooltip) {
-        Tooltips.addTooltip(getFormComponent(), tooltip);
-        Tooltips.addTooltip(inlinePromptLink, tooltip);
-    }
-
-    private void clearTooltip() {
-        Tooltips.clearTooltip(getFormComponent());
-        Tooltips.clearTooltip(inlinePromptLink);
-    }
-
-    // //////////////////////////////////////
-
     private static Integer getMaxLengthOf(final @NonNull ScalarModel model) {
         return model.getScalarTypeSpec()
                 .lookupFacet(MaxLengthFacet.class)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
index 88480ca..2cf2cc7 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
@@ -18,14 +18,17 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import java.util.Optional;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -55,7 +58,9 @@ extends ScalarPanelAbstract {
     // -- FORM COMPONENT
 
     private FormComponent<?> formComponent;
+    @Nullable
     protected final FormComponent<?> getFormComponent() { return formComponent; }
+
     /**
      * Builds the component to render the form field.
      */
@@ -67,8 +72,10 @@ extends ScalarPanelAbstract {
     protected final MarkupContainer createComponentForRegular() {
         val scalarModel = scalarModel();
 
+        val friendlyNameModel = Model.of(scalarModel.getFriendlyName());
+
         formComponent = createFormComponent(scalarModel);
-        formComponent.setLabel(Model.of(scalarModel.getFriendlyName()));
+        formComponent.setLabel(friendlyNameModel);
 
         final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, formComponent);
         formGroup.add(formComponent);
@@ -79,12 +86,7 @@ extends ScalarPanelAbstract {
             Wkt.cssAppend(formGroup, "mandatory");
         }
 
-        final String labelCaption = getRendering().getLabelCaption(formComponent);
-        final Label scalarName = createScalarName(ID_SCALAR_NAME, labelCaption);
-        formGroup.add(scalarName);
-
-        scalarModel.getDescribedAs()
-            .ifPresent(describedAs->Tooltips.addTooltip(scalarName, describedAs));
+        formGroup.add(createScalarNameLabel(ID_SCALAR_NAME, friendlyNameModel));
 
         formComponent.add(createValidator(scalarModel));
 
@@ -125,4 +127,82 @@ extends ScalarPanelAbstract {
         };
     }
 
+    @Override
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return getFormComponent()!=null
+                ? InlinePromptConfig.supportedAndHide(getFormComponent())
+                : InlinePromptConfig.notSupported();
+    }
+
+    @Override
+    protected void onInitializeNotEditable() {
+        if(getFormComponent()!=null) {
+            //keep inlinePromptLink (if any) enabled
+            getFormComponent().setEnabled(false);
+        }
+        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
+            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(getFormComponent());
+        }
+        clearTooltip();
+    }
+
+    @Override
+    protected void onInitializeReadonly(final String disableReason) {
+        formComponentEnable(false);
+        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
+            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(getFormComponent());
+        }
+        setTooltip(disableReason);
+    }
+
+    @Override
+    protected void onInitializeEditable() {
+        formComponentEnable(true);
+        clearTooltip();
+    }
+
+    @Override
+    protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) {
+        formComponentEnable(false);
+        setTooltip(disableReason);
+        target.ifPresent(this::formComponentAddTo);
+    }
+
+    @Override
+    protected void onEditable(final Optional<AjaxRequestTarget> target) {
+        formComponentEnable(true);
+        clearTooltip();
+        target.ifPresent(this::formComponentAddTo);
+    }
+
+    // -- HELPER
+
+    private void formComponentEnable(final boolean b) {
+        if(getFormComponent()!=null) {
+            getFormComponent().setEnabled(b);
+        }
+        if(inlinePromptLink!=null) {
+            inlinePromptLink.setEnabled(b);
+        }
+    }
+
+    private void formComponentAddTo(final AjaxRequestTarget ajax) {
+        if(getFormComponent()!=null) {
+            ajax.add(getFormComponent());
+        }
+        if(inlinePromptLink!=null) {
+            ajax.add(inlinePromptLink);
+        }
+    }
+
+    private void setTooltip(final String tooltip) {
+        Tooltips.addTooltip(getFormComponent(), tooltip);
+        Tooltips.addTooltip(inlinePromptLink, tooltip);
+    }
+
+    private void clearTooltip() {
+        Tooltips.clearTooltip(getFormComponent());
+        Tooltips.clearTooltip(inlinePromptLink);
+    }
+
 }

[isis] 01/02: ISIS-2877: improve wkt utilities

Posted by ah...@apache.org.
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

commit 05128d504ac969fa53294c57e5fe672f79a34de6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 3 13:49:31 2022 +0100

    ISIS-2877: improve wkt utilities
---
 .../org/apache/isis/viewer/wicket/ui/util/Tooltips.java  | 16 ++++++++++------
 .../java/org/apache/isis/viewer/wicket/ui/util/Wkt.java  |  5 ++++-
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Tooltips.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Tooltips.java
index e43d790..2dd56d9 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Tooltips.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Tooltips.java
@@ -28,7 +28,6 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.viewer.common.model.decorator.tooltip.TooltipUiModel;
 import org.apache.isis.viewer.wicket.ui.util.ExtendedPopoverConfig.PopoverBoundary;
 
-import lombok.NonNull;
 import lombok.val;
 import lombok.experimental.UtilityClass;
 
@@ -54,9 +53,11 @@ public class Tooltips {
      * @param tooltipUiModel
      */
     public static void addTooltip(
-            final @NonNull Component target,
+            final @Nullable Component target,
             final @Nullable TooltipUiModel tooltipUiModel) {
-        if(tooltipUiModel==null || _Strings.isEmpty(tooltipUiModel.getBody())) {
+        if(target ==null
+                || tooltipUiModel==null
+                || _Strings.isEmpty(tooltipUiModel.getBody())) {
             return; // no body so don't render
         }
 
@@ -71,7 +72,10 @@ public class Tooltips {
         target.add(tooltipBehavior);
     }
 
-    public static void clearTooltip(final Component target) {
+    public static void clearTooltip(final @Nullable Component target) {
+        if(target==null) {
+            return;
+        }
         target.getBehaviors(PopoverBehavior.class)
         .forEach(target::remove);
     }
@@ -80,13 +84,13 @@ public class Tooltips {
 
     //sonar-ignore-on ... fails to interpret _Strings.isEmpty as null guard
 
-    public static void addTooltip(@NonNull final Component target, @Nullable final String body) {
+    public static void addTooltip(final @Nullable Component target, @Nullable final String body) {
         addTooltip(target, _Strings.isEmpty(body)
                 ? null
                 : TooltipUiModel.ofBody(body));
     }
 
-    public static void addTooltip(@NonNull final Component target, @Nullable final String label, @Nullable final String body) {
+    public static void addTooltip(final @Nullable Component target, @Nullable final String label, @Nullable final String body) {
         addTooltip(target, _Strings.isEmpty(body)
                 ? null
                 : TooltipUiModel.of(label, body));
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 114184b..56684e3 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
@@ -162,7 +162,10 @@ public class Wkt {
         return add(markupContainer, behaviorFireOnEscapeKey(onRespond));
     }
 
-    public void behaviorAddReplaceDisabledTagWithReadonlyTag(final Component component) {
+    public void behaviorAddReplaceDisabledTagWithReadonlyTag(final @Nullable Component component) {
+        if(component==null) {
+            return;
+        }
         if (component.getBehaviors(ReplaceDisabledTagWithReadonlyTagBehavior.class).isEmpty()) {
             component.add(new ReplaceDisabledTagWithReadonlyTagBehavior());
         }