Repository: isis Updated Branches: refs/heads/master f057d29d8 -> 15d87eada
ISIS-1552: now uses 'readonly' rather than 'disabled' tag for disabled text fields, provided that the new 'replaceDisabledTagWithReadonlyTag has not been set to false. Also updates the docs Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/f325400b Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/f325400b Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/f325400b Branch: refs/heads/master Commit: f325400b3fd1e120c67cf8ca909a5763a30f0da0 Parents: fa36da4 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Fri Dec 9 09:00:19 2016 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Fri Dec 9 09:00:19 2016 +0000 ---------------------------------------------------------------------- .../guides/_ugvw_configuration-properties.adoc | 5 +++ .../settings/WicketViewerSettingsDefault.java | 5 +++ .../wicket/model/isis/WicketViewerSettings.java | 7 +++- .../components/scalars/ScalarPanelAbstract.java | 1 - .../scalars/ScalarPanelTextFieldAbstract.java | 40 +++++++++++++++++++- .../webapp/WEB-INF/viewer_wicket.properties | 10 ++++- 6 files changed, 64 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc ---------------------------------------------------------------------- diff --git a/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc b/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc index f01f52d..ea5f3fc 100644 --- a/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc +++ b/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc @@ -120,6 +120,11 @@ for further details). | Ignored for 1.8.0+; in earlier versions forced regular case rather than title case in the UI |`isis.viewer.wicket.` + +`replaceDisabledTagWithReadonlyTag` +| `true`,`false` (`_true_`) +| (`1.13.2-SNAPSHOT`) Whether to replace 'disabled' tag with 'readonly' (for link:https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#the-readonly-attribute[w3 spec]-compliant browsers such as for Firefox and Chrome 54+) which prevent copy from 'disabled' fields. + +|`isis.viewer.wicket.` + `rememberMe.cookieKey` | ascii chars (`_isisWicketRememberMe_`) |Cookie key holding the (encrypted) 'rememberMe' user/password. There is generally no need to http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java index 0771dde..91ef087 100644 --- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java +++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java @@ -70,4 +70,9 @@ public class WicketViewerSettingsDefault implements WicketViewerSettings { public String getTimestampPattern() { return getConfiguration().getString("isis.viewer.wicket.timestampPattern", "yyyy-MM-dd HH:mm:ss.SSS"); } + + @Override + public boolean isReplaceDisabledTagWithReadonlyTag() { + return getConfiguration().getBoolean("isis.viewer.wicket.replaceDisabledTagWithReadonlyTag", true); + } } http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/isis/WicketViewerSettings.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/isis/WicketViewerSettings.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/isis/WicketViewerSettings.java index 90f4d50..0f00912 100644 --- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/isis/WicketViewerSettings.java +++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/isis/WicketViewerSettings.java @@ -65,5 +65,10 @@ public interface WicketViewerSettings extends Serializable { */ String getTimestampPattern(); - + /** + * in Firefox and more recent versions of Chrome 54+, cannot copy out of disabled fields; instead we use the + * readonly attribute (https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#the-readonly-attribute) + * This behaviour is enabled by default but can be disabled using this flag + */ + boolean isReplaceDisabledTagWithReadonlyTag(); } http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java index bf33953..98b8c55 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java @@ -43,7 +43,6 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking; import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet; import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet; -import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.viewer.wicket.model.links.LinkAndLabel; import org.apache.isis.viewer.wicket.model.models.ActionPrompt; import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider; http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java index 311e3ce..e3dbe06 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java @@ -28,6 +28,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.behavior.Behavior; +import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.AbstractTextComponent; @@ -44,6 +45,7 @@ import org.apache.isis.core.metamodel.facets.SingleIntValueFacet; import org.apache.isis.core.metamodel.facets.all.named.NamedFacet; import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet; import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet; +import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings; 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.EntityActionUtil; @@ -62,6 +64,17 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten protected final Class<T> cls; + protected static class ReplaceDisabledTagWithReadonlyTagBehaviour extends Behavior { + @Override public void onComponentTag(final Component component, final ComponentTag tag) { + super.onComponentTag(component, tag); + if(component.isEnabled()) { + return; + } + tag.remove("disabled"); + tag.put("readonly","readonly"); + } + } + protected WebMarkupContainer scalarTypeContainer; private AbstractTextComponent<T> textField; @@ -152,7 +165,18 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten // over the parsing (using custom subclasses of TextField etc) } - + private void addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(final Component component) { + if(!getSettings().isReplaceDisabledTagWithReadonlyTag()) { + return; + } + if (component == null) { + return; + } + if (!component.getBehaviors(ReplaceDisabledTagWithReadonlyTagBehaviour.class).isEmpty()) { + return; + } + component.add(new ReplaceDisabledTagWithReadonlyTagBehaviour()); + } private MarkupContainer createFormComponentLabel() { Fragment textFieldFragment = createTextFieldFragment("scalarValueContainer"); @@ -243,12 +267,14 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten protected void onBeforeRenderWhenViewMode() { super.onBeforeRenderWhenViewMode(); textField.setEnabled(false); + addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(textField); final String disableReasonIfAny = scalarModel.disable(getRendering().getWhere()); if(disableReasonIfAny == null) { CssClassAppender.appendCssClassTo(this, "editable"); } + setTitleAttribute(""); } @@ -256,6 +282,7 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten protected void onBeforeRenderWhenDisabled(final String disableReason) { super.onBeforeRenderWhenDisabled(disableReason); textField.setEnabled(false); + addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(textField); setTitleAttribute(disableReason); } @@ -275,5 +302,16 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten textField.add(behavior); } + + //region > dependencies + + @com.google.inject.Inject + private WicketViewerSettings settings; + protected WicketViewerSettings getSettings() { + return settings; + } + + //endregion + } http://git-wip-us.apache.org/repos/asf/isis/blob/f325400b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties index 7b72fb1..d6f1ff1 100644 --- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties +++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties @@ -31,13 +31,21 @@ isis.viewer.wicket.maxTitleLengthInStandaloneTables=0 isis.viewer.wicket.maxTitleLengthInParentedTables=0 + +# +# in Firefox and more recent versions of Chrome 54+, cannot copy out of disabled fields; instead we use the +# readonly attribute (https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#the-readonly-attribute) +# This behaviour is enabled by default but can be disabled using this flag +# +#isis.viewer.wicket.replaceDisabledTagWithReadonlyTag=true + + #isis.viewer.wicket.datePicker.minDate=1900-01-01T00:00:00.000Z #isis.viewer.wicket.datePicker.maxDate=2100-01-01T00:00:00.000Z #isis.viewer.wicket.datePattern=dd-MM-yyyy #isis.viewer.wicket.dateTimePattern=dd-MM-yyyy HH:mm - #isis.viewer.wicket.datePattern=dd/MM/yy #isis.viewer.wicket.dateTimePattern=dd/MM/yy HH:mm