]> source.dussan.org Git - redmine.git/commitdiff
Use HTML5 date input fields instead of text fields with jquery ui date pickers (...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 7 May 2016 08:05:43 +0000 (08:05 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 7 May 2016 08:05:43 +0000 (08:05 +0000)
Patch by Jan Schulz-Hofen.

git-svn-id: http://svn.redmine.org/redmine/trunk@15375 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/application_helper.rb
app/views/custom_fields/formats/_date.html.erb
app/views/issues/_attributes.html.erb
app/views/issues/bulk_edit.html.erb
app/views/timelog/_form.html.erb
app/views/timelog/bulk_edit.html.erb
app/views/versions/_form.html.erb
lib/redmine/field_format.rb
public/javascripts/application.js

index 7cdf5061a4b76a66fcc18b6574b3bcee6cb40cad..a145a72acf087a7a6d3995f78815ab59b57d112b 100644 (file)
@@ -1171,7 +1171,7 @@ module ApplicationHelper
 
   def calendar_for(field_id)
     include_calendar_headers_tags
-    javascript_tag("$(function() { $('##{field_id}').addClass('date').datepicker(datepickerOptions); });")
+    javascript_tag("$(function() { $('##{field_id}').addClass('date').datepickerFallback(datepickerOptions); });")
   end
 
   def include_calendar_headers_tags
index df3ba078920ea29a8e8f01100f48ad9d2ff1e646..b52c063105a6f497c53f0edd9b34c4bfda1bc6af 100644 (file)
@@ -1,3 +1,3 @@
-<p><%= f.text_field(:default_value, :size => 10) %></p>
+<p><%= f.date_field(:default_value, :value => @custom_field.default_value, :size => 10) %></p>
 <%= calendar_for('custom_field_default_value') %>
 <p><%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %></p>
index 63782d237920aad7a46bbc211b66b50aae08962c..960256e44249188c376629a7f521fe80bcddb2ef 100644 (file)
 
 <% if @issue.safe_attribute? 'start_date' %>
 <p id="start_date_area">
-  <%= f.text_field(:start_date, :size => 10, :required => @issue.required_attribute?('start_date')) %>
+  <%= f.date_field(:start_date, :size => 10, :required => @issue.required_attribute?('start_date')) %>
   <%= calendar_for('issue_start_date') %>
 </p>
 <% end %>
 
 <% if @issue.safe_attribute? 'due_date' %>
 <p id="due_date_area">
-  <%= f.text_field(:due_date, :size => 10, :required => @issue.required_attribute?('due_date')) %>
+  <%= f.date_field(:due_date, :size => 10, :required => @issue.required_attribute?('due_date')) %>
   <%= calendar_for('issue_due_date') %>
 </p>
 <% end %>
index db77431fa6a9cb18bc8d86c6f4fb2e6b8b831d82..37bdb6d42ce3563cabd2a09eda755558181c255e 100644 (file)
 <% if @safe_attributes.include?('start_date') %>
 <p>
   <label for='issue_start_date'><%= l(:field_start_date) %></label>
-  <%= text_field_tag 'issue[start_date]', '', :value => @issue_params[:start_date], :size => 10 %><%= calendar_for('issue_start_date') %>
+  <%= date_field_tag 'issue[start_date]', '', :value => @issue_params[:start_date], :size => 10 %><%= calendar_for('issue_start_date') %>
   <label class="inline"><%= check_box_tag 'issue[start_date]', 'none', (@issue_params[:start_date] == 'none'), :id => nil, :data => {:disables => '#issue_start_date'} %><%= l(:button_clear) %></label>
 </p>
 <% end %>
 <% if @safe_attributes.include?('due_date') %>
 <p>
   <label for='issue_due_date'><%= l(:field_due_date) %></label>
-  <%= text_field_tag 'issue[due_date]', '', :value => @issue_params[:due_date], :size => 10 %><%= calendar_for('issue_due_date') %>
+  <%= date_field_tag 'issue[due_date]', '', :value => @issue_params[:due_date], :size => 10 %><%= calendar_for('issue_due_date') %>
   <label class="inline"><%= check_box_tag 'issue[due_date]', 'none', (@issue_params[:due_date] == 'none'), :id => nil, :data => {:disables => '#issue_due_date'} %><%= l(:button_clear) %></label>
 </p>
 <% end %>
index ac6ba915477e321534509bffd7cff9ba43c4f549..ebd9d394500738f2c7c63f6a84a20349352d3b80 100644 (file)
@@ -17,7 +17,7 @@
       <span id="time_entry_issue"><%= "#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}" %></span>
     <% end %>
   </p>
-  <p><%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
+  <p><%= f.date_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
   <p><%= f.text_field :hours, :size => 6, :required => true %></p>
   <p><%= f.text_field :comments, :size => 100, :maxlength => 1024 %></p>
   <p><%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %></p>
index 8f6c674c7ba64cea49d84ff7e74b43a69ba4bbd2..640f7d893b0993f9b6ca0f90d89ee39289d0a25f 100644 (file)
@@ -18,7 +18,7 @@
 
     <p>
       <label><%= l(:field_spent_on) %></label>
-      <%= text_field :time_entry, :spent_on, :size => 10 %><%= calendar_for('time_entry_spent_on') %>
+      <%= date_field :time_entry, :spent_on, :size => 10 %><%= calendar_for('time_entry_spent_on') %>
     </p>
 
     <p>
index db84f07eb3b571b23bd8ed95bab9e3217f4723ef..3d8ecd4da138331d32b11603fd02f3d65554ce7b 100644 (file)
@@ -6,7 +6,7 @@
 <p><%= f.text_field :description, :size => 60 %></p>
 <p><%= f.select :status, Version::VERSION_STATUSES.collect {|s| [l("version_status_#{s}"), s]} %></p>
 <p><%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %></p>
-<p><%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p>
+<p><%= f.date_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p>
 <p><%= f.select :sharing, @version.allowed_sharings.collect {|v| [format_version_sharing(v), v]} %></p>
 
 <% @version.custom_field_values.each do |value| %>
index de2f8fc5c9298678e0f113bd78e32523abd21865..c7e8115a6140580d9bed62f90573f8f9a2d080f8 100644 (file)
@@ -461,12 +461,12 @@ module Redmine
       end
 
       def edit_tag(view, tag_id, tag_name, custom_value, options={})
-        view.text_field_tag(tag_name, custom_value.value, options.merge(:id => tag_id, :size => 10)) +
+        view.date_field_tag(tag_name, custom_value.value, options.merge(:id => tag_id, :size => 10)) +
           view.calendar_for(tag_id)
       end
 
       def bulk_edit_tag(view, tag_id, tag_name, custom_field, objects, value, options={})
-        view.text_field_tag(tag_name, value, options.merge(:id => tag_id, :size => 10)) +
+        view.date_field_tag(tag_name, value, options.merge(:id => tag_id, :size => 10)) +
           view.calendar_for(tag_id) +
           bulk_clear_tag(view, tag_id, tag_name, custom_field, value)
       end
index 985467b4cb8043d51c5a53941c00ea96d2c73730..743b14ff66609339a1eb9e60a2c5507d3777de75 100644 (file)
@@ -185,12 +185,12 @@ function buildFilterRow(field, operator, values) {
   case "date":
   case "date_past":
     tr.find('td.values').append(
-      '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
-      ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
+      '<span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
+      ' <span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
       ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
     );
-    $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
-    $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
+    $('#values_'+fieldId+'_1').val(values[0]).datepickerFallback(datepickerOptions);
+    $('#values_'+fieldId+'_2').val(values[1]).datepickerFallback(datepickerOptions);
     $('#values_'+fieldId).val(values[0]);
     break;
   case "string":
@@ -587,7 +587,7 @@ function beforeShowDatePicker(input, inst) {
       }
       break;
   }
-  $(input).datepicker("option", "defaultDate", default_date);
+  $(input).datepickerFallback("option", "defaultDate", default_date);
 }
 
 (function($){
@@ -723,6 +723,33 @@ function toggleDisabledOnChange() {
 function toggleDisabledInit() {
   $('input[data-disables], input[data-enables]').each(toggleDisabledOnChange);
 }
+
+(function ( $ ) {
+
+  // detect if native date input is supported
+  var nativeDateInputSupported = true;
+
+  var input = document.createElement('input');
+  input.setAttribute('type','date');
+  if (input.type === 'text') {
+    nativeDateInputSupported = false;
+  }
+
+  var notADateValue = 'not-a-date';
+  input.setAttribute('value', notADateValue);
+  if (input.value === notADateValue) {
+    nativeDateInputSupported = false;
+  }
+
+  $.fn.datepickerFallback = function( options ) {
+    if (nativeDateInputSupported) {
+      return this;
+    } else {
+      return this.datepicker( options );
+    }
+  };
+}( jQuery ));
+
 $(document).ready(function(){
   $('#content').on('change', 'input[data-disables], input[data-enables]', toggleDisabledOnChange);
   toggleDisabledInit();