From 7645f916febc65a7f5ae1b1c75de8fbe799aa158 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Thu, 9 Jun 2016 20:34:37 -0600 Subject: [PATCH 1/8] AM/PM Widget Fix --- date.js | 157 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 56 deletions(-) diff --git a/date.js b/date.js index ac7b8db..1c9b915 100644 --- a/date.js +++ b/date.js @@ -47,16 +47,58 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod // Now iterate over the items and render them using the format. // @TODO might need to do the "T" stuff for iOS and/or Safari $.each(items, function(delta, item) { - var value2_present = typeof item.value2 !== 'undefined' ? true: false; - var label = value2_present ? 'From: ' : ''; + + // prepare date formats + var format_full = 'D, j F Y - g:i a'; + var format_day = 'D, j F Y'; + var format_time = 'g:i a'; + + // prepare 'From:' date value var d = date_prepare(item.value); - element[delta] = { - markup: '
' + label + date(format, d.getTime()) + '
' - }; + + // check to see if there is a 'To:' date + var value2_present = typeof item.value2 !== 'undefined' ? true: false; + if (value2_present) { + + // prepare 'To:' date value var d2 = date_prepare(item.value2); - element[delta].markup += '
To: ' + date(format, d2.getTime()) + '
'; + + var from_day = date(format_day, d.getTime()); + var to_day = date(format_day, d2.getTime()); + + // get hour for 'To:' date + var to_hour = date('g', d2.getTime()); + + // correct the 0 hour to 12 for 12pm + if (to_hour == '0') { + var to_time = '12' + date(':i a', d2.getTime());; + } else { + var to_time = date(format_time, d2.getTime()); + } + + if (from_day == to_day) { + + element[delta] = { + markup: '
' + date(format_full, d.getTime()) + ' to ' + to_time + '
' + }; + + } else { + + var label = value2_present ? 'From: ' : ''; + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; + element[delta].markup += '
To: ' + date(format_full, d2.getTime()) + '
'; + + } + + } else { + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; } + }); } @@ -123,7 +165,7 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite // on this item, otherwise the DG FAPI will default it to the item's value, which is only the first part of the // date. if (value2_set && items[delta].value.indexOf('|') == -1) { - items[delta].value += '|' + items[delta].value2; + items[delta].value += '|' + items[delta].item.value2; if (!items[delta].attributes) { items[delta].attributes = {}; } items[delta].attributes.value = items[delta].value; } @@ -131,7 +173,6 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite // Grab the current date. var date = new Date(); - // Depending if we are collecting an end date or not, build a widget for each date value. var values = ['value']; if (!empty(todate)) { values.push('value2'); } @@ -195,26 +236,9 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite case 'hour': _widget_hour = _date_grain_widget_hour(date, instance, attributes, value_set, value2_set, item_date, military); - // Add an am/pm selector if we're not in military time. Hang onto the old value so we - // can prevent the +/- 12 adjustment from happening if the user selects the same - // thing twice. + // Add an am/pm selector if we're not in military time. if (!military) { - var onclick = attributes.onchange.replace(grain, 'ampm') + - '; this.date_ampm_old_value = this.value;'; - var ampm_value = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; - _widget_ampm = { - type: 'select', - attributes: { - id: attributes.id.replace(grain, 'ampm'), - onclick: onclick, - date_ampm_original_value: ampm_value - }, - value: ampm_value, - options: { - am: 'am', - pm: 'pm' - } - }; + _widget_ampm = _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military); } break; @@ -414,6 +438,30 @@ function _date_grain_widget_hour(date, instance, attributes, value_set, value2_s catch (error) { console.log('_date_grain_widget_hour', error); } } +function _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military) { + try { + + var ampm = parseInt(date.getHours()) < 12 ? 'am' : 'pm'; + + if (value_set) { + ampm = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; + } + + return { + // prefix: theme('date_label', { title: t('AM/PM') }), + type: 'date_select', + value: ampm, + attributes: attributes, + options: { + am: 'am', + pm: 'pm' + } + }; + } + catch (error) { console.log('_date_grain_widget_day', error); } +} + + function _date_grain_widget_minute(date, instance, attributes, value_set, value2_set, item_date, _value, increment) { try { // Determine the current minute. @@ -588,6 +636,9 @@ function date_military(instance) { function date_select_onchange(input, id, grain, military, increment, offset) { try { + console.log('--- date_select_onchange --- function called ---'); + console.log('grain', grain); + // @TODO - we may need the time zone offset placed here as well! // Are we setting a "to date"? @@ -596,6 +647,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { // Grab the current value (which may include both the "from" and "to" dates // separated by a pipe '|') var current_val = $('#' + id).val(); + console.log('current_val', current_val); // Is there a "to date" already set on the current value? var todate_already_set = current_val.indexOf('|') != -1 ? true : false; @@ -651,42 +703,35 @@ function date_select_onchange(input, id, grain, military, increment, offset) { break; case 'hour': if (!military) { + + var currenthour = date.getHours(); + console.log('input_val', input_val); + console.log('date.getHours() BEFORE', date.getHours()); + console.log('currenthour', currenthour); + + if (input_val == 'pm') { + if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } + else { date.setHours(date.getHours()); } + } + else if (input_val == 'am') { date.setHours(date.getHours() - 12); } + input_val = parseInt(input_val); - var ampm_input = $('#' + $(input).attr('id').replace(grain, 'ampm')); - var ampm_input_value = $(ampm_input).val(); - switch (ampm_input_value) { - case 'am': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val); - break; - case 'pm': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val + 12); - break; + if (input_val >= 0 && currenthour > 12) { + date.setHours(input_val + 12); + } else if (input_val >= 0 && currenthour < 12) { + date.setHours(input_val); + } else if (input_val >= 0 && currenthour == 12) { + date.setHours(0); } + } else { date.setHours(input_val); } + + console.log('date.getHours() AFTER', date.getHours()); + break; case 'minute': date.setMinutes(input_val); - break; - case 'ampm': - - // Stop if they picked the same val twice. - if (input.date_ampm_old_value == input_val || - ( - typeof input.date_ampm_old_value === 'undefined' && - $(input).attr('date_ampm_original_value') == input_val - ) - ) { return; } - - // Adjust the hours by +/- 12 as needed. - if (input_val == 'pm') { - if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } - else { date.setHours(date.getHours()); } - } - else if (input_val == 'am') { date.setHours(date.getHours() - 12); } - break; } From cfd1c0015db6339406f0d761f8947a4013d65cb5 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Sun, 12 Jun 2016 17:04:44 -0600 Subject: [PATCH 2/8] Update date.js --- date.js | 165 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 132 insertions(+), 33 deletions(-) diff --git a/date.js b/date.js index 1c9b915..90a60c1 100644 --- a/date.js +++ b/date.js @@ -171,7 +171,15 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite } // Grab the current date. - var date = new Date(); + if (date_apple_device()) { + // console.log('--- APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + var date = date.getTime() + (date.getTimezoneOffset() * 60000); + var date = new Date(date); + } else { + // console.log('--- NON APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + } // Depending if we are collecting an end date or not, build a widget for each date value. var values = ['value']; @@ -461,7 +469,6 @@ function _date_grain_widget_ampm(date, instance, attributes, value_set, value2_s catch (error) { console.log('_date_grain_widget_day', error); } } - function _date_grain_widget_minute(date, instance, attributes, value_set, value2_set, item_date, _value, increment) { try { // Determine the current minute. @@ -636,8 +643,7 @@ function date_military(instance) { function date_select_onchange(input, id, grain, military, increment, offset) { try { - console.log('--- date_select_onchange --- function called ---'); - console.log('grain', grain); + // console.log('--- date_select_onchange --- function called ---'); // @TODO - we may need the time zone offset placed here as well! @@ -647,7 +653,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { // Grab the current value (which may include both the "from" and "to" dates // separated by a pipe '|') var current_val = $('#' + id).val(); - console.log('current_val', current_val); + // console.log('current_val', current_val); // Is there a "to date" already set on the current value? var todate_already_set = current_val.indexOf('|') != -1 ? true : false; @@ -658,37 +664,65 @@ function date_select_onchange(input, id, grain, military, increment, offset) { else { parts.push(current_val); } // Get the date for the current value, or just default to now. - //console.log('parts before', parts); + + // console.log('parts before', parts); + var date = null; - if (!current_val) { date = new Date(); } - else { + if (!current_val) { + // console.log('--- CURRENT VALUE NOT SET ---'); + + + if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); + item_date = new Date(); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } else { + // console.log('--- NON APPLE DEVICE ---'); + date = new Date(); + } + + } else { // In case they set the "to date" before the "from date", give the "from date" a default value. if (!todate && empty(parts[0])) { parts[0] = date_yyyy_mm_dd_hh_mm_ss(); } - //Fixes iOS bug spaces must be replaced with T's - if (date_apple_device()) { + if (date_apple_device() && offset) { + + // TODO -- update to reflect code below + date = date_item_adjust_offset(date, offset); + + } else if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); if (!todate) { - parts[0] = date_apple_cleanse(parts[0]); + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); } else { if (todate_already_set) { - parts[1] = date_apple_cleanse(parts[1]); + item_date = new Date(date_apple_cleanse(parts[1])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } + } + } else { + if (!todate) { + date = new Date(parts[0]); + } else { + if (todate_already_set) { + date = new Date(parts[1]); + } else { + date = new Date(); } } - } - if (!todate) { date = new Date(parts[0]); } - else { - if (todate_already_set) { date = new Date(parts[1]); } - else { date = new Date(); } } - - if (date_apple_device() && offset) { date = date_item_adjust_offset(date, offset); } - + } - //console.log('parts after', parts); + + // console.log('parts after', parts); var input_val = $(input).val(); switch (grain) { @@ -705,9 +739,9 @@ function date_select_onchange(input, id, grain, military, increment, offset) { if (!military) { var currenthour = date.getHours(); - console.log('input_val', input_val); - console.log('date.getHours() BEFORE', date.getHours()); - console.log('currenthour', currenthour); + // console.log('input_val', input_val); + // console.log('date.getHours() BEFORE', date.getHours()); + // console.log('currenthour', currenthour); if (input_val == 'pm') { if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } @@ -727,7 +761,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { } else { date.setHours(input_val); } - console.log('date.getHours() AFTER', date.getHours()); + // console.log('date.getHours() AFTER', date.getHours()); break; case 'minute': @@ -876,6 +910,8 @@ function date_tz_handling_is_date(field) { function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, field) { try { + + console.log('--- function - _date_get_item_and_offset ---'); // Grab the item date and offset, if they are set, otherwise grab the current date/time. var item_date = null; @@ -883,17 +919,35 @@ function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, if (value_set && _value == 'value') { if (items[delta].value.indexOf('|') != -1) { var parts = items[delta].value.split('|'); - item_date = new Date(!date_apple_device() ? parts[0] : date_apple_cleanse(parts[0])); + if(!date_apple_device()){ + item_date = new Date(parts[0]); + } else { + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } else { - item_date = new Date(!date_apple_device() ? items[delta].value : date_apple_cleanse(items[delta].value)); + if(!date_apple_device()){ + item_date = new Date(items[delta].value); + } else { + item_date = new Date(date_apple_cleanse(items[delta].value)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } if (items[delta].item && items[delta].item.offset) { offset = items[delta].item.offset; } } if (value2_set && _value == 'value2') { - item_date = new Date(!date_apple_device() ? items[delta].item.value2 : date_apple_cleanse(items[delta].item.value2)); + if(!date_apple_device()){ + item_date = new Date(items[delta].item.value2); + } else { + item_date = new Date(date_apple_cleanse(items[delta].item.value2)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } if (items[delta].item && items[delta].item.offset2) { offset = items[delta].item.offset2; } @@ -1047,7 +1101,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val // Do we have an item? var have_item = typeof form.elements[field.field_name][langcode][delta].item !== 'undefined'; - //console.log('BYE', form_state_value, field, instance); + // console.log('BYE', form_state_value, field, instance); // On iOS we must place a 'T' on the date. if (date_apple_device()) { form_state_value = date_apple_cleanse(form_state_value); } @@ -1067,7 +1121,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (todate_already_set) { parts = form_state_value.split('|'); } else { parts.push(form_state_value); } - //console.log('HELLO', form_state_value, parts, form_state_value); + // console.log('HELLO', form_state_value, parts, form_state_value); // Add timezone object to result, if necessary. if (date_tz_handling_is_date(field)) { @@ -1082,8 +1136,9 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val var date = null; if (_value == 'value') { - date = new Date(parts[0]); + // console.log('THE DATE before', date); if (have_item) { + // console.log('have_item', have_item); var offset = parseInt(form.elements[field.field_name][langcode][delta].item.offset); if (offset) { result.offset = offset; } if (date_apple_device() && offset) { @@ -1091,11 +1146,33 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset); date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 1 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else {// + date = new Date(parts[0]); + } + } else { + // console.log('does not have_item', have_item); + if (date_apple_device() && offset) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset); + date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 2 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[0]); } } + // console.log('THE DATE after', date); } else if (_value == 'value2') { - date = new Date(parts[1]); if (have_item) { var offset2 = parseInt(form.elements[field.field_name][langcode][delta].item.offset2); if (offset2) { result.offset2 = offset2; } @@ -1104,6 +1181,25 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset2); date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); + } + } else { + if (date_apple_device() && offset2) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset2); + date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); } } } @@ -1125,7 +1221,10 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (result[_value].hour >= 12) { result[_value].hour = result[_value].hour % 12; result[_value].ampm = 'pm'; + } else { + result[_value].ampm = 'am'; } + if (result[_value].hour == 0) { result[_value].hour = 12; } } break; case 'minute': @@ -1138,7 +1237,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val }); - //console.log('RESULT', result); + // console.log('RESULT', result); return result; } From dfe7de9ad423f0c82aca82bb6fe9c62eec632880 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:45:26 -0600 Subject: [PATCH 3/8] Update date.field-formatter.js --- src/date.field-formatter.js | 67 ++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/src/date.field-formatter.js b/src/date.field-formatter.js index 18a14df..2346aa0 100644 --- a/src/date.field-formatter.js +++ b/src/date.field-formatter.js @@ -7,7 +7,7 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod //console.log(field); //console.log(instance); //console.log(display); - //console.log(items); + //console.log('ITEMS', items); //console.log('date_formats', drupalgap.date_formats); //console.log('date_types', drupalgap.date_types); @@ -47,16 +47,67 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod // Now iterate over the items and render them using the format. // @TODO might need to do the "T" stuff for iOS and/or Safari $.each(items, function(delta, item) { - var value2_present = typeof item.value2 !== 'undefined' ? true: false; - var label = value2_present ? 'From: ' : ''; + + // prepare date formats + var format_full = 'D, j F Y - g:i a'; + var format_day = 'D, j F Y'; + var format_time = 'g:i a'; + + // prepare 'From:' date value var d = date_prepare(item.value); - element[delta] = { - markup: '
' + label + date(format, d.getTime()) + '
' - }; + + // check to see if there is a 'To:' date + var value2_present = typeof item.value2 !== 'undefined' ? true: false; + if (value2_present) { + + // prepare 'To:' date value var d2 = date_prepare(item.value2); - element[delta].markup += '
To: ' + date(format, d2.getTime()) + '
'; + + var from_day = date(format_day, d.getTime()); + var to_day = date(format_day, d2.getTime()); + + // get hour for 'To:' date + var to_hour = date('g', d2.getTime()); + + // correct the 0 hour to 12 for 12pm + if (to_hour == '0') { + var to_time = '12' + date(':i a', d2.getTime());; + } else { + var to_time = date(format_time, d2.getTime()); + } + + // get hour for 'From:' date + var from_hour = date('g', d.getTime()); + + if (from_hour == '0') { + var from_hour = '12' + date(':i a', d.getTime());; + } else { + var from_hour = date(format_time, d.getTime()); + } + + if (from_day == to_day) { + + element[delta] = { + markup: '
' + from_day + ' - ' + from_hour + ' to ' + to_time + '
' + }; + + } else { + + var label = value2_present ? 'From: ' : ''; + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; + element[delta].markup += '
To: ' + date(format_full, d2.getTime()) + '
'; + + } + + } else { + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; } + }); } @@ -85,4 +136,4 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod return element; } catch (error) { console.log('date_field_formatter_view - ' + error); } -} \ No newline at end of file +} From cb85a286c4a405ba0d30cd1bcd0dfe7ee1c380a5 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:46:12 -0600 Subject: [PATCH 4/8] Update date.field-widget.js --- src/date.field-widget.js | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/src/date.field-widget.js b/src/date.field-widget.js index e4a4ead..a8016e0 100644 --- a/src/date.field-widget.js +++ b/src/date.field-widget.js @@ -34,14 +34,21 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite // on this item, otherwise the DG FAPI will default it to the item's value, which is only the first part of the // date. if (value2_set && items[delta].value.indexOf('|') == -1) { - items[delta].value += '|' + items[delta].value2; + items[delta].value += '|' + items[delta].item.value2; if (!items[delta].attributes) { items[delta].attributes = {}; } items[delta].attributes.value = items[delta].value; } // Grab the current date. - var date = new Date(); - + if (date_apple_device()) { + // console.log('--- APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + var date = date.getTime() + (date.getTimezoneOffset() * 60000); + var date = new Date(date); + } else { + // console.log('--- NON APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + } // Depending if we are collecting an end date or not, build a widget for each date value. var values = ['value']; @@ -106,26 +113,9 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite case 'hour': _widget_hour = _date_grain_widget_hour(date, instance, attributes, value_set, value2_set, item_date, military); - // Add an am/pm selector if we're not in military time. Hang onto the old value so we - // can prevent the +/- 12 adjustment from happening if the user selects the same - // thing twice. + // Add an am/pm selector if we're not in military time. if (!military) { - var onclick = attributes.onchange.replace(grain, 'ampm') + - '; this.date_ampm_old_value = this.value;'; - var ampm_value = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; - _widget_ampm = { - type: 'select', - attributes: { - id: attributes.id.replace(grain, 'ampm'), - onclick: onclick, - date_ampm_original_value: ampm_value - }, - value: ampm_value, - options: { - am: 'am', - pm: 'pm' - } - }; + _widget_ampm = _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military); } break; From e1f4e864295c9a03c7aca547207384b159423227 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:47:05 -0600 Subject: [PATCH 5/8] Update date.grains.js --- src/date.grains.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/date.grains.js b/src/date.grains.js index 2754ec3..01c3377 100644 --- a/src/date.grains.js +++ b/src/date.grains.js @@ -1,3 +1,6 @@ +/** + * + */ function _date_grain_widget_year(date, instance, attributes, value_set, value2_set, item_date) { try { // Determine the current year and the range of year(s) to provide @@ -127,6 +130,29 @@ function _date_grain_widget_hour(date, instance, attributes, value_set, value2_s catch (error) { console.log('_date_grain_widget_hour', error); } } +function _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military) { + try { + + var ampm = parseInt(date.getHours()) < 12 ? 'am' : 'pm'; + + if (value_set) { + ampm = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; + } + + return { + // prefix: theme('date_label', { title: t('AM/PM') }), + type: 'date_select', + value: ampm, + attributes: attributes, + options: { + am: 'am', + pm: 'pm' + } + }; + } + catch (error) { console.log('_date_grain_widget_day', error); } +} + function _date_grain_widget_minute(date, instance, attributes, value_set, value2_set, item_date, _value, increment) { try { // Determine the current minute. @@ -236,4 +262,3 @@ function _date_grain_widgets_ux_wrap(items, delta, _widget_year, _widget_month, if (ymd_grid) { items[delta].children.push({ markup: '' }); } } catch (error) { console.log('_date_grain_widgets_ux_wrap', error); } -} \ No newline at end of file From 5ac203abceb39e4b8986286b487314760e763e58 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:48:11 -0600 Subject: [PATCH 6/8] Update date.helpers.js --- src/date.helpers.js | 140 +++++++++++++++++++++++++++++--------------- 1 file changed, 92 insertions(+), 48 deletions(-) diff --git a/src/date.helpers.js b/src/date.helpers.js index 3b7e3b8..c743e98 100644 --- a/src/date.helpers.js +++ b/src/date.helpers.js @@ -62,6 +62,8 @@ function date_military(instance) { function date_select_onchange(input, id, grain, military, increment, offset) { try { + // console.log('--- date_select_onchange --- function called ---'); + // @TODO - we may need the time zone offset placed here as well! // Are we setting a "to date"? @@ -70,6 +72,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { // Grab the current value (which may include both the "from" and "to" dates // separated by a pipe '|') var current_val = $('#' + id).val(); + // console.log('current_val', current_val); // Is there a "to date" already set on the current value? var todate_already_set = current_val.indexOf('|') != -1 ? true : false; @@ -80,37 +83,65 @@ function date_select_onchange(input, id, grain, military, increment, offset) { else { parts.push(current_val); } // Get the date for the current value, or just default to now. - //console.log('parts before', parts); + + // console.log('parts before', parts); + var date = null; - if (!current_val) { date = new Date(); } - else { + if (!current_val) { + // console.log('--- CURRENT VALUE NOT SET ---'); + + + if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); + item_date = new Date(); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } else { + // console.log('--- NON APPLE DEVICE ---'); + date = new Date(); + } + + } else { // In case they set the "to date" before the "from date", give the "from date" a default value. if (!todate && empty(parts[0])) { parts[0] = date_yyyy_mm_dd_hh_mm_ss(); } - //Fixes iOS bug spaces must be replaced with T's - if (date_apple_device()) { + if (date_apple_device() && offset) { + + // TODO -- update to reflect code below + date = date_item_adjust_offset(date, offset); + + } else if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); if (!todate) { - parts[0] = date_apple_cleanse(parts[0]); + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); } else { if (todate_already_set) { - parts[1] = date_apple_cleanse(parts[1]); + item_date = new Date(date_apple_cleanse(parts[1])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } + } + } else { + if (!todate) { + date = new Date(parts[0]); + } else { + if (todate_already_set) { + date = new Date(parts[1]); + } else { + date = new Date(); } } - } - if (!todate) { date = new Date(parts[0]); } - else { - if (todate_already_set) { date = new Date(parts[1]); } - else { date = new Date(); } } - - if (date_apple_device() && offset) { date = date_item_adjust_offset(date, offset); } - + } - //console.log('parts after', parts); + + // console.log('parts after', parts); var input_val = $(input).val(); switch (grain) { @@ -125,42 +156,35 @@ function date_select_onchange(input, id, grain, military, increment, offset) { break; case 'hour': if (!military) { + + var currenthour = date.getHours(); + // console.log('input_val', input_val); + // console.log('date.getHours() BEFORE', date.getHours()); + // console.log('currenthour', currenthour); + + if (input_val == 'pm') { + if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } + else { date.setHours(date.getHours()); } + } + else if (input_val == 'am') { date.setHours(date.getHours() - 12); } + input_val = parseInt(input_val); - var ampm_input = $('#' + $(input).attr('id').replace(grain, 'ampm')); - var ampm_input_value = $(ampm_input).val(); - switch (ampm_input_value) { - case 'am': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val); - break; - case 'pm': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val + 12); - break; + if (input_val >= 0 && currenthour > 12) { + date.setHours(input_val + 12); + } else if (input_val >= 0 && currenthour < 12) { + date.setHours(input_val); + } else if (input_val >= 0 && currenthour == 12) { + date.setHours(0); } + } else { date.setHours(input_val); } + + // console.log('date.getHours() AFTER', date.getHours()); + break; case 'minute': date.setMinutes(input_val); - break; - case 'ampm': - - // Stop if they picked the same val twice. - if (input.date_ampm_old_value == input_val || - ( - typeof input.date_ampm_old_value === 'undefined' && - $(input).attr('date_ampm_original_value') == input_val - ) - ) { return; } - - // Adjust the hours by +/- 12 as needed. - if (input_val == 'pm') { - if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } - else { date.setHours(date.getHours()); } - } - else if (input_val == 'am') { date.setHours(date.getHours() - 12); } - break; } @@ -305,6 +329,8 @@ function date_tz_handling_is_date(field) { function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, field) { try { + + console.log('--- function - _date_get_item_and_offset ---'); // Grab the item date and offset, if they are set, otherwise grab the current date/time. var item_date = null; @@ -312,17 +338,35 @@ function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, if (value_set && _value == 'value') { if (items[delta].value.indexOf('|') != -1) { var parts = items[delta].value.split('|'); - item_date = new Date(!date_apple_device() ? parts[0] : date_apple_cleanse(parts[0])); + if(!date_apple_device()){ + item_date = new Date(parts[0]); + } else { + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } else { - item_date = new Date(!date_apple_device() ? items[delta].value : date_apple_cleanse(items[delta].value)); + if(!date_apple_device()){ + item_date = new Date(items[delta].value); + } else { + item_date = new Date(date_apple_cleanse(items[delta].value)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } if (items[delta].item && items[delta].item.offset) { offset = items[delta].item.offset; } } if (value2_set && _value == 'value2') { - item_date = new Date(!date_apple_device() ? items[delta].item.value2 : date_apple_cleanse(items[delta].item.value2)); + if(!date_apple_device()){ + item_date = new Date(items[delta].item.value2); + } else { + item_date = new Date(date_apple_cleanse(items[delta].item.value2)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } if (items[delta].item && items[delta].item.offset2) { offset = items[delta].item.offset2; } From b8617bfa410060fcfd6afaa7a8c65acbe629a157 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:49:22 -0600 Subject: [PATCH 7/8] Update date.hooks.js --- src/date.hooks.js | 55 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/src/date.hooks.js b/src/date.hooks.js index 622573a..e6007a0 100644 --- a/src/date.hooks.js +++ b/src/date.hooks.js @@ -24,7 +24,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val // Do we have an item? var have_item = typeof form.elements[field.field_name][langcode][delta].item !== 'undefined'; - //console.log('BYE', form_state_value, field, instance); + // console.log('BYE', form_state_value, field, instance); // On iOS we must place a 'T' on the date. if (date_apple_device()) { form_state_value = date_apple_cleanse(form_state_value); } @@ -44,7 +44,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (todate_already_set) { parts = form_state_value.split('|'); } else { parts.push(form_state_value); } - //console.log('HELLO', form_state_value, parts, form_state_value); + // console.log('HELLO', form_state_value, parts, form_state_value); // Add timezone object to result, if necessary. if (date_tz_handling_is_date(field)) { @@ -59,8 +59,9 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val var date = null; if (_value == 'value') { - date = new Date(parts[0]); + // console.log('THE DATE before', date); if (have_item) { + // console.log('have_item', have_item); var offset = parseInt(form.elements[field.field_name][langcode][delta].item.offset); if (offset) { result.offset = offset; } if (date_apple_device() && offset) { @@ -68,11 +69,33 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset); date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 1 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else {// + date = new Date(parts[0]); + } + } else { + // console.log('does not have_item', have_item); + if (date_apple_device() && offset) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset); + date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 2 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[0]); } } + // console.log('THE DATE after', date); } else if (_value == 'value2') { - date = new Date(parts[1]); if (have_item) { var offset2 = parseInt(form.elements[field.field_name][langcode][delta].item.offset2); if (offset2) { result.offset2 = offset2; } @@ -81,6 +104,25 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset2); date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); + } + } else { + if (date_apple_device() && offset2) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset2); + date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); } } } @@ -102,7 +144,10 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (result[_value].hour >= 12) { result[_value].hour = result[_value].hour % 12; result[_value].ampm = 'pm'; + } else { + result[_value].ampm = 'am'; } + if (result[_value].hour == 0) { result[_value].hour = 12; } } break; case 'minute': @@ -115,7 +160,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val }); - //console.log('RESULT', result); + // console.log('RESULT', result); return result; } From cbb81dfe85d8a55930480bfe5071078e11e80181 Mon Sep 17 00:00:00 2001 From: mkinnan Date: Mon, 11 Jul 2016 19:50:23 -0600 Subject: [PATCH 8/8] Update date.js --- date.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/date.js b/date.js index 90a60c1..ebb9343 100644 --- a/date.js +++ b/date.js @@ -66,7 +66,7 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod var from_day = date(format_day, d.getTime()); var to_day = date(format_day, d2.getTime()); - + // get hour for 'To:' date var to_hour = date('g', d2.getTime()); @@ -77,10 +77,19 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod var to_time = date(format_time, d2.getTime()); } + // get hour for 'From:' date + var from_hour = date('g', d.getTime()); + + if (from_hour == '0') { + var from_hour = '12' + date(':i a', d.getTime());; + } else { + var from_hour = date(format_time, d.getTime()); + } + if (from_day == to_day) { element[delta] = { - markup: '
' + date(format_full, d.getTime()) + ' to ' + to_time + '
' + markup: '
' + from_day + ' - ' + from_hour + ' to ' + to_time + '
' }; } else {