Skip to content

Commit 759efbd

Browse files
committed
Uniform formatting for <f:displayWidget
1 parent f4f75fd commit 759efbd

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

grails-fields/grails-app/taglib/grails/plugin/formfields/FormFieldsTagLib.groovy

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ package grails.plugin.formfields
2020

2121
import java.sql.Blob
2222
import java.text.NumberFormat
23+
import java.time.Instant
2324
import java.time.LocalDate
2425
import java.time.LocalDateTime
26+
import java.time.OffsetDateTime
27+
import java.time.ZonedDateTime
2528

2629
import groovy.transform.CompileStatic
2730
import groovy.util.logging.Slf4j
@@ -725,7 +728,7 @@ class FormFieldsTagLib {
725728
}
726729

727730
// TODO: https://github.com/apache/grails-core/issues/14198
728-
boolean datePicker = model.type in [Date, Calendar, java.sql.Date, java.sql.Time, LocalDate, LocalDateTime]
731+
boolean datePicker = model.type in [Date, Calendar, java.sql.Date, java.sql.Time, LocalDate, LocalDateTime, Instant, ZonedDateTime, OffsetDateTime]
729732
if (!datePicker) {
730733
attrs.remove('selectDateClass')
731734
}
@@ -953,6 +956,9 @@ class FormFieldsTagLib {
953956
case java.sql.Time:
954957
case LocalDate:
955958
case LocalDateTime:
959+
case Instant:
960+
case ZonedDateTime:
961+
case OffsetDateTime:
956962
g.formatDate(date: model.value)
957963
break
958964
default:

grails-fields/src/test/groovy/grails/plugin/formfields/DisplayWidgetSpec.groovy

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package grails.plugin.formfields
2020

21+
import grails.plugin.formfields.mock.Cyborg
2122
import grails.plugin.formfields.mock.Person
2223
import grails.plugin.formfields.taglib.AbstractFormFieldsTagLibSpec
2324
import grails.testing.web.taglib.TagLibUnitTest
@@ -27,7 +28,7 @@ class DisplayWidgetSpec extends AbstractFormFieldsTagLibSpec implements TagLibUn
2728
def mockFormFieldsTemplateService = Mock(FormFieldsTemplateService)
2829

2930
def setupSpec() {
30-
mockDomain(Person)
31+
mockDomains(Person, Cyborg)
3132
}
3233

3334
def setup() {
@@ -40,6 +41,11 @@ class DisplayWidgetSpec extends AbstractFormFieldsTagLibSpec implements TagLibUn
4041
applyTemplate('<f:displayWidget bean="personInstance" property="dateOfBirth"/>', [personInstance: personInstance]) == applyTemplate('<g:formatDate date="${personInstance.dateOfBirth}"/>', [personInstance: personInstance])
4142
}
4243

44+
void 'f:displayWidget without template and an instant value renders the formatted date'() {
45+
expect:
46+
applyTemplate('<f:displayWidget bean="cyborgInstance" property="timestamp"/>', [cyborgInstance: cyborgInstance]) == applyTemplate('<g:formatDate date="${cyborgInstance.timestamp}"/>', [cyborgInstance: cyborgInstance])
47+
}
48+
4349
void 'f:displayWidget without template and a boolean value renders the formatted boolean'() {
4450
expect:
4551
applyTemplate('<f:displayWidget bean="personInstance" property="minor"/>', [personInstance: personInstance]) == applyTemplate('<g:formatBoolean boolean="${personInstance.minor}"/>', [personInstance: personInstance])

grails-fields/src/test/groovy/grails/plugin/formfields/mock/Person.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
*/
1919
package grails.plugin.formfields.mock
2020

21+
import java.time.Instant
22+
2123
import grails.gorm.annotation.AutoTimestamp
2224
import grails.persistence.Entity
2325

2426
@Entity
2527
class Cyborg extends Person {
2628
@AutoTimestamp(AutoTimestamp.EventType.CREATED) Date created
2729
@AutoTimestamp Date modified
30+
Instant timestamp
2831
}
2932

3033
@Entity

grails-fields/src/test/groovy/grails/plugin/formfields/taglib/AbstractFormFieldsTagLibSpec.groovy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
package grails.plugin.formfields.taglib
2121

22+
import java.time.Instant
23+
2224
import grails.core.support.proxy.DefaultProxyHandler
2325
import grails.plugin.formfields.BeanPropertyAccessorFactory
2426
import grails.plugin.formfields.FieldsGrailsPlugin
@@ -45,7 +47,7 @@ abstract class AbstractFormFieldsTagLibSpec extends Specification implements Gra
4547
personInstance.address = new Address(street: "94 Evergreen Terrace", city: "Springfield", country: "USA")
4648
personInstance.emails = [home: "[email protected]", school: "[email protected]"]
4749
productInstance = new Product(netPrice: 12.33, name: "<script>alert('XSS');</script>")
48-
cyborgInstance = new Cyborg(name: "Hal", password: "monolith", gender: null)
50+
cyborgInstance = new Cyborg(name: "Hal", password: "monolith", gender: null, timestamp: Instant.parse("2025-10-16T00:12:15.195Z"))
4951
}
5052

5153
def cleanup() {

0 commit comments

Comments
 (0)