diff --git a/5_10_RELEASE_NOTES.md b/5_10_RELEASE_NOTES.md index d62d92163c..4a942b709a 100644 --- a/5_10_RELEASE_NOTES.md +++ b/5_10_RELEASE_NOTES.md @@ -17,16 +17,24 @@ Scratch pad for changes destined for the 5.10.0 release notes page. * `org.apache.tapestry5.services.javascript.ImportPlacement` * `org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback` * `org.apache.tapestry5.services.javascript.EsModuleManager` +* `org.apache.tapestry5.services.javascript.ESWrapper` # Non-backward-compatible changes (but that probably won't cause problems) # Non-backward-compatible changes -When using Require.js and AMD modules, from Tapestry 5.10.0 on, -the previously returned objects, functions or values are now -the `default` property of the object received from `require()`. -This is a consequence we couldn't avoid from the CoffeeScript -to JavaScript to TypeScript conversion. +* When using Require.js and AMD modules, from Tapestry 5.10.0 on, + the previously returned objects, functions or values are now + the `default` property of the object received from `require()`. + This is a consequence we couldn't avoid from the CoffeeScript + to JavaScript to TypeScript conversion. + + +# Notes about Require.js disabled mode +* Underscore.js, jQuery and Require.js are not included in the default stack + (i.e. the set of JavaScript files which are included in pages by default). + If you need to use Underscore.js or jQuery, they're automatically available for + import as `underscore` and `jquery`, respectively. # Overall notes diff --git a/build.gradle b/build.gradle index a80b696370..bde9ee18d7 100755 --- a/build.gradle +++ b/build.gradle @@ -538,12 +538,13 @@ task combinedJacocoReport(type:JacocoReport){ } task continuousIntegration { - // tapestry-javadoc doesn't work with Java 8 anymore. That's why it's only added if != 8. - def dependants = [subprojects.build, // jQuery and Require.js enabled -// 'tapestry-core:testWithJqueryAndRequireJsDisabled', -// 'tapestry-core:testWithPrototypeAndRequireJsEnabled', + def dependants = [ 'tapestry-core:testWithPrototypeAndRequireJsDisabled', + 'tapestry-core:testWithJqueryAndRequireJsDisabled', + subprojects.build, // jQuery and Require.js enabled + 'tapestry-core:testWithPrototypeAndRequireJsEnabled', combinedJacocoReport] + // tapestry-javadoc doesn't work with Java 8 anymore. That's why it's only added if != 8. if (JavaVersion.current() != JavaVersion.VERSION_1_8) { dependants << aggregateJavadoc } diff --git a/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/modules/BeanValidatorModule.java b/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/modules/BeanValidatorModule.java index 2f93c789b5..e068bb5146 100644 --- a/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/modules/BeanValidatorModule.java +++ b/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/modules/BeanValidatorModule.java @@ -14,6 +14,7 @@ package org.apache.tapestry5.beanvalidator.modules; import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.beanvalidator.*; import org.apache.tapestry5.commons.Configuration; import org.apache.tapestry5.commons.MappedConfiguration; @@ -21,6 +22,7 @@ import org.apache.tapestry5.internal.beanvalidator.*; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Local; +import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.services.PropertyShadowBuilder; import org.apache.tapestry5.ioc.services.ThreadLocale; import org.apache.tapestry5.services.FieldValidatorDefaultSource; @@ -92,14 +94,20 @@ public void configure(jakarta.validation.Configuration configuration) } public static void contributeClientConstraintDescriptorSource(final JavaScriptSupport javaScriptSupport, - final Configuration configuration) + final Configuration configuration, + final @Symbol(SymbolConstants.REQUIRE_JS_ENABLED) boolean requireJsEnabled) { + + final Runnable importJs = requireJsEnabled ? + () -> javaScriptSupport.require(MODULE_NAME) : + () -> javaScriptSupport.importEsModule(MODULE_NAME); + configuration.add(new BaseCCD(Max.class, "value") { @Override public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require("t5/core/validation"); + importJs.run(); writer.attributes( "data-validate", true, "data-validate-max", attributes.get("value"), @@ -113,7 +121,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require("t5/core/validation"); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, "data-validate-min", attributes.get("value"), @@ -127,7 +135,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require("t5/core/validation"); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, "data-optionality", "required", @@ -140,7 +148,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require(MODULE_NAME); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, "data-optionality", "prohibited", @@ -153,7 +161,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require(MODULE_NAME); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, "data-validate-regexp", attributes.get("regexp"), @@ -166,7 +174,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require(MODULE_NAME); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, "data-range-message", message); @@ -192,7 +200,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require("t5/core/validation"); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, @@ -206,7 +214,7 @@ public void applyClientValidation(MarkupWriter writer, String message, Map attributes) { - javaScriptSupport.require("t5/core/validation"); + importJs.run(); writer.attributes( DataConstants.VALIDATION_ATTRIBUTE, true, diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java index 64ac711afd..4e27a3f6b4 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java @@ -20,8 +20,8 @@ import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.http.Link; import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; -import org.apache.tapestry5.services.javascript.JavaScriptSupport; /** * Base class for link-generating components that are based on a component event request. Such events have an event @@ -57,8 +57,8 @@ public abstract class AbstractComponentEventLink extends AbstractLink @Inject private Request request; - @Environmental - private JavaScriptSupport javaScriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; void beginRender(MarkupWriter writer) { @@ -72,7 +72,7 @@ void beginRender(MarkupWriter writer) if (async) { - javaScriptSupport.require("t5/core/zone"); + requireJsModeHelper.importModule("t5/core/zone"); writer.attributes("data-async-trigger", true); } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractField.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractField.java index 654917abd5..22e991caec 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractField.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractField.java @@ -22,6 +22,7 @@ import org.apache.tapestry5.internal.BeanValidationContext; import org.apache.tapestry5.internal.InternalComponentResources; import org.apache.tapestry5.internal.services.FormControlNameManager; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.internal.util.InternalUtils; @@ -154,6 +155,9 @@ public String toString() @Environmental protected JavaScriptSupport javaScriptSupport; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Environmental protected ValidationTracker validationTracker; @@ -296,7 +300,7 @@ final void afterDecorator() if (error != null) { - javaScriptSupport.require("t5/core/fields").invoke("showValidationError").with(assignedClientId, error); + requireJsModeHelper.importModule("t5/core/fields").invoke("showValidationError").with(assignedClientId, error); } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java index 789ca01ebe..72eaded6b6 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java @@ -20,6 +20,7 @@ import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.http.Link; import org.apache.tapestry5.internal.services.RequestConstants; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.ComponentDefaultProvider; @@ -62,7 +63,6 @@ */ @Events( {EventConstants.ADD_ROW, EventConstants.REMOVE_ROW}) -@Import(module = "t5/core/ajaxformloop") @SupportsInformalParameters public class AjaxFormLoop { @@ -139,6 +139,9 @@ public class AjaxFormLoop @Inject private ComponentResources resources; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Environmental private FormSupport formSupport; @@ -167,7 +170,7 @@ public class AjaxFormLoop @Inject private DeprecationWarning deprecationWarning; - + void pageLoaded() { deprecationWarning.ignoredComponentParameters(resources, "show"); @@ -325,6 +328,9 @@ private String toClientValue() void setupRender(MarkupWriter writer) { + + requireJsModeHelper.importModule("t5/core/ajaxformloop"); + pushContext(); iterator = source == null ? Collections.EMPTY_LIST.iterator() : source.iterator(); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Alerts.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Alerts.java index cf6e06400b..6893fc9127 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Alerts.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Alerts.java @@ -20,6 +20,7 @@ import org.apache.tapestry5.corelib.base.BaseClientElement; import org.apache.tapestry5.http.Link; import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.compatibility.DeprecationWarning; @@ -63,6 +64,9 @@ public class Alerts extends BaseClientElement @Inject private Request request; + + @Inject + private RequireJsModeHelper requireJsModeHelper; void onPageLoaded() { @@ -120,7 +124,7 @@ void addAlertsFromStorage() for (Alert alert : storage.getAlerts()) { - javaScriptSupport.require("t5/core/alert").with(alert.toJSON()); + requireJsModeHelper.importModule("t5/core/alert").with(alert.toJSON()); } storage.dismissNonPersistent(); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DateField.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DateField.java index c986beb195..569ebfdc3a 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DateField.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DateField.java @@ -20,6 +20,7 @@ import org.apache.tapestry5.commons.Messages; import org.apache.tapestry5.corelib.base.AbstractField; import org.apache.tapestry5.dom.Element; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.internal.util.InternalUtils; @@ -49,8 +50,7 @@ * @see TextField */ // TODO: More testing; see https://issues.apache.org/jira/browse/TAPESTRY-1844 -@Import(stylesheet = "${tapestry.datepicker}/css/datepicker.css", - module = "t5/core/datefield") +@Import(stylesheet = "${tapestry.datepicker}/css/datepicker.css") @Events(EventConstants.VALIDATE) public class DateField extends AbstractField { @@ -127,6 +127,9 @@ public class DateField extends AbstractField @Inject private DeprecationWarning deprecationWarning; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject @Symbol(SymbolConstants.LENIENT_DATE_FORMAT) @@ -225,6 +228,9 @@ JSONObject onFormat(@RequestParameter(INPUT_PARAMETER) void beginRender(MarkupWriter writer) { + + requireJsModeHelper.importModule("t5/core/datefield"); + String value = validationTracker.getInput(this); if (value == null) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DevTool.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DevTool.java index 3c6f9f614d..9c0ad42cc2 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DevTool.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DevTool.java @@ -14,6 +14,7 @@ import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.alerts.AlertManager; import org.apache.tapestry5.annotations.Component; import org.apache.tapestry5.annotations.Environmental; @@ -94,6 +95,10 @@ public class DevTool @Inject private ReloadHelper reloadHelper; + + @Inject + @Symbol(SymbolConstants.REQUIRE_JS_ENABLED) + private boolean requireJsEnabled; public String getZoneElement() { @@ -122,7 +127,14 @@ boolean beginRender() { if (enabled) { - javaScriptSupport.importStack("core").require("bootstrap/dropdown"); + if (requireJsEnabled) + { + javaScriptSupport.importStack("core").require("bootstrap/dropdown"); + } + else + { + javaScriptSupport.importEsModule("bootstrap/dropdown"); + } } return enabled; diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Errors.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Errors.java index 7438dfd764..71c2cb6f20 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Errors.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Errors.java @@ -24,6 +24,7 @@ import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.commons.util.CollectionFactory; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.services.ComponentOverride; @@ -79,7 +80,7 @@ public class Errors private String closeButtonCssClass; @Inject - private JavaScriptSupport javaScriptSupport; + private RequireJsModeHelper requireJsModeHelper; boolean beginRender(MarkupWriter writer) { @@ -146,7 +147,7 @@ boolean beginRender(MarkupWriter writer) * @see ComponentOverride */ protected void setUpJavaScript() { - javaScriptSupport.require("bootstrap/alert"); + requireJsModeHelper.importModule("bootstrap/alert"); } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ExceptionDisplay.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ExceptionDisplay.java index c1afa247ac..b510d43752 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ExceptionDisplay.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ExceptionDisplay.java @@ -17,6 +17,7 @@ import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Primary; import org.apache.tapestry5.ioc.services.ExceptionAnalysis; @@ -34,7 +35,7 @@ * @tapestrydoc * @see org.apache.tapestry5.ioc.services.ExceptionAnalyzer */ -@Import(stylesheet = "ExceptionDisplay.css", module = "t5/core/exception-display") +@Import(stylesheet = "ExceptionDisplay.css") public class ExceptionDisplay { /** @@ -63,12 +64,17 @@ public class ExceptionDisplay @Inject @Primary private StackTraceElementAnalyzer frameAnalyzer; + + @Inject + private RequireJsModeHelper requireJsModeHelper; void setupRender() { ExceptionAnalysis analysis = analyzer.analyze(exception); stack = analysis.getExceptionInfos(); + + requireJsModeHelper.importModule("t5/core/exception-display"); } public Object getPropertyValue() diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java index 3d0fe289b6..5d8b8222c3 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java @@ -33,6 +33,7 @@ import org.apache.tapestry5.internal.InternalConstants; import org.apache.tapestry5.internal.services.FormControlNameManager; import org.apache.tapestry5.internal.services.HeartbeatImpl; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.AutofocusValidationDecorator; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; @@ -238,6 +239,9 @@ public class Form implements ClientElement, FormValidationControl @Environmental private JavaScriptSupport javascriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; + @Inject private Request request; @@ -394,7 +398,7 @@ void beginRender(MarkupWriter writer) if (async) { - javascriptSupport.require("t5/core/zone"); + requireJsModeHelper.importModule("t5/core/zone"); writer.attributes("data-async-trigger", true); } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormFragment.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormFragment.java index 972fde06df..c4046648b0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormFragment.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormFragment.java @@ -12,10 +12,13 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.ClientElement; +import org.apache.tapestry5.ComponentAction; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.HeartbeatDeferred; -import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.corelib.internal.ComponentActionSink; @@ -23,6 +26,7 @@ import org.apache.tapestry5.corelib.internal.HiddenFieldPositioner; import org.apache.tapestry5.corelib.mixins.TriggerFragment; import org.apache.tapestry5.dom.Element; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ClientDataEncoder; import org.apache.tapestry5.services.Environment; @@ -54,7 +58,6 @@ * @see Form */ @SupportsInformalParameters -@Import(module = "t5/core/form-fragment") public class FormFragment implements ClientElement { /** @@ -122,9 +125,12 @@ public class FormFragment implements ClientElement @Inject private Environment environment; - + @Environmental private JavaScriptSupport javascriptSupport; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject private ComponentResources resources; @@ -143,7 +149,7 @@ public class FormFragment implements ClientElement @Inject private ClientDataEncoder clientDataEncoder; - + String defaultElement() { return resources.getElementName("div"); @@ -170,6 +176,8 @@ void beginRender(MarkupWriter writer) } resources.renderInformalParameters(writer); + + requireJsModeHelper.importModule("t5/core/form-fragment"); if (!visible) { @@ -177,7 +185,7 @@ void beginRender(MarkupWriter writer) if (!alwaysSubmit) { - javascriptSupport.require("t5/core/form-fragment").invoke("hide").with(clientId); + requireJsModeHelper.importModule("t5/core/form-fragment").invoke("hide").with(clientId); } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java index 0f34cd3ec9..d735c60db5 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Graphviz.java @@ -21,6 +21,7 @@ import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.commons.Messages; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ajax.AjaxResponseRenderer; import org.apache.tapestry5.services.javascript.JavaScriptSupport; @@ -58,6 +59,9 @@ public class Graphviz @Environmental private JavaScriptSupport javaScriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; + @Inject private AjaxResponseRenderer ajaxResponseRenderer; @@ -88,7 +92,7 @@ void setupRender(MarkupWriter writer) // TODO import https://cdn.jsdelivr.net/npm/@hpcc-js/wasm/dist/graphviz.js // if Require.js is disabled @hpcc-js/wasm - javaScriptSupport.require("t5/core/graphviz").with(cachedValue, id, showDownloadLink); + requireJsModeHelper.importModule("t5/core/graphviz").with(cachedValue, id, showDownloadLink); if (showDownloadLink) { diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Grid.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Grid.java index 79e120b79b..bb5e5c3ee4 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Grid.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Grid.java @@ -22,12 +22,12 @@ import org.apache.tapestry5.grid.*; import org.apache.tapestry5.internal.TapestryInternalUtils; import org.apache.tapestry5.internal.bindings.AbstractBinding; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.services.ComponentDefaultProvider; import org.apache.tapestry5.services.ComponentEventResultProcessor; import org.apache.tapestry5.services.FormSupport; -import org.apache.tapestry5.services.javascript.JavaScriptSupport; import java.io.IOException; import java.util.Collections; @@ -234,8 +234,8 @@ public class Grid implements GridModel, ClientElement @Inject private BeanModelSource modelSource; - @Environmental - private JavaScriptSupport javaScriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; @Component(parameters = {"index=inherit:columnIndex", "lean=inherit:lean", "overrides=overrides", "zone=zone"}) @@ -591,7 +591,7 @@ Object beginRender(MarkupWriter writer) if (inPlace && zone == null) { - javaScriptSupport.require("t5/core/zone"); + requireJsModeHelper.importModule("t5/core/zone"); writer.element("div", "data-container-type", "zone"); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Label.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Label.java index c64853a386..529b027c53 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Label.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Label.java @@ -19,6 +19,7 @@ import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.http.TapestryHttpSymbolConstants; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.internal.util.InternalUtils; @@ -67,6 +68,9 @@ public class Label @Inject private JavaScriptSupport javaScriptSupport; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject @Symbol(TapestryHttpSymbolConstants.PRODUCTION_MODE) @@ -120,7 +124,7 @@ private void updateAttributes() // TAP5-2500 String warningText = "The Label component " + resources.getCompleteId() + " is linked to a Field that failed to return a clientId. The 'for' attibute will not be rendered."; - javaScriptSupport.require("t5/core/console").invoke("warn").with(warningText); + requireJsModeHelper.importModule("t5/core/console").invoke("warn").with(warningText); } String id = clientId != null ? clientId : javaScriptSupport.allocateClientId(fieldId + "-label"); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LinkSubmit.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LinkSubmit.java index 4ab44ed18a..66141a074f 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LinkSubmit.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LinkSubmit.java @@ -14,10 +14,20 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.ClientElement; +import org.apache.tapestry5.ComponentAction; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.TrackableComponentEventCallback; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Events; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.corelib.SubmitMode; import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.json.JSONArray; @@ -34,7 +44,6 @@ */ @SupportsInformalParameters @Events(EventConstants.SELECTED + " by default, may be overridden") -@Import(module = "t5/core/forms") public class LinkSubmit implements ClientElement { /** @@ -94,13 +103,17 @@ public class LinkSubmit implements ClientElement @Inject private Request request; + + @Inject + private RequireJsModeHelper requireJsModeHelper; - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") @Environmental private TrackableComponentEventCallback eventCallback; private String clientId; + @SuppressWarnings("serial") private static class ProcessSubmission implements ComponentAction { private final String clientId; @@ -143,6 +156,9 @@ void beginRender(MarkupWriter writer) { if (!disabled) { + + requireJsModeHelper.importModule("t5/core/forms"); + clientId = javascriptSupport.allocateClientId(resources); formSupport.store(this, new ProcessSubmission(clientId)); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LocalDate.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LocalDate.java index 797bc5fabd..f9f0f33b1e 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LocalDate.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/LocalDate.java @@ -12,17 +12,16 @@ package org.apache.tapestry5.corelib.components; +import java.util.Date; + import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.MarkupWriter; -import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SupportsInformalParameters; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.DateUtilities; -import org.apache.tapestry5.services.javascript.JavaScriptSupport; - -import java.util.Date; /** * Used to present a date, formatted in the time zone of the client browser. @@ -62,8 +61,8 @@ public class LocalDate @Inject ComponentResources resources; - @Environmental - JavaScriptSupport javaScriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject DateUtilities dateUtilities; @@ -81,7 +80,7 @@ boolean beginRender(MarkupWriter writer) writer.end(); - javaScriptSupport.require("t5/core/localdate"); + requireJsModeHelper.importModule("t5/core/localdate"); } // Skip the body regardless. diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Palette.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Palette.java index 69313c37bf..955a3840bc 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Palette.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Palette.java @@ -12,19 +12,31 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; +import java.util.Collection; + +import org.apache.tapestry5.Asset; +import org.apache.tapestry5.Binding; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.Block; +import org.apache.tapestry5.ComponentParameterConstants; +import org.apache.tapestry5.FieldValidator; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.Renderable; +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.ValidationException; +import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.base.AbstractField; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.SelectModelRenderer; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.json.JSONArray; import org.apache.tapestry5.services.compatibility.DeprecationWarning; -import java.util.Collection; - /** * Multiple selection component. Generates a UI consisting of two <select> elements configured for multiple * selection; the one on the left is the list of "available" elements, the one on the right is "selected". Elements can @@ -160,7 +172,6 @@ public class Palette extends AbstractField * @since 5.2.0 */ @Parameter(defaultPrefix = BindingConstants.VALIDATE) - @SuppressWarnings("unchecked") private FieldValidator validate; @Inject @@ -169,6 +180,9 @@ public class Palette extends AbstractField @Inject private DeprecationWarning deprecationWarning; + + @Inject + private RequireJsModeHelper requireJsModeHelper; void pageLoaded() { deprecationWarning.ignoredComponentParameters(resources, "select", "moveUp", "moveDown", "deselect"); @@ -247,7 +261,7 @@ void beginRender() // The client side just need to know the id of the selected (right column) select; // it can take it from there. - javaScriptSupport.require("t5/core/palette").with(clientId); + requireJsModeHelper.importModule("t5/core/palette").with(clientId); } /** diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ProgressiveDisplay.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ProgressiveDisplay.java index 69da03e0f5..726f4cd6e6 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ProgressiveDisplay.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ProgressiveDisplay.java @@ -18,6 +18,7 @@ import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.http.Link; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.compatibility.DeprecationWarning; import org.apache.tapestry5.services.javascript.JavaScriptSupport; @@ -63,9 +64,12 @@ public class ProgressiveDisplay @Inject private ComponentResources resources; - + @Environmental - private JavaScriptSupport jsSupport; + private JavaScriptSupport javaScriptSupport; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Environmental private TrackableComponentEventCallback eventCallback; @@ -91,7 +95,7 @@ void pageLoaded() { Block beginRender(MarkupWriter writer) { - String clientId = jsSupport.allocateClientId(resources); + String clientId = javaScriptSupport.allocateClientId(resources); String elementName = resources.getElementName("div"); writer.element(elementName, "id", clientId, "data-container-type", "zone"); @@ -99,7 +103,7 @@ Block beginRender(MarkupWriter writer) Link link = resources.createEventLink(EventConstants.ACTION, context); - jsSupport.require("t5/core/zone").invoke("deferredZoneUpdate").with(clientId, link.toURI()); + requireJsModeHelper.importModule("t5/core/zone").invoke("deferredZoneUpdate").with(clientId, link.toURI()); // Return the placeholder for the full content. That will render instead of the main body // of the component. diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java index 1c15c04386..76e61e874c 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java @@ -12,9 +12,29 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; -import org.apache.tapestry5.beanmodel.services.*; +import java.util.List; + +import org.apache.tapestry5.Binding; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.ComponentParameterConstants; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.EventContext; +import org.apache.tapestry5.FieldValidationSupport; +import org.apache.tapestry5.FieldValidator; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.OptionGroupModel; +import org.apache.tapestry5.OptionModel; +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.SelectModelVisitor; +import org.apache.tapestry5.ValidationException; +import org.apache.tapestry5.ValidationTracker; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.annotations.BeforeRenderTemplate; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Events; +import org.apache.tapestry5.annotations.Mixin; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.RequestParameter; import org.apache.tapestry5.commons.Messages; import org.apache.tapestry5.commons.services.TypeCoercer; import org.apache.tapestry5.corelib.base.AbstractField; @@ -26,6 +46,7 @@ import org.apache.tapestry5.internal.AbstractEventContext; import org.apache.tapestry5.internal.InternalComponentResources; import org.apache.tapestry5.internal.TapestryInternalUtils; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.CaptureResultCallback; import org.apache.tapestry5.internal.util.SelectModelRenderer; import org.apache.tapestry5.ioc.annotations.Inject; @@ -34,12 +55,8 @@ import org.apache.tapestry5.services.FormSupport; import org.apache.tapestry5.services.ValueEncoderFactory; import org.apache.tapestry5.services.ValueEncoderSource; -import org.apache.tapestry5.services.javascript.JavaScriptSupport; import org.apache.tapestry5.util.EnumSelectModel; -import java.util.Collections; -import java.util.List; - /** * Select an item from a list of values, using an [X]HTML <select> element on the client side. Any validation * decorations will go around the entire <select> element. @@ -180,12 +197,11 @@ protected boolean isOptionSelected(OptionModel optionModel, String clientValue) private FormSupport formSupport; @Inject - private JavaScriptSupport javascriptSupport; + private RequireJsModeHelper requireJsModeHelper; @Inject private TypeCoercer typeCoercer; - @SuppressWarnings("unused") @Mixin private RenderDisabled renderDisabled; @@ -196,8 +212,6 @@ private boolean isSelected(String clientValue) return TapestryInternalUtils.isEqual(clientValue, selectedClientValue); } - @SuppressWarnings( - {"unchecked"}) @Override protected void processSubmission(String controlName) { @@ -260,7 +274,7 @@ void beginRender(MarkupWriter writer) if (this.zone != null) { - javaScriptSupport.require("t5/core/select"); + requireJsModeHelper.importModule("t5/core/select"); Link link = resources.createEventLink(CHANGE_EVENT, context); @@ -391,17 +405,6 @@ private boolean findInOptions(List options, Object asSubmitted) return false; } - private static List orEmpty(List list) - { - if (list == null) - { - return Collections.emptyList(); - } - - return list; - } - - @SuppressWarnings("unchecked") ValueEncoder defaultEncoder() { return defaultProvider.defaultValueEncoder("value", resources); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Submit.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Submit.java index b96db2ca4d..9df3c97d85 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Submit.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Submit.java @@ -14,10 +14,21 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; +import org.apache.tapestry5.Asset; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.ClientElement; +import org.apache.tapestry5.ComponentAction; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.TrackableComponentEventCallback; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Events; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.corelib.SubmitMode; import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.Holder; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.internal.util.InternalUtils; @@ -36,7 +47,6 @@ */ @SupportsInformalParameters @Events(EventConstants.SELECTED + " by default, may be overridden") -@Import(module="t5/core/forms") public class Submit implements ClientElement { /** @@ -120,6 +130,9 @@ public class Submit implements ClientElement @SuppressWarnings("unchecked") @Environmental private TrackableComponentEventCallback eventCallback; + + @Inject + private RequireJsModeHelper requireJsModeHelper; private String clientId; @@ -150,6 +163,9 @@ public Submit() void beginRender(MarkupWriter writer) { + + requireJsModeHelper.importModule("t5/core/forms"); + clientId = javascriptSupport.allocateClientId(resources); String name = formSupport.allocateControlName(resources.getId()); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/TimeInterval.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/TimeInterval.java index 01d3482da1..45fec9e136 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/TimeInterval.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/TimeInterval.java @@ -12,16 +12,16 @@ package org.apache.tapestry5.corelib.components; +import java.util.Date; + import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.MarkupWriter; -import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SupportsInformalParameters; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.DateUtilities; -import java.util.Date; - /** * Used to present an interval value using Moment.js's from() or fromNow() functions. The interval * is determined in terms of a start and end date; either (but not both) may be omitted, in which @@ -40,7 +40,6 @@ * @since 5.4 */ @SupportsInformalParameters -@Import(module = "t5/core/time-interval") public class TimeInterval { /** @@ -65,6 +64,9 @@ public class TimeInterval @Inject ComponentResources resources; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject DateUtilities dateUtilities; @@ -76,6 +78,9 @@ private String toISO(Date date) boolean beginRender(MarkupWriter writer) { + + requireJsModeHelper.importModule("t5/core/time-interval"); + writer.element(resources.getElementName("span"), // Trigger the client-side logic: "data-timeinterval", "true", diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java index 7167574a46..a7a6702364 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Tree.java @@ -12,13 +12,25 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; +import java.util.List; + +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.Block; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Events; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.RequestParameter; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.func.F; import org.apache.tapestry5.func.Flow; import org.apache.tapestry5.func.Worker; import org.apache.tapestry5.http.Link; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.CaptureResultCallback; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONObject; @@ -26,9 +38,11 @@ import org.apache.tapestry5.runtime.RenderQueue; import org.apache.tapestry5.services.Heartbeat; import org.apache.tapestry5.services.javascript.JavaScriptSupport; -import org.apache.tapestry5.tree.*; - -import java.util.List; +import org.apache.tapestry5.tree.DefaultTreeExpansionModel; +import org.apache.tapestry5.tree.TreeExpansionModel; +import org.apache.tapestry5.tree.TreeModel; +import org.apache.tapestry5.tree.TreeNode; +import org.apache.tapestry5.tree.TreeSelectionModel; /** * A component used to render a recursive tree structure, with expandable/collapsable/selectable nodes. The data that is displayed @@ -45,9 +59,8 @@ * @since 5.3 */ @SuppressWarnings( - {"rawtypes", "unchecked", "unused"}) + {"rawtypes", "unchecked"}) @Events({EventConstants.NODE_SELECTED, EventConstants.NODE_UNSELECTED}) -@Import(module = "t5/core/tree") public class Tree { /** @@ -143,6 +156,14 @@ public void render(MarkupWriter writer, RenderQueue queue) @Environmental private Heartbeat heartbeat; + + @Inject + private RequireJsModeHelper requireJsModeHelper; + + void beginRender() + { + requireJsModeHelper.importModule("t5/core/tree"); + } /** * Renders a single node (which may be the last within its containing node). @@ -160,6 +181,7 @@ private RenderCommand toRenderCommand(final TreeNode node, final boolean isLast) { return new RenderCommand() { + @SuppressWarnings("deprecation") public void render(MarkupWriter writer, RenderQueue queue) { // Inform the component's container about what value is being rendered diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Zone.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Zone.java index b4e9b02829..276cf8d82e 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Zone.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Zone.java @@ -12,14 +12,24 @@ package org.apache.tapestry5.corelib.components; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; -import org.apache.tapestry5.beanmodel.services.*; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.Block; +import org.apache.tapestry5.ClientBodyElement; +import org.apache.tapestry5.ComponentAction; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.QueryParameterConstants; +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.annotations.BeginRender; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.SupportsInformalParameters; import org.apache.tapestry5.corelib.internal.ComponentActionSink; import org.apache.tapestry5.corelib.internal.FormSupportAdapter; import org.apache.tapestry5.corelib.internal.HiddenFieldPositioner; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.internal.services.RequestConstants; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.json.JSONObject; @@ -68,7 +78,6 @@ * @see FormFragment */ @SupportsInformalParameters -@Import(module = "t5/core/zone") public class Zone implements ClientBodyElement { /** @@ -144,6 +153,9 @@ public class Zone implements ClientBodyElement @Inject private HiddenFieldLocationRules rules; + + @Inject + private RequireJsModeHelper requireJsModeHelper; private String clientId; @@ -175,6 +187,9 @@ void pageLoaded() void beginRender(MarkupWriter writer) { + + requireJsModeHelper.importModule("t5/core/zone"); + clientId = resources.isBound("id") ? idParameter : javascriptSupport.allocateClientId(resources); Element e = writer.element(elementName, diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java index 8d72839fd6..097fe79515 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java @@ -12,11 +12,27 @@ package org.apache.tapestry5.corelib.mixins; -import org.apache.tapestry5.*; -import org.apache.tapestry5.annotations.*; +import java.util.Collections; +import java.util.List; + +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.ComponentEventCallback; +import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.EventContext; +import org.apache.tapestry5.Field; +import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.annotations.Environmental; +import org.apache.tapestry5.annotations.Events; +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.InjectContainer; +import org.apache.tapestry5.annotations.MixinAfter; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.RequestParameter; import org.apache.tapestry5.commons.services.TypeCoercer; import org.apache.tapestry5.http.Link; import org.apache.tapestry5.internal.AbstractEventContext; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.Holder; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONArray; @@ -24,9 +40,6 @@ import org.apache.tapestry5.services.compatibility.DeprecationWarning; import org.apache.tapestry5.services.javascript.JavaScriptSupport; -import java.util.Collections; -import java.util.List; - /** * A mixin for a text field that allows for autocompletion of text fields. This is based on * Twttter typeahead.js version 0.10.5. @@ -61,6 +74,9 @@ public class Autocomplete @Environmental private JavaScriptSupport jsSupport; + + @Inject + private RequireJsModeHelper requireJsModeHelper; @Inject private TypeCoercer coercer; @@ -129,7 +145,7 @@ void afterRender() JSONObject spec = new JSONObject("id", field.getClientId(), "url", link.toString()).put("minChars", minChars).put("limit", maxSuggestions); - jsSupport.require("t5/core/autocomplete").with(spec); + requireJsModeHelper.importModule("t5/core/autocomplete").with(spec); } Object onAutocomplete(final EventContext context, @RequestParameter("t:input") diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Confirm.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Confirm.java index f67d203e8f..f412453384 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Confirm.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Confirm.java @@ -17,6 +17,8 @@ import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.MixinAfter; import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; +import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.javascript.JavaScriptSupport; /** @@ -47,8 +49,8 @@ public class Confirm @Parameter("false") private boolean disabled; - @Environmental - private JavaScriptSupport javaScriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; /* * The CSS class for the ok button @@ -72,7 +74,7 @@ void beginRender(MarkupWriter writer) { if (!disabled) { - javaScriptSupport.require("t5/core/confirm-click"); + requireJsModeHelper.importModule("t5/core/confirm-click"); writer.attributes("data-confirm-title", title, "data-confirm-message", message, diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/TriggerFragment.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/TriggerFragment.java index 2d497b53e3..6055316ee0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/TriggerFragment.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/TriggerFragment.java @@ -17,13 +17,13 @@ import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.ClientElement; import org.apache.tapestry5.Field; -import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.HeartbeatDeferred; import org.apache.tapestry5.annotations.InjectContainer; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.corelib.components.FormFragment; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; +import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONObject; -import org.apache.tapestry5.services.javascript.JavaScriptSupport; /** * A mixin that can be applied to a {@link org.apache.tapestry5.corelib.components.Checkbox} or @@ -53,8 +53,8 @@ public class TriggerFragment @Parameter private boolean invert; - @Environmental - private JavaScriptSupport javascriptSupport; + @Inject + private RequireJsModeHelper requireJsModeHelper; @HeartbeatDeferred void beginRender() @@ -73,6 +73,6 @@ void beginRender() spec.put("invert", true); } - javascriptSupport.require("t5/core/form-fragment").invoke("linkTrigger").with(spec); + requireJsModeHelper.importModule("t5/core/form-fragment").invoke("linkTrigger").with(spec); } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/ZoneRefresh.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/ZoneRefresh.java index 372618c5bd..e2e02fb7f3 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/ZoneRefresh.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/ZoneRefresh.java @@ -19,6 +19,7 @@ import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.corelib.components.Zone; import org.apache.tapestry5.http.Link; +import org.apache.tapestry5.internal.services.ajax.RequireJsModeHelper; import org.apache.tapestry5.internal.util.CaptureResultCallback; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.javascript.JavaScriptSupport; @@ -57,17 +58,17 @@ public class ZoneRefresh private Zone zone; @Inject - private JavaScriptSupport javaScriptSupport; + private RequireJsModeHelper requireJsModeHelper; @Inject private ComponentResources resources; //For testing purpose - ZoneRefresh(Object[] context, ComponentResources resources, JavaScriptSupport javaScriptSupport, Zone zone) + ZoneRefresh(Object[] context, ComponentResources resources, RequireJsModeHelper requireJsModeHelper, Zone zone) { this.context = context; this.resources = resources; - this.javaScriptSupport = javaScriptSupport; + this.requireJsModeHelper = requireJsModeHelper; this.zone = zone; } @@ -76,7 +77,7 @@ void addJavaScript() { Link link = resources.createEventLink("zoneRefresh", context); - javaScriptSupport.require("t5/core/zone-refresh").with(zone.getClientId(), period, link.toString()); + requireJsModeHelper.importModule("t5/core/zone-refresh").with(zone.getClientId(), period, link.toString()); } Object onZoneRefresh(EventContext eventContext) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/alerts/AlertManagerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/alerts/AlertManagerImpl.java index 63ace7cf55..29f43d597f 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/alerts/AlertManagerImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/alerts/AlertManagerImpl.java @@ -14,10 +14,13 @@ package org.apache.tapestry5.internal.alerts; +import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.alerts.*; import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.services.PerThreadValue; import org.apache.tapestry5.ioc.services.PerthreadManager; +import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.ApplicationStateManager; import org.apache.tapestry5.services.ajax.AjaxResponseRenderer; import org.apache.tapestry5.services.ajax.JavaScriptCallback; @@ -32,12 +35,17 @@ public class AlertManagerImpl implements AlertManager private final AjaxResponseRenderer ajaxResponseRenderer; private final PerThreadValue needAlertStorageCleanup; + + private final boolean requireJsEnabled; - public AlertManagerImpl(ApplicationStateManager asm, Request request, AjaxResponseRenderer ajaxResponseRenderer, PerthreadManager perThreadManager) + public AlertManagerImpl(ApplicationStateManager asm, Request request, + AjaxResponseRenderer ajaxResponseRenderer, PerthreadManager perThreadManager, + @Symbol(SymbolConstants.REQUIRE_JS_ENABLED) boolean requireJsEnabled) { this.asm = asm; this.request = request; this.ajaxResponseRenderer = ajaxResponseRenderer; + this.requireJsEnabled = requireJsEnabled; needAlertStorageCleanup = perThreadManager.createValue(); } @@ -89,7 +97,15 @@ private void addCallbackForAlert(final Alert alert) { public void run(JavaScriptSupport javascriptSupport) { - javascriptSupport.require("t5/core/alert").with(alert.toJSON()); + final JSONObject json = alert.toJSON(); + if (requireJsEnabled) + { + javascriptSupport.require("t5/core/alert").with(json); + } + else + { + javascriptSupport.importEsModule("t5/core/alert").with(json); + } } }); diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java index 8814e7faf2..8c17f5ca23 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DocumentLinkerImpl.java @@ -24,6 +24,7 @@ import org.apache.tapestry5.services.javascript.ModuleManager; import org.apache.tapestry5.services.javascript.StylesheetLink; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -38,7 +39,7 @@ public class DocumentLinkerImpl implements DocumentLinker private final ModuleInitsManager initsManager = new ModuleInitsManager(); - private final EsModuleInitsManager esModulesinitsManager = new EsModuleInitsManager(); + private final EsModuleInitsManager esModulesInitsManager = new EsModuleInitsManager(); private final List moduleConfigurationCallbacks = CollectionFactory.newList(); @@ -53,6 +54,8 @@ public class DocumentLinkerImpl implements DocumentLinker private final boolean omitGeneratorMetaTag, enablePageloadingMask; private final String tapestryBanner; + + private final boolean requireJsEnabled; // Initially false; set to true when a scriptURL or any kind of initialization is added. private boolean hasScriptsOrInitializations; @@ -66,12 +69,14 @@ public class DocumentLinkerImpl implements DocumentLinker * @param tapestryVersion */ public DocumentLinkerImpl(ModuleManager moduleManager, EsModuleManager esModuleManager, - boolean omitGeneratorMetaTag, boolean enablePageloadingMask, String tapestryVersion) + boolean omitGeneratorMetaTag, boolean enablePageloadingMask, String tapestryVersion, + boolean requireJsEnabled) { this.moduleManager = moduleManager; this.esModuleManager = esModuleManager; this.omitGeneratorMetaTag = omitGeneratorMetaTag; this.enablePageloadingMask = enablePageloadingMask; + this.requireJsEnabled = requireJsEnabled; tapestryBanner = "Apache Tapestry Framework (version " + tapestryVersion + ')'; } @@ -149,15 +154,15 @@ public void updateDocument(Document document) addElementBefore(head, existingMeta, "meta", "name", "generator", "content", tapestryBanner); } - - addScriptElements(root); - final List esModuleInits = esModulesinitsManager.getInits(); - if (isHtmlRoot && !esModuleInits.isEmpty()) + final List imports = esModulesInitsManager.getImports(); + if (isHtmlRoot && !imports.isEmpty()) { esModuleManager.writeImportMap(root.find("head"), esModuleConfigurationCallbacks); - esModuleManager.writeImports(root, esModuleInits); + esModuleManager.writeImports(root, imports); } + + addScriptElements(root); } @@ -252,8 +257,11 @@ protected void addContentToBody(Element body) script.moveToTop(body); } - - moduleManager.writeConfiguration(body, moduleConfigurationCallbacks); + + if (requireJsEnabled) + { + moduleManager.writeConfiguration(body, moduleConfigurationCallbacks); + } // Write the core libraries, which includes RequireJS: @@ -265,8 +273,17 @@ protected void addContentToBody(Element body) } // Write the initialization at this point. - - moduleManager.writeInitialization(body, libraryURLs, initsManager.getSortedInits()); + if (requireJsEnabled) + { + moduleManager.writeInitialization(body, libraryURLs, initsManager.getSortedInits()); + + // Libraries were already added in the line above. + esModuleManager.writeInitialization(body, Collections.emptyList(), esModulesInitsManager.getInitsAsJsonArrayList()); + } + else + { + esModuleManager.writeInitialization(body, libraryURLs, esModulesInitsManager.getInitsAsJsonArrayList()); + } } private static Element createTemporaryContainer(Element headElement, String existingElementName, String newElementName) @@ -337,7 +354,7 @@ public void addEsModuleConfigurationCallback(EsModuleConfigurationCallback callb public void addEsModuleInitialization(EsModuleInitialization initialization) { assert initialization != null; - esModulesinitsManager.add(initialization); + esModulesInitsManager.add(initialization); hasScriptsOrInitializations = true; } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java index e3fc767fe4..c03bd6be27 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java @@ -25,37 +25,116 @@ package org.apache.tapestry5.internal.services; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; import org.apache.tapestry5.commons.util.CollectionFactory; import org.apache.tapestry5.internal.services.ajax.EsModuleInitializationImpl; +import org.apache.tapestry5.json.JSONArray; import org.apache.tapestry5.services.javascript.EsModuleInitialization; public class EsModuleInitsManager { private final Set modules = CollectionFactory.newSet(); + private final List imports = CollectionFactory.newList(); + private final List initializations = CollectionFactory.newList(); - + public void add(EsModuleInitialization initialization) { assert initialization != null; - // We ignore a module being added again. - final String moduleName = ((EsModuleInitializationImpl) initialization).getModuleId(); - if (!modules.contains(moduleName)) + // We avoid having the same module being imported more than twice. + // Also notice non-pure inits (i.e. ones having a function name or + // both) are added both to the imports, so they can have + //