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/23 05:11:26 UTC

[isis] branch 2877_value.comps created (now 1bcfcc3)

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

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


      at 1bcfcc3  ISIS-2877: compact fragments to be shared

This branch includes the following new commits:

     new 5aac433  ISIS-2877: branching off
     new 1bcfcc3  ISIS-2877: compact fragments to be shared

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.


[isis] 02/02: ISIS-2877: compact fragments to be shared

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1bcfcc3eacafb8c8f49a6274e58c491c1cb759e2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 23 06:11:13 2022 +0100

    ISIS-2877: compact fragments to be shared
    
    - either use with compact frame
    - or use with regular frame when readonly
---
 .../components/scalars/ScalarFragmentFactory.java  |  9 +++-
 .../scalars/ScalarPanelFormFieldAbstract.java      |  6 +--
 .../scalars/ScalarPanelTextFieldNumeric.java       |  5 +--
 .../scalars/string/ScalarTitlePanel.java           | 50 +---------------------
 4 files changed, 13 insertions(+), 57 deletions(-)

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 2ed72ad..07c1a41 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
@@ -97,10 +97,15 @@ public class ScalarFragmentFactory {
         ;
         private final String fragmentId;
         /**
+         * @param id - Where to 'put' the fragment
          * @param markupProvider - The component whose markup contains the fragment's markup
+         * @param componentFactory - creates the scalarValue component to be added to the fragment
          */
-        public Fragment createFragment(final MarkupContainer markupProvider) {
-            return Wkt.fragment(FrameFragment.COMPACT.getContainerId(), fragmentId, markupProvider);
+        public <T extends Component> Fragment
+        createFragment(final String id, final MarkupContainer markupProvider, final Function<String, T> componentFactory) {
+            val fragment = Wkt.fragment(id, fragmentId, markupProvider);
+            fragment.add(componentFactory.apply(ScalarPanelAbstract.ID_SCALAR_VALUE));
+            return fragment;
         }
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
index fa5f05a..ed4c0e5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
@@ -170,10 +170,8 @@ extends ScalarPanelAbstract2 {
      * However, it may be overridden if required.
      */
     protected Component createComponentForOutput(final String id) {
-        return Wkt.labelAdd(
-                CompactFragment.LABEL.createFragment(this),
-                id,
-                obtainOutputFormatModel());
+        return CompactFragment.LABEL.createFragment(id, this, scalarValueId->
+            Wkt.label(scalarValueId, obtainOutputFormatModel()));
     }
 
     // -- HOOKS
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
index 528a0e2..688c4ef 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
@@ -21,7 +21,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars;
 import org.apache.wicket.Component;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.CompactFragment;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.val;
@@ -43,8 +42,8 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
 
     @Override
     protected final Component createComponentForOutput(final String id) {
-        val label = Wkt.labelAddWithConverter(
-                CompactFragment.LABEL.createFragment(this),
+        val label = Wkt.labelWithConverter(
+                //CompactFragment.LABEL.createFragment(this),
                 id, unwrappedModel(), type, getConverter(scalarModel()));
         label.setEnabled(false);
         return label;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
index 8b9b1c8..4fdf7ea 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
@@ -21,15 +21,12 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.string;
 import java.util.EnumSet;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.markup.html.panel.Fragment;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.CompactFragment;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldWithValueSemantics;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
-import lombok.val;
-
 /**
  * Panel for rendering titles for scalars of any type.
  */
@@ -48,51 +45,8 @@ public class ScalarTitlePanel<T> extends ScalarPanelTextFieldWithValueSemantics<
 
     @Override
     protected Component createComponentForOutput(final String id) {
-
-        System.err.printf("%s%n", id);
-
-        if(id.equals("container-scalarValue-inputFormat")) {
-            val badgeFragment = //CompactFragment.BADGE.createFragment(this)
-                    new Fragment(id, "fragment-compact-badge", this)
-                    ;
-            Wkt.labelAdd(badgeFragment, "scalarValue", obtainOutputFormatModel());
-            return badgeFragment;
-
-        } else {
-            return Wkt.labelAdd(
-                  CompactFragment.BADGE.createFragment(this),
-                  id,
-                  obtainOutputFormatModel());
-        }
-
+        return CompactFragment.BADGE.createFragment(id, this, scalarValueId->
+            Wkt.label(scalarValueId, obtainOutputFormatModel()));
     }
 
-//
-//    static class TitleField<T> extends AbstractTextComponent<T> {
-//        private static final long serialVersionUID = 1L;
-//
-//        final IModel<T> model;
-//        final Class<T> type;
-//        final @Nullable IConverter<T> converter;
-//
-//        public TitleField(final String id, final IModel<T> model, final Class<T> type,
-//                final @Nullable IConverter<T> converter) {
-//            super(id);
-//            this.model = model;
-//            this.type = type;
-//            this.converter = converter;
-//
-//        }
-//
-//        @SuppressWarnings("unchecked")
-//        @Override public <C> IConverter<C> getConverter(final Class<C> cType) {
-//            return cType == type
-//                    ? (IConverter<C>) converter
-//                    : super.getConverter(cType);}
-//        @Override public void error(final IValidationError error) {
-//            //errorMessageIgnoringResourceBundles(this, error);
-//        }
-//
-//    }
-
 }

[isis] 01/02: ISIS-2877: branching off

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5aac4338ce5a402eaeb236b1b2fdb7144402afe8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 23 05:39:09 2022 +0100

    ISIS-2877: branching off
---
 .../components/scalars/ScalarFragmentFactory.java  | 40 ++++++++---
 .../ui/components/scalars/ScalarPanelAbstract.java | 47 +++++++++++++
 .../components/scalars/ScalarPanelAbstract2.java   | 33 +++++----
 .../scalars/ScalarPanelFormFieldAbstract.html      | 22 ++++--
 .../scalars/ScalarPanelFormFieldAbstract.java      | 80 +++++++++++++++-------
 .../scalars/ScalarPanelTextFieldAbstract.java      | 10 ++-
 .../viewer/wicket/ui/components/scalars/_Util.java | 38 ++++++++++
 .../scalars/string/ScalarTitlePanel.java           | 62 +++++++++++++++++
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java | 38 +++++++---
 9 files changed, 306 insertions(+), 64 deletions(-)

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 035d3e9..2ed72ad 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
@@ -30,6 +30,7 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
+import org.apache.isis.viewer.wicket.ui.util.WktComponents;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -71,6 +72,18 @@ public class ScalarFragmentFactory {
         public <T extends Component> T createComponent(final Function<String, T> factory) {
             return factory.apply(containerId);
         }
+        public void permanentlyHideIn(final MarkupContainer container) {
+            container.streamChildren()
+            .filter(comp->containerId.equals(comp.getId()))
+            .findFirst()
+            .ifPresentOrElse(comp->{
+                comp.setVisibilityAllowed(false);
+                comp.setVisible(false);
+            },
+            ()->{
+                WktComponents.permanentlyHide(container, containerId);
+            });
+        }
     }
 
     // -- OUTPUT FRAGMENTS
@@ -80,11 +93,14 @@ public class ScalarFragmentFactory {
     public static enum CompactFragment {
         CHECKBOX("fragment-compact-checkbox"),
         LABEL("fragment-compact-label"),
+        BADGE("fragment-compact-badge"),
         ;
         private final String fragmentId;
-        public Fragment createFragment(final MarkupContainer container) {
-            return Wkt.fragmentAdd(
-                    container, FrameFragment.COMPACT.getContainerId(), fragmentId);
+        /**
+         * @param markupProvider - The component whose markup contains the fragment's markup
+         */
+        public Fragment createFragment(final MarkupContainer markupProvider) {
+            return Wkt.fragment(FrameFragment.COMPACT.getContainerId(), fragmentId, markupProvider);
         }
     }
 
@@ -99,9 +115,12 @@ public class ScalarFragmentFactory {
         FILE("fragment-input-file"),
         ;
         private final String fragmentId;
-        public Fragment createFragment(final MarkupContainer container, final FormComponent<?> inputComponent) {
-            val fragment = Wkt.fragmentAdd(
-                    container, RegularFrame.INPUT_FORMAT_CONTAINER.getContainerId(), fragmentId);
+        /**
+         * @param markupProvider - The component whose markup contains the fragment's markup
+         */
+        public Fragment createFragment(final MarkupContainer markupProvider, final FormComponent<?> inputComponent) {
+            val fragment = Wkt.fragment(
+                    RegularFrame.INPUT_FORMAT_CONTAINER.getContainerId(), fragmentId, markupProvider);
             fragment.add(inputComponent);
             return fragment;
         }
@@ -119,11 +138,14 @@ public class ScalarFragmentFactory {
         private final String fragmentId;
         private final Function<IModel<String>, Component> componentFactory;
 
-        public Fragment createFragment(final MarkupContainer container,
+        /**
+         * @param markupProvider - The component whose markup contains the fragment's markup
+         */
+        public Fragment createFragment(final MarkupContainer markupProvider,
                 final IModel<String> promptLabelModel,
                 final @Nullable Consumer<FormComponent<String>> onComponentCreated) {
-            val fragment = Wkt.fragmentAdd(
-                    container, RegularFrame.OUTPUT_FORMAT_CONTAINER.getContainerId(), fragmentId);
+            val fragment = Wkt.fragment(
+                    RegularFrame.OUTPUT_FORMAT_CONTAINER.getContainerId(), fragmentId, markupProvider);
             val component = componentFactory.apply(promptLabelModel);
             fragment.add(component);
             if(onComponentCreated!=null
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 268cba9..d3b81a7 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
@@ -108,6 +108,47 @@ implements ScalarModelSubscriber {
         NOTHING
     }
 
+    public enum RenderScenario {
+        /**
+         * Is viewing and cannot edit.
+         * But there might be associated actions with dialog feature inline-as-if-edit.
+         */
+        READONLY,
+        /**
+         * Is viewing and can edit.
+         */
+        CAN_EDIT,
+        CAN_EDIT_INLINE,
+        CAN_EDIT_INLINE_VIA_ACTION,
+        /**
+         * Is editing (either prompt form or other dialog).
+         */
+        EDITING;
+
+        public boolean isReadonly() { return this==READONLY;}
+        public boolean isCanEdit() { return this==CAN_EDIT;}
+        public boolean isEditing() { return this==EDITING;}
+
+        static RenderScenario inferFrom(final ScalarPanelAbstract scalarPanel) {
+            val scalarModel = scalarPanel.scalarModel();
+            if(!scalarModel.getRenderingHint().isRegular()) {
+                return READONLY;
+            }
+            if(scalarModel.isEditMode()) {
+                return EDITING;
+            }
+            if(_Util.canPropertyEnterInlineEditDirectly(scalarModel)) {
+                return CAN_EDIT_INLINE;
+            }
+            if(_Util.lookupPropertyActionForInlineEdit(scalarModel).isPresent()) {
+                return CAN_EDIT_INLINE_VIA_ACTION;
+            }
+            return scalarModel.isEnabled()
+                    ? CAN_EDIT
+                    : READONLY;
+        }
+    }
+
     @RequiredArgsConstructor
     public static class InlinePromptConfig {
         @Getter private final boolean supported;
@@ -179,6 +220,11 @@ implements ScalarModelSubscriber {
     private WebMarkupContainer scalarFrameContainer;
     protected final WebMarkupContainer getScalarFrameContainer() { return scalarFrameContainer; }
 
+    // -- RENDER SCENARIO
+
+    @Getter(AccessLevel.PROTECTED)
+    private final RenderScenario renderScenario;
+
     // -- CONSTRUCTION
 
     protected ScalarPanelAbstract(final String id, final ScalarModel scalarModel) {
@@ -189,6 +235,7 @@ implements ScalarModelSubscriber {
         setupFormatModifiers(formatModifiers);
 
         this.formatModifiers = ImmutableEnumSet.from(formatModifiers);
+        this.renderScenario = RenderScenario.inferFrom(this);
     }
 
     // -- INIT
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 3d6b233..8bce481 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
@@ -23,19 +23,18 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.commons.internal.base._Refs;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationModel;
 import org.apache.isis.viewer.wicket.model.models.InlinePromptContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.LinkAndLabelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.RegularFrame;
 import org.apache.isis.viewer.wicket.ui.components.scalars.blobclob.IsisBlobOrClobPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2Panel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLink;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.val;
@@ -108,7 +107,14 @@ extends ScalarPanelAbstract {
      * are required to override and return a non-null value.
      */
     protected IModel<String> obtainOutputFormatModel() {
-        return null;
+        return ()->{
+            val propertyNegotiationModel = (PropertyNegotiationModel)scalarModel().proposedValue();
+            return propertyNegotiationModel.isCurrentValueAbsent().booleanValue()
+                    ? ""
+                    : propertyNegotiationModel
+                        .getValueAsHtml().getValue();
+                        //.getValueAsParsableText().getValue();
+        };
     }
 
     /**
@@ -135,16 +141,18 @@ extends ScalarPanelAbstract {
     // -- HELPER
 
     private void addOnClickBehaviorTo(
-            final MarkupContainer clickReceiver,
+            final @Nullable MarkupContainer clickReceiver,
             final InlinePromptConfig inlinePromptConfig) {
+
+        if(clickReceiver==null) return;
+
         val scalarModel = scalarModel();
 
         // start off assuming that neither the property nor any of the associated actions
         // are using inline prompts
         val componentToHideRef = _Refs.<Component>objectRef(clickReceiver);
 
-        if (scalarModel.getPromptStyle().isInline()
-                && scalarModel.canEnterEditMode()) {
+        if (_Util.canPropertyEnterInlineEditDirectly(scalarModel)) {
 
             // we configure the prompt link if _this_ property is configured for inline edits...
             Wkt.behaviorAddOnClick(clickReceiver, this::onPropertyInlineEditClick);
@@ -152,16 +160,7 @@ extends ScalarPanelAbstract {
 
         } else {
 
-            val inlineActionIfAny =
-                    scalarModel.getAssociatedActions().getFirstAssociatedWithInlineAsIfEdit();
-
-            // not editable property, but maybe one of the actions is.
-            inlineActionIfAny
-            .map(LinkAndLabelFactory.forPropertyOrParameter(scalarModel))
-            .map(LinkAndLabel::getUiComponent)
-            .map(ActionLink.class::cast)
-            .filter(ActionLink::isVisible)
-            .filter(ActionLink::isEnabled)
+            _Util.lookupPropertyActionForInlineEdit(scalarModel)
             .ifPresent(actionLinkInlineAsIfEdit->{
                 Wkt.behaviorAddOnClick(clickReceiver, actionLinkInlineAsIfEdit::onClick);
                 componentToHideRef.setValue(inlinePromptConfig.getComponentToHide().orElse(null));
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.html b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.html
index 4852d2d..3559032 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.html
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.html
@@ -31,7 +31,11 @@
 				<label wicket:id="scalarName"
 					class="scalarName col-form-label">[Label text]</label> 
 				<span class="scalarValueWrapper">
+				
 					<div class="scalarPlaceholder">
+					
+						<label wicket:id="debugLabel" style="font-size: x-small; color: burlywood;">[Debug text]</label>
+					
 						<span class="scalarValueInput"> 
 							<span class="editing">
 
@@ -39,15 +43,19 @@
 									href="##" name="scalarValueInlinePromptLink"
 									class="scalarValueInlinePromptLink">
 									
+									<span style="color: blue;">λ</span>
 									<!-- output format --> 
 									<wicket:container 
 										wicket:id="container-scalarValue-outputFormat"/> 
 										 
 								</a> 
 							
-								<!-- input format (when editing or action dialog) -->
-								<wicket:container 
+								<!-- input format (when editing or action dialog or read-only) -->
+								<div>
+									<span style="color: purple;">α</span>
+									<wicket:container 
 										wicket:id="container-scalarValue-inputFormat" />
+								</div>
 								
 								<a wicket:id="editProperty"
 									href="##" class="edit btn btn-sm btn-link"> 
@@ -133,12 +141,18 @@
 		<!-- COMPACT FRAGMENTS -->
 		
 		<wicket:fragment wicket:id="fragment-compact-checkbox">
-			<input wicket:id="scalarIfCompact" type="checkbox"
+			<input wicket:id="scalarValue" type="checkbox"
 				class="form-control" />
 		</wicket:fragment>
 
 		<wicket:fragment wicket:id="fragment-compact-label">
-			<span wicket:id="scalarIfCompact"/>
+			<span wicket:id="scalarValue"/>
+		</wicket:fragment>
+		
+		<wicket:fragment wicket:id="fragment-compact-badge">
+			<div class="badge bg-info">
+				<span wicket:id="scalarValue"></span>	
+			</div>
 		</wicket:fragment>
 
 	</wicket:panel>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
index 245d325..fa5f05a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
@@ -31,7 +31,6 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 import org.springframework.lang.Nullable;
 
-import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationModel;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
@@ -103,6 +102,53 @@ extends ScalarPanelAbstract2 {
 
         formComponent.add(createValidator(scalarModel));
 
+        val renderScenario = getRenderScenario();
+
+        Wkt.labelAdd(formGroup, "debugLabel", String.format("%s", renderScenario.name()));
+
+//        switch (renderScenario) {
+//        case READONLY:
+//            // setup as output-format (no links)
+//            // that is: disable links - place output-format into RegularFrame.INPUT_FORMAT_CONTAINER
+//            formGroup.add(RegularFrame.INPUT_FORMAT_CONTAINER
+//                    .createComponent(this::createComponentForOutput));
+//
+//            //RegularFrame.SCALAR_VALUE_INLINE_PROMPT_LINK.permanentlyHideIn(formGroup);
+//
+//            break;
+//        case CAN_EDIT:
+//            // setup as output-format (with links to edit)
+//            // that is: enable links - place output-format into RegularFrame.OUTPUT_FORMAT_CONTAINER
+//            // this is done by the inline prompt setup later
+//            // hide formgr comp
+//            //formComponent.setVisibilityAllowed(false);
+//            RegularFrame.INPUT_FORMAT_CONTAINER.permanentlyHideIn(formGroup);
+//
+//            break;
+//        case EDITING:
+//            // setup as input-format
+//            // that is: disable links - place input-format into RegularFrame.INPUT_FORMAT_CONTAINER
+//            getInputFragmentType()
+//                .ifPresent(inputFragmentType->
+//                    formGroup.add(inputFragmentType.createFragment(this, formComponent)));
+//            break;
+//
+//        default:
+//            break;
+//        }
+
+        if(scalarModel().isViewMode()
+                //TODO remove this non intuitive logic
+                && getFormatModifiers().contains(FormatModifier.MARKUP)) {
+            //setRegularFrame(formGroup);
+            formGroup.add(RegularFrame.INPUT_FORMAT_CONTAINER
+                    .createComponent(this::createComponentForOutput));
+        } else {
+            getInputFragmentType()
+            .ifPresent(inputFragmentType->
+                formGroup.add(inputFragmentType.createFragment(this, formComponent)));
+        }
+
         onFormGroupCreated(formGroup);
 
         return formGroup;
@@ -117,45 +163,29 @@ extends ScalarPanelAbstract2 {
     }
 
     /**
-     * Builds the component to render the model when in COMPACT format.
+     * Builds the component to render the model when in COMPACT frame,
+     * or when in REGULAR frame rendering the OUTPUT-FORMAT.
      * <p>
      * The (textual) default implementation uses a {@link Label}.
      * However, it may be overridden if required.
      */
     protected Component createComponentForOutput(final String id) {
-
         return Wkt.labelAdd(
                 CompactFragment.LABEL.createFragment(this),
                 id,
-                ()->{
-                    val propertyNegotiationModel = (PropertyNegotiationModel)scalarModel().proposedValue();
-                    return propertyNegotiationModel.isCurrentValueAbsent().booleanValue()
-                            ? ""
-                            : propertyNegotiationModel
-                                .getValueAsHtml().getValue();
-                                //.getValueAsParsableText().getValue();
-                });
+                obtainOutputFormatModel());
     }
 
-
     // -- HOOKS
 
     protected Optional<InputFragment> getInputFragmentType() {
         return Optional.empty();
     }
 
-    protected void onFormGroupCreated(final FormGroup formGroup) {
-        if(scalarModel().isViewMode()
-                //TODO remove this non intuitive logic
-                && getFormatModifiers().contains(FormatModifier.MARKUP)) {
-            formGroup.add(RegularFrame.INPUT_FORMAT_CONTAINER
-                    .createComponent(this::createComponentForOutput));
-            return;
-        }
-        getInputFragmentType()
-            .ifPresent(inputFragmentType->
-                formGroup.add(inputFragmentType.createFragment(this, getFormComponent())));
-    }
+    /**
+     * Optional hook, to eg. add additional components (like Blob which adds preview image)
+     */
+    protected void onFormGroupCreated(final FormGroup formGroup) {};
 
     protected IValidator<Object> createValidator(final ScalarModel scalarModel) {
         return new IValidator<Object>() {
@@ -262,4 +292,6 @@ extends ScalarPanelAbstract2 {
         WktTooltips.clearTooltip(inlinePromptLink);
     }
 
+
+
 }
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 46538a5..0add814 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
@@ -30,6 +30,7 @@ import org.apache.wicket.model.Model;
 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.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
@@ -101,6 +102,13 @@ extends ScalarPanelFormFieldAbstract<T> {
     }
 
     protected final IModel<T> unwrappedModel() {
+
+        _Assert.assertTrue(scalarModel().getScalarTypeSpec().isAssignableFrom(type), ()->
+            String.format("[%s] cannot possibly unwrap model of type %s into target type %s",
+                    this.getClass().getSimpleName(),
+                    scalarModel().getScalarTypeSpec().getCorrespondingClass(),
+                    type));
+
         return scalarModel().unwrapped(type);
     }
 
@@ -153,7 +161,7 @@ extends ScalarPanelFormFieldAbstract<T> {
         val converter = getConverter(scalarModel());
         return converter!=null
                 ? new ToStringConvertingModel<>(converter)
-                :  _Casts.uncheckedCast(getFormComponent().getModel());
+                : super.obtainOutputFormatModel(); // _Casts.uncheckedCast(getFormComponent().getModel());
     }
 
     protected class ToStringConvertingModel<X> extends Model<String> {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
new file mode 100644
index 0000000..82a6209
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
@@ -0,0 +1,38 @@
+package org.apache.isis.viewer.wicket.ui.components.scalars;
+
+import java.util.Optional;
+
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.LinkAndLabelFactory;
+import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLink;
+
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+class _Util {
+
+    boolean canPropertyEnterInlineEditDirectly(final ScalarModel scalarModel) {
+        return scalarModel.getPromptStyle().isInline()
+                && scalarModel.canEnterEditMode();
+    }
+
+    Optional<ActionLink> lookupPropertyActionForInlineEdit(final ScalarModel scalarModel) {
+        val inlineActionIfAny =
+                scalarModel.getAssociatedActions().getFirstAssociatedWithInlineAsIfEdit();
+
+        if(canPropertyEnterInlineEditDirectly(scalarModel)) {
+            return Optional.empty();
+        }
+
+        // not editable property, but maybe one of the actions is.
+        return inlineActionIfAny
+        .map(LinkAndLabelFactory.forPropertyOrParameter(scalarModel))
+        .map(LinkAndLabel::getUiComponent)
+        .map(ActionLink.class::cast)
+        .filter(ActionLink::isVisible)
+        .filter(ActionLink::isEnabled);
+    }
+
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
index 1ede5ef..8b9b1c8 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/ScalarTitlePanel.java
@@ -18,8 +18,17 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.string;
 
+import java.util.EnumSet;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.panel.Fragment;
+
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.CompactFragment;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldWithValueSemantics;
+import org.apache.isis.viewer.wicket.ui.util.Wkt;
+
+import lombok.val;
 
 /**
  * Panel for rendering titles for scalars of any type.
@@ -32,5 +41,58 @@ public class ScalarTitlePanel<T> extends ScalarPanelTextFieldWithValueSemantics<
         super(id, scalarModel, type);
     }
 
+    @Override
+    protected void setupFormatModifiers(final EnumSet<FormatModifier> modifiers) {
+        modifiers.add(FormatModifier.MARKUP);
+    }
+
+    @Override
+    protected Component createComponentForOutput(final String id) {
+
+        System.err.printf("%s%n", id);
+
+        if(id.equals("container-scalarValue-inputFormat")) {
+            val badgeFragment = //CompactFragment.BADGE.createFragment(this)
+                    new Fragment(id, "fragment-compact-badge", this)
+                    ;
+            Wkt.labelAdd(badgeFragment, "scalarValue", obtainOutputFormatModel());
+            return badgeFragment;
+
+        } else {
+            return Wkt.labelAdd(
+                  CompactFragment.BADGE.createFragment(this),
+                  id,
+                  obtainOutputFormatModel());
+        }
+
+    }
+
+//
+//    static class TitleField<T> extends AbstractTextComponent<T> {
+//        private static final long serialVersionUID = 1L;
+//
+//        final IModel<T> model;
+//        final Class<T> type;
+//        final @Nullable IConverter<T> converter;
+//
+//        public TitleField(final String id, final IModel<T> model, final Class<T> type,
+//                final @Nullable IConverter<T> converter) {
+//            super(id);
+//            this.model = model;
+//            this.type = type;
+//            this.converter = converter;
+//
+//        }
+//
+//        @SuppressWarnings("unchecked")
+//        @Override public <C> IConverter<C> getConverter(final Class<C> cType) {
+//            return cType == type
+//                    ? (IConverter<C>) converter
+//                    : super.getConverter(cType);}
+//        @Override public void error(final IValidationError error) {
+//            //errorMessageIgnoringResourceBundles(this, error);
+//        }
+//
+//    }
 
 }
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 27dce9c..a8fea68 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
@@ -420,27 +420,47 @@ public class Wkt {
     // -- FRAGMENT
 
     /**
-     * @param container - The component whose markup contains the fragment's markup
      * @param id - The component id
      * @param fragmentId - The id of the associated markup fragment
+     * @param markupProvider - The component whose markup contains the fragment's markup
      */
-    public Fragment fragmentAdd(final MarkupContainer container, final String id, final String fragmentId) {
-        return new Fragment(id, fragmentId, container);
+    public Fragment fragment(final String id, final String fragmentId, final MarkupContainer markupProvider) {
+        return new Fragment(id, fragmentId, markupProvider);
     }
 
     /**
-     * @param container - The component whose markup contains the fragment's markup
      * @param id - The component id
      * @param fragmentId - The id of the associated markup fragment
+     * @param markupProvider - The component whose markup contains the fragment's markup
      */
-    public Fragment fragmentAddNoTab(final MarkupContainer container, final String id, final String fragmentId) {
-        return new Fragment(id, fragmentId, container) {
+    public Fragment fragmentNoTab(final String id, final String fragmentId, final MarkupContainer markupProvider) {
+        return new Fragment(id, fragmentId, markupProvider) {
             private static final long serialVersionUID = 1L;
             @Override protected void onComponentTag(final ComponentTag tag) {
                 super.onComponentTag(tag);
-                tag.put("tabindex", "-1");
-            }
-        };
+                tag.put("tabindex", "-1");}};
+    }
+
+    /**
+     * @param container - The component to add the fragment to
+     * @param id - The component id
+     * @param fragmentId - The id of the associated markup fragment
+     * @param markupProvider - The component whose markup contains the fragment's markup
+     */
+    public Fragment fragmentAdd(final MarkupContainer container,
+            final String id, final String fragmentId, final MarkupContainer markupProvider) {
+        return add(container, fragment(id, fragmentId, markupProvider));
+    }
+
+    /**
+     * @param container - The component to add the fragment to
+     * @param id - The component id
+     * @param fragmentId - The id of the associated markup fragment
+     * @param markupProvider - The component whose markup contains the fragment's markup
+     */
+    public Fragment fragmentAddNoTab(final MarkupContainer container,
+            final String id, final String fragmentId, final MarkupContainer markupProvider) {
+        return add(container, fragmentNoTab(id, fragmentId, markupProvider));
     }
 
     // -- IMAGE