001// Licensed under the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012 013package org.apache.tapestry5.corelib.components; 014 015import org.apache.tapestry5.BindingConstants; 016import org.apache.tapestry5.ComponentResources; 017import org.apache.tapestry5.MarkupWriter; 018import org.apache.tapestry5.annotations.Environmental; 019import org.apache.tapestry5.annotations.Parameter; 020import org.apache.tapestry5.annotations.SupportsInformalParameters; 021import org.apache.tapestry5.ioc.annotations.Inject; 022import org.apache.tapestry5.services.DateUtilities; 023import org.apache.tapestry5.services.javascript.JavaScriptSupport; 024 025import java.util.Date; 026 027/** 028 * Used to present a date, formatted in the time zone of the client browser. 029 * This is based on the <a href="http://momentjs.com/">Moment</a> JavaScript library. 030 * 031 * If the value parameter is non-null, then this component will render an element 032 * wrapping the value (formatted in ISO-8601). The element will match the template element, 033 * or a "span" if the template did not provide an element. Informal parameters will be rendered 034 * into the element. 035 * 036 * When a date is rendered, it is rendered in an element, used to specify the client-side formatting. 037 * The element's content will be the ISO-8601 format. The client-side will 038 * immediately rewrite the content to the formatted value, in the client browser's time 039 * zone. 040 * 041 * @tapestrydoc 042 * @see TimeInterval 043 * @since 5.4 044 */ 045@SupportsInformalParameters 046public class LocalDate 047{ 048 /** 049 * The format to use, as defined by <a href="http://momentjs.com/docs/#/displaying/format/">Moment.js</a>. 050 * The factory default is "lll", which is a short form of the month, day, year, hour, minute and am/pm, 051 * e.g. "Sep 4 1986 8:30 PM". 052 */ 053 @Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = false, value = "message:private-default-localdate-format") 054 String format; 055 056 /** 057 * The date value to render. If this value is null, then nothing is rendered at all. 058 */ 059 @Parameter 060 Date value; 061 062 @Inject 063 ComponentResources resources; 064 065 @Environmental 066 JavaScriptSupport javaScriptSupport; 067 068 @Inject 069 DateUtilities dateUtilities; 070 071 boolean beginRender(MarkupWriter writer) 072 { 073 if (value != null) 074 { 075 writer.element(resources.getElementName("span"), 076 "data-localdate-format", format); 077 078 resources.renderInformalParameters(writer); 079 080 writer.write(dateUtilities.formatISO8601(value)); 081 082 writer.end(); 083 084 javaScriptSupport.require("t5/core/localdate"); 085 } 086 087 // Skip the body regardless. 088 return false; 089 } 090}