PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb

https://github.com/jonmc12/active_scaffold
Ruby | 256 lines | 227 code | 25 blank | 4 comment | 27 complexity | 76ab223766a85aa6b8fbad037e92e607 MD5 | raw file
  1. class File #:nodoc:
  2. unless File.respond_to?(:binread)
  3. def self.binread(file)
  4. File.open(file, 'rb') { |f| f.read }
  5. end
  6. end
  7. end
  8. ActiveScaffold::Config::Core.class_eval do
  9. def initialize_with_date_picker(model_id)
  10. initialize_without_date_picker(model_id)
  11. date_picker_fields = self.model.columns.collect{|c| {:name => c.name.to_sym, :type => c.type} if [:date, :datetime].include?(c.type) }.compact
  12. # check to see if file column was used on the model
  13. return if date_picker_fields.empty?
  14. # automatically set the forum_ui to a file column
  15. date_picker_fields.each{|field|
  16. col_config = self.columns[field[:name]]
  17. col_config.form_ui = (field[:type] == :date ? :date_picker : :datetime_picker)
  18. }
  19. end
  20. alias_method_chain :initialize, :date_picker
  21. end
  22. module ActiveScaffold
  23. module Bridges
  24. module DatePickerBridge
  25. DATE_FORMAT_CONVERSION = {
  26. '%a' => 'D',
  27. '%A' => 'DD',
  28. '%b' => 'M',
  29. '$B' => 'MM',
  30. '%d' => 'dd',
  31. '%e' => 'd',
  32. '%j' => 'oo',
  33. '%m' => 'mm',
  34. '%y' => 'y',
  35. '%Y' => 'yy',
  36. '%H' => 'hh', # options ampm => false
  37. '%I' => 'hh', # options ampm => true
  38. '%M' => 'mm',
  39. '%p' => 'tt',
  40. '%S' => 'ss'
  41. }
  42. def self.localization
  43. "jQuery(function($){
  44. if (typeof($.datepicker) === 'object') {
  45. #{date_options_for_locales}
  46. $.datepicker.setDefaults($.datepicker.regional['#{I18n.locale}']);
  47. }
  48. if (typeof($.timepicker) === 'object') {
  49. #{datetime_options_for_locales}
  50. $.timepicker.setDefaults($.timepicker.regional['#{I18n.locale}']);
  51. }
  52. });\n"
  53. end
  54. def self.date_options_for_locales
  55. I18n.available_locales.collect do |locale|
  56. locale_date_options = date_options(locale)
  57. if locale_date_options
  58. "$.datepicker.regional['#{locale}'] = #{locale_date_options.to_json};"
  59. else
  60. nil
  61. end
  62. end.compact.join('')
  63. end
  64. def self.date_options(locale)
  65. begin
  66. date_options = I18n.translate! 'date', :locale => locale
  67. date_picker_options = { :closeText => as_(:close),
  68. :prevText => as_(:previous),
  69. :nextText => as_(:next),
  70. :currentText => as_(:today),
  71. :monthNames => date_options[:month_names][1, (date_options[:month_names].length - 1)],
  72. :monthNamesShort => date_options[:abbr_month_names][1, (date_options[:abbr_month_names].length - 1)],
  73. :dayNames => date_options[:day_names],
  74. :dayNamesShort => date_options[:abbr_day_names],
  75. :dayNamesMin => date_options[:abbr_day_names],
  76. :changeYear => true,
  77. :changeMonth => true,
  78. }
  79. begin
  80. as_date_picker_options = I18n.translate! 'active_scaffold.date_picker_options'
  81. date_picker_options.merge!(as_date_picker_options) if as_date_picker_options.is_a? Hash
  82. rescue
  83. Rails.logger.warn "ActiveScaffold: Missing date picker localization for your locale: #{locale}"
  84. end
  85. js_format = self.to_datepicker_format(date_options[:formats][:default])
  86. date_picker_options[:dateFormat] = js_format unless js_format.nil?
  87. date_picker_options
  88. rescue
  89. if locale == I18n.locale
  90. raise
  91. else
  92. nil
  93. end
  94. end
  95. end
  96. def self.datetime_options_for_locales
  97. I18n.available_locales.collect do |locale|
  98. locale_datetime_options = datetime_options(locale)
  99. if locale_datetime_options
  100. "$.timepicker.regional['#{locale}'] = #{locale_datetime_options.to_json};"
  101. else
  102. nil
  103. end
  104. end.compact.join('')
  105. end
  106. def self.datetime_options(locale)
  107. begin
  108. rails_time_format = I18n.translate! 'time.formats.default', :locale => locale
  109. datetime_options = I18n.translate! 'datetime.prompts', :locale => locale
  110. datetime_picker_options = {:ampm => false,
  111. :hourText => datetime_options[:hour],
  112. :minuteText => datetime_options[:minute],
  113. :secondText => datetime_options[:second],
  114. }
  115. begin
  116. as_datetime_picker_options = I18n.translate! 'active_scaffold.datetime_picker_options'
  117. datetime_picker_options.merge!(as_datetime_picker_options) if as_datetime_picker_options.is_a? Hash
  118. rescue
  119. Rails.logger.warn "ActiveScaffold: Missing datetime picker localization for your locale: #{locale}"
  120. end
  121. date_format, time_format = self.split_datetime_format(self.to_datepicker_format(rails_time_format))
  122. datetime_picker_options[:dateFormat] = date_format unless date_format.nil?
  123. unless time_format.nil?
  124. datetime_picker_options[:timeFormat] = time_format
  125. datetime_picker_options[:ampm] = true if rails_time_format.include?('%I')
  126. end
  127. datetime_picker_options
  128. rescue
  129. if locale == I18n.locale
  130. raise
  131. else
  132. nil
  133. end
  134. end
  135. end
  136. def self.to_datepicker_format(rails_format)
  137. return nil if rails_format.nil?
  138. if rails_format =~ /%[cUWwxXZz]/
  139. Rails.logger.warn("AS DatePickerBridge: Can t convert rails date format: #{rails_format} to jquery datepicker format. Options %c, %U, %W, %w, %x %X, %z, %Z are not supported by datepicker]")
  140. nil
  141. else
  142. js_format = rails_format.dup
  143. DATE_FORMAT_CONVERSION.each do |key, value|
  144. js_format.gsub!(Regexp.new("#{key}"), value)
  145. end
  146. js_format
  147. end
  148. end
  149. def self.split_datetime_format(datetime_format)
  150. date_format = datetime_format
  151. time_format = nil
  152. time_start_indicators = %w{hh mm tt ss}
  153. unless datetime_format.nil?
  154. start_indicator = time_start_indicators.detect {|indicator| datetime_format.include?(indicator)}
  155. unless start_indicator.nil?
  156. pos_time_format = datetime_format.index(start_indicator)
  157. date_format = datetime_format.to(pos_time_format - 1)
  158. time_format = datetime_format.from(pos_time_format)
  159. end
  160. end
  161. return date_format, time_format
  162. end
  163. module DatepickerColumnHelpers
  164. def datepicker_split_datetime_format(datetime_format)
  165. ActiveScaffold::Bridges::DatePickerBridge.split_datetime_format(datetime_format)
  166. end
  167. def to_datepicker_format(rails_format)
  168. ActiveScaffold::Bridges::DatePickerBridge.to_datepicker_format(rails_format)
  169. end
  170. def datepicker_format_options(column, format, options)
  171. if column.form_ui == :date_picker
  172. js_format = to_datepicker_format(I18n.translate!("date.formats.#{format}"))
  173. options['date:dateFormat'] = js_format unless js_format.nil?
  174. else
  175. rails_time_format = I18n.translate!("time.formats.#{format}")
  176. date_format, time_format = datepicker_split_datetime_format(self.to_datepicker_format(rails_time_format))
  177. options['date:dateFormat'] = date_format unless date_format.nil?
  178. unless time_format.nil?
  179. options['time:timeFormat'] = time_format
  180. options['time:ampm'] = true if rails_time_format.include?('%I')
  181. end
  182. end unless format == :default
  183. end
  184. end
  185. module SearchColumnHelpers
  186. def active_scaffold_search_date_bridge_calendar_control(column, options, current_search, name)
  187. if current_search.is_a? Hash
  188. value = controller.class.condition_value_for_datetime(current_search[name], column.form_ui == :date_picker ? :to_date : :to_time)
  189. else
  190. value = current_search
  191. end
  192. options = column.options.merge(options).except!(:include_blank, :discard_time, :discard_date, :value)
  193. options = active_scaffold_input_text_options(options.merge(column.options))
  194. options[:class] << " #{column.search_ui.to_s}"
  195. options[:style] = "display:#{(options[:show].nil? || options[:show]) ? '' : 'none'}"
  196. format = options.delete(:format) || :default
  197. datepicker_format_options(column, format, options)
  198. text_field_tag("#{options[:name]}[#{name}]", value ? l(value, :format => format) : nil, options.merge(:id => "#{options[:id]}_#{name}", :name => "#{options[:name]}[#{name}]"))
  199. end
  200. end
  201. module FormColumnHelpers
  202. def active_scaffold_input_date_picker(column, options)
  203. options = active_scaffold_input_text_options(options.merge(column.options))
  204. options[:class] << " #{column.form_ui.to_s}"
  205. value = controller.class.condition_value_for_datetime(@record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
  206. format = options.delete(:format) || :default
  207. datepicker_format_options(column, format, options)
  208. options[:value] = (value ? l(value, :format => format) : nil)
  209. text_field(:record, column.name, options)
  210. end
  211. end
  212. end
  213. end
  214. end
  215. ActionView::Base.class_eval do
  216. include ActiveScaffold::Bridges::Shared::DateBridge::SearchColumnHelpers
  217. alias_method :active_scaffold_search_date_picker, :active_scaffold_search_date_bridge
  218. alias_method :active_scaffold_search_datetime_picker, :active_scaffold_search_date_bridge
  219. include ActiveScaffold::Bridges::Shared::DateBridge::HumanConditionHelpers
  220. alias_method :active_scaffold_human_condition_date_picker, :active_scaffold_human_condition_date_bridge
  221. alias_method :active_scaffold_human_condition_datetime_picker, :active_scaffold_human_condition_date_bridge
  222. include ActiveScaffold::Bridges::DatePickerBridge::SearchColumnHelpers
  223. include ActiveScaffold::Bridges::DatePickerBridge::FormColumnHelpers
  224. alias_method :active_scaffold_input_datetime_picker, :active_scaffold_input_date_picker
  225. include ActiveScaffold::Bridges::DatePickerBridge::DatepickerColumnHelpers
  226. end
  227. ActiveScaffold::Finder::ClassMethods.module_eval do
  228. include ActiveScaffold::Bridges::Shared::DateBridge::Finder::ClassMethods
  229. alias_method :condition_for_date_picker_type, :condition_for_date_bridge_type
  230. alias_method :condition_for_datetime_picker_type, :condition_for_date_picker_type
  231. end