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;
}