From 97ffdb2edc14c12502f75efef9622cecd89a3020 Mon Sep 17 00:00:00 2001 From: mistic100 Date: Sun, 18 May 2014 10:58:53 +0000 Subject: [PATCH] feature 2679 : allow to change creation time git-svn-id: http://piwigo.org/svn/trunk@28500 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin/batch_manager_global.php | 4 +- admin/batch_manager_unit.php | 22 +- admin/history.php | 2 +- admin/picture_modify.php | 25 +- admin/themes/default/js/datepicker.js | 73 +- .../default/template/batch_manager_global.tpl | 2 +- .../default/template/batch_manager_unit.tpl | 2 +- .../template/include/datepicker.inc.tpl | 15 +- .../default/template/picture_modify.tpl | 3 +- .../js/ui/i18n/jquery.ui.timepicker-af.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-am.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-bg.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-ca.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-cs.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-da.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-de.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-el.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-es.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-et.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-eu.js | 22 + .../js/ui/i18n/jquery.ui.timepicker-fi.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-fr.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-gl.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-he.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-hr.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-hu.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-id.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-it.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-ja.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-ko.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-lt.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-nl.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-no.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-pl.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-pt-BR.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-pt.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-ro.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-ru.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-sk.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-sr-RS.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-sr-YU.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-sv.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-th.js | 18 + .../js/ui/i18n/jquery.ui.timepicker-tr.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-uk.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-vi.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-zh-CN.js | 21 + .../js/ui/i18n/jquery.ui.timepicker-zh-TW.js | 21 + .../js/ui/jquery.ui.timepicker-addon.js | 2197 +++++++++++++++++ .../jquery.ui.timepicker-addon.min.js | 5 + .../ui/theme/jquery.ui.timepicker-addon.css | 11 + 51 files changed, 3107 insertions(+), 71 deletions(-) create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-af.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-am.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-bg.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-ca.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-cs.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-da.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-de.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-el.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-es.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-et.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-eu.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-fi.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-fr.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-gl.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-he.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-hr.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-hu.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-id.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-it.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-ja.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-ko.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-lt.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-nl.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-no.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-pl.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-pt-BR.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-pt.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-ro.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-ru.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-sk.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-sr-RS.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-sr-YU.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-sv.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-th.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-tr.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-uk.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-vi.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-zh-CN.js create mode 100644 themes/default/js/ui/i18n/jquery.ui.timepicker-zh-TW.js create mode 100644 themes/default/js/ui/jquery.ui.timepicker-addon.js create mode 100644 themes/default/js/ui/minified/jquery.ui.timepicker-addon.min.js create mode 100644 themes/default/js/ui/theme/jquery.ui.timepicker-addon.css diff --git a/admin/batch_manager_global.php b/admin/batch_manager_global.php index 1d72e2e2d..c8bc38dad 100644 --- a/admin/batch_manager_global.php +++ b/admin/batch_manager_global.php @@ -292,7 +292,7 @@ DELETE } else { - $date_creation = $_POST['date_creation'].' 00:00:00'; + $date_creation = $_POST['date_creation']; } $datas = array(); @@ -565,7 +565,7 @@ if (count($page['cat_elements_id']) > 0) // creation date $template->assign('DATE_CREATION', - empty($_POST['date_creation']) ? date('y-n-j') : $_POST['date_creation'] + empty($_POST['date_creation']) ? date('Y-m-d').' 00:00:00' : $_POST['date_creation'] ); // image level options diff --git a/admin/batch_manager_unit.php b/admin/batch_manager_unit.php index 068182050..bbbe4810c 100644 --- a/admin/batch_manager_unit.php +++ b/admin/batch_manager_unit.php @@ -78,15 +78,7 @@ SELECT id, date_creation if (!empty($_POST['date_creation-'.$row['id']])) { - if (!empty($row['date_creation'])) - { - list(, $time) = explode(' ', $row['date_creation']); - } - else - { - $time = '00:00:00'; - } - $data['date_creation'] = $_POST['date_creation-'.$row['id']].' '.$time; + $data['date_creation'] = $_POST['date_creation-'.$row['id']]; } else { @@ -222,16 +214,6 @@ SELECT * $src_image = new SrcImage($row); - // creation date - if (!empty($row['date_creation'])) - { - list($date) = explode(' ', $row['date_creation']); - } - else - { - $date = ''; - } - $query = ' SELECT id, @@ -260,7 +242,7 @@ SELECT 'AUTHOR' => htmlspecialchars(@$row['author']), 'LEVEL' => !empty($row['level'])?$row['level']:'0', 'DESCRIPTION' => htmlspecialchars(@$row['comment']), - 'DATE_CREATION' => $date, + 'DATE_CREATION' => $row['date_creation'], 'TAGS' => $tag_selection, ) )); diff --git a/admin/history.php b/admin/history.php index 29f59b6b2..68b997736 100644 --- a/admin/history.php +++ b/admin/history.php @@ -570,7 +570,7 @@ else { // by default, at page load, we want the selected date to be the current // date - $form['start'] = $form['end'] = date('Y-n-j'); + $form['start'] = $form['end'] = date('Y-m-d'); $form['types'] = $types; // Hoverbox by default $form['display_thumbnail'] = diff --git a/admin/picture_modify.php b/admin/picture_modify.php index d476c560f..1b99e5f55 100644 --- a/admin/picture_modify.php +++ b/admin/picture_modify.php @@ -127,7 +127,7 @@ if (isset($_POST['submit'])) if (!empty($_POST['date_creation'])) { - $data['date_creation'] = $_POST['date_creation'].' '.$_POST['date_creation_time']; + $data['date_creation'] = $_POST['date_creation']; } else { @@ -255,6 +255,8 @@ $template->assign( : @$row['author'] ), + 'DATE_CREATION' => $row['date_creation'], + 'DESCRIPTION' => htmlspecialchars( isset($_POST['description']) ? stripslashes($_POST['description']) : @$row['comment'] ), @@ -316,26 +318,7 @@ $template->assign( ) ); -// creation date -unset($day, $month, $year); - -if (!empty($row['date_creation'])) -{ - list($date, $time) = explode(' ', $row['date_creation']); -} -else -{ - $date = ''; - $time = '00:00:00'; -} - -$template->assign( - array( - 'DATE_CREATION' => $date, - 'DATE_CREATION_TIME' => $time, - ) - ); - +// categories $query = ' SELECT category_id, uppercats FROM '.IMAGE_CATEGORY_TABLE.' AS ic diff --git a/admin/themes/default/js/datepicker.js b/admin/themes/default/js/datepicker.js index ace38da13..eb6f31a6f 100644 --- a/admin/themes/default/js/datepicker.js +++ b/admin/themes/default/js/datepicker.js @@ -1,45 +1,69 @@ +jQuery.timepicker.log = jQuery.noop; // that's ugly, but the timepicker is acting weird and throws parsing errors + jQuery.fn.pwgDatepicker = function(options) { options = options || {}; return this.each(function() { var $this = jQuery(this), $target = jQuery('[name="'+ jQuery(this).data('datepicker') +'"]'), - value = $target.val().split('-'); + linked = !!$target.length; - function set(date) { - $this.datepicker('setDate', date); + if (linked) { // get value before init + var value = $target.val().split(' '); + } + + // custom setter + function set(date, init) { + $this.datetimepicker('setDate', date); if ($this.data('datepicker-start')) { - $start.datepicker('option', 'maxDate', date); + $start.datetimepicker('option', 'maxDate', date); } else if ($this.data('datepicker-end')) { - $end.datepicker('option', 'minDate', date); + if (!init) { // on init, "end" is not initialized yet (assuming "start" is before "end" in the DOM) + $end.datetimepicker('option', 'minDate', date); + } + } + + if (!date && linked) { + $target.val(''); } } // init picker - $this.datepicker(jQuery.extend({ - dateFormat: 'DD d MM yy', - altField: $target, + $this.datetimepicker(jQuery.extend({ + dateFormat: linked ? 'DD d MM yy' : 'yy-mm-dd', + timeFormat: 'HH:mm', + + altField: linked ? $target : null, altFormat: 'yy-mm-dd', + altTimeFormat: options.showTimepicker ? 'HH:mm:ss' : '', + autoSize: true, changeMonth : true, - changeYear: true + changeYear: true, + showTimepicker: false, + altFieldTimeOnly: false, + showSecond: false, + alwaysSetTime: false, + stepMinute: 5 }, options)); - // attach linked picker (for ranges) + // attach range pickers if ($this.data('datepicker-start')) { var $start = jQuery('[data-datepicker="'+ jQuery(this).data('datepicker-start') +'"]'); - $this.datepicker('option', 'onClose', function(date) { - $start.datepicker('option', 'maxDate', date); + $this.datetimepicker('option', 'onClose', function(date) { + $start.datetimepicker('option', 'maxDate', date); }); + + $this.datetimepicker('option', 'minDate', $start.datetimepicker('getDate')); } else if ($this.data('datepicker-end')) { var $end = jQuery('[data-datepicker="'+ jQuery(this).data('datepicker-end') +'"]'); - $this.datepicker('option', 'onClose', function(date) { - $end.datepicker('option', 'minDate', date); + $this.datetimepicker('option', 'onClose', function(date) { + $end.datetimepicker('option', 'minDate', date); }); } @@ -47,15 +71,26 @@ jQuery.fn.pwgDatepicker = function(options) { if ($this.data('datepicker-unset')) { jQuery('#'+ $this.data('datepicker-unset')).on('click', function(e) { e.preventDefault(); - - $target.val(''); - set(null); + set(null, false); }); } // set value from linked input - if (value.length == 3) { - set(new Date(value[0], value[1]-1, value[2])); + if (linked) { + if (value[0].length == 10 && !options.showTimepicker) { + set(jQuery.datepicker.parseDate('yy-mm-dd', value[0]), true); + } + else if (value.length == 2 && options.showTimepicker) { + set(jQuery.datepicker.parseDateTime('yy-mm-dd', 'HH:mm:ss', value.join(' ')), true); + } + else { + set(null, true); + } + } + + // autoSize not handled by timepicker + if (options.showTimepicker) { + $this.attr('size', parseInt($this.attr('size'))+6); } }); }; \ No newline at end of file diff --git a/admin/themes/default/template/batch_manager_global.tpl b/admin/themes/default/template/batch_manager_global.tpl index 148f48735..631a00f0d 100644 --- a/admin/themes/default/template/batch_manager_global.tpl +++ b/admin/themes/default/template/batch_manager_global.tpl @@ -60,7 +60,7 @@ jQuery(document).ready(function() { {footer_script require='jquery.tokeninput'} jQuery(document).ready(function() {ldelim} - jQuery('[data-datepicker]').pwgDatepicker(); + jQuery('[data-datepicker]').pwgDatepicker({ showTimepicker: true }); jQuery("a.preview-box").colorbox(); diff --git a/admin/themes/default/template/batch_manager_unit.tpl b/admin/themes/default/template/batch_manager_unit.tpl index e282a5e0b..d0d06e11d 100644 --- a/admin/themes/default/template/batch_manager_unit.tpl +++ b/admin/themes/default/template/batch_manager_unit.tpl @@ -51,7 +51,7 @@ tagsCache.get(function(tags) { {* *} jQuery(function(){ {* *} - jQuery('[data-datepicker]').pwgDatepicker(); + jQuery('[data-datepicker]').pwgDatepicker({ showTimepicker: true }); }); {* *} diff --git a/admin/themes/default/template/include/datepicker.inc.tpl b/admin/themes/default/template/include/datepicker.inc.tpl index d8202703d..92e40aa3a 100644 --- a/admin/themes/default/template/include/datepicker.inc.tpl +++ b/admin/themes/default/template/include/datepicker.inc.tpl @@ -1,9 +1,16 @@ -{combine_script id='datepicker.js' load='footer' require='jquery.ui.datepicker' path='admin/themes/default/js/datepicker.js'} +{combine_script id='jquery.ui.timepicker-addon' load='footer' require='jquery.ui.datepicker,jquery.ui.slider' path="themes/default/js/ui/jquery.ui.timepicker-addon.js"} +{combine_script id='datepicker.js' load='footer' require='jquery.ui.timepicker-addon' path='admin/themes/default/js/datepicker.js'} {assign var="datepicker_language" value="themes/default/js/ui/i18n/jquery.ui.datepicker-`$lang_info.code`.js"} - {if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists} -{combine_script id="jquery.ui.datepicker-$lang_info.code" load='footer' path=$datepicker_language} +{combine_script id="jquery.ui.datepicker-$lang_info.code" load='footer' require='jquery.ui.datepicker' path=$datepicker_language} {/if} -{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"} \ No newline at end of file +{assign var="timepicker_language" value="themes/default/js/ui/i18n/jquery.ui.timepicker-`$lang_info.code`.js"} +{if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists} +{combine_script id="jquery.ui.timepicker-$lang_info.code" load='footer' require='jquery.ui.timepicker-addon' path=$timepicker_language} +{/if} + +{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"} +{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"} +{combine_css path="themes/default/js/ui/theme/jquery.ui.timepicker-addon.css"} \ No newline at end of file diff --git a/admin/themes/default/template/picture_modify.tpl b/admin/themes/default/template/picture_modify.tpl index 99a53b247..f48a152d6 100644 --- a/admin/themes/default/template/picture_modify.tpl +++ b/admin/themes/default/template/picture_modify.tpl @@ -77,7 +77,7 @@ tagsCache.get(function(tags) { {* *} jQuery(function(){ {* *} - jQuery('[data-datepicker]').pwgDatepicker(); + jQuery('[data-datepicker]').pwgDatepicker({ showTimepicker: true }); }); }()); {/footer_script} @@ -140,7 +140,6 @@ jQuery(function(){ {* *}

{'Creation date'|@translate}
-

' + '
' + o.timeText + '
' + + '
'; + + // Create the markup + for (i = 0, l = this.units.length; i < l; i++) { + litem = this.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10); + gridSize[litem] = 0; + + html += '
' + o[litem + 'Text'] + '
' + + '
'; + + if (show && o[litem + 'Grid'] > 0) { + html += '
'; + + if (litem === 'hour') { + for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o); + html += ''; + } + } + else { + for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + html += ''; + } + } + + html += '
' + tmph + '' + ((m < 10) ? '0' : '') + m + '
'; + } + html += '
'; + } + + // Timezone + var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone; + html += '
' + o.timezoneText + '
'; + html += '
'; + + // Create the elements from string + html += '
'; + var $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend('
' + '
' + o.timeOnlyTitle + '
' + '
'); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + // add sliders, adjust grids, add events + for (i = 0, l = tp_inst.units.length; i < l; i++) { + litem = tp_inst.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // add the slider + tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]); + + // adjust the grid and add click event + if (show && o[litem + 'Grid'] > 0) { + size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']); + $tp.find('.ui_tpicker_' + litem + ' table').css({ + width: size + "%", + marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"), + marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0', + borderCollapse: 'collapse' + }).find("td").click(function (e) { + var $t = $(this), + h = $t.html(), + n = parseInt(h.replace(/[^0-9]/g), 10), + ap = h.replace(/[^apm]/ig), + f = $t.data('for'); // loses scope, so we use data-for + + if (f === 'hour') { + if (ap.indexOf('p') !== -1 && n < 12) { + n += 12; + } + else { + if (ap.indexOf('a') !== -1 && n === 12) { + n = 0; + } + } + } + + tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n); + + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + }).css({ + cursor: 'pointer', + width: (100 / gridSize[litem]) + '%', + textAlign: 'center', + overflow: 'hidden' + }); + } // end if grid > 0 + } // end for loop + + // Add timezone options + this.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function (val, idx) { + return $("