This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch v3
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/v3 by this push:
new de5bd85cc5e CAUSEWAY-3960: [v3] backport from v4
de5bd85cc5e is described below
commit de5bd85cc5e99d80045ef935d6ffaae1a586eb85
Author: Andi Huber <[email protected]>
AuthorDate: Wed Jan 21 12:38:38 2026 +0100
CAUSEWAY-3960: [v3] backport from v4
---
.../viewer/commons/model/action/UiActionForm.java | 14 ++++----
.../viewer/wicket/model/models/ActionModel.java | 16 ++++-----
.../interaction/act/ActionInteractionWkt.java | 12 +++----
.../ActionLinksAsButtonInlinePanel.java | 2 +-
.../entityactions/ActionLinksAsDropDownPanel.java | 2 +-
.../entityactions/ActionLinksPanel.java | 28 ++++++++--------
.../serviceactions/ServiceActionUtil.java | 5 +--
.../ui/components/attributes/AttributePanel.java | 39 +++++++++-------------
.../attributes/AttributePanelWithInlinePrompt.java | 16 ++++-----
.../parented/ParentedCollectionPanel.java | 2 +-
.../present/ajaxtable/columns/ActionColumn.java | 10 +++---
.../wicket/ui/components/layout/bs/col/Col.java | 3 +-
.../components/object/fieldset/PropertyGroup.java | 15 ++++-----
.../object/header/ObjectHeaderPanel.java | 3 +-
.../components/widgets/actionlink/ActionLink.java | 17 ++++++----
15 files changed, 90 insertions(+), 94 deletions(-)
diff --git
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/action/UiActionForm.java
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/action/UiActionForm.java
index 2ec15693118..ec39064ff24 100644
---
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/action/UiActionForm.java
+++
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/action/UiActionForm.java
@@ -42,32 +42,30 @@ public interface UiActionForm
// -- USABILITY
- default Consent getUsabilityConsent() {
+ default Consent getUsabilityConsent(final Where where) {
return getAction().isUsable(
getActionOwner(),
InteractionInitiatedBy.USER,
- Where.OBJECT_FORMS);
+ where);
}
// -- VISABILITY
- default Consent getVisibilityConsent() {
+ default Consent getVisibilityConsent(final Where where) {
// guard against missing action owner
var actionOwner = getActionOwner();
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionOwner)) {
+ if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionOwner))
return Veto.DEFAULT; // veto, so we don't render the action
- }
// check whether action owner type is hidden
- if (getActionOwner().objSpec().isHidden()) {
+ if (getActionOwner().objSpec().isHidden())
return Veto.DEFAULT;
- }
return getAction().isVisible(
actionOwner,
InteractionInitiatedBy.USER,
- Where.OBJECT_FORMS);
+ where);
}
// -- VALIDITY
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ActionModel.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ActionModel.java
index ac8f51d2fa2..a6a4539588b 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ActionModel.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ActionModel.java
@@ -134,7 +134,7 @@ public static ActionModel forEntityFromActionColumn(
return ActionModel.forEntity(
parentEntityModel,
action.getFeatureIdentifier(),
- Where.OBJECT_FORMS,
+ Where.ALL_TABLES,
columnActionModifier,
null, null, null);
}
@@ -153,8 +153,8 @@ public static ActionModel forCollection(
public static ActionModel forPropertyOrParameter(
final ObjectAction action,
final UiAttributeWkt attributeModel) {
- return attributeModel instanceof PropertyModel
- ? forProperty(action, (PropertyModel)attributeModel)
+ return attributeModel instanceof PropertyModel p
+ ? forProperty(action, p)
: forParameter(action, (ParameterModel)attributeModel);
}
@@ -175,14 +175,13 @@ public static ActionModel forParameter(
//XXX[CAUSEWAY-3080] only supported, when parameter type is a singular
composite value-type
var param = parameterModel.getMetaModel();
if(param.isSingular()
- && param.getElementType().isCompositeValue()) {
+ && param.getElementType().isCompositeValue())
return ActionModel.forEntity(
parameterModel.getParentUiModel(),
action.getFeatureIdentifier(),
Where.OBJECT_FORMS,
ColumnActionModifier.NONE,
null, parameterModel, null);
- }
return null;
}
@@ -262,11 +261,11 @@ public Optional<ParameterModel> getAssociatedParameter() {
}
public boolean isVisible() {
- return getVisibilityConsent().isAllowed();
+ return getVisibilityConsent(delegate.where()).isAllowed();
}
public boolean isEnabled() {
- return getUsabilityConsent().isAllowed();
+ return getUsabilityConsent(delegate.where()).isAllowed();
}
@Override
@@ -309,11 +308,10 @@ public String toString() {
private static void guardAgainstNotBookmarkable(final ManagedObject
objectAdapter) {
var isIdentifiable = ManagedObjects.isIdentifiable(objectAdapter);
- if (!isIdentifiable) {
+ if (!isIdentifiable)
throw new IllegalArgumentException(String.format(
"Object '%s' is not identifiable (has no identifier).",
objectAdapter.getTitle()));
- }
}
}
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
index 2cf1497ae99..2a72d233e0a 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
@@ -23,7 +23,6 @@
import java.util.stream.Stream;
import org.apache.wicket.model.ChainingModel;
-
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.Identifier;
@@ -46,6 +45,9 @@
import
org.apache.causeway.viewer.wicket.model.models.interaction.BookmarkedObjectWkt;
import
org.apache.causeway.viewer.wicket.model.models.interaction.HasBookmarkedOwnerAbstract;
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
/**
* The parent (container) model of multiple <i>parameter models</i> which
implement
* {@link ChainingModel}.
@@ -71,7 +73,7 @@ public class ActionInteractionWkt
private static final long serialVersionUID = 1L;
private final String memberId;
- private final Where where;
+ @Getter @Accessors(fluent=true) private final Where where;
/**
* memoize, so if we only need the meta-model,
@@ -153,16 +155,14 @@ protected ActionInteraction load() {
associatedWithParameterIfAny.getParameterNegotiationModel(), paramIndex,
memberId, where);
}
- if(associatedWithCollectionIfAny!=null) {
+ if(associatedWithCollectionIfAny!=null)
return
ActionInteraction.startWithMultiselect(getBookmarkedOwner(), memberId, where,
associatedWithCollectionIfAny.getDataTableModel());
- }
- if(associatedWithPropertyIfAny!=null) {
+ if(associatedWithPropertyIfAny!=null)
// supports composite-value-types via mixin
return ActionInteraction.startAsBoundToProperty(
associatedWithPropertyIfAny.getManagedProperty(),
memberId, where);
- }
return ActionInteraction.start(getBookmarkedOwner(), memberId, where);
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsButtonInlinePanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsButtonInlinePanel.java
index 65a0f6da821..ae573434888 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsButtonInlinePanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsButtonInlinePanel.java
@@ -26,6 +26,6 @@ class ActionLinksAsButtonInlinePanel extends ActionLinksPanel
{
private static final long serialVersionUID = 1L;
public ActionLinksAsButtonInlinePanel(final String id, final
Can<ActionLink> links) {
- super(id, links, Style.INLINE_LIST);
+ super(id, links, ActionPanelStyle.INLINE_LIST);
}
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsDropDownPanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsDropDownPanel.java
index 736c4def7c5..b3ee8461aa4 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsDropDownPanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksAsDropDownPanel.java
@@ -26,6 +26,6 @@ class ActionLinksAsDropDownPanel extends ActionLinksPanel {
private static final long serialVersionUID = 1L;
public ActionLinksAsDropDownPanel(final String id, final Can<ActionLink>
links) {
- super(id, links, Style.DROPDOWN);
+ super(id, links, ActionPanelStyle.DROPDOWN);
}
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
index 4de7779200c..b392e8990f3 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
@@ -20,11 +20,11 @@
import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.wicket.MarkupContainer;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import
org.apache.causeway.viewer.commons.model.decorators.ActionDecorators.ActionStyle;
import org.apache.causeway.viewer.wicket.model.models.ActionModel;
@@ -36,7 +36,7 @@
import lombok.RequiredArgsConstructor;
-public class ActionLinksPanel
+public abstract class ActionLinksPanel
extends MenuablePanelAbstract {
private static final long serialVersionUID = 1L;
@@ -46,7 +46,7 @@ public class ActionLinksPanel
private static final String ID_ADDITIONAL_LINK_TITLE =
"additionalLinkTitle";
@RequiredArgsConstructor
- public enum Style {
+ public enum ActionPanelStyle {
INLINE_LIST(ActionStyle.BUTTON) {
@Override
public ActionLinksPanel newPanel(final String id, final
Can<ActionLink> links) {
@@ -71,8 +71,9 @@ public static ActionLinksPanel addActionLinks(
final MarkupContainer markupContainer,
final String id,
final Can<ActionModel> links,
- final Style style) {
- var panel = actionLinks(id, links, style);
+ final ActionPanelStyle style,
+ final Where renderWhere) {
+ var panel = actionLinks(id, links, style, renderWhere);
if(panel.isEmpty()) {
WktComponents.permanentlyHide(markupContainer, id);
return null;
@@ -82,18 +83,19 @@ public static ActionLinksPanel addActionLinks(
public static Optional<ActionLinksPanel> actionLinks(
final String id,
- final Can<ActionModel> links,
- final Style style) {
- if(links.isEmpty()) {
- return Optional.empty();
- }
- return Optional.of(style.newPanel(id, links.map(ActionLink::create)));
+ final Can<ActionModel> actionModels,
+ final ActionPanelStyle style,
+ final Where renderWhere) {
+
+ return actionModels.isEmpty()
+ ? Optional.empty()
+ : Optional.of(style.newPanel(id,
actionModels.map(act->ActionLink.create(act, renderWhere))));
}
protected ActionLinksPanel(
final String id,
final Can<ActionLink> actionLinks,
- final Style style) {
+ final ActionPanelStyle style) {
super(id, actionLinks);
setOutputMarkupId(true);
@@ -122,7 +124,7 @@ protected final Stream<ActionLink> streamActionLinks() {
}
protected final List<ActionLink> listOfActionLinks() {
- return streamActionLinks().collect(Collectors.toList());
+ return streamActionLinks().toList();
}
public final boolean hasAnyVisibleLink() {
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/ServiceActionUtil.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/ServiceActionUtil.java
index d772acee3f5..b79132537bc 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/ServiceActionUtil.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/ServiceActionUtil.java
@@ -24,6 +24,7 @@
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
import org.apache.causeway.viewer.commons.applib.services.menu.MenuVisitor;
@@ -107,7 +108,7 @@ public void onSectionSpacer() {
}
@Override
- public void onMenuAction(MenuAction menuAction) {
+ public void onMenuAction(final MenuAction menuAction) {
var menuItem = CssMenuItem.newMenuItemWithLink(menuAction.name(),
newActionLink(menuAction.managedAction().orElseThrow()));
currentTopLevelMenu.addSubMenuItem(menuItem);
}
@@ -121,7 +122,7 @@ public void onSectionLabel(final String named) {
private ActionLink newActionLink(final ManagedAction managedAction) {
var serviceModel = UiObjectWkt.ofAdapter(managedAction.getOwner());
return ActionLink.create(
- ActionModel.forServiceAction(managedAction.getAction(),
serviceModel));
+ ActionModel.forServiceAction(managedAction.getAction(),
serviceModel), Where.NOT_SPECIFIED);
}
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
index bc249ff4bef..f92ffb62287 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
@@ -39,6 +39,7 @@
import org.apache.causeway.applib.annotation.ActionLayout;
import org.apache.causeway.applib.annotation.LabelPosition;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.collections.ImmutableEnumSet;
import org.apache.causeway.commons.internal.base._Casts;
@@ -147,24 +148,19 @@ public boolean isViewingAndCanEditAny() {
static RenderScenario inferFrom(final AttributePanel scalarPanel) {
var attributeModel = scalarPanel.attributeModel();
- if(attributeModel.getRenderingHint().isInTable()) {
+ if(attributeModel.getRenderingHint().isInTable())
return COMPACT;
- }
- if(attributeModel.isParameter()) {
+ if(attributeModel.isParameter())
return _Util.canParameterEnterNestedEdit(attributeModel)
? EDITING_WITH_LINK_TO_NESTED // nested/embedded dialog
: EDITING; // for params always EDITING even if
editing is vetoed
- }
// at this point we are processing a property (not a parameter)
- if(attributeModel.isEditingMode()) {
+ if(attributeModel.isEditingMode())
return EDITING;
- }
- if(_Util.canPropertyEnterInlineEditDirectly(attributeModel)) {
+ if(_Util.canPropertyEnterInlineEditDirectly(attributeModel))
return CAN_EDIT_INLINE;
- }
-
if(_Util.lookupPropertyActionForInlineEdit(attributeModel).isPresent()) {
+
if(_Util.lookupPropertyActionForInlineEdit(attributeModel).isPresent())
return CAN_EDIT_INLINE_VIA_ACTION;
- }
return attributeModel.disabledReason().isPresent()
? READONLY
: CAN_EDIT;
@@ -520,7 +516,8 @@ public void addChangeListener(final
AttributeModelChangeListener listener) {
protected final <T extends Behavior> void addOrReplaceBehavoir(
final @NonNull Class<T> behaviorClass, final @NonNull Supplier<T>
factory) {
var validationFeedbackReceiver = getValidationFeedbackReceiver();
- if(validationFeedbackReceiver == null) { return; }
+ if(validationFeedbackReceiver == null)
+ return;
for (var behavior :
validationFeedbackReceiver.getBehaviors(behaviorClass)) {
validationFeedbackReceiver.remove(behavior);
}
@@ -559,9 +556,8 @@ protected final void scalarNameLabelAddTo(final
MarkupContainer container, final
helper.visibleLabelId.ifPresent(visibleLabelId->{
final Label scalarNameLabel = Wkt.labelAdd(container,
visibleLabelId, labelCaption);
- if(_Strings.isNullOrEmpty(labelCaption.getObject())) {
+ if(_Strings.isNullOrEmpty(labelCaption.getObject()))
return;
- }
WktDecorators.formLabel()
.decorate(scalarNameLabel, FormLabelDecorationModel
@@ -601,9 +597,8 @@ void hideHiddenLabels(final MarkupContainer container) {
protected abstract Component getValidationFeedbackReceiver();
private void addFeedbackOnlyTo(final MarkupContainer markupContainer,
final Component component) {
- if(component==null) {
+ if(component==null)
return;
- }
markupContainer.addOrReplace(
RegularFrame.FEEDBACK.createComponent(id->
new NotificationPanel(id, component, new
ComponentFeedbackMessageFilter(component))));
@@ -617,13 +612,13 @@ private void addActionLinksBelowAndRight(
.filter(ActionModel.isPositionedAt(ActionLayout.Position.BELOW));
ActionLinksPanel.addActionLinks(
labelIfRegular,
RegularFrame.ASSOCIATED_ACTION_LINKS_BELOW.getContainerId(),
- linksBelow, ActionLinksPanel.Style.INLINE_LIST);
+ linksBelow, ActionLinksPanel.ActionPanelStyle.INLINE_LIST,
Where.OBJECT_FORMS);
var linksRight = actionModels
.filter(ActionModel.isPositionedAt(ActionLayout.Position.RIGHT));
ActionLinksPanel.addActionLinks(
labelIfRegular,
RegularFrame.ASSOCIATED_ACTION_LINKS_RIGHT.getContainerId(),
- linksRight, ActionLinksPanel.Style.DROPDOWN);
+ linksRight, ActionLinksPanel.ActionPanelStyle.DROPDOWN,
Where.OBJECT_FORMS);
}
/**
@@ -698,18 +693,16 @@ public Repaint updateIfNecessary(
onMakeNotEditable(usabilityConsent.getReasonAsString().orElse(null));
}
- if (visibilityBefore != visibilityAfter) {
- // repaint the param panel if visibility has changed
+ if (visibilityBefore != visibilityAfter)
+ // repaint the param panel if visibility has changed
return visibilityAfter
? Repaint.REQUIRED_ON_PARENT
: Repaint.REQUIRED;
- }
if (usabilityBefore != usabilityAfter
- && visibilityAfter) {
- // repaint the param panel if usability has changed, but only if
visible
+ && visibilityAfter)
+ // repaint the param panel if usability has changed, but only if
visible
return Repaint.REQUIRED;
- }
return Repaint.OPTIONAL;
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanelWithInlinePrompt.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanelWithInlinePrompt.java
index e3a2b584f10..365ad18153c 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanelWithInlinePrompt.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanelWithInlinePrompt.java
@@ -29,6 +29,7 @@
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
+import org.apache.causeway.applib.annotation.Where;
import
org.apache.causeway.applib.services.placeholder.PlaceholderRenderService.PlaceholderLiteral;
import org.apache.causeway.core.metamodel.interactions.managed.InteractionVeto;
import org.apache.causeway.viewer.commons.model.components.UiString;
@@ -135,7 +136,7 @@ protected final void setupInlinePrompt() {
* However, it may be overridden if required.
*/
protected Component createComponentForOutput(final String id) {
- if(isUsingTextarea()) {
+ if(isUsingTextarea())
return PromptFragment.TEXTAREA
.createFragment(id, this, scalarValueId->{
var textArea = Wkt.textAreaNoTab(scalarValueId,
this::outputFormatAsString);
@@ -146,7 +147,6 @@ protected Component createComponentForOutput(final String
id) {
attributeModel::typicalLength);
return textArea;
});
- }
return CompactFragment.LABEL
.createFragment(id, this, scalarValueId->
Wkt.labelWithDynamicEscaping(scalarValueId,
this::obtainOutputFormat));
@@ -157,9 +157,8 @@ protected Component createComponentForOutput(final String
id) {
private boolean isUsingTextarea() {
if(getRenderScenario().isCompact()
|| getFormatModifiers().contains(FormatModifier.MARKUP)
- || !getFormatModifiers().contains(FormatModifier.MULTILINE)) {
+ || !getFormatModifiers().contains(FormatModifier.MULTILINE))
return false;
- }
// only render a text-area if it has content
return !attributeModel().isEmpty();
}
@@ -178,11 +177,10 @@ protected final String outputFormatAsString() {
*/
protected UiString obtainOutputFormat() {
var proposedValue = attributeModel().proposedValue();
- if(!proposedValue.isPresent()) {
+ if(!proposedValue.isPresent())
return UiString.markup(
getPlaceholderRenderService()
.asHtml(PlaceholderLiteral.NULL_REPRESENTATION));
- }
return isUsingTextarea()
|| getFormatModifiers().contains(FormatModifier.TEXT_ONLY)
?
UiString.text(proposedValue.getValueAsTitle().getValue())
@@ -229,7 +227,7 @@ private void addOnClickBehaviorTo(
_Util.lookupMixinForCompositeValueUpdate(attributeModel)
.ifPresentOrElse((final ActionModel mixinForCompositeValueEdit)->{
// composite value type support
- var actionLink = ActionLink.create(mixinForCompositeValueEdit);
+ var actionLink = ActionLink.create(mixinForCompositeValueEdit,
Where.OBJECT_FORMS);
Wkt.behaviorAddOnClick(clickReceiver, actionLink::onClick);
},()->{
// we configure the prompt link if _this_ property is
configured for inline edits...
@@ -240,7 +238,7 @@ private void addOnClickBehaviorTo(
_Util.lookupPropertyActionForInlineEdit(attributeModel)
.ifPresent((final ActionModel actionLinkInlineAsIfEdit)->{
- var actionLink = ActionLink.create(actionLinkInlineAsIfEdit);
+ var actionLink = ActionLink.create(actionLinkInlineAsIfEdit,
Where.OBJECT_FORMS);
Wkt.behaviorAddOnClick(clickReceiver, actionLink::onClick);
});
}
@@ -317,7 +315,7 @@ private WebMarkupContainer createInlinePromptLink() {
configureInlinePromptLink(inlinePromptLink);
Wkt.add(inlinePromptLink, FieldFrame.SCALAR_VALUE_CONTAINER
- .createComponent(id->createComponentForOutput(id)));
+ .createComponent(this::createComponentForOutput));
return inlinePromptLink;
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanel.java
index 840e9ef5a81..62d93e33304 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanel.java
@@ -152,7 +152,7 @@ private void buildGui() {
final Can<ActionModel> links = collectionModel.getLinks();
ActionLinksPanel.addActionLinks(
- div, ID_ADDITIONAL_LINKS, links,
ActionLinksPanel.Style.INLINE_LIST);
+ div, ID_ADDITIONAL_LINKS, links,
ActionLinksPanel.ActionPanelStyle.INLINE_LIST, Where.OBJECT_FORMS);
createSelectorDropdownPanel(collectionModel);
collectionPanel.setSelectorDropdownPanel(selectorDropdownPanel);
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/present/ajaxtable/columns/ActionColumn.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/present/ajaxtable/columns/ActionColumn.java
index 7f5f3a9142f..8e6fe097747 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/present/ajaxtable/columns/ActionColumn.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/present/ajaxtable/columns/ActionColumn.java
@@ -21,21 +21,21 @@
import java.util.Optional;
import org.apache.wicket.Component;
+import org.jspecify.annotations.NonNull;
import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
import org.apache.causeway.viewer.wicket.model.models.ActionModel;
import
org.apache.causeway.viewer.wicket.model.models.ActionModel.ColumnActionModifier;
-import org.apache.causeway.viewer.wicket.model.models.coll.DataRowWkt;
-import
org.apache.causeway.viewer.wicket.model.models.coll.CollectionModel.Variant;
import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
+import
org.apache.causeway.viewer.wicket.model.models.coll.CollectionModel.Variant;
+import org.apache.causeway.viewer.wicket.model.models.coll.DataRowWkt;
import
org.apache.causeway.viewer.wicket.ui.components.actionlinks.entityactions.ActionLinksPanel;
import org.apache.causeway.viewer.wicket.ui.util.Wkt;
-import org.jspecify.annotations.NonNull;
-
public final class ActionColumn
extends GenericColumnAbstract {
@@ -83,7 +83,7 @@ protected Component createCellComponent(
determineColumnActionModifier(act, elementType)))
.collect(Can.toCan());
- return ActionLinksPanel.actionLinks(componentId, actionModels,
ActionLinksPanel.Style.DROPDOWN)
+ return ActionLinksPanel.actionLinks(componentId, actionModels,
ActionLinksPanel.ActionPanelStyle.DROPDOWN, Where.ALL_TABLES)
.map(Component.class::cast)
.orElseGet(()->Wkt.label(componentId, ""));
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
index 691e20d72e6..6d90a2105d6 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
@@ -26,6 +26,7 @@
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.Model;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.applib.layout.component.ActionLayoutData;
import org.apache.causeway.applib.layout.component.CollectionLayoutData;
import org.apache.causeway.applib.layout.component.DomainObjectLayoutData;
@@ -132,7 +133,7 @@ private void buildGui() {
.collect(Can.toCan());
if (!visibleActions.isEmpty()) {
- ActionLinksPanel.addActionLinks(actionOwner, actionIdToUse,
visibleActions, ActionLinksPanel.Style.INLINE_LIST);
+ ActionLinksPanel.addActionLinks(actionOwner, actionIdToUse,
visibleActions, ActionLinksPanel.ActionPanelStyle.INLINE_LIST,
Where.OBJECT_FORMS);
visible = true;
} else {
WktComponents.permanentlyHide(actionOwner, actionIdToUse);
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/fieldset/PropertyGroup.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/fieldset/PropertyGroup.java
index 17add85ce73..7ebe0dea842 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/fieldset/PropertyGroup.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/fieldset/PropertyGroup.java
@@ -112,13 +112,15 @@ private List<Component> buildGui() {
panelHeading, ID_ASSOCIATED_ACTION_LINKS_PANEL,
memberGroupActions
.filter(ActionModel.isPositionedAt(ActionLayout.Position.PANEL)),
- ActionLinksPanel.Style.INLINE_LIST);
+ ActionLinksPanel.ActionPanelStyle.INLINE_LIST,
+ Where.OBJECT_FORMS);
ActionLinksPanel.addActionLinks(
panelHeading, ID_ASSOCIATED_ACTION_LINKS_PANEL_DROPDOWN,
memberGroupActions
.filter(ActionModel.isPositionedAt(ActionLayout.Position.PANEL_DROPDOWN)),
- ActionLinksPanel.Style.DROPDOWN);
+ ActionLinksPanel.ActionPanelStyle.DROPDOWN,
+ Where.OBJECT_FORMS);
}
// either add the built content, or hide entire
@@ -219,15 +221,12 @@ public boolean isVisible() {
// TODO: should remove this hack. We need some sort of SPI for
ScalarPanelAbstract2's and any other component,
// (eg PdfJsViewer) that can implement. It's "probably" just a matter
of having PdfJsViewer do its work in the
// correct Wicket callback (probably onConfigure).
- if(childComponents.size() > childScalarPanels.size()) {
- return true;
- }
- // HACK:END
+ if(childComponents.size() > childScalarPanels.size())
+ return true;
for (final AttributePanel childComponent : childScalarPanels) {
- if(childComponent.isVisibilityAllowed()) {
+ if(childComponent.isVisibilityAllowed())
return true;
- }
}
return false;
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/header/ObjectHeaderPanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/header/ObjectHeaderPanel.java
index 88b94dfc32d..113046c46a4 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/header/ObjectHeaderPanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/header/ObjectHeaderPanel.java
@@ -20,6 +20,7 @@
import org.apache.wicket.Component;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.object.ManagedObject;
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -78,7 +79,7 @@ private void buildEntityActionsGui() {
ActionLinksPanel
.addActionLinks(this, ID_OBJECT_ACTIONS, topLevelActions,
- ActionLinksPanel.Style.INLINE_LIST);
+ ActionLinksPanel.ActionPanelStyle.INLINE_LIST,
Where.OBJECT_FORMS);
} else {
WktComponents.permanentlyHide(this, ID_OBJECT_ACTIONS);
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
index 40f638265f0..c4e47c8c2bf 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
@@ -27,6 +27,7 @@
import org.apache.wicket.request.cycle.RequestCycle;
import org.jspecify.annotations.NonNull;
+import org.apache.causeway.applib.annotation.Where;
import org.apache.causeway.commons.internal.assertions._Assert;
import org.apache.causeway.commons.internal.debug._Probe;
import org.apache.causeway.commons.internal.debug._Probe.EntryPoint;
@@ -82,21 +83,25 @@ public final class ActionLink
private static final String ID_ACTION_LINK = "actionLink";
public static ActionLink create(
- final @NonNull ActionModel actionModel) {
+ final @NonNull ActionModel actionModel,
+ final @NonNull Where where) {
- var actionLink = new ActionLink(ID_ACTION_LINK, actionModel);
+ var actionLink = new ActionLink(ID_ACTION_LINK, actionModel, where);
return Wkt.cssAppend(actionLink, "noVeil");
}
private final AjaxIndicatorAppender indicatorAppenderIfAny;
+ private final Where where; // where to render the action, used to check
action's usability and visibility
private ActionLink(
final String id,
- final ActionModel model) {
+ final ActionModel model,
+ final Where where) {
super(id, model);
_Assert.assertNotNull(model.getAction(), "ActionLink requires an
Action");
+ this.where = where;
this.indicatorAppenderIfAny =
getSettings().isUseIndicatorForNoArgAction()
? new AjaxIndicatorAppender()
: null;
@@ -134,18 +139,18 @@ protected void updateAjaxAttributes(final
AjaxRequestAttributes attributes) {
public String getReasonDisabledIfAny() {
// no point evaluating if not visible
return isVisible()
- ?
getActionModel().getUsabilityConsent().getReasonAsString().orElse(null)
+ ?
getActionModel().getUsabilityConsent(where).getReasonAsString().orElse(null)
: null;
}
@Override
public boolean isVisible() {
- return getActionModel().getVisibilityConsent().isAllowed();
+ return getActionModel().getVisibilityConsent(where).isAllowed();
}
@Override
public boolean isEnabled() {
- return getActionModel().getUsabilityConsent().isAllowed();
+ return getActionModel().getUsabilityConsent(where).isAllowed();
}
@SuppressWarnings("deprecation")