Re-code rendering of the DateField component - remove the "core-datefield" JavaScriptStack - be explicit about the asset root, to avoid problems when resolving assets from @Import - clean up the markup of the DateFieldDemo page
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/46dcb0fe Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/46dcb0fe Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/46dcb0fe Branch: refs/heads/5.4-js-rewrite Commit: 46dcb0fef2ddcb3e00a42ee1af0a65a696973dbd Parents: 0e94d06 Author: Howard M. Lewis Ship <[email protected]> Authored: Thu Nov 8 11:54:58 2012 -0800 Committer: Howard M. Lewis Ship <[email protected]> Committed: Thu Nov 8 11:54:58 2012 -0800 ---------------------------------------------------------------------- .../tapestry5/corelib/components/DateField.java | 63 +++++--- .../services/javascript/DateFieldStack.java | 122 --------------- .../apache/tapestry5/services/TapestryModule.java | 2 +- .../services/javascript/JavaScriptModule.java | 3 +- .../tapestry5/corelib/components/datefield.gif | Bin 127 -> 0 bytes tapestry-core/src/test/app1/DateFieldDemo.tml | 69 +++++---- 6 files changed, 84 insertions(+), 175 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/DateField.java ---------------------------------------------------------------------- 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 adcd343..5fdaafa 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 @@ -25,6 +25,7 @@ import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.ComponentDefaultProvider; +import org.apache.tapestry5.services.compatibility.DeprecationWarning; import java.text.DateFormat; import java.text.ParseException; @@ -36,7 +37,7 @@ import java.util.Locale; * A component used to collect a provided date from the user using a client-side JavaScript calendar. Non-JavaScript * clients can simply type into a text field. * <p/> - * One wierd aspect here is that, because client-side JavaScript formatting and parsing is so limited, we (currently) + * One aspect here is that, because client-side JavaScript formatting and parsing is so limited, we (currently) * use Ajax to send the user's input to the server for parsing (before raising the popup) and formatting (after closing * the popup). Weird and inefficient, but easier than writing client-side JavaScript for that purpose. * <p/> @@ -48,7 +49,7 @@ import java.util.Locale; * @see TextField */ // TODO: More testing; see https://issues.apache.org/jira/browse/TAPESTRY-1844 -@Import(stack = "core-datefield") +@Import(library = "${tapestry.datepicker}/js/datepicker.js", stylesheet = "${tapestry.datepicker}/css/datepicker.css") @Events(EventConstants.VALIDATE) public class DateField extends AbstractField { @@ -81,7 +82,12 @@ public class DateField extends AbstractField @SuppressWarnings("unchecked") private FieldValidator<Object> validate; - @Parameter(defaultPrefix = BindingConstants.ASSET, value = "datefield.gif") + /** + * Icon used for the date field trigger button. This was used in Tapestry 5.3 and earlier and is now ignored. + * + * @deprecated Deprecated in 5.4 with no replacement. The component leverages the Twitter Bootstrap glyphicons support. + */ + @Parameter(defaultPrefix = BindingConstants.ASSET) private Asset icon; /** @@ -96,11 +102,19 @@ public class DateField extends AbstractField @Inject private Locale locale; + @Inject + private DeprecationWarning deprecationWarning; + private static final String RESULT = "result"; private static final String ERROR = "error"; private static final String INPUT_PARAMETER = "input"; + void pageLoaded() + { + deprecationWarning.ignoredComponentParameters(resources, "icon"); + } + DateFormat defaultFormat() { DateFormat shortDateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale); @@ -181,15 +195,28 @@ public class DateField extends AbstractField String value = validationTracker.getInput(this); if (value == null) + { value = formatCurrentValue(); + } String clientId = getClientId(); - String triggerId = clientId + "-trigger"; + + writer.element("div", + "data-component-type", "core/DateField", + "data-parse-url", resources.createEventLink("parse").toString(), + "data-format-url", resources.createEventLink("format").toString()); + + if (!hideTextField) + { + writer.attributes("class", "input-append"); + } writer.element("input", "type", hideTextField ? "hidden" : "text", + "class", "input-small", + "name", getControlName(), "id", clientId, @@ -210,26 +237,24 @@ public class DateField extends AbstractField writer.end(); - // Now the trigger icon. - - writer.element("img", - - "id", triggerId, - - "class", "t-calendar-trigger", - - "src", icon.toClientURL(), + writer.element("button", + "class", "btn", "alt", "[Show]"); - writer.end(); // img + writer.element("i", "class", "icon-calendar"); + writer.end(); + writer.end(); - JSONObject spec = new JSONObject(); - spec.put("field", clientId); - spec.put("parseURL", resources.createEventLink("parse").toURI()); - spec.put("formatURL", resources.createEventLink("format").toURI()); + writer.end(); // outer div - javaScriptSupport.addInitializerCall("dateField", spec); +// JSONObject spec = new JSONObject(); +// +// spec.put("field", clientId); +// spec.put("parseURL", resources.createEventLink("parse").toURI()); +// spec.put("formatURL", resources.createEventLink("format").toURI()); +// +// javaScriptSupport.addInitializerCall("dateField", spec); } private void writeDisabled(MarkupWriter writer) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java deleted file mode 100644 index 1546b72..0000000 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/DateFieldStack.java +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2010, 2011 The Apache Software Foundation -// -// 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.text.DateFormatSymbols; -import java.util.Calendar; -import java.util.Collections; -import java.util.List; -import java.util.Locale; - -import org.apache.tapestry5.Asset; -import org.apache.tapestry5.SymbolConstants; -import org.apache.tapestry5.func.F; -import org.apache.tapestry5.func.Mapper; -import org.apache.tapestry5.internal.TapestryInternalUtils; -import org.apache.tapestry5.ioc.annotations.Symbol; -import org.apache.tapestry5.ioc.services.ThreadLocale; -import org.apache.tapestry5.json.JSONArray; -import org.apache.tapestry5.json.JSONObject; -import org.apache.tapestry5.services.AssetSource; -import org.apache.tapestry5.services.javascript.JavaScriptStack; -import org.apache.tapestry5.services.javascript.StylesheetLink; - -public class DateFieldStack implements JavaScriptStack -{ - private final ThreadLocale threadLocale; - - private final boolean compactJSON; - - private final List<Asset> javaScriptStack; - - private final List<StylesheetLink> stylesheetStack; - - public DateFieldStack(ThreadLocale threadLocale, @Symbol(SymbolConstants.COMPACT_JSON) - boolean compactJSON, final AssetSource assetSource) - { - this.threadLocale = threadLocale; - this.compactJSON = compactJSON; - - Mapper<String, Asset> pathToAsset = new Mapper<String, Asset>() - { - public Asset map(String path) - { - return assetSource.getExpandedAsset(path); - } - }; - - Mapper<String, StylesheetLink> pathToStylesheetLink = F.combine(pathToAsset, - TapestryInternalUtils.assetToStylesheetLink); - - javaScriptStack = F - .flow("${tapestry.datepicker}/js/datepicker.js", "org/apache/tapestry5/corelib/components/datefield.js") - .map(pathToAsset).toList(); - - stylesheetStack = F.flow("${tapestry.datepicker}/css/datepicker.css").map(pathToStylesheetLink).toList(); - } - - public String getInitialization() - { - Locale locale = threadLocale.getLocale(); - - JSONObject spec = new JSONObject(); - - DateFormatSymbols symbols = new DateFormatSymbols(locale); - - spec.put("months", new JSONArray((Object[])symbols.getMonths())); - - StringBuilder days = new StringBuilder(); - - String[] weekdays = symbols.getWeekdays(); - - Calendar c = Calendar.getInstance(locale); - - int firstDay = c.getFirstDayOfWeek(); - - // DatePicker needs them in order from monday to sunday. - - for (int i = Calendar.MONDAY; i <= Calendar.SATURDAY; i++) - { - days.append(weekdays[i].substring(0, 1)); - } - - days.append(weekdays[Calendar.SUNDAY].substring(0, 1)); - - spec.put("days", days.toString().toLowerCase(locale)); - - // DatePicker expects 0 to be monday. Calendar defines SUNDAY as 1, MONDAY as 2, etc. - - spec.put("firstDay", firstDay == Calendar.SUNDAY ? 6 : firstDay - 2); - - // TODO: Skip localization if locale is English? - - return String.format("Tapestry.DateField.initLocalization(%s);", spec.toString(compactJSON)); - } - - public List<Asset> getJavaScriptLibraries() - { - return javaScriptStack; - } - - public List<StylesheetLink> getStylesheets() - { - return stylesheetStack; - } - - public List<String> getStacks() - { - return Collections.emptyList(); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java index 7ac90be..0c9a69a 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java @@ -2131,7 +2131,7 @@ public final class TapestryModule // files deleted between scriptaculous releases to be accidentally left lying around). // There's also a ClasspathAliasManager contribution based on the path. - configuration.add("tapestry.asset.root", "META-INF/assets/tapestry5"); + configuration.add("tapestry.asset.root", "classpath:/META-INF/assets/tapestry5"); configuration.add(SymbolConstants.SCRIPTACULOUS, "${tapestry.asset.root}/scriptaculous_1_9_0"); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptModule.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptModule.java index a5ef4b0..5d1694c 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/JavaScriptModule.java @@ -65,7 +65,7 @@ public class JavaScriptModule } /** - * Contributes the "core" and "core-datefield" {@link JavaScriptStack}s + * Contributes the "core" {@link JavaScriptStack}s * * @since 5.2.0 */ @@ -73,7 +73,6 @@ public class JavaScriptModule public static void provideBuiltinJavaScriptStacks(MappedConfiguration<String, JavaScriptStack> configuration, @Core JavaScriptStack coreStack) { configuration.add(InternalConstants.CORE_STACK_NAME, coreStack); - configuration.addInstance("core-datefield", DateFieldStack.class); } @Contribute(JavaScriptStack.class) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/datefield.gif ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/datefield.gif b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/datefield.gif deleted file mode 100644 index 8526cf5..0000000 Binary files a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/datefield.gif and /dev/null differ http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/46dcb0fe/tapestry-core/src/test/app1/DateFieldDemo.tml ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/app1/DateFieldDemo.tml b/tapestry-core/src/test/app1/DateFieldDemo.tml index f57945f..e52aa64 100644 --- a/tapestry-core/src/test/app1/DateFieldDemo.tml +++ b/tapestry-core/src/test/app1/DateFieldDemo.tml @@ -1,47 +1,54 @@ <html t:type="Border" - xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> + xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"> - <h1>DateField Demo</h1> +<h1>DateField Demo</h1> - <t:form> - <t:errors/> +<t:form> + <t:errors/> - <div class="t-beaneditor"> + <div class="control-group"> + <t:label for="birthday"/> + <div class="controls"> + <t:datefield format="d MMM yyyy" hidetextfield="true" t:id="birthday"/> + </div> + </div> + + <div class="control-group"> + <t:label for="asteroidImpact"/> + <div class="controls"> + <t:datefield t:id="asteroidImpact"/> + </div> + </div> - <div class="t-beaneditor-row"> - <t:label for="birthday"/> - <t:datefield format="d MMM yyyy" hidetextfield="true" t:id="birthday"/> - </div> - <div class="t-beaneditor-row"> - <t:label for="asteroidImpact"/> - <t:datefield t:id="asteroidImpact"/> - </div> + <div class="form-actions"> + <input type="submit" value="Go" class="btn btn-primary"/> + </div> +</t:form> - <div class="t-beaneditor-row"> - <input type="submit" value="Go"/> - </div> +<div class="btn-toolbar btn-group"> - </div> - </t:form> + <t:actionlink class="btn" t:id="clear">clear</t:actionlink> + <t:actionlink class="btn" t:id="english">english</t:actionlink> + <t:actionlink class="btn" t:id="french">french</t:actionlink> +</div> + +<t:if test="birthday"> + <hr/> <p> - <t:actionlink t:id="clear">clear</t:actionlink> - <t:actionlink t:id="english">english</t:actionlink> - <t:actionlink t:id="french">french</t:actionlink> + Birthday: [ + <t:output value="birthday" format="dateFormat"/> + ] </p> - <t:if test="birthday"> - <hr/> - <p> - Birthday: [<t:output value="birthday" format="dateFormat"/>] - </p> - - <p> - Impact: [<t:output value="asteroidImpact" format="dateFormat"/>] - </p> - </t:if> + <p> + Impact: [ + <t:output value="asteroidImpact" format="dateFormat"/> + ] + </p> +</t:if> </html>
