admin_data 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. data/History.txt +221 -0
  2. data/README.textile +21 -0
  3. data/Rakefile +46 -0
  4. data/app/controllers/admin_data/base_controller.rb +114 -0
  5. data/app/controllers/admin_data/diagnostic_controller.rb +28 -0
  6. data/app/controllers/admin_data/feed_controller.rb +17 -0
  7. data/app/controllers/admin_data/main_controller.rb +132 -0
  8. data/app/controllers/admin_data/migration_controller.rb +19 -0
  9. data/app/controllers/admin_data/search_controller.rb +125 -0
  10. data/app/controllers/admin_data/validate_model_controller.rb +106 -0
  11. data/app/views/admin_data/diagnostic/index.html.erb +17 -0
  12. data/app/views/admin_data/diagnostic/missing_index.html.erb +26 -0
  13. data/app/views/admin_data/feed/index.rss.builder +24 -0
  14. data/app/views/admin_data/main/all_models.html.erb +22 -0
  15. data/app/views/admin_data/main/association/_association_info.html.erb +10 -0
  16. data/app/views/admin_data/main/association/_belongs_to_info.html.erb +7 -0
  17. data/app/views/admin_data/main/association/_has_many_info.html.erb +7 -0
  18. data/app/views/admin_data/main/association/_has_one_info.html.erb +6 -0
  19. data/app/views/admin_data/main/edit.html.erb +38 -0
  20. data/app/views/admin_data/main/misc/_form.html.erb +25 -0
  21. data/app/views/admin_data/main/misc/_modify_record.html.erb +22 -0
  22. data/app/views/admin_data/main/new.html.erb +23 -0
  23. data/app/views/admin_data/main/show.html.erb +41 -0
  24. data/app/views/admin_data/main/table_structure.html.erb +55 -0
  25. data/app/views/admin_data/migration/index.html.erb +18 -0
  26. data/app/views/admin_data/migration/jstest.html.erb +51 -0
  27. data/app/views/admin_data/search/_search_base.html.erb +34 -0
  28. data/app/views/admin_data/search/advance_search.html.erb +3 -0
  29. data/app/views/admin_data/search/quick_search.html.erb +6 -0
  30. data/app/views/admin_data/search/search/_advance_search_form.html.erb +48 -0
  31. data/app/views/admin_data/search/search/_errors.html.erb +5 -0
  32. data/app/views/admin_data/search/search/_listing.html.erb +40 -0
  33. data/app/views/admin_data/search/search/_search_form.html.erb +28 -0
  34. data/app/views/admin_data/search/search/_sortby.html.erb +18 -0
  35. data/app/views/admin_data/search/search/_title.html.erb +34 -0
  36. data/app/views/admin_data/shared/_breadcrum.html.erb +10 -0
  37. data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
  38. data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
  39. data/app/views/admin_data/shared/_header.html.erb +23 -0
  40. data/app/views/admin_data/shared/_powered_by.html.erb +23 -0
  41. data/app/views/admin_data/shared/_secondary_navigation.html.erb +28 -0
  42. data/app/views/admin_data/validate_model/_bad.html.erb +1 -0
  43. data/app/views/admin_data/validate_model/tid.html.erb +2 -0
  44. data/app/views/admin_data/validate_model/validate.html.erb +67 -0
  45. data/app/views/layouts/admin_data.html.erb +60 -0
  46. data/config/routes.rb +34 -0
  47. data/init.rb +1 -0
  48. data/lib/admin_data.rb +34 -0
  49. data/lib/admin_data/chelper.rb +37 -0
  50. data/lib/admin_data/compatibility.rb +7 -0
  51. data/lib/admin_data/helpers.rb +222 -0
  52. data/lib/admin_data/railtie.rb +21 -0
  53. data/lib/admin_data/search.rb +186 -0
  54. data/lib/admin_data/settings.rb +72 -0
  55. data/lib/admin_data/util.rb +237 -0
  56. data/lib/admin_data/version.rb +3 -0
  57. data/lib/admin_data_date_validation.rb +79 -0
  58. data/lib/css/app.css +224 -0
  59. data/lib/css/base.css +1071 -0
  60. data/lib/css/header.css +65 -0
  61. data/lib/css/rounded.css +18 -0
  62. data/lib/css/themes/drastic-dark/style.css +374 -0
  63. data/lib/css/umbrella.css +34 -0
  64. data/lib/css/vendor/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
  65. data/lib/css/vendor/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
  66. data/lib/css/vendor/images/ui-bg_flat_0_333333_40x100.png +0 -0
  67. data/lib/css/vendor/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
  68. data/lib/css/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/lib/css/vendor/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
  70. data/lib/css/vendor/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
  71. data/lib/css/vendor/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
  72. data/lib/css/vendor/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
  73. data/lib/css/vendor/images/ui-icons_004276_256x240.png +0 -0
  74. data/lib/css/vendor/images/ui-icons_cc0000_256x240.png +0 -0
  75. data/lib/css/vendor/images/ui-icons_ffffff_256x240.png +0 -0
  76. data/lib/css/vendor/jquery-ui-1.7.2.custom.css +406 -0
  77. data/lib/css/vendor/qunit.css +119 -0
  78. data/lib/js/advance_search/act_on_result.js +47 -0
  79. data/lib/js/advance_search/adv_search.js +46 -0
  80. data/lib/js/advance_search/advance_search.js +60 -0
  81. data/lib/js/advance_search/advance_search_structure.js +79 -0
  82. data/lib/js/advance_search/ajaxify_advance_search.js +28 -0
  83. data/lib/js/advance_search/build_first_row.js +12 -0
  84. data/lib/js/advance_search/event_bindings.js +87 -0
  85. data/lib/js/advance_search/global_ajax_setting.js +10 -0
  86. data/lib/js/advance_search/trigger_submit_on_domready.js +6 -0
  87. data/lib/js/misc/drop_down_change.js +8 -0
  88. data/lib/js/misc/js_util.js +42 -0
  89. data/lib/js/misc/quick_search_input_focus.js +6 -0
  90. data/lib/js/test/act_on_result.js +120 -0
  91. data/lib/js/test/advance_search.js +80 -0
  92. data/lib/js/test/ajaxify_advance_search.js +29 -0
  93. data/lib/js/test/build_first_row.js +10 -0
  94. data/lib/js/test/event_bindings.js +100 -0
  95. data/lib/js/validate_model/ajaxify_form.js +66 -0
  96. data/lib/js/validate_model/select_all.js +15 -0
  97. data/lib/js/vendor/jack.js +903 -0
  98. data/lib/js/vendor/jquery-1.4.1.js +6078 -0
  99. data/lib/js/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
  100. data/lib/js/vendor/jquery.ba-isjquery.js +21 -0
  101. data/lib/js/vendor/jquery.form.js +814 -0
  102. data/lib/js/vendor/jquery.lint.js +604 -0
  103. data/lib/js/vendor/log.js +9 -0
  104. data/lib/js/vendor/qunit.js +1043 -0
  105. data/lib/tasks/admin_data_tasks.rake +7 -0
  106. data/lib/tasks/validate_models_bg.rake +23 -0
  107. data/test/factories/article.rb +9 -0
  108. data/test/factories/car.rb +4 -0
  109. data/test/factories/city.rb +4 -0
  110. data/test/factories/comment.rb +6 -0
  111. data/test/factories/door.rb +4 -0
  112. data/test/factories/engine.rb +4 -0
  113. data/test/functional/base_controller_test.rb +5 -0
  114. data/test/functional/feed_controller_test.rb +34 -0
  115. data/test/functional/main_controller_test.rb +421 -0
  116. data/test/functional/migration_controller_test.rb +30 -0
  117. data/test/functional/routes_test.rb +61 -0
  118. data/test/functional/search_controller_test.rb +814 -0
  119. data/test/helper/view_helper_test.rb +177 -0
  120. data/test/misc_tests/date_validation_test.rb +32 -0
  121. data/test/misc_tests/settings_test.rb +29 -0
  122. data/test/misc_tests/util_test.rb +83 -0
  123. data/test/rails_root/Gemfile +22 -0
  124. data/test/rails_root/Gemfile.lock +101 -0
  125. data/test/rails_root/Rakefile +7 -0
  126. data/test/rails_root/app/controllers/application_controller.rb +3 -0
  127. data/test/rails_root/app/helpers/application_helper.rb +2 -0
  128. data/test/rails_root/app/models/article.rb +25 -0
  129. data/test/rails_root/app/models/city.rb +15 -0
  130. data/test/rails_root/app/models/comment.rb +13 -0
  131. data/test/rails_root/app/models/tech_magazine.rb +2 -0
  132. data/test/rails_root/app/models/vehicle/car.rb +4 -0
  133. data/test/rails_root/app/models/vehicle/door.rb +3 -0
  134. data/test/rails_root/app/models/vehicle/engine.rb +3 -0
  135. data/test/rails_root/app/views/layouts/application.html.erb +14 -0
  136. data/test/rails_root/config.ru +4 -0
  137. data/test/rails_root/config/application.rb +42 -0
  138. data/test/rails_root/config/boot.rb +13 -0
  139. data/test/rails_root/config/database.yml +22 -0
  140. data/test/rails_root/config/environment.rb +5 -0
  141. data/test/rails_root/config/environments/development.rb +22 -0
  142. data/test/rails_root/config/environments/production.rb +49 -0
  143. data/test/rails_root/config/environments/test.rb +35 -0
  144. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  145. data/test/rails_root/config/initializers/inflections.rb +10 -0
  146. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  147. data/test/rails_root/config/initializers/secret_token.rb +7 -0
  148. data/test/rails_root/config/initializers/session_store.rb +8 -0
  149. data/test/rails_root/config/locales/en.yml +5 -0
  150. data/test/rails_root/config/routes.rb +58 -0
  151. data/test/rails_root/db/migrate/20090809061114_create_tables.rb +70 -0
  152. data/test/rails_root/db/schema.rb +74 -0
  153. data/test/rails_root/db/seeds.rb +7 -0
  154. data/test/rails_root/script/rails +6 -0
  155. data/test/rails_root/test/performance/browsing_test.rb +0 -0
  156. data/test/rails_root/test/test_helper.rb +13 -0
  157. data/test/support/assertions.rb +20 -0
  158. data/test/test_helper.rb +74 -0
  159. metadata +321 -0
@@ -0,0 +1,72 @@
1
+ class AdminData::Config
2
+
3
+ cattr_accessor :setting
4
+
5
+ def self.set=(input = {})
6
+ valid_keys =
7
+ %w(
8
+ find_conditions
9
+ plugin_dir
10
+ will_paginate_per_page
11
+ is_allowed_to_view
12
+ is_allowed_to_view_feed
13
+ feed_authentication_user_id
14
+ feed_authentication_password
15
+ is_allowed_to_view_model
16
+ is_allowed_to_update
17
+ is_allowed_to_update_model
18
+ column_settings
19
+ columns_order
20
+ use_google_hosting_for_jquery
21
+ rake_options
22
+ drop_down_for_associations
23
+ ignore_column_limit
24
+ ).collect(&:intern)
25
+
26
+ extra_keys = input.keys - valid_keys
27
+ raise "Following options are not supported. #{extra_keys.inspect}" unless extra_keys.empty?
28
+
29
+ self.setting ||= {}
30
+ self.setting.merge!(input)
31
+
32
+ unless self.setting[:rake_options].blank?
33
+ env = self.setting[:rake_options][:env]
34
+ if env.blank? || env.include?(Rails.env.intern)
35
+ self.setting[:rake_command] = self.setting[:rake_options][:command]
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ def self.initialize_defaults
42
+ self.setting = {
43
+
44
+ :plugin_dir => File.expand_path(File.join(File.dirname(__FILE__), '..', '..')),
45
+
46
+ :will_paginate_per_page => 50,
47
+
48
+ :is_allowed_to_view => lambda {|controller| return true if Rails.env.development? },
49
+
50
+ :is_allowed_to_update => lambda {|controller| return true if Rails.env.development? },
51
+
52
+ :is_allowed_to_view_model => lambda {|controller| return true },
53
+
54
+ :is_allowed_to_update_model => lambda {|controller| return true },
55
+
56
+ :find_conditions => nil,
57
+
58
+ :use_google_hosting_for_jquery => true,
59
+
60
+ :drop_down_for_associations => true,
61
+
62
+ :ignore_column_limit => false,
63
+
64
+ :columns_order => nil,
65
+
66
+ #TODO fix below
67
+ :adapter_name => "SQLite" # ActiveRecord::Base.connection.adapter_name
68
+
69
+ }
70
+ end
71
+
72
+ end
@@ -0,0 +1,237 @@
1
+ class AdminData::Util
2
+
3
+ def self.google_hosted_jquery_ui_css(context)
4
+ if AdminData::Config.setting[:use_google_hosting_for_jquery]
5
+ jquery_ui_css = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css'
6
+ jquery_ui_theme_css = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/blitzer/jquery-ui.css'
7
+ context.send(:stylesheet_link_tag, jquery_ui_css, jquery_ui_theme_css)
8
+ else
9
+ stylesheet_link_tag('vendor/jquery-ui-1.7.2.custom')
10
+ end
11
+ end
12
+
13
+ def self.google_hosted_jquery(context)
14
+ if AdminData::Config.setting[:use_google_hosting_for_jquery]
15
+ jquery_min = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js'
16
+ jquery_ui_min = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js'
17
+ context.send(:javascript_include_tag, jquery_min, jquery_ui_min)
18
+ elsif Rails.env.test?
19
+ # It is breaking the html markup and test is full of messages like
20
+ # ignoring attempt to close string with script Hence not including jquery.form in test
21
+ else
22
+ javascript_include_tag('vendor/jquery-1.4.1', 'vendor/jquery-ui-1.7.2.custom.min')
23
+ end
24
+ end
25
+
26
+ def self.is_allowed_to_view_feed?(controller)
27
+ return true if Rails.env.development?
28
+ return true if Rails.env.test? #TODO FIXME remove this line
29
+
30
+ if AdminData::Config.setting[:feed_authentication_user_id].blank?
31
+ Rails.logger.info 'No user id has been supplied for feed'
32
+ return false
33
+ end
34
+
35
+ if AdminData::Config.setting[:feed_authentication_password].blank?
36
+ Rails.logger.info 'No password has been supplied for feed'
37
+ return false
38
+ end
39
+
40
+ stored_userid = AdminData::Config.setting[:feed_authentication_user_id]
41
+ stored_password = AdminData::Config.setting[:feed_authentication_password]
42
+ self.perform_basic_authentication(stored_userid, stored_password, controller)
43
+ end
44
+
45
+ def self.perform_basic_authentication(stored_userid, stored_password, controller)
46
+ controller.authenticate_or_request_with_http_basic do |input_userid, input_password|
47
+ (input_userid == stored_userid) && (input_password == stored_password)
48
+ end
49
+ end
50
+
51
+
52
+ def self.label_values_pair_for(model, view)
53
+ model.class.columns.inject([]) do |sum, column|
54
+ tmp = view.admin_data_get_value_for_column(column, model, :limit => nil)
55
+ sum << [column.name, view.send(:h,tmp)]
56
+ end
57
+ end
58
+
59
+ def self.custom_value_for_column(column, model)
60
+ # some would say that if I use try method then I will not be raising exception and
61
+ # I agree. However in this case for clarity I would prefer to not to have try after each call
62
+ begin
63
+ AdminData::Config.setting[:column_settings].fetch(model.class.name.to_s).fetch(column.name.intern).call(model)
64
+ rescue
65
+ model.send(column.name)
66
+ end
67
+ end
68
+
69
+ def self.get_serialized_value(html, column_value)
70
+ html << %{ <i>Cannot edit serialized field.</i> }
71
+ unless column_value.blank?
72
+ html << %{ <i>Raw contents:</i><br/> }
73
+ html << column_value.inspect
74
+ end
75
+ html.join
76
+ end
77
+
78
+ def self.pluralize(count, text)
79
+ count > 1 ? text+'s' : text
80
+ end
81
+
82
+ # Rails method merge_conditions ANDs all the conditions. I need to ORs all the conditions
83
+ def self.or_merge_conditions(klass, *conditions)
84
+ s = ') OR ('
85
+ cond = conditions.inject([]) do |sum, condition|
86
+ condition.blank? ? sum : sum << klass.send(:sanitize_sql, condition)
87
+ end.compact.join(s)
88
+ "(#{cond})" unless cond.blank?
89
+ end
90
+
91
+ def self.camelize_constantize(klassu)
92
+ klasss = klassu.camelize
93
+ self.constantize_klass(klasss)
94
+ end
95
+
96
+ # klass_name = model_name.sub(/\.rb$/,'').camelize
97
+ # constantize_klass(klass_name)
98
+ def self.constantize_klass(klass_name)
99
+ klass_name.split('::').inject(Object) do |klass, part|
100
+ klass.const_get(part)
101
+ end
102
+ end
103
+
104
+ def self.columns_order(klasss)
105
+ klass = self.constantize_klass(klasss)
106
+ columns = klass.columns.map(&:name)
107
+ columns_symbol = columns.map(&:intern)
108
+
109
+ columns_order = AdminData::Config.setting[:columns_order]
110
+
111
+ if columns_order && columns_order[klasss]
112
+ primary_key = klass.send(:primary_key).intern
113
+ order = [primary_key] + columns_order.fetch(klasss)
114
+ order.uniq!
115
+ sanitized_order = order - (order - columns_symbol)
116
+ sorted_columns = sanitized_order + (columns_symbol - sanitized_order)
117
+ return sorted_columns.map(&:to_s)
118
+ end
119
+
120
+ # created_at and updated_at should be at the very end
121
+ if columns_symbol.include? :created_at
122
+ columns_symbol = (columns_symbol - [:created_at]) + [:created_at]
123
+ end
124
+
125
+ if columns_symbol.include? :updated_at
126
+ columns_symbol = (columns_symbol - [:updated_at]) + [:updated_at]
127
+ end
128
+
129
+ columns_symbol.map(&:to_s)
130
+ end
131
+
132
+ # Usage: write 'hello world' to tmp/hello.txt file
133
+ # Util.write_to_file('hello world', 'a+', 'tmp', 'hello.txt')
134
+ def self.write_to_file(data, mode, *path)
135
+ path = File.expand_path(Rails.root.join(*path.flatten.compact))
136
+ FileUtils.mkdir_p(File.dirname(path))
137
+ File.open(path, mode) {|fh| fh.puts(data) }
138
+ end
139
+
140
+ def self.javascript_include_tag(*args)
141
+ data = args.inject('') do |sum, arg|
142
+ f = File.new(File.join(AdminData::Config.setting[:plugin_dir], 'lib', 'js', "#{arg}.js"))
143
+ sum << f.read
144
+ end
145
+ ['<script type="text/javascript">', data, '</script>'].join
146
+ end
147
+
148
+ def self.stylesheet_link_tag(*args)
149
+ data = args.inject('') do |sum, arg|
150
+ f = File.new(File.join(AdminData::Config.setting[:plugin_dir], 'lib', 'css', "#{arg}.css"))
151
+ sum << f.read
152
+ end
153
+ ["<style type='text/css'>", data, '</style>'].join
154
+ end
155
+
156
+ def self.get_class_name_for_has_many_association(model, has_many_string)
157
+ data = model.class.name.camelize.constantize.reflections.values.detect do |value|
158
+ value.macro == :has_many && value.name.to_s == has_many_string
159
+ end
160
+ data.klass if data # output of detect from hash is an array with key and value
161
+ end
162
+
163
+ def self.get_class_name_for_belongs_to_class(model, belongs_to_string)
164
+ reflections = model.class.name.camelize.constantize.reflections
165
+ options = reflections.fetch(belongs_to_string.intern).send(:options)
166
+ return {:polymorphic => true} if options.keys.include?(:polymorphic) && options.fetch(:polymorphic)
167
+ {:klass_name => reflections[belongs_to_string.intern].klass.name }
168
+ end
169
+
170
+ def self.get_class_name_for_has_one_association(model, has_one_string)
171
+ data = model.class.name.camelize.constantize.reflections.values.detect do |value|
172
+ value.macro == :has_one && value.name.to_s == has_one_string
173
+ end
174
+ data.klass if data
175
+ end
176
+
177
+ def self.has_many_count(model, hm)
178
+ model.send(hm.intern).count
179
+ end
180
+
181
+ def self.has_many_what(klass)
182
+ associations_for(klass, :has_many).map(&:name).map(&:to_s)
183
+ end
184
+
185
+ def self.has_one_what(klass)
186
+ associations_for(klass, :has_one).map(&:name).map(&:to_s)
187
+ end
188
+
189
+ def self.belongs_to_what(klass)
190
+ associations_for(klass, :belongs_to).map(&:name).map(&:to_s)
191
+ end
192
+
193
+ def self.habtm_what(klass)
194
+ associations_for(klass, :has_and_belongs_to_many).map(&:name).map(&:to_s)
195
+ end
196
+
197
+ def self.admin_data_association_info_size(klass)
198
+ (belongs_to_what(klass).size > 0) ||
199
+ (has_many_what(klass).size > 0) ||
200
+ (has_one_what(klass).size > 0) ||
201
+ (habtm_what(klass).size > 0)
202
+ end
203
+
204
+ def self.string_representation_of_data(value)
205
+ case value
206
+ when BigDecimal
207
+ value.to_s
208
+ when Date, DateTime, Time
209
+ "'#{value.to_s(:db)}'"
210
+ else
211
+ value.inspect
212
+ end
213
+ end
214
+
215
+ def self.build_sort_options(klass, sortby)
216
+ klass.columns.inject('') do |result, column|
217
+ name = column.name
218
+
219
+ selected_text = (sortby == "#{name} desc") ? "selected='selected'" : ''
220
+ result << "<option value='#{name} desc' #{selected_text}>#{name} desc</option>"
221
+
222
+ selected_text = (sortby == "#{name} asc") ? "selected='selected'" : ''
223
+ result << "<option value='#{name} asc' #{selected_text}>#{name} asc</option>"
224
+ end.html_safe
225
+ end
226
+
227
+ def self.associations_for(klass, association_type)
228
+ klass.name.camelize.constantize.reflections.values.select do |value|
229
+ value.macro == association_type
230
+ end
231
+ end
232
+
233
+ def self.exception_info(e)
234
+ "#{e.class}: #{e.message}#$/#{e.backtrace.join($/)}"
235
+ end
236
+
237
+ end
@@ -0,0 +1,3 @@
1
+ module AdminData
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,79 @@
1
+ require 'date'
2
+
3
+ class AdminDataDateValidation
4
+
5
+ def self.validate_with_operator(input)
6
+ return false if input.blank?
7
+
8
+ input.strip!
9
+
10
+ # replace multiple consecutive white spaces by one single whitespace
11
+ input.gsub!(/\s+/,' ')
12
+ operator, date = input.split
13
+ return false if operator.nil?
14
+ return false unless %w(> < >= <= =).include? operator
15
+ validate(date)
16
+ end
17
+
18
+ # Usage:
19
+ #
20
+ # validate('13-feb-2008') # => time_object
21
+ # validate('13-February-2008') # => time_object
22
+ # validate('13-February-2008') # => time_object
23
+ # validate('30-Feb-2008') #=> false
24
+ #
25
+ def self.validate(input)
26
+ return false if input.nil?
27
+
28
+ input.strip!
29
+
30
+ # remove all the white space characters
31
+ input.gsub!(/\s/,'')
32
+
33
+ return false if input.length < 9
34
+
35
+ dd,mm,yyyy = input.split('-')
36
+ return false if dd.nil?
37
+ return false if mm.nil?
38
+ return false if yyyy.nil?
39
+
40
+ # month must be of aleast three characters
41
+ return false if mm.length < 3
42
+
43
+ mm = mm.downcase
44
+
45
+ #get only the first three characters
46
+ mm = mm[0,3]
47
+
48
+ months = {'jan' => 1,
49
+ 'feb' => 2,
50
+ 'mar' => 3,
51
+ 'apr' => 4,
52
+ 'may' => 5,
53
+ 'jun' => 6,
54
+ 'jul' => 7,
55
+ 'aug' => 8,
56
+ 'sep' => 9,
57
+ 'oct' => 10,
58
+ 'nov' => 11,
59
+ 'dec' => 12 }
60
+
61
+ return false unless months.keys.include? mm
62
+
63
+ mm = months[mm]
64
+ mm = mm.to_i
65
+ yyyy = yyyy.to_i
66
+ dd = dd.to_i
67
+
68
+ # validate date values
69
+ begin
70
+ Date.new(yyyy,mm,dd)
71
+ rescue => e
72
+ return false
73
+ end
74
+
75
+ t = Time.now
76
+ t.change(:year => yyyy, :month => mm, :day => dd, :hour => 0)
77
+ end
78
+
79
+ end
data/lib/css/app.css ADDED
@@ -0,0 +1,224 @@
1
+ #footer {
2
+ padding-left:30px;
3
+ }
4
+
5
+ .search_form {
6
+ margin:15px 5px 5px 5px;
7
+ padding:5px;
8
+ }
9
+
10
+ .breadcrum {
11
+ margin-bottom: 15px;
12
+ background: #fff;
13
+ padding: 10px 4px;
14
+ }
15
+
16
+ #quick_search_input { font-size: 15px; }
17
+
18
+ table.with_border td{
19
+ border:2px solid #DEDEDE;
20
+ padding:5px;
21
+ }
22
+
23
+ table {
24
+ border-collapse: collapse;
25
+ border-spacing: 0;
26
+ }
27
+
28
+ .advtable {
29
+ font-size: 15px;
30
+ }
31
+
32
+ #advance_search_table select {
33
+ font-size: 15px;
34
+ width: 280px;
35
+ padding: 2px;
36
+ margin: 2px;
37
+ }
38
+
39
+ #advance_search_table select option {
40
+ padding: 2px 5px;
41
+ }
42
+
43
+ .advtable td {
44
+ border-bottom: 1px solid #F0F0EE;
45
+ padding: 10px;
46
+ }
47
+
48
+ .ram_input_field_col3 {
49
+ font-size: 15px;
50
+ }
51
+
52
+ /*IE6 will ignore this*/
53
+ input[disabled], input[readonly], select[disabled], select[readonly], checkbox[disabled], checkbox[readonly], textarea[disabled], textarea[readonly]
54
+ {
55
+ background-color: #dcdcdc;
56
+ border: 1px solid gray;
57
+ color: #000000;
58
+ cursor: default;
59
+ }
60
+
61
+ input.col3 {
62
+ height: 20px;
63
+ font-size: 16px;
64
+ }
65
+
66
+ span.searching_message{
67
+ color: red;
68
+ font-size: 25px;
69
+ margin: 20px 0 20px 0;
70
+ }
71
+
72
+ table#view_table {
73
+ padding: 0;
74
+ margin: 5px 0 5px 0;
75
+ border-collapse: collapse;
76
+ border-spacing: 0;
77
+ }
78
+
79
+ table#view_table th {
80
+ border: 1px solid #ccc;
81
+ letter-spacing: 2px;
82
+ text-align: left;
83
+ padding: 6px 6px 6px 12px;
84
+ }
85
+
86
+
87
+ table#view_table td {
88
+ border: 1px solid #DEDEDE;
89
+ padding: 6px 6px 6px 12px;
90
+ }
91
+
92
+ table#view_table tr:hover {
93
+ background: #FFFFC0;
94
+ }
95
+
96
+
97
+ #model_drop_down {
98
+ float: right;
99
+ margin: 0 10px;
100
+ }
101
+
102
+ .drop_down_value_klass {
103
+ width: 300px;
104
+ font-size: 14px;
105
+ padding: 5px;
106
+ }
107
+
108
+ .drop_down_value_klass option {
109
+ padding: 2px;
110
+ }
111
+
112
+
113
+ .klass_box {
114
+ margin: 15px 0 15px 0;
115
+ padding: 15px 20px 15px 0;
116
+ line-height: 40px;
117
+ font-size: 16px;
118
+ }
119
+
120
+ .klass_description {
121
+ font-size: 90%;
122
+ }
123
+
124
+ #footer p {
125
+ float: left;
126
+ font-size: 11px;
127
+ padding: 2px 10px 2px 2px;
128
+ }
129
+
130
+ #main {
131
+ width: 100%;
132
+ }
133
+
134
+
135
+ .main2 {
136
+ background-color: #FFF;
137
+ padding: 5px;
138
+ margin: 10px 2px 10px 2px;
139
+ float: left;
140
+ }
141
+
142
+ .error {
143
+ color: red;
144
+ font-size: 16px;
145
+ }
146
+
147
+ #noscript-warning {
148
+ background-color:#AE0000;
149
+ color:#FFFFFF;
150
+ font-family:Arial,Helvetica,sans-serif;
151
+ font-size:140%;
152
+ font-weight:bold;
153
+ left:0;
154
+ padding:5px 0;
155
+ position:fixed;
156
+ text-align:center;
157
+ top:0;
158
+ width:100%;
159
+ z-index:101;
160
+ }
161
+
162
+ a:link, a:visited, a:active {
163
+ text-decoration: none;
164
+ color: green;
165
+ }
166
+
167
+ a:hover {
168
+ text-decoration: underline;
169
+ color: #f03;
170
+ }
171
+
172
+ #footer a, .group a, .pagination a {
173
+ color: #36393d;
174
+ }
175
+
176
+ .association_info {
177
+ line-height: 20px;
178
+ }
179
+
180
+ table#missing_index tr td {
181
+ height: 25px;
182
+ }
183
+
184
+ #main .block .content #validate_model_rhs_data p {
185
+ font-size: 16px;
186
+ }
187
+
188
+ .clear { clear: both; }
189
+
190
+ .rounded {
191
+ -moz-border-radius: 5px; /* Firefox */
192
+ -webkit-border-radius: 5px; /* Safari */
193
+ }
194
+
195
+ .powered_by {
196
+ font-family: Arial;
197
+ font-size: 12px;
198
+ }
199
+
200
+ .submit_search {
201
+ float: left;
202
+ border: 2px solid #127BC4;
203
+ color: #fff;
204
+ background: #4F8AFF;
205
+ padding: 3px;
206
+ font-weight: bold;
207
+ font-size: 16px;
208
+ }
209
+
210
+
211
+ .add_row_link, .remove_row {
212
+ font-size: 30px;
213
+ text-decoration: none;
214
+ border: 1px solid #127BC4;
215
+ color: #fff;
216
+ background: #4F8AFF;
217
+ padding: 0 3px;
218
+ margin: 0;
219
+ }
220
+
221
+ #advance_search_table a {
222
+ color: #fff;
223
+ }
224
+