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");