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/04/17 07:04:43 UTC

[isis] branch master updated: ISIS-3006: display button-group on focused form field

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 fdf8079835 ISIS-3006: display button-group on focused form field
fdf8079835 is described below

commit fdf807983519d93a154ef0fccbb44efa0658bf78
Author: andi-huber <ah...@apache.org>
AuthorDate: Sun Apr 17 09:04:36 2022 +0200

    ISIS-3006: display button-group on focused form field
---
 .../viewer/wicket/model/models/ScalarModel.java    | 13 ++++
 .../components/scalars/ScalarFragmentFactory.java  |  2 +-
 .../components/scalars/ScalarPanelAbstract2.java   | 15 +++--
 .../scalars/ScalarPanelTextFieldAbstract.java      | 38 +++---------
 .../wicket/ui/pages/bootstrap-overrides-all-v2.css |  3 +-
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java | 72 +++++++++++++++++-----
 6 files changed, 87 insertions(+), 56 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index f6a7687074..79b0c012a4 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -20,6 +20,7 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.OptionalInt;
 
 import org.apache.wicket.model.ChainingModel;
 import org.apache.wicket.model.IModel;
@@ -344,4 +345,16 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
         return getAssociatedActions().getFirstAssociatedWithInlineAsIfEdit().isPresent();
     }
 
+    public final OptionalInt multilineNumberOfLines() {
+        return Facets.multilineNumberOfLines(getScalarTypeSpec());
+    }
+
+    public final OptionalInt maxLength() {
+        return Facets.maxLength(getScalarTypeSpec());
+    }
+
+    public final OptionalInt typicalLength() {
+        return Facets.typicalLength(getScalarTypeSpec(), maxLength());
+    }
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarFragmentFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarFragmentFactory.java
index 86265dad69..7310f04348 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarFragmentFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarFragmentFactory.java
@@ -206,7 +206,7 @@ public class ScalarFragmentFactory {
         LABEL("fragment-prompt-label", promptLabelModel->
             Wkt.label(ScalarPanelAbstract.ID_SCALAR_VALUE, promptLabelModel)),
         TEXTAREA("fragment-prompt-textarea", promptLabelModel->
-            Wkt.textAreaNoTab(ScalarPanelAbstract.ID_SCALAR_VALUE, promptLabelModel)),
+            Wkt.textArea(ScalarPanelAbstract.ID_SCALAR_VALUE, promptLabelModel)),
         CHECKBOX_YES("fragment-prompt-checkboxYes", null),
         CHECKBOX_NO("fragment-prompt-checkboxNo", null),
         CHECKBOX_INTERMEDIATE("fragment-prompt-checkboxIntermediate", null),
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 4e882d7f50..735a0b1e77 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -41,12 +41,11 @@ import org.apache.isis.viewer.wicket.ui.panels.FormExecutorDefault;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.val;
 
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField;
-
 /**
  *  Adds inline prompt logic.
  */
@@ -128,10 +127,14 @@ extends ScalarPanelAbstract {
                 && !getRenderScenario().isCompact()) {
             return PromptFragment.TEXTAREA
                     .createFragment(id, this, scalarValueId->{
-                        val textArea = Wkt.textAreaNoTab(scalarValueId, this::obtainOutputFormat);
-                        if(this instanceof ScalarPanelTextFieldAbstract) {
-                            ((ScalarPanelTextFieldAbstract)this).setFormComponentAttributes(textArea);
-                        }
+                        //XXX tab or no-tab?
+                        //XXX always full width
+                        val textArea = Wkt.textArea(scalarValueId, this::obtainOutputFormat);
+                        val scalarModel = scalarModel();
+                        Wkt.setFormComponentAttributes(textArea,
+                                scalarModel::multilineNumberOfLines,
+                                scalarModel::maxLength,
+                                scalarModel::typicalLength);
                         return textArea;
                     });
         }
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 d4a24a1a21..decc88be45 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
@@ -22,15 +22,12 @@ import java.util.Optional;
 
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.validation.validator.StringValidator;
 
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
-import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.InputFragment;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
@@ -109,8 +106,7 @@ extends ScalarPanelFormFieldAbstract<T> {
     protected final FormComponent<T> createFormComponent(final String id, final ScalarModel scalarModel) {
         formField = createTextField(id);
         formField.setOutputMarkupId(true);
-        setFormComponentAttributes(formField);
-        return formField;
+        return applyFormComponentAttributes(formField);
     }
 
     @Override
@@ -161,33 +157,13 @@ extends ScalarPanelFormFieldAbstract<T> {
 
     // -- HELPER
 
-    void setFormComponentAttributes(final FormComponent<?> formComponent) {
+    <F extends FormComponent<?>> F applyFormComponentAttributes(final F formComponent) {
         val scalarModel = scalarModel();
-        val scalarTypeSpec = scalarModel.getScalarTypeSpec();
-
-        if(formComponent instanceof TextArea) {
-            Facets.multilineNumberOfLines(scalarTypeSpec)
-            .ifPresent(numberOfLines->
-                Wkt.attributeReplace(formComponent, "rows", numberOfLines));
-
-            // in conjunction with javascript in jquery.isis.wicket.viewer.js
-            // see http://stackoverflow.com/questions/4459610/set-maxlength-in-html-textarea
-            //Wkt.attributeReplace(textArea, "maxlength", getMaxLengthOf(scalarModel));
-        }
-
-        val maxLenIfAny = Facets.maxLength(scalarTypeSpec);
-        maxLenIfAny
-        .ifPresent(maxLength->{
-            Wkt.attributeReplace(formComponent, "maxlength", maxLength);
-            if(type.equals(String.class)) {
-                formComponent.add(StringValidator.maximumLength(maxLength));
-            }
-        });
-
-        Facets.typicalLength(scalarTypeSpec, maxLenIfAny)
-        .ifPresent(typicalLength->
-            Wkt.attributeReplace(formComponent, "size", typicalLength));
-
+        Wkt.setFormComponentAttributes(formComponent,
+                scalarModel::multilineNumberOfLines,
+                scalarModel::maxLength,
+                scalarModel::typicalLength);
+        return formComponent;
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
index 531f61f421..919ff9b204 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
@@ -1059,7 +1059,8 @@ span.scalarValueInput.input-group div.btn-group {
     display: none;
 }
 div.scalarValueInlinePromptLink.form-control:hover .btn-group,
-span.scalarValueInput.input-group:hover div.btn-group {
+span.scalarValueInput.input-group:hover div.btn-group,
+textarea.form-control:focus +span >.btn-group{
 	display: inherit;
 }
 
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 e3639b172b..1c8d8433df 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
@@ -19,6 +19,8 @@
 package org.apache.isis.viewer.wicket.ui.util;
 
 import java.util.List;
+import java.util.OptionalInt;
+import java.util.function.Supplier;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
@@ -59,6 +61,7 @@ import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.validation.IValidationError;
 import org.apache.wicket.validation.ValidationError;
+import org.apache.wicket.validation.validator.StringValidator;
 import org.danekja.java.util.function.serializable.SerializableBiConsumer;
 import org.danekja.java.util.function.serializable.SerializableBooleanSupplier;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
@@ -73,10 +76,6 @@ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.ui.components.widgets.links.AjaxLinkNoPropagate;
 import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
 
-import lombok.NonNull;
-import lombok.val;
-import lombok.experimental.UtilityClass;
-
 import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
 import de.agilecoders.wicket.core.util.Attributes;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkboxx.CheckBoxX;
@@ -84,6 +83,9 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkboxx.Che
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkboxx.CheckBoxXConfig.Sizes;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField;
 import de.agilecoders.wicket.jquery.Key;
+import lombok.NonNull;
+import lombok.val;
+import lombok.experimental.UtilityClass;
 
 /**
  * Wicket common idioms, in alphabetical order.
@@ -703,20 +705,24 @@ public class Wkt {
 
     // -- TEXT AREA
 
-    public TextArea<String> textAreaNoTab(final String id, final IModel<String> textModel) {
-        return new TextArea<String>(id, textModel) {
-            private static final long serialVersionUID = 1L;
-            @Override protected void onComponentTag(final ComponentTag tag) {
-                super.onComponentTag(tag);
-                tag.put("tabindex", "-1");
-            }
-        };
+    public TextArea<String> textArea(final String id, final IModel<String> textModel) {
+        return new TextArea<String>(id, textModel);
     }
 
-    public TextArea<String> textAreaAddNoTab(
-            final MarkupContainer container, final String id, final IModel<String> textModel) {
-        return add(container, textAreaNoTab(id, textModel));
-    }
+//    public TextArea<String> textAreaNoTab(final String id, final IModel<String> textModel) {
+//        return new TextArea<String>(id, textModel) {
+//            private static final long serialVersionUID = 1L;
+//            @Override protected void onComponentTag(final ComponentTag tag) {
+//                super.onComponentTag(tag);
+//                tag.put("tabindex", "-1");
+//            }
+//        };
+//    }
+
+//    public TextArea<String> textAreaAddNoTab(
+//            final MarkupContainer container, final String id, final IModel<String> textModel) {
+//        return add(container, textAreaNoTab(id, textModel));
+//    }
 
     /**
      * @param converter - if {@code null} returns {@link TextArea} using Wicket's default converters.
@@ -865,6 +871,38 @@ public class Wkt {
         }
     }
 
+    // -- FORM COMPONENT ATTRIBUTE UTILITY
+
+    public void setFormComponentAttributes(
+            final FormComponent<?> formComponent,
+            final Supplier<OptionalInt> multilineNumberOfLines,
+            final Supplier<OptionalInt> maxLength,
+            final Supplier<OptionalInt> typicalLength) {
+
+        if(formComponent instanceof TextArea) {
+            multilineNumberOfLines.get()
+            .ifPresent(numberOfLines->
+                Wkt.attributeReplace(formComponent, "rows", numberOfLines));
+
+            // in conjunction with javascript in jquery.isis.wicket.viewer.js
+            // see http://stackoverflow.com/questions/4459610/set-maxlength-in-html-textarea
+            //Wkt.attributeReplace(textArea, "maxlength", getMaxLengthOf(scalarModel));
+        }
+
+        maxLength.get()
+        .ifPresent(maxLen->{
+            Wkt.attributeReplace(formComponent, "maxlength", maxLen);
+            if(formComponent.getType().equals(String.class)) {
+                formComponent.add(StringValidator.maximumLength(maxLen));
+            }
+        });
+
+        typicalLength.get()
+        .ifPresent(typicalLen->
+            Wkt.attributeReplace(formComponent, "size", typicalLen));
+
+    }
+
     // -- DISABLE WORKAROUND
 
     /**
@@ -877,7 +915,7 @@ public class Wkt {
      * @deprecated since Wicket 7.0: doesn't mangle the link/button's markup anymore
      */
     @Deprecated
-    public static void fixDisabledState(final Component component, final ComponentTag tag) {
+    public void fixDisabledState(final Component component, final ComponentTag tag) {
         if (!component.isEnabledInHierarchy()) {
             if (component instanceof AbstractLink) {
                 tag.setName("a");