- 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:
@ -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' }
|
||||||
|
@ -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) {
|
||||||
$parsed_date = explode('/', $date);
|
$datetime = false;
|
||||||
if($date_format === 'mm/dd/yyyy' && count($parsed_date) === 3) {
|
if ($date_format === 'datetime') {
|
||||||
$parsed_date = array(
|
$datetime = $date;
|
||||||
'mm' => $parsed_date[0],
|
|
||||||
'dd' => $parsed_date[1],
|
|
||||||
'yyyy' => $parsed_date[2]
|
|
||||||
);
|
|
||||||
} else if($date_format === 'mm/yyyy' && count($parsed_date) === 2) {
|
|
||||||
$parsed_date = array(
|
|
||||||
'mm' => $parsed_date[0],
|
|
||||||
'dd' => '01',
|
|
||||||
'yyyy' => $parsed_date[1]
|
|
||||||
);
|
|
||||||
} else if($date_format === 'mm' && count($parsed_date) === 1) {
|
|
||||||
$parsed_date = array(
|
|
||||||
'mm' => $parsed_date[0],
|
|
||||||
'dd' => '01',
|
|
||||||
'yyyy' => date('Y')
|
|
||||||
);
|
|
||||||
} else if($date_format === 'dd' && count($parsed_date) === 1) {
|
|
||||||
$parsed_date = array(
|
|
||||||
'mm' => '01',
|
|
||||||
'dd' => $parsed_date[0],
|
|
||||||
'yyyy' => date('Y')
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$parsed_date = false;
|
|
||||||
$date = false;
|
|
||||||
}
|
}
|
||||||
if($parsed_date) {
|
else {
|
||||||
try {
|
$parsed_date = explode('/', $date);
|
||||||
$date = sprintf(
|
$parsed_date_format = explode('/', $date_format);
|
||||||
'%s-%s-%s 00:00:00',
|
$year_position = array_search('YYYY', $parsed_date_format);
|
||||||
$parsed_date['yyyy'],
|
$month_position = array_search('MM', $parsed_date_format);
|
||||||
$parsed_date['mm'],
|
$day_position = array_search('DD', $parsed_date_format);
|
||||||
$parsed_date['dd']
|
if(count($parsed_date) === 3) {
|
||||||
|
// create date from any combination of mm, dd and yyyy
|
||||||
|
$parsed_date = array(
|
||||||
|
'year' => $parsed_date[$year_position],
|
||||||
|
'month' => $parsed_date[$month_position],
|
||||||
|
'day' => $parsed_date[$day_position]
|
||||||
|
);
|
||||||
|
} else if(count($parsed_date) === 2) {
|
||||||
|
// create date from any combination of mm and dd
|
||||||
|
$parsed_date = array(
|
||||||
|
'year' => $parsed_date[$year_position],
|
||||||
|
'month' => $parsed_date[$month_position],
|
||||||
|
'day' => '01'
|
||||||
|
);
|
||||||
|
} else if($date_format === 'MM' && count($parsed_date) === 1) {
|
||||||
|
// create date from mm
|
||||||
|
$parsed_date = array(
|
||||||
|
'month' => $parsed_date[$month_position],
|
||||||
|
'day' => '01',
|
||||||
|
'year' => date('Y')
|
||||||
|
);
|
||||||
|
} else if($date_format === 'YYYY' && count($parsed_date) === 1) {
|
||||||
|
// create date from dd
|
||||||
|
$parsed_date = array(
|
||||||
|
'year' => $parsed_date[$year_position],
|
||||||
|
'month' => '01',
|
||||||
|
'day' => '01'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$parsed_date = false;
|
||||||
|
}
|
||||||
|
if($parsed_date) {
|
||||||
|
$datetime = sprintf(
|
||||||
|
'%s-%s-%s 00:00:00',
|
||||||
|
$parsed_date['year'],
|
||||||
|
$parsed_date['month'],
|
||||||
|
$parsed_date['day']
|
||||||
);
|
);
|
||||||
$date = Carbon::parse($date)->toDateTimeString();
|
|
||||||
} catch(\Exception $e) {
|
|
||||||
$date = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $date;
|
if($datetime) {
|
||||||
|
try {
|
||||||
|
$datetime = Carbon::parse($datetime)->toDateTimeString();
|
||||||
|
} catch(\Exception $e) {
|
||||||
|
$datetime = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $datetime;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
45
tests/unit/Form/Block/DateTest.php
Normal file
45
tests/unit/Form/Block/DateTest.php
Normal 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');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user