]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1201266: Migrate YUI calendar to jQuery
authorFrédéric Buclin <LpSolit@gmail.com>
Fri, 25 Sep 2015 16:34:42 +0000 (18:34 +0200)
committerFrédéric Buclin <LpSolit@gmail.com>
Fri, 25 Sep 2015 16:34:42 +0000 (18:34 +0200)
r=gerv

17 files changed:
docs/en/rst/administering/custom-fields.rst
js/field.js
skins/standard/global.css
template/en/default/bug/create/create.html.tmpl
template/en/default/bug/field.html.tmpl
template/en/default/bug/show-header.html.tmpl
template/en/default/bug/summarize-time.html.tmpl
template/en/default/global/calendar.js.tmpl [deleted file]
template/en/default/global/header.html.tmpl
template/en/default/list/list.html.tmpl
template/en/default/reports/create-chart.html.tmpl
template/en/default/search/field.html.tmpl
template/en/default/search/form.html.tmpl
template/en/default/search/search-advanced.html.tmpl
template/en/default/search/search-create-series.html.tmpl
template/en/default/search/search-report-graph.html.tmpl
template/en/default/search/search-report-table.html.tmpl

index 29cc72e62e18f9e3bb4f61bbce715e199809723a..b7820284931c0b23045998ba85482d47aadfc494 100644 (file)
@@ -68,8 +68,7 @@ The following attributes must be set for each new custom field:
       :ref:`edit-values-list` for information about
       editing legal values.
   Date/Time:
-      A date field. This field appears with a
-      calendar widget for choosing the date.
+      A date field.
 
 - *Sortkey:*
   Integer that determines in which order Custom Fields are
index 380901d96a5efdc9b7c91d95e48c67b2050e52dc..2bd8868f82a81f8cc0a3d4fd7b4fc5c0e37283cb 100644 (file)
@@ -87,129 +87,6 @@ function _errorFor(field, name) {
     YAHOO.util.Dom.addClass(field, 'validation_error_field');
 }
 
-/* This function is never to be called directly, but only indirectly
- * using template/en/default/global/calendar.js.tmpl, so that localization
- * works. For the same reason, if you modify this function's parameter list,
- * you need to modify the documentation in said template as well. */
-function createCalendar(name, start_weekday, months_long, weekdays_short) {
-    var cal = new YAHOO.widget.Calendar('calendar_' + name, 
-                                        'con_calendar_' + name,
-                                        { START_WEEKDAY:  start_weekday,
-                                          MONTHS_LONG:    months_long,
-                                          WEEKDAYS_SHORT: weekdays_short
-                                        });
-    YAHOO.bugzilla['calendar_' + name] = cal;
-    var field = document.getElementById(name);
-    cal.selectEvent.subscribe(setFieldFromCalendar, field, false);
-    updateCalendarFromField(field);
-    cal.render();
-}
-
-/* The onclick handlers for the button that shows the calendar. */
-function showCalendar(field_name) {
-    var calendar  = YAHOO.bugzilla["calendar_" + field_name];
-    var field     = document.getElementById(field_name);
-    var button    = document.getElementById('button_calendar_' + field_name);
-
-    bz_overlayBelow(calendar.oDomContainer, field);
-    calendar.show();
-    button.onclick = function() { hideCalendar(field_name); };
-
-    // Because of the way removeListener works, this has to be a function
-    // attached directly to this calendar.
-    calendar.bz_myBodyCloser = function(event) {
-        var container = this.oDomContainer;
-        var target    = YAHOO.util.Event.getTarget(event);
-        if (target != container && target != button
-            && !YAHOO.util.Dom.isAncestor(container, target))
-        {
-            hideCalendar(field_name);
-        }
-    };
-
-    // If somebody clicks outside the calendar, hide it.
-    YAHOO.util.Event.addListener(document.body, 'click', 
-                                 calendar.bz_myBodyCloser, calendar, true);
-
-    // Make Esc close the calendar.
-    calendar.bz_escCal = function (event) {
-        var key = YAHOO.util.Event.getCharCode(event);
-        if (key == 27) {
-            hideCalendar(field_name);
-        }
-    };
-    YAHOO.util.Event.addListener(document.body, 'keydown', calendar.bz_escCal);
-}
-
-function hideCalendar(field_name) {
-    var cal = YAHOO.bugzilla["calendar_" + field_name];
-    cal.hide();
-    var button = document.getElementById('button_calendar_' + field_name);
-    button.onclick = function() { showCalendar(field_name); };
-    YAHOO.util.Event.removeListener(document.body, 'click',
-                                    cal.bz_myBodyCloser);
-    YAHOO.util.Event.removeListener(document.body, 'keydown', cal.bz_escCal);
-}
-
-/* This is the selectEvent for our Calendar objects on our custom 
- * DateTime fields.
- */
-function setFieldFromCalendar(type, args, date_field) {
-    var dates = args[0];
-    var setDate = dates[0];
-
-    // We can't just write the date straight into the field, because there 
-    // might already be a time there.
-    var timeRe = /\b(\d{1,2}):(\d\d)(?::(\d\d))?/;
-    var currentTime = timeRe.exec(date_field.value);
-    var d = new Date(setDate[0], setDate[1] - 1, setDate[2]);
-    if (currentTime) {
-        d.setHours(currentTime[1], currentTime[2]);
-        if (currentTime[3]) {
-            d.setSeconds(currentTime[3]);
-        }
-    }
-
-    var year = d.getFullYear();
-    // JavaScript's "Date" represents January as 0 and December as 11.
-    var month = d.getMonth() + 1;
-    if (month < 10) month = '0' + String(month);
-    var day = d.getDate();
-    if (day < 10) day = '0' + String(day);
-    var dateStr = year + '-' + month  + '-' + day;
-
-    if (currentTime) {
-        var minutes = d.getMinutes();
-        if (minutes < 10) minutes = '0' + String(minutes);
-        var seconds = d.getSeconds();
-        if (seconds > 0 && seconds < 10) {
-            seconds = '0' + String(seconds);
-        }
-
-        dateStr = dateStr + ' ' + d.getHours() + ':' + minutes;
-        if (seconds) dateStr = dateStr + ':' + seconds;
-    }
-
-    date_field.value = dateStr;
-    hideCalendar(date_field.id);
-}
-
-/* Sets the calendar based on the current field value. 
- */ 
-function updateCalendarFromField(date_field) {
-    var dateRe = /(\d\d\d\d)-(\d\d?)-(\d\d?)/;
-    var pieces = dateRe.exec(date_field.value);
-    if (pieces) {
-        var cal = YAHOO.bugzilla["calendar_" + date_field.id];
-        cal.select(new Date(pieces[1], pieces[2] - 1, pieces[3]));
-        var selectedArray = cal.getSelectedDates();
-        var selected = selectedArray[0];
-        cal.cfg.setProperty("pagedate", (selected.getMonth() + 1) + '/' 
-                                        + selected.getFullYear());
-        cal.render();
-    }
-}
-
 function setupEditLink(id) {
     var link_container = 'container_showhide_' + id;
     var input_container = 'container_' + id;
index dfbf1ee92f8dcb3aebe36753133bf0c82f560168..b9148f764781288c478f9f6c9d001596b04ee8cc 100644 (file)
@@ -684,13 +684,6 @@ input.required, select.required, span.required_explanation {
     color: #000;
 }
 
-.calendar_button {
-    background: transparent url("global/calendar.png") no-repeat;
-    width: 20px;
-    height: 20px;
-    vertical-align: middle;
-}
-.calendar_button span { display: none }
 /* These classes are set by YUI. */
 .yui-calcontainer {
     display: none;
index 367292756c63e58d7f70abb669ab168c65781846..e0fdd13b98a455d200e739ac131c2fc9f6e6a722 100644 (file)
@@ -12,7 +12,7 @@
 [% PROCESS global/header.html.tmpl
   title = title
   generate_api_token = 1
-  yui = [ 'calendar', 'datatable', 'button' ]
+  yui = ['datatable', 'button']
   style_urls = ['skins/standard/bug.css']
   javascript_urls = [ "js/attachment.js", "js/util.js",
                       "js/field.js", "js/TUI.js", "js/bug.js" ]
index 87725b69979cf7e2f593312a62d2d0ceecdeb172..fe649d50d24e705630c70e1c92edaf9c33bd82f6 100644 (file)
     [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
       [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %]
       <input name="[% field.name FILTER html %]" size="[% size FILTER none %]"
-             id="[% field.name FILTER html %]"
-             value="[% value FILTER html %]"
+             id="[% field.name FILTER html %]" value="[% value FILTER html %]"
              [% IF field.is_mandatory %]
                data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
-             [% END %]
-             onchange="updateCalendarFromField(this)">
-      <button type="button" class="calendar_button"
-              id="button_calendar_[% field.name FILTER html %]"
-              onclick="showCalendar('[% field.name FILTER js %]')">
-        <span>Calendar</span>
-      </button>
-
-      <div id="con_calendar_[% field.name FILTER html %]"></div>
-
+             [% END %]>
       <script type="text/javascript">
-        <!--
-          [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
-        //--></script>
+        $(function() {
+          $("#[% field.name FILTER html FILTER js %]").datepicker([% "{constrainInput: false}" IF field.type == constants.FIELD_TYPE_DATETIME %]);
+        });
+      </script>
     [% CASE constants.FIELD_TYPE_BUG_ID %]
         <span id="[% field.name FILTER html %]_input_area">
           <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
index 473df17dad412ac135cfbfbbea749f454f2068a3..da9d5f73bd7fb78efacbd043de9dd6f3107af997 100644 (file)
@@ -24,7 +24,6 @@
 [% END %]
 [% title = title _ filtered_desc %]
 [% generate_api_token = 1 %]
-[% yui = [ 'calendar' ] %]
 [% yui.push('json', 'connection', 'container') IF user.can_tag_comments %]
 [% javascript_urls = [ "js/util.js", "js/field.js", "js/comments.js" ] %]
 [% javascript_urls.push("js/bug.js") IF user.id  %]
index 9613eebf14d6447e7088b8c132f99537d07ce6d5..84eb75615db2f218d92a83fee66a7c9b5ee34d54 100644 (file)
@@ -22,9 +22,7 @@
     header = header
     style_urls = ['skins/standard/buglist.css']
     doc_section = "using/editing.html#time-tracking"
-    yui = ['calendar']
-    javascript_urls = [ "js/util.js", "js/field.js" ]
-    %]
+%]
 
 [% INCLUDE query_form %]
 
       <label accesskey="s" for="start_date">Period <u>s</u>tarting</label>:
     </th>
     <td>
-      <input id="start_date" name="start_date" size="10" autofocus
-             value="[% start_date FILTER html %]" maxlength="10"
-             onchange="updateCalendarFromField(this)">
-      <button type="button" class="calendar_button" id="button_calendar_start_date"
-              onclick="showCalendar('start_date')"><span>Calendar</span>
-      </button>
-      <div id="con_calendar_start_date"></div>
+      <input id="start_date" name="start_date" size="10"
+             value="[% start_date FILTER html %]" maxlength="10">
       <span class="label">
         and <label accesskey="e" for="end_date"><u>e</u>nding</label>:
       </span>
-      <input type="text" name="end_date" size="10" id="end_date"
-             value ="[% end_date FILTER html %]" maxlength="10"
-             onchange="updateCalendarFromField(this)">
-      <button type="button" class="calendar_button" id="button_calendar_end_date"
-              onclick="showCalendar('end_date')"><span>Calendar</span>
-      </button>
-      <div id="con_calendar_end_date"></div>
+      <input id="end_date" name="end_date" size="10"
+             value ="[% end_date FILTER html %]" maxlength="10">
+      <script type="text/javascript">
+        $(function() {
+          $("#start_date").datepicker();
+          $("#end_date").datepicker();
+        });
+      </script>
       <br>
       <span class="bz_info">(Dates are optional, and in YYYY-MM-DD format)</span>
     </td>
 </table>
 
 </form>
-<script type="text/javascript">
-  <!--
-    [%+ PROCESS "global/calendar.js.tmpl" id = 'start_date' %]
-    [% PROCESS "global/calendar.js.tmpl" id = 'end_date' %]
-  //-->
-</script>
 <hr>
 [% END %]
diff --git a/template/en/default/global/calendar.js.tmpl b/template/en/default/global/calendar.js.tmpl
deleted file mode 100644 (file)
index 26f3fa0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
-  # License, v. 2.0. If a copy of the MPL was not distributed with this
-  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
-  #
-  # This Source Code Form is "Incompatible With Secondary Licenses", as
-  # defined by the Mozilla Public License, v. 2.0.
-  #%]
-
-[%# INTERFACE:
-  # id: The id of the input field the calendar widget is to be assigned to.
-  #%]
-
-[%# This template exists because createCalendar accepts additional parameters
-  # which allow for localization. Please see the YUI documentation at
-  # http://developer.yahoo.com/yui/calendar/#internationalization for details.
-  # As an example, here's what you'd specify as additional parameters to
-  # localize for German calendars; replace the ellipsis ("...") by the original
-  # parameter (we cannot put it into the example because it'd break this
-  # template comment):
-  #
-  #   createCalendar(...
-  #                  /* The weekday the week begins on; 0 is Sunday,
-  #                   * 1 is Monday and so on: */
-  #                  1,
-  #                  /* Months, full names; first must be January: */
-  #                  ['Januar',    'Februar',   'März',      'April',
-  #                   'Mai',       'Juni',      'Juli',      'August',
-  #                   'September', 'Oktober',   'November',  'Dezember'],
-  #                  /* Weekdays, two-letter abbreviations; first must be
-  #                   * Sunday: */
-  #                  ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']);
-  #%]
-createCalendar('[% id FILTER js %]');
index af9c8b686ff81b5a40601a43698b5097e6731bb4..6a52e7840425a97f366d3830a8bcc3a08f759456 100644 (file)
@@ -44,7 +44,6 @@
 
 [% IF NOT no_yui %]
   [% SET yui_css = {
-    calendar     => 1,
     datatable    => 1,
     button       => 1,
   } %]
         } 
         $(document).ready(unhide_language_selector);
 
+        // This sets the default parameters for all calendar fields.
+        $.datepicker.setDefaults({
+            dateFormat: "yy-mm-dd", // this is the YYYY-MM-DD format
+            showButtonPanel: true,  // permits to easily select "Today"
+            // These 3 parameters are useful for localization.
+            firstDay: 0,            // 0 = Sunday, 1 = Monday, etc...
+            dayNamesMin: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ],
+            monthNames: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
+        });
+
         [%# Make some Bugzilla information available to all scripts. 
           # We don't import every parameter and constant because we
           # don't want to add a lot of uncached JS to every page. 
index 190b2193cbddcac419df4491621a4cbfa9ab12bb..42af501236ae4773e6f59b29588595a964918e8b 100644 (file)
@@ -61,7 +61,6 @@
   title = title
   generate_api_token = dotweak
   atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" 
-  yui = [ 'calendar' ]
   javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
   style_urls = [ "skins/standard/buglist.css" ]
   doc_section = "using/finding.html"
index 6b5fa5fe333ce8e21bbbb0db561b25e967c4934c..533c631ed274e56dc8dd34a2af9965b9596920a9 100644 (file)
@@ -215,12 +215,10 @@ function subcatSelected() {
         <td></td>
         <td>
           <label for="datefrom"><b>Date Range</b></label>:
-          <input type="text" size="12" name="datefrom" id="datefrom"
-            placeholder="YYYY-MM-DD"
-            value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom%]">
+          <input size="12" name="datefrom" id="datefrom" placeholder="YYYY-MM-DD"
+            value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom %]">
           <label for="dateto"><b>to</b></label>
-          <input type="text" size="12" name="dateto" id="dateto"
-            placeholder="YYYY-MM-DD"
+          <input size="12" name="dateto" id="dateto" placeholder="YYYY-MM-DD"
             value="[% time2str("%Y-%m-%d", chart.dateto) IF chart.dateto %]">
         </td>
 
@@ -230,6 +228,12 @@ function subcatSelected() {
         </td>
       </tr>
     </table>
+    <script type="text/javascript">
+      $(function() {
+        $("#datefrom").datepicker();
+        $("#dateto").datepicker();
+      });
+    </script>
   [% ELSE %]
   <p><i>None</i></p>
   [% END %]  
index b2013eff6407d4095a26d712596733c715bb06dd..765ede557d173bc1abe6533f7bd6e92dc2504ad1 100644 (file)
       tag_name = "span"
       editable = 1
     %]
-    from <input name="[% field.name FILTER html %]from" 
-                id="[% field.name FILTER html %]" 
-                size="10" maxlength="10"
-                value="[% value.0 FILTER html %]" 
-                onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
-         <button type="button" class="calendar_button"
-                        id="button_calendar_[% field.name FILTER html %]"
-                        onclick="showCalendar('[% field.name FILTER js %]')">
-           <span>Calendar</span>
-         </button>
-         <span id="con_calendar_[% field.name FILTER html %]"></span>               
-    to <input name="[% field.name FILTER html %]to" 
+    from <input name="[% field.name FILTER html %]from"
+                id="[% field.name FILTER html %]"
+                size="10" maxlength="10" value="[% value.0 FILTER html %]">
+    to <input name="[% field.name FILTER html %]to"
               id="[% field.name FILTER html %]to" size="10" maxlength="10"
-              value="[% value.1 FILTER html %]" 
-              onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
-       <button type="button" class="calendar_button"
-                      id="button_calendar_[% field.name FILTER html %]to"
-                      onclick="showCalendar('[% field.name FILTER js %]to')">
-         <span>Calendar</span>
-       </button>
+              value="[% value.1 FILTER html %]">
     <small>(YYYY-MM-DD or relative dates)</small>
-    
-    <span id="con_calendar_[% field.name FILTER html %]to"></span>
+
     <script type="text/javascript">
-      <!--
-        [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
-        [% PROCESS "global/calendar.js.tmpl" id = field.name _ 'to' %]
-      //--></script>
+      $(function() {
+        // do not check user input as relative dates are allowed
+        $("#[% field.name FILTER html FILTER js %]").datepicker({constrainInput: false});
+        $("#[% field.name FILTER html FILTER js %]to").datepicker({constrainInput: false});
+      });
+    </script>
   [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT, 
             constants.FIELD_TYPE_MULTI_SELECT ] %]
     <div id="container_[% field.name FILTER html %]" class="search_field_grid">      
index 410bd2d20bb7d6b99d7674d049cfab7537e3c64a..30835b1b0b95b3e7a89f737a970023b8a5bf5663 100644 (file)
@@ -307,26 +307,18 @@ TUI_hide_default('information_query');
   <li>
     <label for="chfieldfrom">between:</label>
     <input name="chfieldfrom" id="chfieldfrom" size="10" 
-           value="[% default.chfieldfrom.0 FILTER html %]" onchange="updateCalendarFromField(this)"> 
-           <button type="button" class="calendar_button"
-                          id="button_calendar_chfieldfrom"
-                          onclick="showCalendar('chfieldfrom')"><span>Calendar</span></button>
-           and 
-           <div id="con_calendar_chfieldfrom"></div>
-          <input name="chfieldto" size="10" id="chfieldto" 
-                 value="[% default.chfieldto.0 || "Now" FILTER html %]" 
-                 onchange="updateCalendarFromField(this)">
-          <button type="button" class="calendar_button"
-                         id="button_calendar_chfieldto"
-                         onclick="showCalendar('chfieldto')"><span>Calendar</span></button>
-          <div id="con_calendar_chfieldto"></div>
+           value="[% default.chfieldfrom.0 FILTER html %]">
+    and
+    <input name="chfieldto" size="10" id="chfieldto"
+           value="[% default.chfieldto.0 || "Now" FILTER html %]">
     (YYYY-MM-DD or relative dates)
     <script type="text/javascript">
-      <!--
-        [%+ PROCESS "global/calendar.js.tmpl" id = 'chfieldfrom' %]
-        [% PROCESS "global/calendar.js.tmpl" id = 'chfieldto' %]
-      //--></script>
-  </li>    
+      $(function() {
+        $("#chfieldfrom").datepicker();
+        $("#chfieldto").datepicker();
+      });
+    </script>
+  </li>
 </ul>
 
 [%############################################################################%]
index af07aa4759d67d605a1340355c2c4bcb45454eb4..ae4a72812fd50db13f2ad1fbdcffd70ea2e6af48 100644 (file)
@@ -27,7 +27,6 @@ function remove_token() {
 [% PROCESS global/header.html.tmpl
   title = "Search for $terms.bugs"
   generate_api_token = 1
-  yui = [ 'calendar' ]
   javascript = javascript
   javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js"]
   style_urls = ['skins/standard/buglist.css']
index 6df1a79d3c19e464ed267441763ba66f16aaff02..87be44f8cbb075558376091e7b8a65a09f72a00d 100644 (file)
@@ -19,7 +19,6 @@
 [% PROCESS global/header.html.tmpl 
   title = "Create New Data Set"
   onload = "doOnSelectProduct(0);"
-  yui = [ 'calendar' ]
   javascript = js_data 
   javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
   style_urls = ['skins/standard/buglist.css']
index 6cbafd11cbcda42da0013e652aad2b1dee1054c0..4f882ea0e5fadc4ad59d671b22937b4536baa5c3 100644 (file)
@@ -18,7 +18,6 @@ var queryform = "reportform"
 [% PROCESS global/header.html.tmpl
   title = "Generate Graphical Report"
   onload = "doOnSelectProduct(0); chartTypeChanged()"
-  yui = [ 'calendar' ]
   javascript = js_data
   javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
   style_urls = ['skins/standard/buglist.css']
index 18c87131346537f708bcf79efb31c56cae819677..09a8b18b8ef669dc4bf621b6da1e81c00d6f76e3 100644 (file)
@@ -18,7 +18,6 @@ var queryform = "reportform"
 [% PROCESS global/header.html.tmpl
   title = "Generate Tabular Report"
   onload = "doOnSelectProduct(0)"
-  yui = [ 'calendar' ]
   javascript = js_data
   javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
   style_urls = ['skins/standard/buglist.css']