From 44313c8843cef0bb7480a6b6093ab904e1b27005 Mon Sep 17 00:00:00 2001 From: Connor Jennings Date: Sat, 14 Dec 2019 16:58:35 -0500 Subject: [PATCH] Support i18n in story budget date picker --- common/js/ef_date.js | 48 ++++++----- modules/story-budget/story-budget.php | 89 +++++++++++++------- tests/test-edit-flow-story-budget.php | 116 ++++++++++++++++++++++++++ 3 files changed, 201 insertions(+), 52 deletions(-) create mode 100644 tests/test-edit-flow-story-budget.php diff --git a/common/js/ef_date.js b/common/js/ef_date.js index 7cde82bee..1029ad515 100644 --- a/common/js/ef_date.js +++ b/common/js/ef_date.js @@ -1,23 +1,31 @@ -jQuery(document).ready(function($) { - var dateTimePicks = jQuery(".date-time-pick"); +/* global document, jQuery, ef_week_first_day */ - dateTimePicks.each(function() { - var $dTP = jQuery(this); +jQuery( document ).ready( function() { + const dateTimePicks = jQuery( '.date-time-pick' ); - $dTP.datetimepicker({ - dateFormat: "M dd yy", - firstDay: ef_week_first_day, - alwaysSetTime: false, - controlType: "select", - altField: '#' + $dTP.prop("id") + "_hidden", - altFieldTimeOnly: false, - altFormat: "yy-mm-dd", - altTimeFormat: "HH:mm" - }); - }); + dateTimePicks.each( function() { + const $dTP = jQuery( this ); - jQuery(".date-pick").datepicker({ - dateFormat: "M dd yy", - firstDay: ef_week_first_day - }); -}); + $dTP.datetimepicker( { + dateFormat: 'M dd yy', + firstDay: ef_week_first_day, + alwaysSetTime: false, + controlType: 'select', + altField: '#' + $dTP.prop( 'id' ) + '_hidden', + altFieldTimeOnly: false, + altFormat: 'yy-mm-dd', + altTimeFormat: 'HH:mm', + } ); + } ); + + const datePicks = jQuery( '.date-pick' ); + datePicks.each( function() { + const $datePicker = jQuery( this ); + + $datePicker.datepicker( { + firstDay: ef_week_first_day, + altField: '#' + $datePicker.prop( 'id' ) + '_hidden', + altFormat: 'yy-mm-dd', + } ); + } ); +} ); diff --git a/modules/story-budget/story-budget.php b/modules/story-budget/story-budget.php index 29b523b2d..ca4681729 100644 --- a/modules/story-budget/story-budget.php +++ b/modules/story-budget/story-budget.php @@ -188,23 +188,56 @@ function register_term_columns() { */ function handle_form_date_range_change() { - if ( !isset( $_POST['ef-story-budget-range-submit'], $_POST['ef-story-budget-number-days'], $_POST['ef-story-budget-start-date'] ) ) + if ( ! isset( $_POST['ef-story-budget-range-submit'], $_POST['ef-story-budget-number-days'], $_POST['ef-story-budget-start-date_hidden'] ) ) { return; + } if ( !wp_verify_nonce( $_POST['nonce'], 'change-date' ) ) wp_die( $this->module->messages['nonce-failed'] ); $current_user = wp_get_current_user(); - $user_filters = $this->get_user_meta( $current_user->ID, self::usermeta_key_prefix . 'filters', true ); - $user_filters['start_date'] = date( 'Y-m-d', strtotime( $_POST['ef-story-budget-start-date'] ) ); - $user_filters['number_days'] = (int)$_POST['ef-story-budget-number-days']; - if ( $user_filters['number_days'] <= 1 ) - $user_filters['number_days'] = 1; + $new_filters = array ( + 'start_date' => $_POST['ef-story-budget-start-date_hidden'], + 'number_days' => (int) $_POST['ef-story-budget-number-days'], + ); + $user_filters = $this->update_user_filters_from_form_date_range_change( $current_user, $new_filters ); $this->update_user_meta( $current_user->ID, self::usermeta_key_prefix . 'filters', $user_filters ); wp_redirect( menu_page_url( $this->module->slug, false ) ); exit; } + + /** + * Handles updating the users + */ + public function update_user_filters_from_form_date_range_change( $current_user, $new_filters ) { + $existing_filters = $this->get_user_meta( $current_user->ID, self::usermeta_key_prefix . 'filters', true ); + + // Default start date value + if ( isset( $new_filters['start_date'] ) ) { + // Validate that it's a legitimate date + $valid_date = DateTime::createFromFormat( 'Y-m-d', $new_filters['start_date'] ); + + if ( false === $valid_date ) { + $start_date = date_i18n( 'Y-m-d' ); + } else { + $start_date = $valid_date->format( 'Y-m-d' ); + } + + // Set the start_date filter (to new value or default) + $existing_filters['start_date'] = $start_date; + } + + if ( isset( $new_filters['number_days'] ) ) { + if ( $new_filters['number_days'] <= 1 ) { + $existing_filters['number_days'] = 1; + } else { + $existing_filters['number_days'] = $new_filters['number_days']; + } + } + + return $existing_filters; + } /** * Get the number of columns to show on the story budget @@ -320,32 +353,24 @@ function story_budget() { * @since 0.7 */ function story_budget_time_range() { - - $output = '
'; - - $start_date_value = ''; - - $start_date_value .= esc_html( date_i18n( get_option( 'date_format' ), strtotime( $this->user_filters['start_date'] ) ) ); - $start_date_value .= ''; - - $number_days_value = '' . esc_html( $this->user_filters['number_days'] ) - . ''; - - $output .= sprintf( _x( 'starting %1$s showing %2$s %3$s', '%1$s = start date, %2$s = number of days, %3$s = translation of \'Days\'', 'edit-flow' ), $start_date_value, $number_days_value, _n( 'day', 'days', $this->user_filters['number_days'], 'edit-flow' ) ); - $output .= '  '; - $output .= ''; - $output .= ' '; - $output .= ''; - $output .= '' . __( 'Change', 'edit-flow' ) . ''; - $output .= wp_nonce_field( 'change-date', 'nonce', 'change-date-nonce', false ); - $output .= '
'; - - echo $output; + ?> +
+ + user_filters['start_date'] ) ) ); ?> + + + + + user_filters['number_days'] ); ?> + user_filters['number_days'], 'edit-flow' ) ); ?> + + + + + + +
+ user->create( array( 'role' => 'administrator' ) ); + } + + public static function wpTearDownAfterClass() { + self::delete_user( self::$admin_user_id ); + } + + /** + * Test that the story budget date filter handles valid date + */ + public function test_story_budget_set_start_date_filter() { + global $edit_flow; + + $user = get_user_by( 'id', self::$admin_user_id ); + + wp_set_current_user( self::$admin_user_id ); + + // Users filters need to be set (they're set by default) + $edit_flow->story_budget->update_user_filters(); + + $new_filters['start_date'] = '2019-12-01'; + + $users_filters = $edit_flow->story_budget->update_user_filters_from_form_date_range_change( $user, $new_filters ); + + $this->assertEquals( '2019-12-01', $users_filters['start_date'] ); + } + + /** + * Test that the story budget date filter handles invalid date + */ + public function test_story_budget_set_start_date_filter_invalid() { + global $edit_flow; + + $user = get_user_by( 'id', self::$admin_user_id ); + + wp_set_current_user( self::$admin_user_id ); + + // Users filters need to be set (they're set by default) + $edit_flow->story_budget->update_user_filters(); + + $new_filters['start_date'] = 'not a date'; + + $users_filters = $edit_flow->story_budget->update_user_filters_from_form_date_range_change( $user, $new_filters ); + + $this->assertEquals( date( 'Y-m-d' ), $users_filters['start_date'] ); + } + + /** + * Test that the story budget number of days filter handles valid number of days + */ + public function test_story_budget_set_number_days_filter() { + global $edit_flow; + + $user = get_user_by( 'id', self::$admin_user_id ); + + wp_set_current_user( self::$admin_user_id ); + + // Users filters need to be set (they're set by default) + $edit_flow->story_budget->update_user_filters(); + + $new_filters['number_days'] = 10; + + $users_filters = $edit_flow->story_budget->update_user_filters_from_form_date_range_change( $user, $new_filters ); + + $this->assertEquals( 10, $users_filters['number_days'] ); + } + + /** + * Test that the story budget number of days filter handles invalid number of days + */ + public function test_story_budget_set_number_days_filter_invalid() { + global $edit_flow; + + $user = get_user_by( 'id', self::$admin_user_id ); + + wp_set_current_user( self::$admin_user_id ); + + // Users filters need to be set (they're set by default) + $edit_flow->story_budget->update_user_filters(); + + $new_filters['number_days'] = 'not days'; + + $users_filters = $edit_flow->story_budget->update_user_filters_from_form_date_range_change( $user, $new_filters ); + + $this->assertEquals( 1, $users_filters['number_days'] ); + } + + /** + * Test that the story budget handles both valid date and number of days filters + */ + public function test_story_budget_set_date_and_number_days_filters() { + global $edit_flow; + + $user = get_user_by( 'id', self::$admin_user_id ); + + wp_set_current_user( self::$admin_user_id ); + + // Users filters need to be set (they're set by default) + $edit_flow->story_budget->update_user_filters(); + + $new_filters['start_date'] = '2019-12-01'; + $new_filters['number_days'] = 10; + + $users_filters = $edit_flow->story_budget->update_user_filters_from_form_date_range_change( $user, $new_filters ); + + $this->assertEquals( 10, $users_filters['number_days'] ); + $this->assertEquals( '2019-12-01', $users_filters['start_date'] ); + } +}