This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch feature/requirejs-less in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
The following commit(s) were added to refs/heads/feature/requirejs-less by this push: new eecdb503c Partial work on ES shims eecdb503c is described below commit eecdb503ca752bb060c8ea3a0e82ea9b6bed3b78 Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br> AuthorDate: Wed Jul 16 14:56:01 2025 -0300 Partial work on ES shims --- 5_10_RELEASE_NOTES.md | 1 + .../services/javascript/EsModuleManagerImpl.java | 4 +- .../services/javascript/EsShimDispatcher.java | 152 +++ .../apache/tapestry5/modules/JavaScriptModule.java | 162 ++- .../services/javascript/EsModuleManager.java | 31 +- .../tapestry5/services/javascript/EsShim.java | 148 +++ .../underscore-esm.js => es-modules/underscore.js} | 0 .../tapestry5/integration/app1/pages/Index.java | 1150 ++++++++++---------- 8 files changed, 1044 insertions(+), 604 deletions(-) diff --git a/5_10_RELEASE_NOTES.md b/5_10_RELEASE_NOTES.md index 05f469737..b893fdec3 100644 --- a/5_10_RELEASE_NOTES.md +++ b/5_10_RELEASE_NOTES.md @@ -17,6 +17,7 @@ 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) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java index f65cc7a49..a73a2fe64 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java @@ -73,7 +73,7 @@ public class EsModuleManagerImpl implements EsModuleManager private final List<EsModuleConfigurationCallback> baseCallbacks; private final List<EsModuleConfigurationCallback> globalPerRequestCallbacks; - + public EsModuleManagerImpl( List<EsModuleManagerContribution> contributions, AssetSource assetSource, @@ -197,7 +197,7 @@ public class EsModuleManagerImpl implements EsModuleManager init = (EsModuleInitializationImpl) i; final String moduleId = init.getModuleId(); - // Making sure the user doesn't shoot heir own foot + // Making sure the user doesn't shoot their own foot final String url = cache.get(moduleId); if (url == null) { diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsShimDispatcher.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsShimDispatcher.java new file mode 100644 index 000000000..fb1a24da9 --- /dev/null +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsShimDispatcher.java @@ -0,0 +1,152 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry5.internal.services.javascript; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.commons.Resource; +import org.apache.tapestry5.http.services.Dispatcher; +import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.http.services.Response; +import org.apache.tapestry5.internal.services.AssetDispatcher; +import org.apache.tapestry5.internal.services.ResourceStreamer; +import org.apache.tapestry5.internal.services.assets.ResourceChangeTracker; +import org.apache.tapestry5.ioc.IOOperation; +import org.apache.tapestry5.ioc.OperationTracker; +import org.apache.tapestry5.ioc.annotations.Symbol; +import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration; +import org.apache.tapestry5.services.PathConstructor; +import org.apache.tapestry5.services.assets.StreamableResource; +import org.apache.tapestry5.services.assets.StreamableResourceProcessing; +import org.apache.tapestry5.services.assets.StreamableResourceSource; +import org.apache.tapestry5.services.javascript.EsShim; + +import jakarta.servlet.http.HttpServletResponse; + +/** + * Handler contributed to {@link AssetDispatcher} with key "es-shims". + * It interprets the extra path as a module name and serves the ES shim + * for it. + * + * @see EsShim + */ +@UsesMappedConfiguration(Resource.class) +public class EsShimDispatcher implements Dispatcher +{ + + private static final String ES_SUBPATH = "es-shims"; + + private final ResourceStreamer streamer; + + private final OperationTracker tracker; + + private final String requestPrefix; + + private final boolean compress; + + private Map<String, StreamableResource> shimMap; + + public EsShimDispatcher(Map<String, Resource> configuration, + StreamableResourceSource streamableResourceSource, + ResourceChangeTracker resourceChangeTracker, + ResourceStreamer streamer, + OperationTracker tracker, + PathConstructor pathConstructor, + @Symbol(SymbolConstants.ASSET_PATH_PREFIX) + String assetPrefix, + boolean compress) + { + this.streamer = streamer; + this.tracker = tracker; + this.compress = compress; + this.shimMap = new HashMap<>(configuration.size()); + + try + { + for (String moduleName : configuration.keySet()) + { + shimMap.put(moduleName, streamableResourceSource.getStreamableResource( + configuration.get(moduleName), StreamableResourceProcessing.COMPRESSION_ENABLED, resourceChangeTracker)); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + + requestPrefix = pathConstructor.constructDispatchPath(assetPrefix + "/" + (compress ? ES_SUBPATH + ".gz" : ES_SUBPATH) + "/"); + } + + public boolean dispatch(Request request, Response response) throws IOException + { + String path = request.getPath(); + + if (path.startsWith(requestPrefix)) + { + String extraPath = path.substring(requestPrefix.length()); + + if (!handleModuleRequest(extraPath, response)) + { + response.sendError(HttpServletResponse.SC_NOT_FOUND, String.format("No ES module shim for path '%s'.", extraPath)); + } + + return true; + } + + return false; + + } + + public String getUrl(String moduleName) + { + return requestPrefix + moduleName; + } + + private boolean handleModuleRequest(String extraPath, Response response) throws IOException + { + int dotx = extraPath.lastIndexOf('.'); + + if (dotx < 0) + { + return false; + } + + if (!extraPath.substring(dotx + 1).equals("js")) + { + return false; + } + + final String moduleName = extraPath.substring(0, dotx); + + return tracker.perform(String.format("Streaming %s %s", + compress ? "compressed module" : "module", + moduleName), new IOOperation<Boolean>() + { + public Boolean perform() throws IOException + { + StreamableResource resource = shimMap.get(moduleName); + + if (resource != null) + { + return streamer.streamResource(resource, resource.getChecksum(), ResourceStreamer.DEFAULT_OPTIONS); + } + + return false; + } + }); + } + +} diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java index 7c537d7ef..8b6bf81a0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java @@ -36,6 +36,7 @@ import org.apache.tapestry5.internal.services.assets.ResourceChangeTracker; import org.apache.tapestry5.internal.services.javascript.AddBrowserCompatibilityStyles; import org.apache.tapestry5.internal.services.javascript.ConfigureHTMLElementFilter; import org.apache.tapestry5.internal.services.javascript.EsModuleManagerImpl; +import org.apache.tapestry5.internal.services.javascript.EsShimDispatcher; import org.apache.tapestry5.internal.services.javascript.Internal; import org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructor; import org.apache.tapestry5.internal.services.javascript.JavaScriptStackSourceImpl; @@ -66,6 +67,7 @@ import org.apache.tapestry5.services.PathConstructor; import org.apache.tapestry5.services.compatibility.Compatibility; import org.apache.tapestry5.services.compatibility.Trait; import org.apache.tapestry5.services.javascript.AMDWrapper; +import org.apache.tapestry5.services.javascript.EsShim; import org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback; import org.apache.tapestry5.services.javascript.EsModuleManager; import org.apache.tapestry5.services.javascript.EsModuleManager.EsModuleManagerContribution; @@ -106,6 +108,7 @@ public class JavaScriptModule binder.bind(JavaScriptStack.class, ExtensibleJavaScriptStack.class).withMarker(Core.class).withId("CoreJavaScriptStack"); binder.bind(JavaScriptStack.class, ExtensibleJavaScriptStack.class).withMarker(Internal.class).withId("InternalJavaScriptStack"); binder.bind(RequireJsModeHelper.class, RequireJsModeHelperImpl.class); + binder.bind(EsShimDispatcher.class); } /** @@ -289,7 +292,8 @@ public class JavaScriptModule @Symbol(SymbolConstants.MODULE_PATH_PREFIX) String modulePathPrefix, @Symbol(SymbolConstants.ASSET_PATH_PREFIX) - String assetPathPrefix) + String assetPathPrefix, + EsShimDispatcher esShimDispatcher) { configuration.add("Modules", new ModuleDispatcher(moduleManager, resourceStreamer, tracker, pathConstructor, @@ -302,6 +306,9 @@ public class JavaScriptModule javaScriptStackSource, javaScriptStackPathConstructor, localizationSetter, modulePathPrefix, assetPathPrefix, true), "after:Modules", "before:ComponentEvent"); + + configuration.add("EsShims", esShimDispatcher, "after:Asset", "before:ComponentEvent"); + } /** @@ -544,56 +551,163 @@ public class JavaScriptModule configuration.add("ApplicationCatalog", EsModuleManagerContribution.base(callback)); } - - @Contribute(EsModuleManager.class) - public static void setupBaseEsModules( - OrderedConfiguration<EsModuleManagerContribution> configuration, - @Symbol(SymbolConstants.BOOTSTRAP_ROOT) String bootstrapRoot, + + @Contribute(EsShimDispatcher.class) + public static void setupBaseEsShims( + MappedConfiguration<String, Resource> configuration, + @Path("${tapestry.asset.root}/bootstrap/js/transition.js") + Resource transition, + @Path("${tapestry.asset.root}/bootstrap4/js/bootstrap-util.js") + Resource bootstrapUtil, Compatibility compatibility, - AssetSource assetSource) + AssetSource assetSource, + EsShimDispatcher esShimDispatcher) { +// configuration.add("jquery", new JavaScriptModuleConfiguration(jqueryShim)); if (compatibility.enabled(Trait.BOOTSTRAP_3)) { final String[] modules = new String[]{"affix", "alert", "button", "carousel", "collapse", "dropdown", "modal", - "scrollspy", "tab", "tooltip", "transition", "popover"}; - addEsBootstrap3Modules(configuration, modules, bootstrapRoot, assetSource); + "scrollspy", "tab", "tooltip"}; + addBootstrap3EsShims(configuration, modules, transition); + + Resource popover = transition.forFile("popover.js"); + + final String popoverModuleName = "bootstrap/popover"; + configuration.add(popoverModuleName, + EsModuleManagerContribution.base( + new EsShim(popover).importModule("bootstrap/tooltip"), + createCallback(popoverModuleName, esShimDispatcher))); } + if (compatibility.enabled(Trait.BOOTSTRAP_4)) { - final String[] modules = new String[]{"alert", "button", "carousel", "collapse", "dropdown", "modal", - "scrollspy", "tab", "tooltip", "bootstrap-util", "popper"}; - - addEsBootstrap3Modules(configuration, modules, bootstrapRoot, assetSource); + final String bootstrapUtilModuleName = "bootstrap/bootstrap-util"; + configuration.add(bootstrapUtilModuleName, + EsModuleManagerContribution.base( + new EsShim(bootstrapUtil), + createCallback(bootstrapUtilModuleName, esShimDispatcher))); + + final String popperModuleName = "bootstrap/popper"; + final Resource popper = bootstrapUtil.forFile("popper.js"); + configuration.add(popperModuleName, + EsModuleManagerContribution.base( + new EsShim(popper), + createCallback(popperModuleName, esShimDispatcher))); + + for (String name : new String[]{"alert", "button", "carousel", "collapse", "dropdown", "modal", + "scrollspy", "tab", "tooltip"}) + { + Resource lib = bootstrapUtil.forFile(name + ".js"); + if (lib.exists()) + { + final String moduleName = "bootstrap/" + name; + configuration.add(moduleName, + EsModuleManagerContribution.base( + new EsShim(lib) + .importModule(bootstrapUtilModuleName) + .importModule(popperModuleName), + createCallback(popperModuleName, esShimDispatcher))); + } + } } // Just the minimum to have alerts and AJAX validation working when Bootstrap // is completely disabled if (!compatibility.enabled(Trait.BOOTSTRAP_3) && !compatibility.enabled(Trait.BOOTSTRAP_4)) { - final String[] modules = new String[]{"transition", "collapse", "alert", "dropdown"}; - addEsBootstrap3Modules(configuration, modules, bootstrapRoot, assetSource); + final String[] modules = new String[]{"alert", "dropdown", "collapse"}; + addBootstrap3EsShims(configuration, modules, transition); } + } +// @Contribute(EsModuleManager.class) +// public static void setupBaseEsModules( +// OrderedConfiguration<EsModuleManagerContribution> configuration, +// @Path("${tapestry.asset.root}/bootstrap/js/transition.js") +// Resource transition, +// @Path("${tapestry.asset.root}/bootstrap4/js/bootstrap-util.js") +// Resource bootstrapUtil, +// Compatibility compatibility, +// AssetSource assetSource, +// EsShimDispatcher esShimDispatcher) +// { +// +//// configuration.add("jquery", new JavaScriptModuleConfiguration(jqueryShim)); +// +// if (compatibility.enabled(Trait.BOOTSTRAP_3)) +// { +// final String[] modules = new String[]{"affix", "alert", "button", "carousel", "collapse", "dropdown", "modal", +// "scrollspy", "tab", "tooltip"}; +// addBootstrap3EsShims(configuration, modules, transition); +// +// Resource popover = transition.forFile("popover.js"); +// +// final String popoverModuleName = "bootstrap/popover"; +// configuration.add(popoverModuleName, +// EsModuleManagerContribution.base( +// new EsShim(popover).importModule("bootstrap/tooltip"), +// createCallback(popoverModuleName, esShimDispatcher))); +// } +// +// if (compatibility.enabled(Trait.BOOTSTRAP_4)) +// { +// final String bootstrapUtilModuleName = "bootstrap/bootstrap-util"; +// configuration.add(bootstrapUtilModuleName, +// EsModuleManagerContribution.base( +// new EsShim(bootstrapUtil), +// createCallback(bootstrapUtilModuleName, esShimDispatcher))); +// +// final String popperModuleName = "bootstrap/popper"; +// final Resource popper = bootstrapUtil.forFile("popper.js"); +// configuration.add(popperModuleName, +// EsModuleManagerContribution.base( +// new EsShim(popper), +// createCallback(popperModuleName, esShimDispatcher))); +// +// for (String name : new String[]{"alert", "button", "carousel", "collapse", "dropdown", "modal", +// "scrollspy", "tab", "tooltip"}) +// { +// Resource lib = bootstrapUtil.forFile(name + ".js"); +// if (lib.exists()) +// { +// final String moduleName = "bootstrap/" + name; +// configuration.add(moduleName, +// EsModuleManagerContribution.base( +// new EsShim(lib) +// .importModule(bootstrapUtilModuleName) +// .importModule(popperModuleName), +// createCallback(popperModuleName, esShimDispatcher))); +// } +// } +// } +// +// // Just the minimum to have alerts and AJAX validation working when Bootstrap +// // is completely disabled +// if (!compatibility.enabled(Trait.BOOTSTRAP_3) && !compatibility.enabled(Trait.BOOTSTRAP_4)) +// { +// final String[] modules = new String[]{"alert", "dropdown", "collapse"}; +// addBootstrap3EsShims(configuration, modules, transition); +// } +// } + + private static EsModuleConfigurationCallback createCallback(final String moduleName, EsShimDispatcher esShimDispatcher) { + return c -> EsModuleConfigurationCallback.setImport(c, moduleName, esShimDispatcher.getUrl(moduleName)); } - private static void addEsBootstrap3Modules( - OrderedConfiguration<EsModuleManagerContribution> configuration, + private static void addBootstrap3EsShims( + MappedConfiguration<String, Resource> configuration, String[] modules, - String bootstrapRoot, - AssetSource assetSource) + Resource reference) { for (String module : modules) { final String moduleId = "bootstrap/" + module; - final Resource resource = assetSource.getClasspathAsset(bootstrapRoot + "/" + module + ".js") - .getResource(); + final Resource resource = reference.forFile(module + ".js"); if (resource.exists()) { - final String url = resource.toURL().toString(); - configuration.add(moduleId, EsModuleManagerContribution.base( - c -> EsModuleConfigurationCallback.setImport(c, moduleId, url))); + configuration.add(moduleId, resource); } } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleManager.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleManager.java index 70a3b00b0..edd3dfbb0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleManager.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleManager.java @@ -67,12 +67,16 @@ public interface EsModuleManager private final EsModuleConfigurationCallback callback; private final boolean isBase; + + // In case this is an ES shim contribution. + private final EsShim esWrapper; - EsModuleManagerContribution(EsModuleConfigurationCallback callback, boolean isBase) + private EsModuleManagerContribution(EsModuleConfigurationCallback callback, boolean isBase, EsShim esWrapper) { super(); this.callback = callback; this.isBase = isBase; + this.esWrapper = esWrapper; } /** @@ -83,9 +87,26 @@ public interface EsModuleManager */ public static EsModuleManagerContribution base(EsModuleConfigurationCallback callback) { - return new EsModuleManagerContribution(callback, true); + return new EsModuleManagerContribution(callback, true, null); } + /** + * Creates a base contribution (one that contributes a callback used + * when creating the base import map to be used for all requests) + * which is also an ES module shim. + * @param esWrapper an {@linkplain EsShim} instance. It cannot be null. + * @param callback an {@linkplain EsModuleConfigurationCallback} instance. + * @return a corresponding {@linkplain EsModuleManagerContribution}. + */ + public static EsModuleManagerContribution base(EsShim esWrapper, EsModuleConfigurationCallback callback) + { + if (esWrapper == null) + { + throw new IllegalArgumentException("Parameter esWrapper cannot be null"); + } + return new EsModuleManagerContribution(callback, true, esWrapper); + } + /** * Creates a global per-request contribution (one that contributes a callback used * in all requests after the callbacks added through @@ -96,7 +117,7 @@ public interface EsModuleManager */ public static EsModuleManagerContribution globalPerRequest(EsModuleConfigurationCallback callback) { - return new EsModuleManagerContribution(callback, false); + return new EsModuleManagerContribution(callback, false, null); } public EsModuleConfigurationCallback getCallback() { @@ -106,6 +127,10 @@ public interface EsModuleManager public boolean isBase() { return isBase; } + + public EsShim getEsWrapper() { + return esWrapper; + } } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsShim.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsShim.java new file mode 100644 index 000000000..ca20f71b4 --- /dev/null +++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsShim.java @@ -0,0 +1,148 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry5.services.javascript; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.SequenceInputStream; +import java.net.URL; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.tapestry5.commons.Resource; +import org.apache.tapestry5.internal.util.VirtualResource; + +/** + * Used to wrap plain JavaScript libraries as ES modules. The underlying + * resource is transformed before it is sent to the client. + * + * @since 5.10.0 + */ +public class EsShim { + + /** + * The underlying resource, usually a JavaScript library + */ + private final Resource resource; + + /** + * The modules that this module requires, the keys being module names and + * the values being the respective parameter names for the module's factory + * function. + */ + private final Map<String, String> importConfig = new LinkedHashMap<String, String>(); + + public EsShim(final Resource resource) { + this.resource = resource; + } + + /** + * Adds a dependency on another module. + * + * @param moduleName + * the name of the required module, e.g. <code>jQuery</code> + * @param variableName + * the module's corresponding variable name + * @return this ESWrapper for further configuration + */ + public EsShim importModule(final String moduleName, + final String variableName) { + importConfig.put(moduleName, variableName); + return this; + } + + /** + * Adds a dependency on another module. The module will be loaded but not + * passed to a variable. This is useful for dependencies on other + * modules that do not actually return a value. + * + * @param moduleName + * the name of the required module, e.g. + * <code>bootstrap/transition</code> + * @return this ESWrapper for further configuration + */ + public EsShim importModule(final String moduleName) { + importConfig.put(moduleName, null); + return this; + } + + /** + * Returns a virtual resource representing this wrapper. + * @return a {@linkplain Resource}. + */ + public Resource getResource() { + return new ESModuleWrapperResource(resource, importConfig); + } + + /** + * A virtual resource that wraps a plain JavaScript library as an AMD + * module. + * + */ + private final static class ESModuleWrapperResource extends VirtualResource + { + private final Resource resource; + private final Map<String, String> importConfig; + + public ESModuleWrapperResource(final Resource resource, + final Map<String, String> importConfig) + { + this.resource = resource; + this.importConfig = importConfig; + } + + @Override + public InputStream openStream() throws IOException + { + StringBuilder sb = new StringBuilder(); + + for (String module : importConfig.keySet()) + { + final String variableName = importConfig.get(module); + sb.append("import "); + if (variableName != null) + { + sb.append(variableName); + sb.append(" from "); + } + sb.append("\""); + sb.append(module); + sb.append("\";\n"); + } + + return new SequenceInputStream(toInputStream(sb), resource.openStream()); + } + + @Override + public String getFile() { + return "generated-module-for-" + resource.getFile(); + } + + @Override + public URL toURL() { + return null; + } + + @Override + public String toString() { + return "ES module wrapper for " + resource.toString(); + } + + private static InputStream toInputStream(final StringBuilder sb) + { + return new ByteArrayInputStream(sb.toString().getBytes(UTF8)); + } + } + +} diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/underscore-esm.js b/tapestry-core/src/main/resources/META-INF/assets/es-modules/underscore.js similarity index 100% rename from tapestry-core/src/main/resources/META-INF/assets/tapestry5/underscore-esm.js rename to tapestry-core/src/main/resources/META-INF/assets/es-modules/underscore.js diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java index fcad59e0a..42338f94a 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java @@ -58,581 +58,581 @@ public class Index private static final List<Item> ITEMS = CollectionFactory .newList( - new Item("PublishEventDemo", "@PublishEvent Demo", "Publishing server-side events to client-side code (JavaScript)"), - - new Item("StaticActivationContextValueDemo", "@StaticActivationContextValue Demo", "Demonstrates the usage of @StaticActivationContextValue"), - - new Item("rest/RestWithOnEventDemo", "REST with @OnEvent Demo", "Demonstrates the usage of @OnEvent to handle REST requests"), - - new Item("rest/RestWithEventHandlerMethodNameDemo", "REST with Event Handler Method Name Demo", "Demonstrates the usage of event handler method names to handle REST requests"), - - new Item("Html5DateFieldDemo", "Html5DateField Demo", "Choosing dates using the native HTML5 date picker"), - -// new Item("ZoneFormDemo", "Zone Form Decoration", "Fields inside an Ajax-updatd Form are still decorated properly."), - - new Item("AjaxValidationDemo", "Ajax Validation", "Demonstrated proper integration of server-side validation and client-side field decoration."), - - new Item("OverrideEventHandlerDemo", "Event Handler Override Demo", "Event Handler methods overridden by sub-classes invoke base-class correctly."), - - new Item("LogoSubclass", "Base class Assets in sub-classes", "Assets are resolved for the parent class if that's where the annotations are."), - - new Item("MissingRequiredARP", "Missing Query Parameter for @ActivationRequestParameter", "Activating a page with a required @ActivationRequestParameter, but no matching query parameter, is an error."), - -// new Item("DateFieldValidationDemo", "DateField Validation Demo", -// "Use of DateField component when client validation is disabled."), - - new Item("MixinParameters54", "Strict Mixin Parameters", "In the 5.4 DTD, Parameter Mixins must be qualified with the mixin id."), - - new Item("AsyncDemo", "Async Links and Forms Demo", "Async (XHR) Updates without a containing Zone."), - - new Item("FormCancelActionDemo", "Form Cancel Action Demo", "FormSupport.addCancel() support"), - - new Item("AjaxRadioDemo", "Ajax Radio Demo", "Radio components inside an Ajax form"), - - new Item("TimeIntervalDemo", "TimeInterval Demo", "Interval component, based on Moment.js"), - - new Item("LocalDateDemo", "LocalDate Demo", "LocalDate component, based on Moment.js"), - - new Item("EmptyIfDemo", "Empty If Demo", "Ensure an empty If can still render."), - - new Item("MissingAssetDemo", "Missing Asset Demo", "Error when injecting an asset that does not exist."), - - new Item("ConfirmDemo", "Confirm Mixin Demo", "Confirm an action when clicking it."), - - new Item("SingleErrorDemo", "Single Error", "Using Error component to customize where the errors for a field will be displayed."), - - new Item("JavaScriptTests", "JavaScript Tests", "Client-side tests using Mocha and Chai"), - - new Item("ModuleInitDemo", "Module-based Initialization Demo", "Invoke a module function to perform page initialization"), - - new Item("OperationWorkerDemo", "Operation Worker Demo", "Demonstrate use of @Operation annotation on component methods"), - - new Item("MixinParameterDefault", "Mixin Parameter with Default", "Ensure that a mixin parameter with a default value is not reported as unbound."), - - new Item("MixinVsInformalParameter", "Mixin Parameter vs. Informal Parameter", "Informal Paramters vs. Mixin parameter of same name"), - - new Item("inherit/childa", "TAP5-1656 Demo", "Test a reported bug in component inheritance"), - - new Item("ComponentInsideBlockDemo", "Component Inside Block Demo", "Verify that a component, inside a block, is still an embedded "), - - new Item("EventMethodUnmatchedComponentId", "Unmatched Component Id in Event Method Demo", "Show that referencing a component that does not exist in an event handler method name is an error."), - - new Item("AlertsDemo", "Alerts Demo", "Managing alerts both traditional and Ajax"), - - new Item("ClientConsoleDemo", "Client Console Demo", "Demo for the JavaScript client-side console"), - - new Item("InvalidFormalParameterDemo", "Unmatched Formal Parameter with @Component", "Parameters specified with @Component annotation must match formal parameters"), - - new Item("NullBindingToPrimitive", "Null Bound to Primitive Demo", "Correct exception when a primitive parameter is bound to null"), - - new Item("TreeDemo", "Tree Component Demo", "Demo of Tree Component"), - - new Item("TreeSelectionDemo", "Tree Component Selection Demo", "Demo of Selection with Tree Component"), - - new Item("TreeNoRootsDemo", "Tree Component No Roots Demo", "Demo of No Roots with Tree Component"), - - new Item("InvalidExpressionInDynamicTemplate", "Invalid Dynamic Expression", - "Invalid expression in a Dynamic Template"), - - new Item("DynamicDemo", "Dynamic Demo", "Basic Dynamic component tests"), - - new Item("DynamicExpansionsDemo", "Expansions in Dynamic Templates", - "Expansions inside Dynamic component content and attributes"), - - new Item("PACAnnotationDemo", "PageActivationContext Demo", - "Shows that @PageActivationContext fields are set before calls to the activate event handler."), - - new Item("PACMultipleAnnotationDemo", "PageActivationContext Multiple Demo", - "Demonstrates multiple @PageActivationContext fields."), - - new Item("PublicFieldAccessDemo", "Public Field Access Demo", "Demonstrates TAP5-1222 fix"), - - new Item("ActivationRequestParameterDemo", "ActivationRequestParameter Annotation Demo", - "Use of @ActivationRequestParameter to encode page state into query parameters"), - - new Item("LibraryMessagesDemo", "Library Messages Demo", - "Demo ability to contribute additional message catalog resources to the application global catalog."), - - new Item("MultiZoneUpdateInsideForm", "MultiZone Update inside a Form", - "Update multiple zones within a single Form."), - - new Item("ZoneFormUpdateDemo", "Zone/Form Update Demo", "Updating a Zone inside a Form"), - - new Item("MultiZoneStringBodyDemo", "MultiZone String Body Demo", - "Multi-zone updates in a loop using strings coerced into blocks"), - - new Item("RenderNotificationDemo", "RenderNotification Demo", "Use of RenderNotification mixin"), - - new Item("InjectMessagesDemo", "Inject Global Messages into Service Demo", - "Ensure that it is possible to inject the application global message catalog into a service"), - - new Item("ReloadDemo", "Reloadable Service Implementation Demo", - "Used when manually testing service reloads"), - - new Item("RequestParameterDemo", "RequestParameter Annotation Demo", - "Use of @RequestParameter annotation on event handler method parameters"), - - new Item("CancelDemo", "Cancel Demo", "Use of the cancel option with Submit"), - - new Item("CanceledEventDemo", "Canceled Event Demo", "Triggering of the canceled event from a form."), - - new Item("PageResetDemo", "PageReset Annotation Demo", - "Use of PageReset annotation to re-initialize page state"), - - new Item("TestOnlyServiceDemo", "Test Only Service Demo", - "IoC module available via web.xml configuration"), - - new Item("RenderObjectExceptionDemo", "RenderObject Exception Demo", - "Demonstrate how exceptions when rendering default objects are displayed."), - - new Item("MultiLevelInheritDemo", "Multi-Level Inherit Demo", - "Use of inherit: binding prefix across three levels"), - - new Item("HiddenDemo", "Hidden Demo", "Demo the use of the Hidden component."), - - new Item("FormZoneDemo", "Form Zone Demo", "Use a form to update a zone."), - - new Item("ZoneUpdateNamespace", "Zone/Namespace Interaction", "Prove that TAP5-573 is fixed"), - - new Item("AbstractComponentDemo", "Abstract Component Demo", "Error when a component is abstract"), - - new Item("TemplateOverrideDemo", "Template Override Demo", - "Child component extends and overrides parent template."), - - new Item("MultiZoneUpdateDemo", "Multiple Zone Update Demo", - "A single request can now update multiple Zones"), - - new Item("LinkSubmitInZoneDemo", "LinkSubmit inside Zone", - "Ensure that a LinkSubmit works correctly when its containing Form updates a Zone"), - - new Item("ProgressiveDemo", "ProgressiveDisplay Demo", "Progressive Enhancement via a component"), - - new Item("ClientNumericValidationDemo", "Client-Side Numeric Validation", - "Client-side locale-specific validation"), - - new Item("PublishParametersDemo", "Publish Parameters Demo", - "Use of @Component.publishParameters attribute."), - - new Item("LinkSubmitDemo", "LinkSubmit Demo", "JavaScript LinkSubmit component"), - - new Item("LinkSubmitWithoutValidatorDemo", "LinkSubmit Without Validator Demo", - "Demonstrates that the LinkSubmit component is working without a validator on any of fields in the form"), - - new Item("PerFormValidationMessageDemo", "Per-Form Validation Messages", - "Per-form configuration of validation messages and constraints."), - - new Item("EmptyLoopDemo", "Empty Loop Demo", "Use of empty parameter with the Loop component."), - - new Item("GenericLoopDemo", "Generic Loop Demo", - "Use of generic parameters with the Loop component."), - - new Item("LoopWithMixinDemo", "Loop With Mixin Demo", - "Use a mixin with a Loop component."), - - new Item("BlankPasswordDemo", "Blank Password Demo", - "Show that a blank value in a PasswordField does not update the server side value."), - - new Item("GridFormEncoderDemo", "Grid Form Encoder Demo", - "Grid inside a Form using the ValueEncoder option"), - - new Item("GridFormWithInitialSortMixinDemo", "Grid Form With Initial Sort Mixin Demo", - "Grid inside a Form using the InitialSort mixin"), - - new Item("DateFieldAjaxFormLoop", "DateField inside AjaxFormLoop", - "Show that DateField component works correctly inside AjaxFormLoop"), - - new Item("NestedForm", "Nested Form Demo", "Error when a Form is nested inside another Form."), - - new Item("UnhandledEventDemo", "Unhandled Event Demo", - "Events that don't have matching event handlers cause exceptions"), - - new Item("PrimitiveDefaultDemo", "Primitive Default Demo", - "Primitive value returned from parameter default method"), - - new Item("ValidateFormValidationExceptionDemo", "ValidationForm ValidationException Demo", - "Throwing a ValidationException from the validateForm event handler."), - - new Item("ClientFormatDemo", "Client Format Validation", "Client-side input format validation"), - - new Item("ShortGrid", "Short Grid", - "Grid where the number of claimed rows is less than the number of actual rows"), - - new Item("NullParameterDemo", "Null Parameter Demo", "Binding a not-null parameter to null."), - - new Item("nestedbeaneditor", "Nested BeanEditor", - "BeanEditor as override for property editor in BeanEditForm"), - - new Item("actionpage", "Action Page", "tests fixture for ActionLink component"), - - new Item("cleancachedemo", "Clean Cache Demo", "cache cleared properly during Ajax calls"), - - new Item("numberbeaneditordemo", "Number BeanEditor Demo", - "use of nulls and wrapper types with BeanEditor"), - - new Item("forminjectordemo", "FormInjector Demo", "extending a form dynamically via Ajax"), - - new Item("music", "Music Page", "demo handling of edge cases of page naming"), - - new Item("PersistentDemo", "Persistent Demo", "storing and clearing persistent properties"), - - new Item("ActionViaLinkDemo", "Action via Link Demo", "tests creating an action link explicitly"), - - new Item("FormFragmentDemo", "Form Fragment Demo", "page with dynamic form sections"), - - new Item("BooleanDemo", "Boolean Property Demo", - "demo boolean properties using both is and get prefixes"), - - new Item("DeleteFromGridDemo", "Delete From Grid", "demo deleting items form a Grid"), - - new Item("RenderErrorDemo", "Render Error Demo", "reporting of errors while rendering"), - - new Item("nested/AssetDemo", "AssetDemo", "declaring an image using Assets"), - - new Item("nested/ActionDemo", "Action With Context Demo", - "using action links with context on page with activation context"), - - new Item("blockdemo", "BlockDemo", "use of blocks to control rendering"), - - new Item("countdown", "Countdown Page", "defining component using @Component annotation"), - - new Item("injectdemo", "Inject Demo", "use of various kinds of injection"), - - new Item("instancemixin", "InstanceMixin", "mixin added to a particular component instance"), - - new Item("TextFieldWrapperTypeDemo", "TextField Wrapper Types", - "use of TextField to edit numeric wrapper types (not primitives) "), - - new Item("EnvironmentalDemo", "Environmental Annotation Usage", - "Storing and retrieving Environmental values"), - - new Item("Expansion", "Expansion Page", "Use of expansions in templates"), - - new Item("ExpansionSubclass", "ExpansionSubclass", - "components can inherit templates from base classes"), - - new Item("Localization", "Localization", "access localized messages from the component catalog"), - - new Item("NumberSelect", "NumberSelect", "passivate/activate page context demo"), - - new Item("ParameterConflict", "Template Overridden by Class Page", - "Parameters in the class override those in the template"), - - new Item("ParameterDefault", "ParameterDefault", "defaulter methods for component parameters"), - - new Item("passwordfielddemo", "PasswordFieldDemo", "test for the PasswordField component"), - - new Item("rendercomponentdemo", "RenderComponentDemo", - "components that \"nominate\" other components to render"), - - new Item("renderphaseorder", "RenderPhaseOrder", - "order of operations when invoking render phase methods"), - - new Item("simpleform", "SimpleForm", "first pass at writing Form and TextField components"), - - new Item("OptionGroupForm", "OptionGroupForm Demo", "Select with Option Group"), - - new Item("validform", "ValidForm", "server-side input validation"), - - new Item("ToDoListVolatile", "ToDo List (Volatile)", "Loops and Submit inside Form, volatile mode"), - - new Item("MissingTemplate", "Missing Template Demo", - "Demo for what happens when a template is not found for a page"), - - new Item("nested/zonedemo", "Zone Demo", "dynamic updates within a page"), - - new Item("todolist", "ToDo List", "Loops and Submit inside Form using primary key encoder"), - - new Item("flashdemo", "FlashDemo", "demonstrate 'flash' persistence"), - - new Item("beaneditordemo", "BeanEditor Demo", "demonstrate the BeanEditor mega-component"), - - new Item("pageloadeddemo", "PageLoaded Demo", "shows that page lifecycle methods are invoked"), - - new Item("griddemo", "Grid Demo", "default Grid component"), - - new Item("GridInLoopDemo", "Grid In Loop Demo", "Grid inside loop with different model on each iteration"), - - new Item("nullgrid", "Null Grid", "handling of null source for Grid"), - - new Item("gridsetdemo", "Grid Set Demo", "handling of Set sources for Grid"), - - new Item("gridenumdemo", "Grid Enum Demo", "handling of enum types in the Grid"), - - new Item("GridRemoveReorderDemo", "Grid Remove/Reorder Demo", - "handling of remove and reorder parameters"), - - new Item("EmptyGrid", "Empty Grid Demo", "show table for empty data sources"), - - new Item("GridEarlyPagingDemo", "Grid Early Paging", "set a Grid's current page before rendering"), - - new Item("protected", "Protected Page", - "Demonstrate result of non-void return from a page's activate method"), - - new Item("Kicker", "Kicker", "demos complex page and component context in links"), - - new Item("simpletrackgriddemo", "SimpleTrack Grid Demo", - "customizing the model for a Grid around an interface"), - - new Item("pagelinkcontext", "PageLink Context Demo", - "passing explicit context in a page render link"), - - new Item("pagecontextinform", "Page Context in Form", "passivate/activate page context in Form", - "betty", "wilma", "context with spaces", "context/with/slashes"), - - new Item("ValidBeanEditorDemo", "Client Validation Demo", "BeanEditor with validation enabled"), - - new Item("Unreachable", "Unreachable Page", "page not reachable due to IgnoredPathsFilter"), - - new Item("renderabledemo", "Renderable Demo", - "shows that render phase methods can return a Renderable"), - - new Item("inheritedbindingsdemo", "Inherited Bindings Demo", - "Tests for components that inherit bindings from containing components"), - - new Item("ClientPersistenceDemo", "Client Persistence Demo", - "component field values persisted on the client side"), - - new Item("attributeExpansionsDemo", "Attribute Expansions Demo", - "use expansions inside attributes of ordinary elements"), - - new Item("PaletteDemo", "Palette Demo", "multiple selection component"), - new Item("PaletteGroupedDemo", "Palette Grouped Demo", "multiple selection component (grouped)"), - - new Item("ReturnTypes", "Return Types", "tests various event handler return types"), - - new Item("FormEncodingType", "Form Encoding Type", - "Test ability to set an encoding type for a Form"), - - new Item("RadioDemo", "RadioDemo", "Use of the RadioGroup and Radio components"), - - new Item("RegexpDemo", "Regexp Demo", "Use of the Regexp validator"), - - new Item("BeanEditRemoveReorder", "BeanEdit Remove/Reorder", - "Use of the remove and reorder parameters with BeanEditForm"), - - new Item("MultiBeanEditDemo", "MultiBeanEdit Demo", - "Multiple BeanEditor components in a single form"), - - new Item("GridFormDemo", "Grid Form Demo", "Grid operating inside a Form"), - - new Item("DateFieldDemo", "DateField Demo", "using DateField by itself on a page"), - - new Item("BeanEditDateDemo", "BeanEditor / Date Demo", - "Use of date properties inside BeanEditor and BeanDisplay"), - - new Item("eventmethodtranslate", "EventMethod Translator", - "Demo ability to provide toclient and parseclient event handler methods"), - - new Item("autocompletedemo", "Autocomplete Mixin Demo", - "Demo the autocomplete mixin for text fields"), - - new Item("componentparameter", "ComponentParameter Demo", - " Demo using a component type as a parameter type and succesfully passing a component"), - - new Item("inheritinformalsdemo", "Inherit Informal Parameters Demo", - "Demo a component which inherits informal parameters from its container"), - - new Item("disabledfields", "Disabled Fields", - "Demonstrate a bunch of disabled fields, to verify that the RenderDisabled mixin works and is being used properly"), - - new Item("BeanEditorOverride", "BeanEditor Override", - "Property editor overrides work for the BeanEditor component itself (not just the BeanEditForm component)"), - - new Item("varbindingdemo", "Var Binding Demo", "use of the var: binding prefix"), - - new Item("leangriddemo", "Lean Grid Demo", - "Grid component with lean parameter turned on, to eliminate CSS class attributes in TD and TH elements"), - - new Item("blockcaller", "Action Links off of Active Page", - "Actions can exist on pages other than the active page, via Blocks."), - - new Item("unlessdemo", "Unless Demo", "use of the Unless component"), - - new Item("delegateinline", "Inline Delegate", - "Using the delegate component to create inline components"), - - new Item("MagicValueEncoder", "Magic ValueEncoder Demo", - "Automatic creation of ValueEncoder using the TypeCoercer"), - - new Item("NullStrategyDemo", "Null Field Strategy Demo", "use of the nulls parameter of TextField"), - - new Item("OverrideValidationDecorator", "Override Validation Decorator", - "override the default validation decorator"), - - new Item("ExceptionEventDemo", "Exception Event Demo", "handling component event exceptions"), - - new Item("AddedGridColumnsDemo", "Added Grid Columns Demo", "programatically adding grid columns"), - - new Item("PrimitiveArrayParameterDemo", "Primitive Array Parameter Demo", - "use primitive array as parameter type"), - - new Item("RenderPhaseMethodExceptionDemo", "Render Phase Method Exception Demo", - "render phase methods may throw checked exceptions"), - - new Item("TrackEditor", "Generic Page Class Demo", - "demo use of generics with component classes and, particularily, with property types"), - - new Item("IndirectProtectedFields", "Protected Fields Demo", - "demo exception when component class contains protected fields"), - - new Item("injectcomponentdemo", "Inject Component Demo", "inject component defined in template"), - - new Item("cachedpage", "Cached Annotation", "Caching method return values"), - - new Item("cachedpage2", "Cached Annotation2", "Caching method return values w/ inheritence"), - - new Item("inplacegriddemo", "In-Place Grid Demo", "Grid that updates in-place using Ajax"), - - new Item("methodadvicedemo", "Method Advice Demo", "Advising component methods."), - - new Item("HasBodyDemo", "Has Body Demo", "Verify the hasBody() method of ComponentResources"), - - new Item("BeanEditorBeanEditContext", "BeanEditor BeanEditContext", - "BeanEditContext is pushed into enviroment by BeanEditor."), - - new Item("InformalParametersDemo", "Informal Parameters Demo", - "Access to informal parameters names and values"), - - new Item("FormFieldOutsideForm", "Form Field Outside Form", - "Nice exception message for common problem of form fields outside forms"), - - new Item("SubmitWithContext", "Submit With Context", "Providing a context for Submit component"), - - new Item("MessageConstraintGeneratorDemo", "Validation Constraints From Messages", - "Providing validators to apply from a properties file"), - - new Item("RenderClientIdDemo", "RenderClientId Mixin", - "Force render of client-side id of a client element via the RenderClientId mixin"), - - new Item("BindParameterDemo", "BindParameter mixin annotation", - "Accessing component parameter values from a mixin"), - - new Item("BindParameterNoSuchParameter", "BindParameter error handling", - "BindParameter throws exception if the containing component doesn't have a matching parameter"), - - new Item("BindParameterOnComponent", "BindParameter on component", - "Verify that BindParameter can only be used on mixin fields"), - - new Item("MixinOrderingDemo", "Mixin Ordering Demo", "Various mixin-ordering scenarios"), - - new Item( - "MissingComponentClassException", - "Missing Component Class Exception", - "Meaningful exception message thrown when component class can't be determined from template or field in containing component."), - - new Item("SessionAttributeDemo", "SessionAttribute Demo", - "Annotation to map a field to a specific session attribute"), - - new Item("BeanEditCalendarDemo", "BeanEditor / Calendar Demo", - "Use of calendar properties inside BeanEditor and BeanDisplay"), - - new Item("TriggerDemo", "Trigger Demo", "Use of Trigger component"), - - new Item("ImageSubmitDemo", "Submit with an Image Demo", - "Make sure that submit with the image parameter set triggers the 'selected' event."), - - new Item("SelectZoneDemo", "Select Zone Demo", "Use a Select component to update a zone."), - - new Item("AssetProtectionDemo", "Asset Protection Demo", - "AssetProtectionDispatcher is properly contributed and functioning"), - - new Item("BeanDisplayEnumDemo", "BeanDisplay Enum Demo", - "User represenation of enum values is correctly read from messages"), - - new Item("unavailablecomponentdemo", "Report Location of Unavailable Component", - "Report Location of Unavailable Component"), - - new Item("discardafterdemo", "@DiscardAfter Demo", "Demo using @DiscardAfter annotation"), - - new Item("SelectDemo", "Select Demo", "Validation decoration for Select"), - - new Item("SelectModelFromObjectsAndPropertyNameDemo", "SelectModel from objects and property name", - "Creating a SelectModel from a list of objects and a label property name"), - - new Item("SelectModelFromObjectsDemo", "SelectModel from objects", - "Creating a SelectModel from a list of objects"), - - new Item("SelectModelCoercionDemo", "SelectModel coercion", - "Creating a SelectModel from a list of objects using coercion"), - - new Item("DecoratePageRenderLinkDemo", "Decorate Page Render Link Demo", - "Decorating page render links"), - - new Item("DecorateComponentEventLinkDemo", "Decorate Component Event Link Demo", - "Decorating event links"), - - new Item("ValidatorMacroDemo", "Validator Macro Demo", "Using validator macros"), - - new Item("AtInjectDemo", "@jakarta.inject.Inject Demo", "Using @jakarta.inject.Inject for injection"), - - new Item("LinkQueryParameters", "Link Query Parameters Demo", - "Providing Query Parameters directly to link components as a map of key=parameter name, value=parameter values"), - - new Item("ChecklistDemo", "Checklist Demo", "Use Checklist component"), - - new Item("BeanEditFormPrepareBubbling", "BeanEditor Prepare Bubbling Demo", "Prepare event bubbling"), - - new Item("NestedFormFragment", "Nested Form Fragment Demo", "Nesting Form Fragments work properly"), - - new Item("MapExpressionInExpansions", "Map Expressions in Expansions Demo", "Maps can be used in expansions"), - - new Item("ExpressionInJsFunction", "Expressions in JS Functions Demo", "Expressions can be used inside javascript functions"), - - new Item("FormFieldFocusDemo", "FormFieldFocus (DEPRECATED) Demo", "Setting the Form focus on a specific field"), - - new Item("FormFragmentExplicitVisibleBoundsDemo", "Form Fragment Explicit Visible Bounds Demo", "Check for form fragment parent visibility can be bounded to"), - - new Item("OverrideFieldFocusDemo", "OverrideFieldFocus Demo", "Setting the focus in a form to a specific field"), - - new Item("OverrideLabelClassDemo", "Override Label Class Demo", "Setting class attribute on Label component"), - - new Item("FormLinkParameters", "FormLinkParameters Demo", "Form link parameters should be unescaped for a hidden field"), - - new Item("KnownActivationContextDemo", "Known Activation Context Demo", "Page is displayed normally if called without context (TAP5-2070)", - "Exact"), - - new Item("UnknownActivationContextDemo", "Unknown Activation Context Demo", "Page refuse to serve if called with an unknown activation context (TAP5-2070)", - "Unwanted", "context"), - - new Item("ModuleConfigurationCallbackDemo", "ModuleConfigurationCallback Demo", "Shows an example of changing the Require.js configuration using JavaScriptSupport.addModuleConfigurationDemo()"), - - new Item("PartialTemplateRendererDemo", "PartialTemplateRenderer Demo", "Shows some examples of rendering blocks and components to a String using PartialTemplateRenderer"), - - new Item("nested/PageThatThrowsException", "Reload on nested page", "Tests a page reload from a nested page's exception report"), - - new Item("inplacegridinloopdemo", "In-Place Grid in a Loop Demo", "In-place grid in a loop"), - - new Item("GenericTypeDemo", "Generic bound type demo", "Tests that generic type info is available for generic bindings"), - - new Item("FormFieldClientIdParameterDemo", "Form Field clientId Parameter Demo", "Shows and tests how to explicitly set the id of a form field component"), - - new Item("gridwithsubmitwithcontextdemo", "Grid with Submit with context", "A grid whose rows contain a Submit component with context"), - - new Item("textfieldwithnullvalidateparameter", "TextField with null validate parameter", "A TextField whose validate parameter is bound to null"), - - new Item("validateCheckboxMustBeChecked", "Validate Checkbox Must Be Checked", "A form that trigger validate in " + - "error event on submit when checkbox is not checked"), - - new Item("validateCheckboxMustBeUnchecked", "Validate Checkbox Must Be Unchecked", "A form that trigger validate in " + - "error event on submit when checkbox is checked"), - - new Item("validateInErrorEvent", "Validate in error Event", "A form that trigger validate in " + - "error event on submit when textfield is empty"), - - new Item("onactivateredirect", "OnActivateRedirect Demo", "A page that redirects to itself from" - + " its activation method"), - - new Item("BeanEditorWithFormFragmentDemo", "Bean Editor With Form Fragment Demo", "TriggerFragment mixin used inside a BeanEditor"), - - new Item("ObjectEditorDemo","Object Editor Demo","Edit Bean with address objects"), - - new Item("IfDemo","If Demo","If component with all its options"), - - new Item("RecursiveDemo","Recursive Demo","Recursive component example"), - - new Item("SelfRecursiveDemo", "Self-Recursive Demo", "check for handling of self-recursive components"), - - new Item("EsModuleDemo", "ES Module Demo", "tests and demonstrations for the ES module support") +// new Item("PublishEventDemo", "@PublishEvent Demo", "Publishing server-side events to client-side code (JavaScript)"), +// +// new Item("StaticActivationContextValueDemo", "@StaticActivationContextValue Demo", "Demonstrates the usage of @StaticActivationContextValue"), +// +// new Item("rest/RestWithOnEventDemo", "REST with @OnEvent Demo", "Demonstrates the usage of @OnEvent to handle REST requests"), +// +// new Item("rest/RestWithEventHandlerMethodNameDemo", "REST with Event Handler Method Name Demo", "Demonstrates the usage of event handler method names to handle REST requests"), +// +// new Item("Html5DateFieldDemo", "Html5DateField Demo", "Choosing dates using the native HTML5 date picker"), +// +//// new Item("ZoneFormDemo", "Zone Form Decoration", "Fields inside an Ajax-updatd Form are still decorated properly."), +// +// new Item("AjaxValidationDemo", "Ajax Validation", "Demonstrated proper integration of server-side validation and client-side field decoration."), +// +// new Item("OverrideEventHandlerDemo", "Event Handler Override Demo", "Event Handler methods overridden by sub-classes invoke base-class correctly."), +// +// new Item("LogoSubclass", "Base class Assets in sub-classes", "Assets are resolved for the parent class if that's where the annotations are."), +// +// new Item("MissingRequiredARP", "Missing Query Parameter for @ActivationRequestParameter", "Activating a page with a required @ActivationRequestParameter, but no matching query parameter, is an error."), +// +//// new Item("DateFieldValidationDemo", "DateField Validation Demo", +//// "Use of DateField component when client validation is disabled."), +// +// new Item("MixinParameters54", "Strict Mixin Parameters", "In the 5.4 DTD, Parameter Mixins must be qualified with the mixin id."), +// +// new Item("AsyncDemo", "Async Links and Forms Demo", "Async (XHR) Updates without a containing Zone."), +// +// new Item("FormCancelActionDemo", "Form Cancel Action Demo", "FormSupport.addCancel() support"), +// +// new Item("AjaxRadioDemo", "Ajax Radio Demo", "Radio components inside an Ajax form"), +// +// new Item("TimeIntervalDemo", "TimeInterval Demo", "Interval component, based on Moment.js"), +// +// new Item("LocalDateDemo", "LocalDate Demo", "LocalDate component, based on Moment.js"), +// +// new Item("EmptyIfDemo", "Empty If Demo", "Ensure an empty If can still render."), +// +// new Item("MissingAssetDemo", "Missing Asset Demo", "Error when injecting an asset that does not exist."), +// +// new Item("ConfirmDemo", "Confirm Mixin Demo", "Confirm an action when clicking it."), +// +// new Item("SingleErrorDemo", "Single Error", "Using Error component to customize where the errors for a field will be displayed."), +// +// new Item("JavaScriptTests", "JavaScript Tests", "Client-side tests using Mocha and Chai"), +// +// new Item("ModuleInitDemo", "Module-based Initialization Demo", "Invoke a module function to perform page initialization"), +// +// new Item("OperationWorkerDemo", "Operation Worker Demo", "Demonstrate use of @Operation annotation on component methods"), +// +// new Item("MixinParameterDefault", "Mixin Parameter with Default", "Ensure that a mixin parameter with a default value is not reported as unbound."), +// +// new Item("MixinVsInformalParameter", "Mixin Parameter vs. Informal Parameter", "Informal Paramters vs. Mixin parameter of same name"), +// +// new Item("inherit/childa", "TAP5-1656 Demo", "Test a reported bug in component inheritance"), +// +// new Item("ComponentInsideBlockDemo", "Component Inside Block Demo", "Verify that a component, inside a block, is still an embedded "), +// +// new Item("EventMethodUnmatchedComponentId", "Unmatched Component Id in Event Method Demo", "Show that referencing a component that does not exist in an event handler method name is an error."), +// +// new Item("AlertsDemo", "Alerts Demo", "Managing alerts both traditional and Ajax"), +// +// new Item("ClientConsoleDemo", "Client Console Demo", "Demo for the JavaScript client-side console"), +// +// new Item("InvalidFormalParameterDemo", "Unmatched Formal Parameter with @Component", "Parameters specified with @Component annotation must match formal parameters"), +// +// new Item("NullBindingToPrimitive", "Null Bound to Primitive Demo", "Correct exception when a primitive parameter is bound to null"), +// +// new Item("TreeDemo", "Tree Component Demo", "Demo of Tree Component"), +// +// new Item("TreeSelectionDemo", "Tree Component Selection Demo", "Demo of Selection with Tree Component"), +// +// new Item("TreeNoRootsDemo", "Tree Component No Roots Demo", "Demo of No Roots with Tree Component"), +// +// new Item("InvalidExpressionInDynamicTemplate", "Invalid Dynamic Expression", +// "Invalid expression in a Dynamic Template"), +// +// new Item("DynamicDemo", "Dynamic Demo", "Basic Dynamic component tests"), +// +// new Item("DynamicExpansionsDemo", "Expansions in Dynamic Templates", +// "Expansions inside Dynamic component content and attributes"), +// +// new Item("PACAnnotationDemo", "PageActivationContext Demo", +// "Shows that @PageActivationContext fields are set before calls to the activate event handler."), +// +// new Item("PACMultipleAnnotationDemo", "PageActivationContext Multiple Demo", +// "Demonstrates multiple @PageActivationContext fields."), +// +// new Item("PublicFieldAccessDemo", "Public Field Access Demo", "Demonstrates TAP5-1222 fix"), +// +// new Item("ActivationRequestParameterDemo", "ActivationRequestParameter Annotation Demo", +// "Use of @ActivationRequestParameter to encode page state into query parameters"), +// +// new Item("LibraryMessagesDemo", "Library Messages Demo", +// "Demo ability to contribute additional message catalog resources to the application global catalog."), +// +// new Item("MultiZoneUpdateInsideForm", "MultiZone Update inside a Form", +// "Update multiple zones within a single Form."), +// +// new Item("ZoneFormUpdateDemo", "Zone/Form Update Demo", "Updating a Zone inside a Form"), +// +// new Item("MultiZoneStringBodyDemo", "MultiZone String Body Demo", +// "Multi-zone updates in a loop using strings coerced into blocks"), +// +// new Item("RenderNotificationDemo", "RenderNotification Demo", "Use of RenderNotification mixin"), +// +// new Item("InjectMessagesDemo", "Inject Global Messages into Service Demo", +// "Ensure that it is possible to inject the application global message catalog into a service"), +// +// new Item("ReloadDemo", "Reloadable Service Implementation Demo", +// "Used when manually testing service reloads"), +// +// new Item("RequestParameterDemo", "RequestParameter Annotation Demo", +// "Use of @RequestParameter annotation on event handler method parameters"), +// +// new Item("CancelDemo", "Cancel Demo", "Use of the cancel option with Submit"), +// +// new Item("CanceledEventDemo", "Canceled Event Demo", "Triggering of the canceled event from a form."), +// +// new Item("PageResetDemo", "PageReset Annotation Demo", +// "Use of PageReset annotation to re-initialize page state"), +// +// new Item("TestOnlyServiceDemo", "Test Only Service Demo", +// "IoC module available via web.xml configuration"), +// +// new Item("RenderObjectExceptionDemo", "RenderObject Exception Demo", +// "Demonstrate how exceptions when rendering default objects are displayed."), +// +// new Item("MultiLevelInheritDemo", "Multi-Level Inherit Demo", +// "Use of inherit: binding prefix across three levels"), +// +// new Item("HiddenDemo", "Hidden Demo", "Demo the use of the Hidden component."), +// +// new Item("FormZoneDemo", "Form Zone Demo", "Use a form to update a zone."), +// +// new Item("ZoneUpdateNamespace", "Zone/Namespace Interaction", "Prove that TAP5-573 is fixed"), +// +// new Item("AbstractComponentDemo", "Abstract Component Demo", "Error when a component is abstract"), +// +// new Item("TemplateOverrideDemo", "Template Override Demo", +// "Child component extends and overrides parent template."), +// +// new Item("MultiZoneUpdateDemo", "Multiple Zone Update Demo", +// "A single request can now update multiple Zones"), +// +// new Item("LinkSubmitInZoneDemo", "LinkSubmit inside Zone", +// "Ensure that a LinkSubmit works correctly when its containing Form updates a Zone"), +// +// new Item("ProgressiveDemo", "ProgressiveDisplay Demo", "Progressive Enhancement via a component"), +// +// new Item("ClientNumericValidationDemo", "Client-Side Numeric Validation", +// "Client-side locale-specific validation"), +// +// new Item("PublishParametersDemo", "Publish Parameters Demo", +// "Use of @Component.publishParameters attribute."), +// +// new Item("LinkSubmitDemo", "LinkSubmit Demo", "JavaScript LinkSubmit component"), +// +// new Item("LinkSubmitWithoutValidatorDemo", "LinkSubmit Without Validator Demo", +// "Demonstrates that the LinkSubmit component is working without a validator on any of fields in the form"), +// +// new Item("PerFormValidationMessageDemo", "Per-Form Validation Messages", +// "Per-form configuration of validation messages and constraints."), +// +// new Item("EmptyLoopDemo", "Empty Loop Demo", "Use of empty parameter with the Loop component."), +// +// new Item("GenericLoopDemo", "Generic Loop Demo", +// "Use of generic parameters with the Loop component."), +// +// new Item("LoopWithMixinDemo", "Loop With Mixin Demo", +// "Use a mixin with a Loop component."), +// +// new Item("BlankPasswordDemo", "Blank Password Demo", +// "Show that a blank value in a PasswordField does not update the server side value."), +// +// new Item("GridFormEncoderDemo", "Grid Form Encoder Demo", +// "Grid inside a Form using the ValueEncoder option"), +// +// new Item("GridFormWithInitialSortMixinDemo", "Grid Form With Initial Sort Mixin Demo", +// "Grid inside a Form using the InitialSort mixin"), +// +// new Item("DateFieldAjaxFormLoop", "DateField inside AjaxFormLoop", +// "Show that DateField component works correctly inside AjaxFormLoop"), +// +// new Item("NestedForm", "Nested Form Demo", "Error when a Form is nested inside another Form."), +// +// new Item("UnhandledEventDemo", "Unhandled Event Demo", +// "Events that don't have matching event handlers cause exceptions"), +// +// new Item("PrimitiveDefaultDemo", "Primitive Default Demo", +// "Primitive value returned from parameter default method"), +// +// new Item("ValidateFormValidationExceptionDemo", "ValidationForm ValidationException Demo", +// "Throwing a ValidationException from the validateForm event handler."), +// +// new Item("ClientFormatDemo", "Client Format Validation", "Client-side input format validation"), +// +// new Item("ShortGrid", "Short Grid", +// "Grid where the number of claimed rows is less than the number of actual rows"), +// +// new Item("NullParameterDemo", "Null Parameter Demo", "Binding a not-null parameter to null."), +// +// new Item("nestedbeaneditor", "Nested BeanEditor", +// "BeanEditor as override for property editor in BeanEditForm"), +// +// new Item("actionpage", "Action Page", "tests fixture for ActionLink component"), +// +// new Item("cleancachedemo", "Clean Cache Demo", "cache cleared properly during Ajax calls"), +// +// new Item("numberbeaneditordemo", "Number BeanEditor Demo", +// "use of nulls and wrapper types with BeanEditor"), +// +// new Item("forminjectordemo", "FormInjector Demo", "extending a form dynamically via Ajax"), +// +// new Item("music", "Music Page", "demo handling of edge cases of page naming"), +// +// new Item("PersistentDemo", "Persistent Demo", "storing and clearing persistent properties"), +// +// new Item("ActionViaLinkDemo", "Action via Link Demo", "tests creating an action link explicitly"), +// +// new Item("FormFragmentDemo", "Form Fragment Demo", "page with dynamic form sections"), +// +// new Item("BooleanDemo", "Boolean Property Demo", +// "demo boolean properties using both is and get prefixes"), +// +// new Item("DeleteFromGridDemo", "Delete From Grid", "demo deleting items form a Grid"), +// +// new Item("RenderErrorDemo", "Render Error Demo", "reporting of errors while rendering"), +// +// new Item("nested/AssetDemo", "AssetDemo", "declaring an image using Assets"), +// +// new Item("nested/ActionDemo", "Action With Context Demo", +// "using action links with context on page with activation context"), +// +// new Item("blockdemo", "BlockDemo", "use of blocks to control rendering"), +// +// new Item("countdown", "Countdown Page", "defining component using @Component annotation"), +// +// new Item("injectdemo", "Inject Demo", "use of various kinds of injection"), +// +// new Item("instancemixin", "InstanceMixin", "mixin added to a particular component instance"), +// +// new Item("TextFieldWrapperTypeDemo", "TextField Wrapper Types", +// "use of TextField to edit numeric wrapper types (not primitives) "), +// +// new Item("EnvironmentalDemo", "Environmental Annotation Usage", +// "Storing and retrieving Environmental values"), +// +// new Item("Expansion", "Expansion Page", "Use of expansions in templates"), +// +// new Item("ExpansionSubclass", "ExpansionSubclass", +// "components can inherit templates from base classes"), +// +// new Item("Localization", "Localization", "access localized messages from the component catalog"), +// +// new Item("NumberSelect", "NumberSelect", "passivate/activate page context demo"), +// +// new Item("ParameterConflict", "Template Overridden by Class Page", +// "Parameters in the class override those in the template"), +// +// new Item("ParameterDefault", "ParameterDefault", "defaulter methods for component parameters"), +// +// new Item("passwordfielddemo", "PasswordFieldDemo", "test for the PasswordField component"), +// +// new Item("rendercomponentdemo", "RenderComponentDemo", +// "components that \"nominate\" other components to render"), +// +// new Item("renderphaseorder", "RenderPhaseOrder", +// "order of operations when invoking render phase methods"), +// +// new Item("simpleform", "SimpleForm", "first pass at writing Form and TextField components"), +// +// new Item("OptionGroupForm", "OptionGroupForm Demo", "Select with Option Group"), +// +// new Item("validform", "ValidForm", "server-side input validation"), +// +// new Item("ToDoListVolatile", "ToDo List (Volatile)", "Loops and Submit inside Form, volatile mode"), +// +// new Item("MissingTemplate", "Missing Template Demo", +// "Demo for what happens when a template is not found for a page"), +// +// new Item("nested/zonedemo", "Zone Demo", "dynamic updates within a page"), +// +// new Item("todolist", "ToDo List", "Loops and Submit inside Form using primary key encoder"), +// +// new Item("flashdemo", "FlashDemo", "demonstrate 'flash' persistence"), +// +// new Item("beaneditordemo", "BeanEditor Demo", "demonstrate the BeanEditor mega-component"), +// +// new Item("pageloadeddemo", "PageLoaded Demo", "shows that page lifecycle methods are invoked"), +// +// new Item("griddemo", "Grid Demo", "default Grid component"), +// +// new Item("GridInLoopDemo", "Grid In Loop Demo", "Grid inside loop with different model on each iteration"), +// +// new Item("nullgrid", "Null Grid", "handling of null source for Grid"), +// +// new Item("gridsetdemo", "Grid Set Demo", "handling of Set sources for Grid"), +// +// new Item("gridenumdemo", "Grid Enum Demo", "handling of enum types in the Grid"), +// +// new Item("GridRemoveReorderDemo", "Grid Remove/Reorder Demo", +// "handling of remove and reorder parameters"), +// +// new Item("EmptyGrid", "Empty Grid Demo", "show table for empty data sources"), +// +// new Item("GridEarlyPagingDemo", "Grid Early Paging", "set a Grid's current page before rendering"), +// +// new Item("protected", "Protected Page", +// "Demonstrate result of non-void return from a page's activate method"), +// +// new Item("Kicker", "Kicker", "demos complex page and component context in links"), +// +// new Item("simpletrackgriddemo", "SimpleTrack Grid Demo", +// "customizing the model for a Grid around an interface"), +// +// new Item("pagelinkcontext", "PageLink Context Demo", +// "passing explicit context in a page render link"), +// +// new Item("pagecontextinform", "Page Context in Form", "passivate/activate page context in Form", +// "betty", "wilma", "context with spaces", "context/with/slashes"), +// +// new Item("ValidBeanEditorDemo", "Client Validation Demo", "BeanEditor with validation enabled"), +// +// new Item("Unreachable", "Unreachable Page", "page not reachable due to IgnoredPathsFilter"), +// +// new Item("renderabledemo", "Renderable Demo", +// "shows that render phase methods can return a Renderable"), +// +// new Item("inheritedbindingsdemo", "Inherited Bindings Demo", +// "Tests for components that inherit bindings from containing components"), +// +// new Item("ClientPersistenceDemo", "Client Persistence Demo", +// "component field values persisted on the client side"), +// +// new Item("attributeExpansionsDemo", "Attribute Expansions Demo", +// "use expansions inside attributes of ordinary elements"), +// +// new Item("PaletteDemo", "Palette Demo", "multiple selection component"), +// new Item("PaletteGroupedDemo", "Palette Grouped Demo", "multiple selection component (grouped)"), +// +// new Item("ReturnTypes", "Return Types", "tests various event handler return types"), +// +// new Item("FormEncodingType", "Form Encoding Type", +// "Test ability to set an encoding type for a Form"), +// +// new Item("RadioDemo", "RadioDemo", "Use of the RadioGroup and Radio components"), +// +// new Item("RegexpDemo", "Regexp Demo", "Use of the Regexp validator"), +// +// new Item("BeanEditRemoveReorder", "BeanEdit Remove/Reorder", +// "Use of the remove and reorder parameters with BeanEditForm"), +// +// new Item("MultiBeanEditDemo", "MultiBeanEdit Demo", +// "Multiple BeanEditor components in a single form"), +// +// new Item("GridFormDemo", "Grid Form Demo", "Grid operating inside a Form"), +// +// new Item("DateFieldDemo", "DateField Demo", "using DateField by itself on a page"), +// +// new Item("BeanEditDateDemo", "BeanEditor / Date Demo", +// "Use of date properties inside BeanEditor and BeanDisplay"), +// +// new Item("eventmethodtranslate", "EventMethod Translator", +// "Demo ability to provide toclient and parseclient event handler methods"), +// +// new Item("autocompletedemo", "Autocomplete Mixin Demo", +// "Demo the autocomplete mixin for text fields"), +// +// new Item("componentparameter", "ComponentParameter Demo", +// " Demo using a component type as a parameter type and succesfully passing a component"), +// +// new Item("inheritinformalsdemo", "Inherit Informal Parameters Demo", +// "Demo a component which inherits informal parameters from its container"), +// +// new Item("disabledfields", "Disabled Fields", +// "Demonstrate a bunch of disabled fields, to verify that the RenderDisabled mixin works and is being used properly"), +// +// new Item("BeanEditorOverride", "BeanEditor Override", +// "Property editor overrides work for the BeanEditor component itself (not just the BeanEditForm component)"), +// +// new Item("varbindingdemo", "Var Binding Demo", "use of the var: binding prefix"), +// +// new Item("leangriddemo", "Lean Grid Demo", +// "Grid component with lean parameter turned on, to eliminate CSS class attributes in TD and TH elements"), +// +// new Item("blockcaller", "Action Links off of Active Page", +// "Actions can exist on pages other than the active page, via Blocks."), +// +// new Item("unlessdemo", "Unless Demo", "use of the Unless component"), +// +// new Item("delegateinline", "Inline Delegate", +// "Using the delegate component to create inline components"), +// +// new Item("MagicValueEncoder", "Magic ValueEncoder Demo", +// "Automatic creation of ValueEncoder using the TypeCoercer"), +// +// new Item("NullStrategyDemo", "Null Field Strategy Demo", "use of the nulls parameter of TextField"), +// +// new Item("OverrideValidationDecorator", "Override Validation Decorator", +// "override the default validation decorator"), +// +// new Item("ExceptionEventDemo", "Exception Event Demo", "handling component event exceptions"), +// +// new Item("AddedGridColumnsDemo", "Added Grid Columns Demo", "programatically adding grid columns"), +// +// new Item("PrimitiveArrayParameterDemo", "Primitive Array Parameter Demo", +// "use primitive array as parameter type"), +// +// new Item("RenderPhaseMethodExceptionDemo", "Render Phase Method Exception Demo", +// "render phase methods may throw checked exceptions"), +// +// new Item("TrackEditor", "Generic Page Class Demo", +// "demo use of generics with component classes and, particularily, with property types"), +// +// new Item("IndirectProtectedFields", "Protected Fields Demo", +// "demo exception when component class contains protected fields"), +// +// new Item("injectcomponentdemo", "Inject Component Demo", "inject component defined in template"), +// +// new Item("cachedpage", "Cached Annotation", "Caching method return values"), +// +// new Item("cachedpage2", "Cached Annotation2", "Caching method return values w/ inheritence"), +// +// new Item("inplacegriddemo", "In-Place Grid Demo", "Grid that updates in-place using Ajax"), +// +// new Item("methodadvicedemo", "Method Advice Demo", "Advising component methods."), +// +// new Item("HasBodyDemo", "Has Body Demo", "Verify the hasBody() method of ComponentResources"), +// +// new Item("BeanEditorBeanEditContext", "BeanEditor BeanEditContext", +// "BeanEditContext is pushed into enviroment by BeanEditor."), +// +// new Item("InformalParametersDemo", "Informal Parameters Demo", +// "Access to informal parameters names and values"), +// +// new Item("FormFieldOutsideForm", "Form Field Outside Form", +// "Nice exception message for common problem of form fields outside forms"), +// +// new Item("SubmitWithContext", "Submit With Context", "Providing a context for Submit component"), +// +// new Item("MessageConstraintGeneratorDemo", "Validation Constraints From Messages", +// "Providing validators to apply from a properties file"), +// +// new Item("RenderClientIdDemo", "RenderClientId Mixin", +// "Force render of client-side id of a client element via the RenderClientId mixin"), +// +// new Item("BindParameterDemo", "BindParameter mixin annotation", +// "Accessing component parameter values from a mixin"), +// +// new Item("BindParameterNoSuchParameter", "BindParameter error handling", +// "BindParameter throws exception if the containing component doesn't have a matching parameter"), +// +// new Item("BindParameterOnComponent", "BindParameter on component", +// "Verify that BindParameter can only be used on mixin fields"), +// +// new Item("MixinOrderingDemo", "Mixin Ordering Demo", "Various mixin-ordering scenarios"), +// +// new Item( +// "MissingComponentClassException", +// "Missing Component Class Exception", +// "Meaningful exception message thrown when component class can't be determined from template or field in containing component."), +// +// new Item("SessionAttributeDemo", "SessionAttribute Demo", +// "Annotation to map a field to a specific session attribute"), +// +// new Item("BeanEditCalendarDemo", "BeanEditor / Calendar Demo", +// "Use of calendar properties inside BeanEditor and BeanDisplay"), +// +// new Item("TriggerDemo", "Trigger Demo", "Use of Trigger component"), +// +// new Item("ImageSubmitDemo", "Submit with an Image Demo", +// "Make sure that submit with the image parameter set triggers the 'selected' event."), +// +// new Item("SelectZoneDemo", "Select Zone Demo", "Use a Select component to update a zone."), +// +// new Item("AssetProtectionDemo", "Asset Protection Demo", +// "AssetProtectionDispatcher is properly contributed and functioning"), +// +// new Item("BeanDisplayEnumDemo", "BeanDisplay Enum Demo", +// "User represenation of enum values is correctly read from messages"), +// +// new Item("unavailablecomponentdemo", "Report Location of Unavailable Component", +// "Report Location of Unavailable Component"), +// +// new Item("discardafterdemo", "@DiscardAfter Demo", "Demo using @DiscardAfter annotation"), +// +// new Item("SelectDemo", "Select Demo", "Validation decoration for Select"), +// +// new Item("SelectModelFromObjectsAndPropertyNameDemo", "SelectModel from objects and property name", +// "Creating a SelectModel from a list of objects and a label property name"), +// +// new Item("SelectModelFromObjectsDemo", "SelectModel from objects", +// "Creating a SelectModel from a list of objects"), +// +// new Item("SelectModelCoercionDemo", "SelectModel coercion", +// "Creating a SelectModel from a list of objects using coercion"), +// +// new Item("DecoratePageRenderLinkDemo", "Decorate Page Render Link Demo", +// "Decorating page render links"), +// +// new Item("DecorateComponentEventLinkDemo", "Decorate Component Event Link Demo", +// "Decorating event links"), +// +// new Item("ValidatorMacroDemo", "Validator Macro Demo", "Using validator macros"), +// +// new Item("AtInjectDemo", "@jakarta.inject.Inject Demo", "Using @jakarta.inject.Inject for injection"), +// +// new Item("LinkQueryParameters", "Link Query Parameters Demo", +// "Providing Query Parameters directly to link components as a map of key=parameter name, value=parameter values"), +// +// new Item("ChecklistDemo", "Checklist Demo", "Use Checklist component"), +// +// new Item("BeanEditFormPrepareBubbling", "BeanEditor Prepare Bubbling Demo", "Prepare event bubbling"), +// +// new Item("NestedFormFragment", "Nested Form Fragment Demo", "Nesting Form Fragments work properly"), +// +// new Item("MapExpressionInExpansions", "Map Expressions in Expansions Demo", "Maps can be used in expansions"), +// +// new Item("ExpressionInJsFunction", "Expressions in JS Functions Demo", "Expressions can be used inside javascript functions"), +// +// new Item("FormFieldFocusDemo", "FormFieldFocus (DEPRECATED) Demo", "Setting the Form focus on a specific field"), +// +// new Item("FormFragmentExplicitVisibleBoundsDemo", "Form Fragment Explicit Visible Bounds Demo", "Check for form fragment parent visibility can be bounded to"), +// +// new Item("OverrideFieldFocusDemo", "OverrideFieldFocus Demo", "Setting the focus in a form to a specific field"), +// +// new Item("OverrideLabelClassDemo", "Override Label Class Demo", "Setting class attribute on Label component"), +// +// new Item("FormLinkParameters", "FormLinkParameters Demo", "Form link parameters should be unescaped for a hidden field"), +// +// new Item("KnownActivationContextDemo", "Known Activation Context Demo", "Page is displayed normally if called without context (TAP5-2070)", +// "Exact"), +// +// new Item("UnknownActivationContextDemo", "Unknown Activation Context Demo", "Page refuse to serve if called with an unknown activation context (TAP5-2070)", +// "Unwanted", "context"), +// +// new Item("ModuleConfigurationCallbackDemo", "ModuleConfigurationCallback Demo", "Shows an example of changing the Require.js configuration using JavaScriptSupport.addModuleConfigurationDemo()"), +// +// new Item("PartialTemplateRendererDemo", "PartialTemplateRenderer Demo", "Shows some examples of rendering blocks and components to a String using PartialTemplateRenderer"), +// +// new Item("nested/PageThatThrowsException", "Reload on nested page", "Tests a page reload from a nested page's exception report"), +// +// new Item("inplacegridinloopdemo", "In-Place Grid in a Loop Demo", "In-place grid in a loop"), +// +// new Item("GenericTypeDemo", "Generic bound type demo", "Tests that generic type info is available for generic bindings"), +// +// new Item("FormFieldClientIdParameterDemo", "Form Field clientId Parameter Demo", "Shows and tests how to explicitly set the id of a form field component"), +// +// new Item("gridwithsubmitwithcontextdemo", "Grid with Submit with context", "A grid whose rows contain a Submit component with context"), +// +// new Item("textfieldwithnullvalidateparameter", "TextField with null validate parameter", "A TextField whose validate parameter is bound to null"), +// +// new Item("validateCheckboxMustBeChecked", "Validate Checkbox Must Be Checked", "A form that trigger validate in " + +// "error event on submit when checkbox is not checked"), +// +// new Item("validateCheckboxMustBeUnchecked", "Validate Checkbox Must Be Unchecked", "A form that trigger validate in " + +// "error event on submit when checkbox is checked"), +// +// new Item("validateInErrorEvent", "Validate in error Event", "A form that trigger validate in " + +// "error event on submit when textfield is empty"), +// +// new Item("onactivateredirect", "OnActivateRedirect Demo", "A page that redirects to itself from" +// + " its activation method"), +// +// new Item("BeanEditorWithFormFragmentDemo", "Bean Editor With Form Fragment Demo", "TriggerFragment mixin used inside a BeanEditor"), +// +// new Item("ObjectEditorDemo","Object Editor Demo","Edit Bean with address objects"), +// +// new Item("IfDemo","If Demo","If component with all its options"), +// +// new Item("RecursiveDemo","Recursive Demo","Recursive component example"), +// +// new Item("SelfRecursiveDemo", "Self-Recursive Demo", "check for handling of self-recursive components"), +// +// new Item("EsModuleDemo", "ES Module Demo", "tests and demonstrations for the ES module support") ); static