adminpanel 2.0.0 → 2.0.1

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/Gemfile +3 -3
  4. data/adminpanel.gemspec +1 -2
  5. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5-3.min.js +261 -0
  6. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5-advanced.js +553 -0
  7. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5.js +511 -0
  8. data/app/assets/javascripts/adminpanel/wysiwyg.js +5 -0
  9. data/app/assets/stylesheets/adminpanel/bootstrap-wysihtml5.css +102 -0
  10. data/app/assets/stylesheets/application-admin.css +0 -1
  11. data/app/controllers/adminpanel/analytics_controller.rb +2 -1
  12. data/app/controllers/adminpanel/application_controller.rb +2 -1
  13. data/app/controllers/adminpanel/sections_controller.rb +1 -1
  14. data/app/controllers/adminpanel/sessions_controller.rb +2 -2
  15. data/app/controllers/concerns/adminpanel/rest_actions.rb +4 -5
  16. data/app/helpers/adminpanel/{custom_form_builder.rb → adminpanel_form_builder.rb} +14 -38
  17. data/app/helpers/adminpanel/application_helper.rb +2 -2
  18. data/app/helpers/adminpanel/router_helper.rb +10 -1
  19. data/app/models/adminpanel/analytic.rb +1 -1
  20. data/app/models/adminpanel/gallery.rb +1 -1
  21. data/app/models/adminpanel/section.rb +27 -6
  22. data/app/models/adminpanel/user.rb +1 -0
  23. data/app/models/concerns/adminpanel/base.rb +4 -1
  24. data/app/views/adminpanel/categories/_category_form.html.erb +1 -1
  25. data/app/views/adminpanel/sections/edit.html.erb +1 -1
  26. data/app/views/shared/_form_fields.html.erb +88 -85
  27. data/app/views/shared/_remote_form_fields.html.erb +1 -1
  28. data/app/views/shared/edit.html.erb +1 -1
  29. data/app/views/shared/new.html.erb +6 -5
  30. data/app/views/shared/show.html.erb +7 -7
  31. data/config/locales/en.yml +12 -8
  32. data/config/locales/es.yml +13 -9
  33. data/config/routes.rb +18 -14
  34. data/lib/adminpanel.rb +1 -1
  35. data/lib/adminpanel/version.rb +1 -1
  36. data/lib/generators/adminpanel/initialize/templates/category_template.rb +2 -1
  37. data/lib/tasks/adminpanel/adminpanel.rake +1 -1
  38. data/spec/features/shared_pages_spec.rb +1 -1
  39. metadata +77 -72
@@ -0,0 +1,5 @@
1
+ $(document).ready(function(){
2
+ $('.wysihtml5').each(function(i, elem) {
3
+ $(elem).wysihtml5();
4
+ });
5
+ });
@@ -0,0 +1,102 @@
1
+ ul.wysihtml5-toolbar {
2
+ margin: 0;
3
+ padding: 0;
4
+ display: block;
5
+ }
6
+
7
+ ul.wysihtml5-toolbar::after {
8
+ clear: both;
9
+ display: table;
10
+ content: "";
11
+ }
12
+
13
+ ul.wysihtml5-toolbar > li {
14
+ float: left;
15
+ display: list-item;
16
+ list-style: none;
17
+ margin: 0 5px 10px 0;
18
+ }
19
+
20
+ ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] {
21
+ font-weight: bold;
22
+ }
23
+
24
+ ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] {
25
+ font-style: italic;
26
+ }
27
+
28
+ ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] {
29
+ text-decoration: underline;
30
+ }
31
+
32
+ ul.wysihtml5-toolbar a.btn.wysihtml5-command-active {
33
+ background-image: none;
34
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
35
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
36
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
37
+ background-color: #E6E6E6;
38
+ background-color: #D9D9D9;
39
+ outline: 0;
40
+ }
41
+
42
+ ul.wysihtml5-commands-disabled .dropdown-menu {
43
+ display: none !important;
44
+ }
45
+
46
+ ul.wysihtml5-toolbar div.wysihtml5-colors {
47
+ display:block;
48
+ width: 50px;
49
+ height: 20px;
50
+ margin-top: 2px;
51
+ margin-left: 5px;
52
+ position: absolute;
53
+ pointer-events: none;
54
+ }
55
+
56
+ ul.wysihtml5-toolbar a.wysihtml5-colors-title {
57
+ padding-left: 70px;
58
+ }
59
+
60
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] {
61
+ background: black !important;
62
+ }
63
+
64
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] {
65
+ background: silver !important;
66
+ }
67
+
68
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] {
69
+ background: gray !important;
70
+ }
71
+
72
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] {
73
+ background: maroon !important;
74
+ }
75
+
76
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] {
77
+ background: red !important;
78
+ }
79
+
80
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] {
81
+ background: purple !important;
82
+ }
83
+
84
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] {
85
+ background: green !important;
86
+ }
87
+
88
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] {
89
+ background: olive !important;
90
+ }
91
+
92
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] {
93
+ background: navy !important;
94
+ }
95
+
96
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] {
97
+ background: blue !important;
98
+ }
99
+
100
+ ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] {
101
+ background: orange !important;
102
+ }
@@ -9,7 +9,6 @@
9
9
  * compiled file, but it's generally better to create a new file per style scope.
10
10
  *
11
11
  *= require_self
12
- *= require adminpanel/medium-editor
13
12
  *= require font-awesome
14
13
  *= require_tree ./adminpanel/.
15
14
  */
@@ -1,5 +1,6 @@
1
1
  module Adminpanel
2
- class AnalyticsController < Adminpanel::ApplicationController
2
+ class AnalyticsController < Adminpanel::ApplicationController
3
+ skip_authorization_check
3
4
  authorize_resource :class => false
4
5
  skip_before_filter :set_model
5
6
 
@@ -12,6 +12,7 @@ module Adminpanel
12
12
 
13
13
  before_filter :signed_in_user, :set_model, :strong_params_for_cancan
14
14
 
15
+ private
15
16
  def strong_params_for_cancan
16
17
  resource = controller_name.singularize.to_sym
17
18
  method = "#{resource}_params"
@@ -24,7 +25,7 @@ module Adminpanel
24
25
  end
25
26
 
26
27
  def signed_in_user
27
- redirect_to signin_url, :notice => I18n.t("authentication.welcome") unless signed_in?
28
+ redirect_to signin_url, :notice => I18n.t('authentication.welcome') unless signed_in?
28
29
  end
29
30
 
30
31
  def set_model
@@ -28,7 +28,7 @@ module Adminpanel
28
28
  @section = Section.find(params[:id])
29
29
 
30
30
  if @section.update_attributes(params[:section])
31
- redirect_to section_path(@section), :notice => "La seccion se ha actualizado"
31
+ redirect_to section_path(@section), :notice => 'La seccion se ha actualizado'
32
32
  else
33
33
  render 'edit'
34
34
  end
@@ -1,7 +1,7 @@
1
1
  module Adminpanel
2
2
  class SessionsController < Adminpanel::ApplicationController
3
-
4
- layout "admin-login"
3
+ skip_authorization_check
4
+ layout 'admin-login'
5
5
  skip_before_filter :signed_in_user, :set_model
6
6
 
7
7
  def new
@@ -27,7 +27,7 @@ module Adminpanel
27
27
  params.merge({:belongs_request => params[:belongs_request]}) if params[:belongs_request].present?
28
28
  create! do |success, failure|
29
29
  success.html do
30
- flash[:success] = I18n.t("action.save_success")
30
+ flash[:success] = I18n.t('action.save_success')
31
31
  redirect_to resource
32
32
  end
33
33
  failure.html do
@@ -35,11 +35,10 @@ module Adminpanel
35
35
  render 'shared/new'
36
36
  end
37
37
  success.js do
38
- flash.now[:success] = I18n.t("action.save_success")
39
38
  if params[:belongs_request]
40
- render 'shared/create_belongs_to', :locals => {:resource => resource }
39
+ render 'shared/create_belongs_to', :locals => { :resource => resource }
41
40
  else
42
- render 'shared/create_has_many', :locals => {:resource => resource }
41
+ render 'shared/create_has_many', :locals => { :resource => resource }
43
42
  end
44
43
  end
45
44
  failure.js do
@@ -62,7 +61,7 @@ module Adminpanel
62
61
  def update
63
62
  update! do |success, failure|
64
63
  success.html do
65
- flash[:success] = I18n.t("action.save_success")
64
+ flash.now[:success] = I18n.t('action.save_success')
66
65
  render 'shared/index'
67
66
  end
68
67
  failure.html do
@@ -1,5 +1,5 @@
1
1
  module Adminpanel
2
- class CustomFormBuilder < ActionView::Helpers::FormBuilder
2
+ class AdminpanelFormBuilder < ActionView::Helpers::FormBuilder
3
3
 
4
4
  alias_method :text_field_original, :text_field
5
5
  alias_method :radio_button_original, :radio_button
@@ -70,27 +70,18 @@ module Adminpanel
70
70
 
71
71
  def wysiwyg_field(name, *args)
72
72
  options = args.extract_options!
73
- label = options["label"]
74
- options.delete("label")
73
+ label = options['label']
74
+ options.delete('label')
75
75
 
76
- @template.content_tag(:div, :class => "control-group") do
77
- @template.content_tag(:label, label, :class => "control-label") +
78
- @template.content_tag(:div, :class => "controls") do
79
- if self.object.send(name).nil?
80
- @template.content_tag(
81
- :div,
82
- self.object.send(name),
83
- :id => name,
84
- "data-placeholder" => I18n.t("Write description here")
85
- )
86
- else
87
- @template.content_tag(
88
- :div,
89
- self.object.send(name).html_safe,
90
- :id => name,
91
- "data-placeholder" => I18n.t("Write description here")
92
- )
93
- end
76
+ @template.content_tag(:div, :class => 'control-group') do
77
+ @template.content_tag(:label, label, :class => 'control-label') +
78
+ @template.content_tag(:div, :class => 'controls') do
79
+ self.text_area(
80
+ name,
81
+ class: 'wysihtml5 span10',
82
+ placeholder: I18n.t('wysiwyg.description'),
83
+ rows: '6'
84
+ )
94
85
  end
95
86
  end
96
87
  end
@@ -149,12 +140,12 @@ module Adminpanel
149
140
 
150
141
  def select(name, select_options, *args)
151
142
  options = args.extract_options!
143
+ label = options['label']
144
+ options.delete('label')
152
145
 
153
146
  options.reverse_merge! :class => "span7"
154
147
 
155
148
  options.reverse_merge! :include_blank => "(Seleccione por favor)";
156
- label = options['label']
157
- options.delete('label')
158
149
 
159
150
  @template.content_tag :div, :class => "control-group" do
160
151
  @template.content_tag(:label, label, :class => "control-label") +
@@ -189,21 +180,6 @@ module Adminpanel
189
180
  end
190
181
  end
191
182
 
192
- def text_area(name, *args)
193
- options = args.extract_options!
194
-
195
- options.reverse_merge! :class => "span7"
196
- options.reverse_merge! :rows => "10"
197
- options.reverse_merge! :label => name
198
- label = options['label']
199
- options.delete('label')
200
-
201
- @template.content_tag :div, :class => "control-group" do
202
- @template.content_tag(:label, label, :class => "control-label") +
203
- @template.content_tag(:div, super(name, *args << options), :class => "controls")
204
- end
205
- end
206
-
207
183
  def submit(name, *args)
208
184
  options = args.extract_options!
209
185
 
@@ -4,9 +4,9 @@ module Adminpanel
4
4
  include BreadcrumbsHelper
5
5
  include SharedPagesHelper
6
6
 
7
- def custom_form_for(name, *args, &block)
7
+ def adminpanel_form_for(name, *args, &block)
8
8
  options = args.extract_options!
9
- options.reverse_merge! :builder => Adminpanel::CustomFormBuilder, :html => { :class => "form-horizontal" }
9
+ options.reverse_merge! :builder => Adminpanel::AdminpanelFormBuilder, :html => { :class => "form-horizontal" }
10
10
 
11
11
  form_for(name, *(args << options), &block)
12
12
  end
@@ -1,6 +1,6 @@
1
1
  module Adminpanel
2
2
  module RouterHelper
3
- def gallery_children(resource)
3
+ def get_gallery_children(resource)
4
4
  resource_class(resource).gallery_children
5
5
  end
6
6
 
@@ -8,6 +8,15 @@ module Adminpanel
8
8
  resource_class(resource).routes_options
9
9
  end
10
10
 
11
+ def rest_path_names
12
+ {
13
+ path_names: {
14
+ new: I18n.t('routes.new'),
15
+ edit: I18n.t('routes.edit'),
16
+ show: I18n.t('routes.show')
17
+ }
18
+ }
19
+ end
11
20
  private
12
21
  def resource_class(resource)
13
22
  "adminpanel/#{resource.to_s.singularize}".classify.constantize
@@ -3,7 +3,7 @@ module Adminpanel
3
3
  include Adminpanel::Base
4
4
 
5
5
  def self.display_name
6
- 'Google Analtico'
6
+ I18n.t('model.Analytic')
7
7
  end
8
8
 
9
9
  def self.icon
@@ -47,7 +47,7 @@ module Adminpanel
47
47
  end
48
48
 
49
49
  def self.display_name
50
- I18n.t('gallery.name')
50
+ I18n.t('model.Gallery')
51
51
  end
52
52
 
53
53
  def self.icon
@@ -6,18 +6,34 @@ module Adminpanel
6
6
 
7
7
  mount_images :images
8
8
 
9
- validates_length_of :description, :minimum => 10, :maximum => 10, :on => :update, :if => lambda{|section| section.key == 'phone'}, :message => I18n.t('activerecord.errors.messages.not_phone')
10
- validates_presence_of :description, :minimum => 9, :on => :update, :if => lambda{|section| section.has_description == true}
11
- validates :description, :numericality => { :only_integer => true }, :on => :update, :if => lambda{|section| section.key == 'phone'}
9
+ validates_length_of :description,
10
+ minimum: 10,
11
+ maximum: 10,
12
+ on: :update,
13
+ if: :is_invalid_phone?,
14
+ message: I18n.t('activerecord.errors.messages.not_phone')
15
+ validates_presence_of :description,
16
+ minimum: 9,
17
+ on: :update,
18
+ if: lambda{|section| section.has_description == true }
19
+ validates :description,
20
+ numericality: { only_integer: true },
21
+ on: :update,
22
+ if: :is_invalid_phone?
12
23
  validates_presence_of :key
13
24
  validates_presence_of :name
14
25
  validates_presence_of :page
26
+
15
27
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
16
- validates_format_of :description, :with => VALID_EMAIL_REGEX, if: lambda{|section| section.key == 'email'}
28
+ validates_format_of :description, with: VALID_EMAIL_REGEX, if: lambda{|section| section.key == 'email'}
29
+
30
+ default_scope { order("page ASC") }
17
31
 
18
- default_scope { order("page ASC")}
32
+ scope :of_page, lambda{ |page|
33
+ where(page: page)
34
+ }
19
35
 
20
- scope :of_page, lambda{|page| where(:page => page)}
36
+ scope :with_description, -> { where.not( description: '') }
21
37
 
22
38
  def self.form_attributes
23
39
  [
@@ -45,5 +61,10 @@ module Adminpanel
45
61
  return self.attributes['description']
46
62
  end
47
63
  end
64
+
65
+ private
66
+ def is_invalid_phone?
67
+ key == 'phone' && description != ''
68
+ end
48
69
  end
49
70
  end
@@ -71,6 +71,7 @@ module Adminpanel
71
71
  {
72
72
  'group_id' => {
73
73
  'type' => 'belongs_to',
74
+ 'name' => 'Group',
74
75
  'model' => 'Adminpanel::Group',
75
76
  'remote_resource' => false,
76
77
  'placeholder' => I18n.t('model.attributes.group_id'),
@@ -115,7 +115,10 @@ module Adminpanel
115
115
  end
116
116
 
117
117
  def routes_options
118
- { path: display_name.pluralize(I18n.default_locale).downcase }
118
+ { path: ActiveSupport::Inflector.transliterate(
119
+ display_name.pluralize(I18n.default_locale).downcase
120
+ ).tr(' ', '-')
121
+ }
119
122
  end
120
123
 
121
124
  def has_route?(route)
@@ -1,4 +1,4 @@
1
- <%= custom_form_for(resource, :url => {:action => :create, :model => params[:model], :model_name => params[:model_name], :currentcontroller => params[:currentcontroller], :belongs_request => params[:belongs_request]}, :remote => true, :html => {:class => "form-horizontal", :id => "new-category-form"}) do |f| -%>
1
+ <%= adminpanel_form_for(resource, :url => {:action => :create, :model => params[:model], :model_name => params[:model_name], :currentcontroller => params[:currentcontroller], :belongs_request => params[:belongs_request]}, :remote => true, :html => {:class => "form-horizontal", :id => "new-category-form"}) do |f| -%>
2
2
  <div class="row-fluid">
3
3
  <div class="modal-body">
4
4
  <%= render 'shared/error_messages', :object => resource %>
@@ -6,7 +6,7 @@
6
6
  <div class = "widget-header"><i class = "fa fa-tasks"></i><h5><%= @section.name %></h5></div>
7
7
  <div class = "widget-body">
8
8
  <div class = "widget-forms clearfix">
9
- <%= custom_form_for(@section, :url => section_path(@section)) do |f| %>
9
+ <%= adminpanel_form_for(@section, :url => section_path(@section)) do |f| %>
10
10
  <%= render 'shared/error_messages', :object => @section %>
11
11
 
12
12
  <% if @section.has_description %>
@@ -1,102 +1,105 @@
1
1
  <% @model.form_attributes.each do |entries| %>
2
2
  <% entries.each do |attribute, properties| %>
3
3
 
4
- <% if properties['type'] == 'wysiwyg_field' %>
5
- <% type = properties['type'] %>
6
- <% args = properties.except('type') %>
7
- <div style="display:none;">
8
- <%= f.hidden_field attribute, :id => "#{attribute}-field", :value => resource.send(attribute) %>
9
- </div>
10
- <%= f.send(type, attribute, args) %>
11
- <%= content_for :scripts do %>
12
- <script type="text/javascript">
13
- <%= render 'shared/init_editor', :field_var => attribute, :label => properties[:label] %>
14
- </script>
15
- <% end %>
4
+ <% field_type = properties['type'] %>
5
+ <% properties = properties.except('type') %>
16
6
 
17
- <% elsif properties['type'] == 'adminpanel_file_field' %>
18
- <% if !defined? remote_request %>
19
- <%= content_tag :div, :class => 'file-collection-container', :data => {:max => properties['max-files'].nil? ? 0 : properties['max-files'] } do %>
20
- <%= f.fields_for(attribute) do |builder| %>
21
- <%= render 'shared/image_fields', :f => builder %>
22
- <% end -%>
23
- <%= link_to_add_fields t("Add Image"), f, attribute %>
24
- <% end %>
7
+ <% if field_type == 'wysiwyg_field' %>
8
+ <%= f.send(field_type, attribute) %>
25
9
 
26
- <% end %>
27
- <% elsif properties['type'] == 'belongs_to' %>
28
- <% if !defined? remote_request %>
29
- <% args = properties.except('type', 'model') %>
30
- <% args.symbolize_keys! %>
31
- <%= f.select(attribute, (@collections["#{properties["model"]}"].collect{|resource| [resource.name, resource.id]}), args) %>
10
+ <% elsif field_type == 'adminpanel_file_field' %>
32
11
 
12
+ <% if !defined? remote_request %>
13
+ <!-- if not making resource from other form -->
14
+ <%= content_tag :div, :class => 'file-collection-container', :data => {:max => properties['max-files'].nil? ? 0 : properties['max-files'] } do %>
15
+ <%= f.fields_for(attribute) do |builder| %>
16
+ <%= render 'shared/image_fields', :f => builder %>
17
+ <% end -%>
18
+ <%= link_to_add_fields t('Add Image'), f, attribute %>
19
+ <% end %>
33
20
 
34
- <% if(properties['remote_resource'].nil? || properties['remote_resource']) %>
35
- <!-- Button to create a new of this belongs_to resource -->
36
- <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
37
- <%=
38
- link_to(
39
- I18n.t('other.add',
40
- :model => properties['model'].classify.constantize.display_name
41
- ),
42
- polymorphic_path(
43
- [:new, :"#{model_name}"],
44
- :model => @model.display_name,
45
- :model_name => @model.name.demodulize.downcase,
46
- :belongs_request => true
47
- ),
48
- :class => 'btn btn-info',
49
- :id => "#{model_name}-modal-link",
50
- :'data-target' => "#new-modal",
51
- :'data-toggle' => 'modal',
52
- :remote => true
53
- )
54
- %>
55
21
  <% end %>
22
+ <% elsif field_type == 'belongs_to' %>
23
+ <% if !defined? remote_request %>
24
+ <!-- if not making resource from other form
25
+ so we don't have to manage infinite nested forms
26
+ -->
27
+ <% args = properties.except('model') %>
28
+ <%= f.select(attribute, (@collections["#{properties["model"]}"].collect{|resource| [resource.name, resource.id]}), args) %>
56
29
 
57
30
 
58
- <% end %>
59
- <% elsif properties['type'] == 'has_many' %>
60
- <% if !defined? remote_request %>
61
- <div class="control-group">
62
- <div class="control-label">
63
- <%= I18n.t('other.choose', :model => properties['model'].classify.constantize.display_name.pluralize) %>
64
- </div>
65
- <%= hidden_field_tag("#{class_name_downcase(f.object)}[#{relationship_ids(properties["model"])}][]", nil) %>
66
- <div class="controls" id="<%= properties['model'].demodulize.downcase %>-relation">
67
- <% @collections["#{properties['model']}"].each do |resource| %>
68
- <%= f.checkbox(resource, class_name_downcase(f.object) ,relationship_ids(properties["model"])) %>
69
- <% end %>
31
+ <% if(properties['remote_resource'].nil? || properties['remote_resource']) %>
32
+ <!--
33
+ Button to create a new of this belongs_to resource
34
+ if it's supposed to be created remotely
35
+ -->
36
+ <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
37
+ <%=
38
+ link_to(
39
+ I18n.t('other.add',
40
+ :model => properties['model'].classify.constantize.display_name
41
+ ),
42
+ polymorphic_path(
43
+ [:new, :"#{model_name}"],
44
+ :model => @model.display_name,
45
+ :model_name => @model.name.demodulize.downcase,
46
+ :belongs_request => true
47
+ ),
48
+ :class => 'btn btn-info',
49
+ :id => "#{model_name}-modal-link",
50
+ :'data-target' => "#new-modal",
51
+ :'data-toggle' => 'modal',
52
+ :remote => true
53
+ )
54
+ %>
55
+ <% end %>
56
+ <% end %>
57
+ <% elsif field_type == 'has_many' %>
58
+ <% if !defined? remote_request %>
59
+ <div class="control-group">
60
+ <div class="control-label">
61
+ <%= properties['label'] %>
62
+ </div>
63
+ <%= hidden_field_tag("#{class_name_downcase(f.object)}[#{relationship_ids(properties["model"])}][]", nil) %>
64
+ <div class="controls" id="<%= properties['model'].demodulize.downcase %>-relation">
65
+ <% @collections["#{properties['model']}"].each do |resource| %>
66
+ <%= f.checkbox(resource, class_name_downcase(f.object) ,relationship_ids(properties["model"])) %>
67
+ <% end %>
68
+ </div>
70
69
  </div>
71
- </div>
72
70
 
73
- <% if properties['remote_resource'].nil? || propeties['remote_resource'] %>
74
- <!-- Button to create a new of this has_many resource -->
75
- <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
76
- <%=
77
- link_to(
78
- I18n.t('other.add',
79
- :model => properties['model'].classify.constantize.display_name
80
- ),
81
- polymorphic_path(
82
- [:new, :"#{model_name}"],
83
- :model => @model.display_name,
84
- :model_name => @model.name.demodulize.downcase
85
- ),
86
- :class => 'btn btn-info',
87
- :id => "#{model_name}-modal-link",
88
- :'data-target' => "#new-modal",
89
- :'data-toggle' => 'modal',
90
- :remote => true
91
- )
92
- %>
71
+ <% if properties['remote_resource'].nil? || propeties['remote_resource'] %>
72
+ <!-- Button to create a new of this has_many resource
73
+ if it can be created remotely -->
74
+ <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
75
+ <%=
76
+ link_to(
77
+ I18n.t('other.add',
78
+ :model => properties['model'].classify.constantize.display_name
79
+ ),
80
+ polymorphic_path(
81
+ [:new, :"#{model_name}"],
82
+ :model => @model.display_name,
83
+ :model_name => @model.name.demodulize.downcase
84
+ ),
85
+ :class => 'btn btn-info',
86
+ :id => "#{model_name}-modal-link",
87
+ :'data-target' => "#new-modal",
88
+ :'data-toggle' => 'modal',
89
+ :remote => true
90
+ )
91
+ %>
92
+ <% end %>
93
93
  <% end %>
94
- <% end %>
95
94
 
96
- <% else %>
97
- <% type = properties['type'] %>
98
- <% args = properties.except('type', 'name') %>
99
- <%= f.send(type, attribute, args) %>
95
+ <% elsif field_type == 'file_field' %>
96
+ <% if !defined? remote_request %>
97
+ <% args = properties.except('name') %>
98
+ <%= f.send(field_type, attribute, args) %>
99
+ <% end %>
100
+ <% else %>
101
+ <% args = properties.except('name') %>
102
+ <%= f.send(field_type, attribute, args) %>
100
103
  <% end %>
101
104
 
102
105
  <% end %>