- Updates date conversion method

- Uses Moment to parse dates in UI
- Updates Custom Field model to utilize date conversion method
- Adds unit test
This commit is contained in:
Vlad
2016-08-10 21:57:43 -04:00
parent 46b0fcf37b
commit f8fea75130
4 changed files with 139 additions and 88 deletions

View File

@ -127,37 +127,12 @@ define([
return; return;
} }
const dateType = this.props.field.params.date_type; const dateTime = Moment(value);
const dateParts = value.split('-');
let year = '';
let month = '';
let day = '';
switch(dateType) {
case 'year_month_day':
year = ~~(dateParts[0]);
month = ~~(dateParts[1]);
day = ~~(dateParts[2]);
break;
case 'year_month':
year = ~~(dateParts[0]);
month = ~~(dateParts[1]);
break;
case 'month':
month = ~~(dateParts[0]);
break;
case 'year':
year = ~~(dateParts[0]);
break;
}
this.setState({ this.setState({
year: year, year: dateTime.format('YYYY'),
month: month, month: dateTime.format('M'),
day: day day: dateTime.format('D')
}); });
} }
formatValue() { formatValue() {
@ -228,7 +203,7 @@ define([
const fields = dateSelects.map(type => { const fields = dateSelects.map(type => {
switch(type) { switch(type) {
case 'yyyy': case 'YYYY':
return (<FormFieldDateYear return (<FormFieldDateYear
onValueChange={ this.onValueChange.bind(this) } onValueChange={ this.onValueChange.bind(this) }
ref={ 'year' } ref={ 'year' }
@ -239,7 +214,7 @@ define([
/>); />);
break; break;
case 'mm': case 'MM':
return (<FormFieldDateMonth return (<FormFieldDateMonth
onValueChange={ this.onValueChange.bind(this) } onValueChange={ this.onValueChange.bind(this) }
ref={ 'month' } ref={ 'month' }
@ -251,7 +226,7 @@ define([
/>); />);
break; break;
case 'dd': case 'DD':
return (<FormFieldDateDay return (<FormFieldDateDay
onValueChange={ this.onValueChange.bind(this) } onValueChange={ this.onValueChange.bind(this) }
ref={ 'day' } ref={ 'day' }

View File

@ -67,19 +67,19 @@ class Date extends Base {
} }
foreach($date_selectors as $date_selector) { foreach($date_selectors as $date_selector) {
if($date_selector === 'dd') { if($date_selector === 'DD') {
$block['selected'] = $day; $block['selected'] = $day;
$html .= '<select class="mailpoet_date_day" '; $html .= '<select class="mailpoet_date_day" ';
$html .= 'name="'.$field_name.'[day]" placeholder="'.__('Day').'">'; $html .= 'name="'.$field_name.'[day]" placeholder="'.__('Day').'">';
$html .= static::getDays($block); $html .= static::getDays($block);
$html .= '</select>'; $html .= '</select>';
} else if($date_selector === 'mm') { } else if($date_selector === 'MM') {
$block['selected'] = $month; $block['selected'] = $month;
$html .= '<select class="mailpoet_date_month" '; $html .= '<select class="mailpoet_date_month" ';
$html .= 'name="'.$field_name.'[month]" placeholder="'.__('Month').'">'; $html .= 'name="'.$field_name.'[month]" placeholder="'.__('Month').'">';
$html .= static::getMonths($block); $html .= static::getMonths($block);
$html .= '</select>'; $html .= '</select>';
} else if($date_selector === 'yyyy') { } else if($date_selector === 'YYYY') {
$block['selected'] = $year; $block['selected'] = $year;
$html .= '<select class="mailpoet_date_year" '; $html .= '<select class="mailpoet_date_year" ';
$html .= 'name="'.$field_name.'[year]" placeholder="'.__('Year').'">'; $html .= 'name="'.$field_name.'[year]" placeholder="'.__('Year').'">';
@ -102,10 +102,10 @@ class Date extends Base {
static function getDateFormats() { static function getDateFormats() {
return array( return array(
'year_month_day' => array('mm/dd/yyyy', 'dd/mm/yyyy', 'yyyy/mm/dd'), 'year_month_day' => array('MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY/MM/DD'),
'year_month' => array('mm/yyyy', 'yyyy/mm'), 'year_month' => array('MM/YYYY', 'YYYY/MM'),
'year' => array('yyyy'), 'year' => array('YYYY'),
'month' => array('mm') 'month' => array('MM')
); );
} }
static function getMonthNames() { static function getMonthNames() {
@ -195,49 +195,64 @@ class Date extends Base {
return $html; return $html;
} }
static function validateDate($date, $date_format) { static function convertDateToDatetime($date, $date_format) {
$datetime = false;
if ($date_format === 'datetime') {
$datetime = $date;
}
else {
$parsed_date = explode('/', $date); $parsed_date = explode('/', $date);
if($date_format === 'mm/dd/yyyy' && count($parsed_date) === 3) { $parsed_date_format = explode('/', $date_format);
$year_position = array_search('YYYY', $parsed_date_format);
$month_position = array_search('MM', $parsed_date_format);
$day_position = array_search('DD', $parsed_date_format);
if(count($parsed_date) === 3) {
// create date from any combination of mm, dd and yyyy
$parsed_date = array( $parsed_date = array(
'mm' => $parsed_date[0], 'year' => $parsed_date[$year_position],
'dd' => $parsed_date[1], 'month' => $parsed_date[$month_position],
'yyyy' => $parsed_date[2] 'day' => $parsed_date[$day_position]
); );
} else if($date_format === 'mm/yyyy' && count($parsed_date) === 2) { } else if(count($parsed_date) === 2) {
// create date from any combination of mm and dd
$parsed_date = array( $parsed_date = array(
'mm' => $parsed_date[0], 'year' => $parsed_date[$year_position],
'dd' => '01', 'month' => $parsed_date[$month_position],
'yyyy' => $parsed_date[1] 'day' => '01'
); );
} else if($date_format === 'mm' && count($parsed_date) === 1) { } else if($date_format === 'MM' && count($parsed_date) === 1) {
// create date from mm
$parsed_date = array( $parsed_date = array(
'mm' => $parsed_date[0], 'month' => $parsed_date[$month_position],
'dd' => '01', 'day' => '01',
'yyyy' => date('Y') 'year' => date('Y')
); );
} else if($date_format === 'dd' && count($parsed_date) === 1) { } else if($date_format === 'YYYY' && count($parsed_date) === 1) {
// create date from dd
$parsed_date = array( $parsed_date = array(
'mm' => '01', 'year' => $parsed_date[$year_position],
'dd' => $parsed_date[0], 'month' => '01',
'yyyy' => date('Y') 'day' => '01'
); );
} else { } else {
$parsed_date = false; $parsed_date = false;
$date = false;
} }
if($parsed_date) { if($parsed_date) {
try { $datetime = sprintf(
$date = sprintf(
'%s-%s-%s 00:00:00', '%s-%s-%s 00:00:00',
$parsed_date['yyyy'], $parsed_date['year'],
$parsed_date['mm'], $parsed_date['month'],
$parsed_date['dd'] $parsed_date['day']
); );
$date = Carbon::parse($date)->toDateTimeString(); }
}
if($datetime) {
try {
$datetime = Carbon::parse($datetime)->toDateTimeString();
} catch(\Exception $e) { } catch(\Exception $e) {
$date = false; $datetime = false;
} }
} }
return $date; return $datetime;
} }
} }

View File

@ -1,6 +1,8 @@
<?php <?php
namespace MailPoet\Models; namespace MailPoet\Models;
use MailPoet\Form\Block\Date;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class CustomField extends Model { class CustomField extends Model {
@ -43,28 +45,27 @@ class CustomField extends Model {
// format custom field data depending on type // format custom field data depending on type
if(is_array($value) && $this->type === 'date' ) { if(is_array($value) && $this->type === 'date' ) {
$custom_field_data = $this->asArray(); $custom_field_data = $this->asArray();
$date_format = $custom_field_data['params']['date_format'];
$date_type = (isset($custom_field_data['params']['date_type']) $date_type = (isset($custom_field_data['params']['date_type'])
? $custom_field_data['params']['date_type'] ? $custom_field_data['params']['date_type']
: 'year_month_day' : 'year_month_day'
); );
$date_parts = explode('_', $date_type); $date_parts = explode('_', $date_type);
switch($date_type) { switch($date_type) {
case 'year_month_day': case 'year_month_day':
$value = sprintf( $value = sprintf(
'%04d-%02d-%02d', '%s/%s/%s',
$value['year'],
$value['month'], $value['month'],
$value['day'] $value['day'],
$value['year']
); );
break; break;
case 'year_month': case 'year_month':
$value = sprintf( $value = sprintf(
'%04d-%02d', '%s/%s',
$value['year'], $value['month'],
$value['month'] $value['year']
); );
break; break;
@ -73,12 +74,23 @@ class CustomField extends Model {
$value = ''; $value = '';
} else { } else {
$value = sprintf( $value = sprintf(
'%02d', '%s',
$value['month'] $value['month']
); );
} }
break; break;
case 'day':
if((int)$value['day'] === 0) {
$value = '';
} else {
$value = sprintf(
'%s',
$value['day']
);
}
break;
case 'year': case 'year':
if((int)$value['year'] === 0) { if((int)$value['year'] === 0) {
$value = ''; $value = '';
@ -90,6 +102,10 @@ class CustomField extends Model {
} }
break; break;
} }
if(!empty($value)) {
$value = Date::convertDateToDatetime($value, $date_format);
}
} }
return $value; return $value;

View File

@ -0,0 +1,45 @@
<?php
use MailPoet\Form\Block\Date;
class DateTest extends MailPoetTest {
function testItCanConvertDateMonthYearFormatToDatetime() {
$date = array(
'MM/DD/YYYY' => '05/10/2016',
'DD/MM/YYYY' => '10/05/2016',
'YYYY/MM/DD' => '2016/05/10',
'YYYY/DD/MM' => '2016/10/05'
);
foreach($date as $date_format => $date) {
expect(Date::convertDateToDatetime($date, $date_format))
->equals('2016-05-10 00:00:00');
}
}
function testItCanConvertMonthYearFormatToDatetime() {
$date = array(
'MM/YYYY' => '05/2016',
'YYYY/MM' => '2016/05'
);
foreach($date as $date_format => $date) {
expect(Date::convertDATEToDatetime($date, $date_format))
->equals('2016-05-01 00:00:00');
}
}
function testItCanConvertMonthToDatetime() {
expect(Date::convertDateToDatetime('05', 'MM'))
->equals('2016-05-01 00:00:00');
}
function testItCanConvertYearToDatetime() {
expect(Date::convertDateToDatetime('2016', 'YYYY'))
->equals('2016-01-01 00:00:00');
}
function testItCanConvertDatetimeToDatetime() {
expect(Date::convertDateToDatetime('2016-05-10 00:00:00', 'datetime'))
->equals('2016-05-10 00:00:00');
}
}