muck-engine 0.1.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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +23 -0
- data/Rakefile +67 -0
- data/VERSION +1 -0
- data/app/controllers/admin/muck/base_controller.rb +24 -0
- data/app/helpers/muck_custom_form_builder.rb +186 -0
- data/app/helpers/muck_engine_helper.rb +60 -0
- data/app/models/country.rb +13 -0
- data/app/models/language.rb +3 -0
- data/app/models/state.rb +13 -0
- data/app/views/forms/_base_field.html.erb +11 -0
- data/app/views/forms/_color_picker_field.html.erb +27 -0
- data/app/views/forms/_default.html.erb +1 -0
- data/app/views/forms/_field.html.erb +3 -0
- data/app/views/forms/_field_with_tips.html.erb +4 -0
- data/app/views/forms/_menu_field.erb +4 -0
- data/app/views/forms/_menu_field.html.erb +3 -0
- data/app/views/forms/_tips.html.erb +7 -0
- data/app/views/layouts/admin.html.erb +39 -0
- data/app/views/layouts/default.html.erb +39 -0
- data/app/views/shared/_error_box.html.erb +7 -0
- data/app/views/shared/_field_error.html.erb +3 -0
- data/app/views/shared/_flash_error_box.html.erb +4 -0
- data/app/views/shared/_flash_messages.html.erb +7 -0
- data/app/views/shared/_growl.html.erb +11 -0
- data/app/views/shared/_growl_box.html.erb +3 -0
- data/app/views/shared/_no_result.html.erb +1 -0
- data/db/migrate/20090402234137_create_languages.rb +18 -0
- data/db/migrate/20090426041056_create_countries.rb +15 -0
- data/db/migrate/20090426041103_create_states.rb +18 -0
- data/install.rb +1 -0
- data/lib/action_controller/muck_application.rb +74 -0
- data/lib/active_record/muck_model.rb +34 -0
- data/lib/muck-engine.rb +5 -0
- data/locales/en.yml +17 -0
- data/public/images/arrow_down.gif +0 -0
- data/public/images/arrow_left.gif +0 -0
- data/public/images/arrow_right.gif +0 -0
- data/public/images/arrow_up.gif +0 -0
- data/public/images/icons/accept.png +0 -0
- data/public/images/icons/add.png +0 -0
- data/public/images/icons/delete.png +0 -0
- data/public/images/icons/vote.png +0 -0
- data/public/images/loading.gif +0 -0
- data/public/images/spinner.gif +0 -0
- data/public/javascripts/application.js +76 -0
- data/public/javascripts/fancyzoom.min.js +1 -0
- data/public/javascripts/jquery/jquery-ui.js +273 -0
- data/public/javascripts/jquery/jquery.form.js +637 -0
- data/public/javascripts/jquery/jquery.jgrowl.js +2 -0
- data/public/javascripts/jquery/jquery.js +19 -0
- data/public/javascripts/jquery/jquery.tips.js +69 -0
- data/public/stylesheets/admin.css +12 -0
- data/public/stylesheets/blueprint/ie.css +26 -0
- data/public/stylesheets/blueprint/liquid_screen.css +203 -0
- data/public/stylesheets/blueprint/plugins/buttons/icons/cross.png +0 -0
- data/public/stylesheets/blueprint/plugins/buttons/icons/key.png +0 -0
- data/public/stylesheets/blueprint/plugins/buttons/icons/tick.png +0 -0
- data/public/stylesheets/blueprint/plugins/buttons/readme.txt +32 -0
- data/public/stylesheets/blueprint/plugins/buttons/screen.css +97 -0
- data/public/stylesheets/blueprint/plugins/fancy-type/readme.txt +14 -0
- data/public/stylesheets/blueprint/plugins/fancy-type/screen.css +71 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/doc.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/email.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/external.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/feed.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/im.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/pdf.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/visited.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/icons/xls.png +0 -0
- data/public/stylesheets/blueprint/plugins/link-icons/readme.txt +18 -0
- data/public/stylesheets/blueprint/plugins/link-icons/screen.css +40 -0
- data/public/stylesheets/blueprint/plugins/liquid/liquid.css +134 -0
- data/public/stylesheets/blueprint/plugins/liquid/src/liquid.css +197 -0
- data/public/stylesheets/blueprint/plugins/rtl/readme.txt +10 -0
- data/public/stylesheets/blueprint/plugins/rtl/screen.css +109 -0
- data/public/stylesheets/blueprint/print.css +30 -0
- data/public/stylesheets/blueprint/screen.css +251 -0
- data/public/stylesheets/blueprint/src/forms.css +49 -0
- data/public/stylesheets/blueprint/src/grid.css +213 -0
- data/public/stylesheets/blueprint/src/grid.png +0 -0
- data/public/stylesheets/blueprint/src/ie.css +59 -0
- data/public/stylesheets/blueprint/src/print.css +85 -0
- data/public/stylesheets/blueprint/src/reset.css +38 -0
- data/public/stylesheets/blueprint/src/typography.css +105 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_glass_100_f0f0f0_1x400.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_glass_50_99c2ff_1x400.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_glass_80_e6e6e6_1x400.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-soft_100_e7eef3_1x100.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_222222_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_2694e8_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_72a7cf_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_888888_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/stylesheets/jquery/cupertino/jquery-ui-1.7.1.custom.css +404 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_217bc0_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_469bdd_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_6da8d5_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_d8e7f3_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/images/ui-icons_f9bd01_256x240.png +0 -0
- data/public/stylesheets/jquery/redmond/jquery-ui-1.7.1.custom.css +404 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/public/stylesheets/jquery/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/stylesheets/jquery/smoothness/jquery-ui-1.7.1.custom.css +404 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.1.custom.css +404 -0
- data/public/stylesheets/reset.css +0 -0
- data/public/stylesheets/styles.css +76 -0
- data/rails/init.rb +3 -0
- data/tasks/languages.txt +183 -0
- data/test/muck_engine_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- data/uninstall.rb +1 -0
- metadata +207 -0
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2009 [name of plugin creator]
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
MuckEngine
|
|
2
|
+
==========
|
|
3
|
+
The muck engine is forms the basis for the muck framework and includes basic functionality utilized by the various muck engines.
|
|
4
|
+
|
|
5
|
+
The easiest way to get started with muck is to generate your application using a template:
|
|
6
|
+
$ rails <your-app> -m http://github.com/jbasdf/rails-templates/raw/master/muck.rb
|
|
7
|
+
|
|
8
|
+
Add optional functionality with the following command:
|
|
9
|
+
$ rake rails:template LOCATION=http://github.com/jbasdf/rails-templates/raw/master/mucktoo.rb
|
|
10
|
+
|
|
11
|
+
Layout
|
|
12
|
+
=======
|
|
13
|
+
The muck template will build your basic application and construct all the needed files and configuration.
|
|
14
|
+
|
|
15
|
+
If you build your own layout be sure to include the following script in your layout or the javascript in the system won't work:
|
|
16
|
+
<script type="text/javascript" language="JavaScript">
|
|
17
|
+
<%= yield :javascript %>
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
Copyright (c) 2009 Justin Ball, released under the MIT license
|
data/Rakefile
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
require 'rake/testtask'
|
|
3
|
+
require 'rake/rdoctask'
|
|
4
|
+
|
|
5
|
+
desc 'Default: run unit tests.'
|
|
6
|
+
task :default => :test
|
|
7
|
+
|
|
8
|
+
desc 'Test the muck-engine plugin.'
|
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
|
10
|
+
t.libs << 'lib'
|
|
11
|
+
t.libs << 'test'
|
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
|
13
|
+
t.verbose = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc 'Generate documentation for the muck-engine plugin.'
|
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
19
|
+
rdoc.title = 'MuckEngine'
|
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
|
21
|
+
rdoc.rdoc_files.include('README')
|
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
begin
|
|
27
|
+
require 'jeweler'
|
|
28
|
+
Jeweler::Tasks.new do |gemspec|
|
|
29
|
+
gemspec.name = "muck-engine"
|
|
30
|
+
gemspec.summary = "The base engine for the muck system. Contains common tables, custom for, css and javascript."
|
|
31
|
+
gemspec.email = "justinball@gmail.com"
|
|
32
|
+
gemspec.homepage = "http://github.com/technicalpickles/the-perfect-gem"
|
|
33
|
+
gemspec.description = "The base engine for the muck system. Contains common tables, custom for, css and javascript."
|
|
34
|
+
gemspec.authors = ["Justin Ball"]
|
|
35
|
+
gemspec.files.include %w( lib/muck-engine.rb )
|
|
36
|
+
gemspec.rubyforge_project = 'muck-engine'
|
|
37
|
+
end
|
|
38
|
+
rescue LoadError
|
|
39
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# rubyforge tasks
|
|
43
|
+
begin
|
|
44
|
+
require 'rake/contrib/sshpublisher'
|
|
45
|
+
namespace :rubyforge do
|
|
46
|
+
|
|
47
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
|
48
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
|
49
|
+
|
|
50
|
+
namespace :release do
|
|
51
|
+
desc "Publish RDoc to RubyForge."
|
|
52
|
+
task :docs => [:rdoc] do
|
|
53
|
+
config = YAML.load(
|
|
54
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
host = "#{config['username']}@rubyforge.org"
|
|
58
|
+
remote_dir = "/var/www/gforge-projects/muck-engine/"
|
|
59
|
+
local_dir = 'rdoc'
|
|
60
|
+
|
|
61
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
rescue LoadError
|
|
66
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
|
67
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.0
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class Admin::Muck::BaseController < ApplicationController
|
|
2
|
+
|
|
3
|
+
before_filter :login_required
|
|
4
|
+
before_filter :admin_access?
|
|
5
|
+
|
|
6
|
+
protected
|
|
7
|
+
|
|
8
|
+
def get_user
|
|
9
|
+
@user = current_user
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def authorized?
|
|
13
|
+
admin?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def permission_denied
|
|
17
|
+
respond_to do |format|
|
|
18
|
+
format.html do
|
|
19
|
+
redirect_to home_path
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
class MuckCustomFormBuilder < ActionView::Helpers::FormBuilder
|
|
2
|
+
|
|
3
|
+
helpers = field_helpers +
|
|
4
|
+
%w(date_select datetime_select time_select collection_select) +
|
|
5
|
+
%w(select country_select time_zone_select) -
|
|
6
|
+
%w(hidden_field label fields_for)
|
|
7
|
+
|
|
8
|
+
helpers.each do |name|
|
|
9
|
+
define_method name do |field, *args|
|
|
10
|
+
options = args.detect {|argument| argument.is_a?(Hash)} || {}
|
|
11
|
+
|
|
12
|
+
render_field_template(name, field, options) do
|
|
13
|
+
super
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def render_field_template(name, field, options)
|
|
19
|
+
|
|
20
|
+
tippable = !options[:tip].nil?
|
|
21
|
+
|
|
22
|
+
# used by country, state and other selects to specify a different id
|
|
23
|
+
field_id = options[:field_id]
|
|
24
|
+
|
|
25
|
+
local_options = {
|
|
26
|
+
:extra_html => options.delete(:extra_html),
|
|
27
|
+
:tip => options.delete(:tip),
|
|
28
|
+
:tip_title => options.delete(:tip_title),
|
|
29
|
+
:tip_key => options.delete(:tip_key),
|
|
30
|
+
:tip_position => options.delete(:tip_position) || 'right',
|
|
31
|
+
:wrapper_id => options.delete(:wrapper_id),
|
|
32
|
+
:pre_html => options.delete(:pre_html),
|
|
33
|
+
:hide_required => options.delete(:hide_required),
|
|
34
|
+
:hide_control_error => options.delete(:hide_control_error),
|
|
35
|
+
:css_class => options.delete(:css_class)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type = options.delete(:type)
|
|
39
|
+
type ||= :tippable if tippable
|
|
40
|
+
|
|
41
|
+
if !options[:label_class].nil?
|
|
42
|
+
label_options = { :class => options.delete(:label_class) }
|
|
43
|
+
else
|
|
44
|
+
label_options = { }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
if local_options[:hide_required]
|
|
48
|
+
required = false
|
|
49
|
+
label_text = options[:label]
|
|
50
|
+
else
|
|
51
|
+
required = required_field?(field)
|
|
52
|
+
label_text = (options[:label] || field.to_s.camelize)
|
|
53
|
+
label_text = label_text + required_mark(field) if required
|
|
54
|
+
end
|
|
55
|
+
label_name = options.delete(:label)
|
|
56
|
+
|
|
57
|
+
is_checkbox = false
|
|
58
|
+
is_checkbox = true if %w(check_box).include?(name)
|
|
59
|
+
|
|
60
|
+
options[:class] ||= ''
|
|
61
|
+
options[:class] << add_space_to_css(options) + 'tip-field' if tippable
|
|
62
|
+
options[:class] << add_space_to_css(options) + "required-value" if required
|
|
63
|
+
|
|
64
|
+
if type == :choose_menu
|
|
65
|
+
options[:label_class] = 'desc'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
locals = {
|
|
69
|
+
:field_element => yield,
|
|
70
|
+
:field_name => field_id || field_name(field),
|
|
71
|
+
:label_name => options.delete(:required_label) || label_name || '',
|
|
72
|
+
:label_element => label(field, label_text, label_options),
|
|
73
|
+
:is_checkbox => is_checkbox,
|
|
74
|
+
:required => required
|
|
75
|
+
}.merge(local_options)
|
|
76
|
+
|
|
77
|
+
if object.nil?
|
|
78
|
+
locals[:value] = ''
|
|
79
|
+
locals[:id] = ''
|
|
80
|
+
else
|
|
81
|
+
locals[:value] = object.send(field)
|
|
82
|
+
locals[:id] = object.id
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if has_errors_on?(field)
|
|
86
|
+
locals.merge!(:error => error_message(field, options))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
@template.capture do
|
|
90
|
+
|
|
91
|
+
if type == :tippable
|
|
92
|
+
@template.render :partial => 'forms/field_with_tips', :locals => locals
|
|
93
|
+
elsif type == :choose_menu
|
|
94
|
+
@template.render :partial => 'forms/menu_field', :locals => locals
|
|
95
|
+
elsif type == :color_picker
|
|
96
|
+
@template.render :partial => 'forms/color_picker_field', :locals => locals
|
|
97
|
+
elsif type == :default
|
|
98
|
+
@template.render :partial => 'forms/default', :locals => locals
|
|
99
|
+
else
|
|
100
|
+
@template.render :partial => 'forms/field', :locals => locals
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# creates a select control with states. Default id is 'states'. If 'retain' is passed for the class value the value of this
|
|
106
|
+
# control will be written into a cookie with the key 'states'.
|
|
107
|
+
def state_select(method, options = {}, html_options = {}, additional_state = nil)
|
|
108
|
+
country_id_field_name = options.delete(:country_id) || 'country_id'
|
|
109
|
+
country_id = get_instance_object_value(country_id_field_name)
|
|
110
|
+
@states = country_id.nil? ? [] : (additional_state ? [additional_state] : []) + State.find(:all, :conditions => ["country_id = ?", country_id], :order => "name asc")
|
|
111
|
+
self.menu_select(method, 'Choose State', @states, options.merge(:prompt => 'Please select a state', :wrapper_id => 'states-container'), html_options.merge(:id => 'states'))
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# creates a select control with countries. Default id is 'countries'. If 'retain' is passed for the class value the value of this
|
|
115
|
+
# control will be written into a cookie with the key 'states'.
|
|
116
|
+
def country_select(method, options = {}, html_options = {}, additional_country = nil)
|
|
117
|
+
@countries ||= (additional_country ? [additional_country] : []) + Country.find(:all, :order => 'sort, name asc')
|
|
118
|
+
self.menu_select(method, 'Choose Country', @countries, options.merge(:prompt => 'Please select a country', :wrapper_id => 'countries-container'), html_options.merge(:id => 'countries'))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def get_instance_object_value(field_name)
|
|
122
|
+
obj = object || @template.instance_variable_get("@#{@object_name}")
|
|
123
|
+
obj.send(field_name) rescue nil
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def menu_select(method, label, collection, options = {}, html_options = {})
|
|
127
|
+
|
|
128
|
+
# this code will look for a cookie that matches the control and set the value to the cookie value
|
|
129
|
+
# if html_options.has_key?(:class)
|
|
130
|
+
# if html_options[:class].include?('retain')
|
|
131
|
+
# id = html_options[:id]
|
|
132
|
+
# @object.send("#{method}=", @template.cookies[id]) if @template.cookies.has_key? id
|
|
133
|
+
# end
|
|
134
|
+
# end
|
|
135
|
+
if !options[:tip].nil?
|
|
136
|
+
html_options[:class] ||= ''
|
|
137
|
+
html_options[:class] << add_space_to_css(html_options) + 'tip-field'
|
|
138
|
+
end
|
|
139
|
+
self.collection_select(method, collection, :id, :name, options.merge(:object => @object, :label => label, :type => :choose_menu, :label_class => 'desc', :field_id => html_options[:id]), html_options)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
def add_space_to_css(options)
|
|
145
|
+
options[:class].empty? ? '' : ' '
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def error_message(field, options)
|
|
149
|
+
if has_errors_on?(field)
|
|
150
|
+
errors = object.errors.on(field)
|
|
151
|
+
errors.is_a?(Array) ? errors.to_sentence : errors
|
|
152
|
+
else
|
|
153
|
+
''
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def has_errors_on?(field)
|
|
158
|
+
!(object.nil? || object.errors.on(field).blank?)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def field_name(field)
|
|
162
|
+
# TODO figure out if there is a built in method that does this.
|
|
163
|
+
"#{@object_name.to_s}_#{field.to_s}"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def required_mark(field)
|
|
167
|
+
required_field?(field) ? " <em id=\"#{field_name(field)}-label-required\">(required)</em>" : ''
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def required_field?(field)
|
|
171
|
+
reflect_on = object.class if !object.blank?
|
|
172
|
+
if reflect_on.blank?
|
|
173
|
+
reflect_on = @object_name.to_s.camelize.constantize rescue nil
|
|
174
|
+
end
|
|
175
|
+
if !reflect_on.blank?
|
|
176
|
+
reflect_on.reflect_on_validations_for(field).map(&:macro).include?(:validates_presence_of)
|
|
177
|
+
else
|
|
178
|
+
false
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def load_states
|
|
183
|
+
@states = State.find(:all, :order => "name" ).map {|u| [u.name, u.id] }
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module MuckEngineHelper
|
|
2
|
+
|
|
3
|
+
def custom_form_for(record_or_name_or_array, *args, &proc)
|
|
4
|
+
options = args.detect { |argument| argument.is_a?(Hash) }
|
|
5
|
+
if options.nil?
|
|
6
|
+
options = {:builder => MuckCustomFormBuilder}
|
|
7
|
+
args << options
|
|
8
|
+
end
|
|
9
|
+
options[:builder] = MuckCustomFormBuilder unless options.nil?
|
|
10
|
+
form_for(record_or_name_or_array, *args, &proc)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def output_errors(title, options = {}, fields = nil)
|
|
14
|
+
fields = [fields] unless fields.is_a?(Array)
|
|
15
|
+
flash_html = render(:partial => 'shared/flash_messages')
|
|
16
|
+
field_errors = render(:partial => 'shared/field_error', :collection => fields)
|
|
17
|
+
css_class = "class=\"#{options[:class]}\"" unless options[:class].nil?
|
|
18
|
+
|
|
19
|
+
if !flash_html.empty? && field_errors.empty?
|
|
20
|
+
# only flash. Don't render the
|
|
21
|
+
render(:partial => 'shared/flash_error_box', :locals => {:flash_html => flash_html, :css_class => css_class})
|
|
22
|
+
elsif !field_errors.empty?
|
|
23
|
+
# field errors and/or flash
|
|
24
|
+
render(:partial => 'shared/error_box', :locals => {:title => title,
|
|
25
|
+
:flash_html => flash_html,
|
|
26
|
+
:field_errors => field_errors,
|
|
27
|
+
:css_class => css_class,
|
|
28
|
+
:extra_html => options[:extra_html]})
|
|
29
|
+
else
|
|
30
|
+
#nothing
|
|
31
|
+
''
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def error_styles
|
|
36
|
+
if GlobalConfig.growl_all_messages
|
|
37
|
+
' style="display:none;" '
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def icon(object, size = :icon)
|
|
42
|
+
return "" if object.blank? || object.photo.blank?
|
|
43
|
+
link_to(image_tag(object.photo.url(size), :class => size), object, { :title => object.full_name })
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def secure_mail_to(email)
|
|
47
|
+
mail_to email, nil, :encode => 'javascript'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Used inside of format.js to return a message to the client.
|
|
51
|
+
# If jGrowl is enabled the message will show up as a growl instead of a popup
|
|
52
|
+
def page_alert(page, message, title = '')
|
|
53
|
+
if GlobalConfig.growl_enabled
|
|
54
|
+
page << "jQuery.jGrowl.error('" + message + "', {header:'" + title + "'});"
|
|
55
|
+
else
|
|
56
|
+
page.alert(message)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: countries
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# name :string(128) default(""), not null
|
|
7
|
+
# abbreviation :string(3) default(""), not null
|
|
8
|
+
# sort :integer(4) default(1000), not null
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
class Country < ActiveRecord::Base
|
|
12
|
+
|
|
13
|
+
end
|
data/app/models/state.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: states
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# name :string(128) default(""), not null
|
|
7
|
+
# abbreviation :string(3) default(""), not null
|
|
8
|
+
# country_id :integer(8) not null
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
class State < ActiveRecord::Base
|
|
12
|
+
belongs_to :country
|
|
13
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%= pre_html %>
|
|
2
|
+
<% if is_checkbox -%>
|
|
3
|
+
<%= field_element %>
|
|
4
|
+
<%= label_element %>
|
|
5
|
+
<% else -%>
|
|
6
|
+
<%= label_element %>
|
|
7
|
+
<%= field_element %>
|
|
8
|
+
<% end -%>
|
|
9
|
+
<% if required -%><div id="<%= field_name %>_required" class="required-tip" style="display:none;"><em><%= I18n.t(:please_enter_a_value, :label => label_name, :scope => [:muck, :users, :forms, :_base_field]) %></em></div><% end -%>
|
|
10
|
+
<% if !hide_control_error && defined? error -%><div class="form_error_message"><%= error %></div><% end -%>
|
|
11
|
+
<%= extra_html %>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<% color = value
|
|
2
|
+
html_id = '_' + id.to_s + '_' + field_name %>
|
|
3
|
+
<div <%= wrapper_id.nil? ? '' : "id=\"#{wrapper_id}\"" -%> class="form-row color-selector-container">
|
|
4
|
+
<%= render :partial => 'forms/base_field', :locals => local_assigns %>
|
|
5
|
+
<div id="colorSelector<%=html_id%>" class="color-selector">
|
|
6
|
+
<div id="colorSelectorDisplay<%=html_id%>" style="background-color:#<%=color%>;"></div>
|
|
7
|
+
</div>
|
|
8
|
+
<script type="text/javascript" language="JavaScript">
|
|
9
|
+
jQuery(document).ready(function() {
|
|
10
|
+
jQuery('#colorSelector<%=html_id%>').ColorPicker({
|
|
11
|
+
color: '#<%=color%>',
|
|
12
|
+
onShow: function (colpkr) {
|
|
13
|
+
jQuery(colpkr).fadeIn(100);
|
|
14
|
+
return false;
|
|
15
|
+
},
|
|
16
|
+
onHide: function (colpkr) {
|
|
17
|
+
jQuery(colpkr).fadeOut(100);
|
|
18
|
+
return false;
|
|
19
|
+
},
|
|
20
|
+
onChange: function (hsb, hex, rgb) {
|
|
21
|
+
jQuery('#colorSelectorDisplay<%=html_id%>').css('backgroundColor', '#' + hex);
|
|
22
|
+
jQuery('#<%=field_name%>').val(hex);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
</script>
|
|
27
|
+
</div>
|