Merge pull request #8125 from open-sausages/pulls/4/date-field-tweaks

Remove legacy logic from DateField_Disabled
This commit is contained in:
Damian Mooyman 2018-06-11 09:23:33 +12:00 committed by GitHub
commit 546c6c3e22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 124 additions and 16 deletions

View File

@ -220,6 +220,8 @@ class DateField extends TextField
); );
} }
if ($this->getHTML5() && $this->locale) { if ($this->getHTML5() && $this->locale) {
throw new \LogicException( throw new \LogicException(
'Please opt-out of HTML5 processing of ISO 8601 dates via setHTML5(false) if using setLocale()' 'Please opt-out of HTML5 processing of ISO 8601 dates via setHTML5(false) if using setLocale()'
@ -353,9 +355,12 @@ class DateField extends TextField
public function performReadonlyTransformation() public function performReadonlyTransformation()
{ {
$field = $this->castedCopy(DateField_Disabled::class); $field = $this
$field->setValue($this->dataValue()); ->castedCopy(DateField_Disabled::class)
$field->setReadonly(true); ->setValue($this->dataValue())
->setLocale($this->getLocale())
->setReadonly(true);
return $field; return $field;
} }

View File

@ -14,27 +14,51 @@ class DateField_Disabled extends DateField
protected $disabled = true; protected $disabled = true;
public function Field($properties = array()) public function Field($properties = [])
{ {
if ($this->valueObj) { // Default display value
if ($this->valueObj->isToday()) { $displayValue = '<i>(' . _t(DateField::class . '.NOTSET', 'not set') . ')</i>';
$val = Convert::raw2xml($this->valueObj->toString($this->getConfig('dateformat'))
. ' (' . _t('SilverStripe\\Forms\\DateField.TODAY', 'today') . ')'); $value = $this->dataValue();
if ($value) {
$value = $this->tidyInternal($value);
$df = new DBDate($this->name);
$df->setValue($value);
if ($df->IsToday()) {
// e.g. 2018-06-01 (today)
$format = '%s (%s)';
$infoComplement = _t(DateField::class . '.TODAY', 'today');
} else { } else {
$df = new DBDate($this->name); // e.g. 2018-06-01, 5 days ago
$df->setValue($this->dataValue()); $format = '%s, %s';
$val = Convert::raw2xml($this->valueObj->toString($this->getConfig('dateformat')) $infoComplement = $df->Ago();
. ', ' . $df->Ago());
} }
} else {
$val = '<i>(' . _t('SilverStripe\\Forms\\DateField.NOTSET', 'not set') . ')</i>'; // Render the display value with some complement of info
$displayValue = Convert::raw2xml(sprintf(
$format,
$this->Value(),
$infoComplement
));
} }
return "<span class=\"readonly\" id=\"" . $this->ID() . "\">$val</span>"; return sprintf(
"<span class=\"readonly\" id=\"%s\">%s</span>",
$this->ID(),
$displayValue
);
} }
public function Type() public function Type()
{ {
return "date_disabled readonly"; return "date_disabled readonly " . parent::Type();
}
public function getHTML5()
{
// Always disable HTML5 feature when using the readonly field.
return false;
} }
} }

View File

@ -0,0 +1,79 @@
<?php
namespace SilverStripe\Forms\Tests;
use IntlDateFormatter;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\DateField_Disabled;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\FieldType\DBDatetime;
/**
* @skipUpgrade
*/
class DateField_DisabledTest extends SapphireTest
{
protected function setUp()
{
parent::setUp();
i18n::set_locale('en_NZ');
DBDatetime::set_mock_now('2011-02-01 8:34:00');
}
public function testFieldToday()
{
// Today date with normal local
$actual = DateField_Disabled::create('Test')
->setValue('2011-02-01')
->Field();
$expected = '<span class="readonly" id="Test">1/02/2011 (today)</span>';
$this->assertEquals($expected, $actual);
// Test today's date with time
$actual = DateField_Disabled::create('Test')
->setValue('2011-02-01 10:34:00')
->Field();
$this->assertEquals($expected, $actual);
}
public function testFieldWithDifferentDay()
{
// Test past
$actual = DateField_Disabled::create('Test')
->setValue('2011-01-27')
->Field();
$expected = '<span class="readonly" id="Test">27/01/2011, 5 days ago</span>';
$this->assertEquals($expected, $actual);
// Test future
$actual = DateField_Disabled::create('Test')
->setValue('2011-02-06')
->Field();
$expected = '<span class="readonly" id="Test">6/02/2011, in 5 days</span>';
$this->assertEquals($expected, $actual);
}
public function testFieldWithDifferentLocal()
{
// Test different local
$actual = DateField_Disabled::create('Test')
->setValue('2011-02-06')
->setHTML5(false)
->setLocale('de_DE')
->Field();
$expected = '<span class="readonly" id="Test">06.02.2011, in 5 days</span>';
$this->assertEquals($expected, $actual);
}
public function testFieldWithNonValue()
{
// Test none value
$actual = DateField_Disabled::create('Test')->Field();
$expected = '<span class="readonly" id="Test"><i>(not set)</i></span>';
$this->assertEquals($expected, $actual);
$actual = DateField_Disabled::create('Test')->setValue('This is not a date')->Field();
$this->assertEquals($expected, $actual);
}
}