express_admin 1.2.1 → 1.3.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. checksums.yaml +4 -4
  2. data/app/assets/javascripts/express_admin.js +2 -0
  3. data/app/assets/javascripts/express_admin/admin.js +2 -0
  4. data/app/assets/stylesheets/express_admin.css +0 -5
  5. data/app/assets/stylesheets/express_admin/components/_definition.sass +8 -0
  6. data/app/assets/stylesheets/express_admin/components/_pane.sass +2 -2
  7. data/app/assets/stylesheets/express_admin/components/_sub_menu.sass +2 -2
  8. data/app/assets/stylesheets/express_admin/components/_widget_box.sass +4 -4
  9. data/app/assets/stylesheets/express_admin/globals/_foundation_overrides.sass +2 -1
  10. data/app/assets/stylesheets/express_admin/globals/_mixins.sass +0 -2
  11. data/app/assets/stylesheets/express_admin/plugins/_select2.sass +475 -68
  12. data/app/assets/stylesheets/express_admin/plugins/_tinymce.sass +2 -0
  13. data/app/assets/stylesheets/express_admin/screen.sass +6 -1
  14. data/app/assets/stylesheets/express_admin/sections/_header.sass +1 -0
  15. data/app/assets/stylesheets/express_admin/sections/_main_content.sass +6 -2
  16. data/app/assets/stylesheets/express_admin/sections/_main_region.sass +10 -7
  17. data/app/assets/stylesheets/express_admin/sections/_page_body.sass +6 -3
  18. data/app/assets/stylesheets/express_admin/sections/_page_sidebar.sass +6 -2
  19. data/app/assets/stylesheets/express_admin/sections/_sidebar_region.sass +4 -3
  20. data/app/assets/stylesheets/express_admin/shared/_buttons.sass +0 -1
  21. data/app/assets/stylesheets/express_admin/shared/_forms.sass +14 -2
  22. data/app/assets/stylesheets/express_admin/shared/_trees.sass +7 -3
  23. data/app/assets/stylesheets/ionicons/{ionicons.css.sass → ionicons.sass} +0 -0
  24. data/app/components/express_admin/addon_sidebar_component.rb +23 -34
  25. data/app/components/express_admin/definition_list.rb +38 -0
  26. data/app/components/express_admin/definition_table.rb +51 -0
  27. data/app/components/express_admin/flash_message_component.rb +5 -11
  28. data/app/components/express_admin/layout_component.rb +2 -9
  29. data/app/components/express_admin/main_region.rb +4 -4
  30. data/app/components/express_admin/mega_menu_component.rb +40 -34
  31. data/app/components/express_admin/page_header_component.rb +8 -18
  32. data/app/components/express_admin/pane.rb +13 -10
  33. data/app/components/express_admin/setting_form.rb +23 -20
  34. data/app/components/express_admin/sidebar_region.rb +6 -4
  35. data/app/components/express_admin/smart_form.rb +21 -18
  36. data/app/components/express_admin/smart_table.rb +44 -40
  37. data/app/components/express_admin/widget_box.rb +8 -8
  38. data/app/helpers/express_admin/admin_helper.rb +1 -1
  39. data/app/views/devise/sessions/new.html.et +63 -0
  40. data/app/views/layouts/express_admin/admin.html.et +8 -9
  41. data/app/views/shared/express_admin/_navigation_bar.html.et +6 -5
  42. data/config/tinymce.yml +29 -0
  43. data/lib/core_extensions/string_promptify.rb +9 -0
  44. data/lib/express_admin.rb +1 -0
  45. data/lib/express_admin/engine.rb +11 -9
  46. data/lib/express_admin/version.rb +1 -1
  47. data/lib/generators/express_admin/install/install_generator.rb +7 -0
  48. data/lib/generators/express_admin/install/templates/views/devise/sessions/new.html.et +1 -0
  49. data/test/dummy/app/views/demo/sign_in.html.et +6 -6
  50. data/test/dummy/db/test.sqlite3 +0 -0
  51. data/test/dummy/log/test.log +11361 -0
  52. data/test/dummy/test/components/smart_form_test.rb +57 -34
  53. data/test/dummy/test/components/smart_table_test.rb +35 -35
  54. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/1EoyfDwFVtgMAOjo7HPkor8TQbVaioOFx9hildx_DTQ.cache +0 -0
  55. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/4OPIkynisipUm8vKo57HUhBMWFSHBno_IH6OdpK29IA.cache +1 -0
  56. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/4hK1AdPGHbXGkebvk-nSvhxtCdOSlMYNWvA43CvQKhI.cache +0 -0
  57. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/6c0H20s6oHf45XogeDELaojxa0PX1NmirTTWV1ClcRw.cache +0 -0
  58. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/9QvwPXfTSVmgQX6tdK9GuCn0--MZ8Z8eJJbHpUEq1p8.cache +1 -0
  59. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/BoKdGhgi5NHfGTc42p9nltpEIYj_BBUxVdv7YhpBmmA.cache +0 -0
  60. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/GJGMlSyTg1AvPCV_6PaLOTVEKbHeVKY1jhCoaKuRlxM.cache +1 -0
  61. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/H0aD5KRj-4fhORkqWcWZfKPOQfu_ggvt4OmYOl4S5mw.cache +0 -0
  62. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/IBLgVNsKBbJxN8NQnh6zTc3bC_OG-8BhtA3xCNDV6ks.cache +1 -0
  63. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Po8q4NrWy9Kymnz_HbOk-WbdGY_KuuXc6urGogTHe7U.cache +0 -0
  64. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/V1aP9G-CVtOLR5PTnHleid8WC9TSfFAT1DzAygp_5CQ.cache +1 -0
  65. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/WhePtBvZPmF1Jhdcc4glsjhxBJQo9Qw0CDgy_F8lClY.cache +0 -0
  66. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/dVokuKbK8HbOtvPIksKGBAYE8x44l372dQ0gEISqbdo.cache +0 -0
  67. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/oN1zSGeSEz4KhkAuUF_yFDsCVPkulfFjomEAjFzGdPc.cache +0 -0
  68. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/qIeSoker4TjM7JYRQTOjgRd4nN0WeHnNY1GMK7Zpe8M.cache +0 -0
  69. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/tTFLM1bjKSeg4nyH7GWbTY6JVvuYhNKFFvsOMS9h8O0.cache +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/tzX-HHF4F70o-aSB9Z_duoPxFGDv3auYnrpko9SYafU.cache +1 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/vMbWbI1SO5bEaiu2pRvV8NDmms_j5flYoRvCSJavhdU.cache +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ypZCDLo54Pz2ZoUxrxSEUjT5FYMAq8Ozp8OTOYDRdAE.cache +0 -0
  73. data/test/fixtures/categories.yml +8 -0
  74. data/test/test_helper.rb +34 -0
  75. data/vendor/gems/express_templates/CHANGELOG.md +12 -0
  76. data/vendor/gems/express_templates/Gemfile.lock +4 -1
  77. data/vendor/gems/express_templates/README.md +22 -41
  78. data/vendor/gems/express_templates/express_templates.gemspec +1 -0
  79. data/vendor/gems/express_templates/lib/arbre/patches.rb +50 -0
  80. data/vendor/gems/express_templates/lib/core_extensions/proc.rb +1 -0
  81. data/vendor/gems/express_templates/lib/express_templates.rb +2 -3
  82. data/vendor/gems/express_templates/lib/express_templates/compiler.rb +2 -7
  83. data/vendor/gems/express_templates/lib/express_templates/components.rb +1 -9
  84. data/vendor/gems/express_templates/lib/express_templates/components/base.rb +33 -37
  85. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +30 -18
  86. data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +41 -0
  87. data/vendor/gems/express_templates/lib/express_templates/components/form_rails_support.rb +5 -6
  88. data/vendor/gems/express_templates/lib/express_templates/components/forms.rb +0 -1
  89. data/vendor/gems/express_templates/lib/express_templates/components/forms/basic_fields.rb +3 -6
  90. data/vendor/gems/express_templates/lib/express_templates/components/forms/checkbox.rb +1 -1
  91. data/vendor/gems/express_templates/lib/express_templates/components/forms/express_form.rb +15 -25
  92. data/vendor/gems/express_templates/lib/express_templates/components/forms/form_component.rb +20 -11
  93. data/vendor/gems/express_templates/lib/express_templates/components/forms/option_support.rb +2 -2
  94. data/vendor/gems/express_templates/lib/express_templates/components/forms/radio.rb +7 -8
  95. data/vendor/gems/express_templates/lib/express_templates/components/forms/select.rb +61 -37
  96. data/vendor/gems/express_templates/lib/express_templates/components/forms/select_collection.rb +2 -8
  97. data/vendor/gems/express_templates/lib/express_templates/components/forms/submit.rb +7 -6
  98. data/vendor/gems/express_templates/lib/express_templates/components/tree_for.rb +26 -42
  99. data/vendor/gems/express_templates/lib/express_templates/version.rb +1 -1
  100. data/vendor/gems/express_templates/test/components/base_test.rb +17 -15
  101. data/vendor/gems/express_templates/test/components/capabilities/resourceful_test.rb +3 -3
  102. data/vendor/gems/express_templates/test/components/configurable_test.rb +27 -21
  103. data/vendor/gems/express_templates/test/components/forms/basic_fields_test.rb +57 -17
  104. data/vendor/gems/express_templates/test/components/forms/checkbox_test.rb +16 -22
  105. data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +23 -76
  106. data/vendor/gems/express_templates/test/components/forms/radio_test.rb +31 -27
  107. data/vendor/gems/express_templates/test/components/forms/select_test.rb +46 -71
  108. data/vendor/gems/express_templates/test/components/forms/submit_test.rb +10 -5
  109. data/vendor/gems/express_templates/test/components/tree_for_test.rb +24 -52
  110. data/vendor/gems/express_templates/test/dummy/app/views/hello/show.html.et +4 -3
  111. data/vendor/gems/express_templates/test/dummy/app/views/layouts/application.html.et +1 -1
  112. data/vendor/gems/express_templates/test/dummy/log/test.log +4296 -0
  113. data/vendor/gems/express_templates/test/express_templates_test.rb +5 -1
  114. data/vendor/gems/express_templates/test/handler_test.rb +19 -17
  115. data/vendor/gems/express_templates/test/performance_test.rb +11 -7
  116. data/vendor/gems/express_templates/test/test_helper.rb +162 -1
  117. metadata +58 -47
  118. data/app/assets/stylesheets/express_admin/components/_megadropdown.sass +0 -66
  119. data/vendor/gems/express_templates/diagrams/diagram.graffle +0 -2404
  120. data/vendor/gems/express_templates/diagrams/diagram_express_templates.png +0 -0
  121. data/vendor/gems/express_templates/diagrams/diagram_haml_erb.png +0 -0
  122. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/adoptable.rb +0 -20
  123. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/building.rb +0 -14
  124. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/conditionality.rb +0 -54
  125. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/configurable.rb +0 -90
  126. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/iterating.rb +0 -75
  127. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/parenting.rb +0 -72
  128. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/rendering.rb +0 -30
  129. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/templating.rb +0 -198
  130. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/wrapping.rb +0 -84
  131. data/vendor/gems/express_templates/lib/express_templates/components/column.rb +0 -13
  132. data/vendor/gems/express_templates/lib/express_templates/components/container.rb +0 -7
  133. data/vendor/gems/express_templates/lib/express_templates/components/content_for.rb +0 -42
  134. data/vendor/gems/express_templates/lib/express_templates/components/for_each.rb +0 -30
  135. data/vendor/gems/express_templates/lib/express_templates/components/forms/form_support.rb +0 -13
  136. data/vendor/gems/express_templates/lib/express_templates/components/null_wrap.rb +0 -41
  137. data/vendor/gems/express_templates/lib/express_templates/components/row.rb +0 -28
  138. data/vendor/gems/express_templates/lib/express_templates/components/table_for.rb +0 -163
  139. data/vendor/gems/express_templates/lib/express_templates/components/unless_block.rb +0 -40
  140. data/vendor/gems/express_templates/lib/express_templates/expander.rb +0 -140
  141. data/vendor/gems/express_templates/lib/express_templates/macro.rb +0 -45
  142. data/vendor/gems/express_templates/lib/express_templates/markup.rb +0 -9
  143. data/vendor/gems/express_templates/lib/express_templates/markup/html_tag.rb +0 -62
  144. data/vendor/gems/express_templates/lib/express_templates/markup/tag.rb +0 -150
  145. data/vendor/gems/express_templates/lib/express_templates/markup/wrapper.rb +0 -94
  146. data/vendor/gems/express_templates/lib/express_templates/markup/yielder.rb +0 -21
  147. data/vendor/gems/express_templates/test/components/column_test.rb +0 -11
  148. data/vendor/gems/express_templates/test/components/conditionality_test.rb +0 -37
  149. data/vendor/gems/express_templates/test/components/container_test.rb +0 -66
  150. data/vendor/gems/express_templates/test/components/content_for_test.rb +0 -60
  151. data/vendor/gems/express_templates/test/components/iterating_test.rb +0 -127
  152. data/vendor/gems/express_templates/test/components/null_wrap_test.rb +0 -28
  153. data/vendor/gems/express_templates/test/components/row_test.rb +0 -16
  154. data/vendor/gems/express_templates/test/components/table_for_test.rb +0 -211
  155. data/vendor/gems/express_templates/test/expander_stack_test.rb +0 -41
  156. data/vendor/gems/express_templates/test/expander_test.rb +0 -99
  157. data/vendor/gems/express_templates/test/markup/tag_test.rb +0 -149
  158. data/vendor/gems/express_templates/test/markup/wrapper_test.rb +0 -42
  159. data/vendor/gems/express_templates/test/markup/yielder_test.rb +0 -9
@@ -1,17 +1,11 @@
1
1
  module ExpressTemplates
2
2
  module Components
3
3
  module Forms
4
- class FormComponent < Base
5
- include Capabilities::Configurable
6
- include Capabilities::Adoptable
7
-
8
- def compile(*args)
9
- raise "#{self.class} requires a parent ExpressForm" if parent.nil? or parent_form.nil?
10
- super(*args)
11
- end
4
+ class FormComponent < Configurable
12
5
 
13
6
  # Lookup the resource_name from the parent ExpressForm.
14
7
  def resource_name
8
+ raise "FormComponent must have a parent form" unless parent_form
15
9
  parent_form.resource_name
16
10
  end
17
11
 
@@ -30,13 +24,13 @@ module ExpressTemplates
30
24
 
31
25
  # Return the text content for the label
32
26
  def label_text
33
- @config[:label] || field_name.titleize
27
+ config[:label] || field_name.titleize
34
28
  end
35
29
 
36
30
  # Return the field_name as a string. This taken from the first argument
37
31
  # to the component macro in the template or fragment.
38
32
  def field_name
39
- (@config[:id] || (@args.first.is_a?(String) && @args.first)).to_s
33
+ (config[:id] || (@args.first.is_a?(String) && @args.first)).to_s
40
34
  end
41
35
 
42
36
  # Return the field name attribute. Currently handles only simple attributes
@@ -46,7 +40,7 @@ module ExpressTemplates
46
40
  end
47
41
 
48
42
  def field_wrapper_class
49
- @config[:wrapper_class] || 'field-wrapper'
43
+ config[:wrapper_class] || 'field-wrapper'
50
44
  end
51
45
 
52
46
  # Search the parent graph until we find an ExpressForm. Returns nil if none found.
@@ -58,6 +52,21 @@ module ExpressTemplates
58
52
  return @my_form
59
53
  end
60
54
 
55
+ def default_html_options
56
+ (config || {}).reject {|k,v| k.eql?(:id)}
57
+ end
58
+
59
+ def html_options
60
+ default_html_options.merge(config[:html_options] || {})
61
+ end
62
+
63
+ protected
64
+
65
+ def _process_args!(args)
66
+ @args = args
67
+ super(args)
68
+ end
69
+
61
70
  end
62
71
  end
63
72
  end
@@ -28,9 +28,9 @@ module ExpressTemplates
28
28
  reflection = belongs_to_association || has_many_through_association
29
29
  if reflection && !reflection.polymorphic?
30
30
  if cols.detect {|column| column.name.eql?('name') }
31
- "#{reflection.klass}.all.select(:#{option_value_method}, :#{option_name_method}).order(:#{option_name_method})"
31
+ reflection.klass.select(option_value_method.to_sym, option_name_method.to_sym).order(option_name_method.to_sym)
32
32
  else
33
- "#{reflection.klass}.all.sort_by(&:#{option_name_method})"
33
+ reflection.klass.all.sort_by(&option_name_method.to_sym)
34
34
  end
35
35
  end
36
36
  end
@@ -16,8 +16,7 @@ module ExpressTemplates
16
16
  }
17
17
 
18
18
  def use_options_from_collection_radio_buttons_helper
19
- # Note {{ }} will get stripped. This prevents the collection finder string being passed as string.
20
- collection_radio_buttons(resource_var, field_name.to_sym, "{{#{collection_from_association}}}",
19
+ collection_radio_buttons(resource_var, field_name.to_sym, collection_from_association,
21
20
  option_value_method, option_name_method,
22
21
  field_options, html_options) do |b|
23
22
  b.label(class: "radio") {
@@ -31,11 +30,11 @@ module ExpressTemplates
31
30
  end
32
31
 
33
32
  def option_collection
34
- @args.second
33
+ @args.first
35
34
  end
36
35
 
37
36
  def wrapper_class
38
- @config[:wrapper_class] || 'wrapper-class'
37
+ config[:wrapper_class] || 'wrapper-class'
39
38
  end
40
39
 
41
40
  def generate_options_from_specified_values
@@ -44,14 +43,14 @@ module ExpressTemplates
44
43
  option_collection.each_with_index do |option, index|
45
44
  label(class: wrapper_class) {
46
45
  radio_button(resource_var, field_name.to_sym, option, class: 'radio')
47
- null_wrap { option }
46
+ current_arbre_element.add_child option
48
47
  }
49
48
  end
50
49
  when option_collection.kind_of?(Hash)
51
50
  option_collection.each_pair do |key, value|
52
51
  label(class: wrapper_class) {
53
52
  radio_button(resource_var, field_name.to_sym, key, class: 'radio')
54
- null_wrap { value }
53
+ current_arbre_element.add_child value
55
54
  }
56
55
  end
57
56
  else
@@ -66,8 +65,8 @@ module ExpressTemplates
66
65
  def field_options
67
66
  # If field_otions is omitted the Expander will be
68
67
  # in last or 3rd position and we don't want that
69
- if @args.size > 3 && @args[2].is_a?(Hash)
70
- @args[2]
68
+ if @args[1] && @args[1].is_a?(Hash)
69
+ @args[1]
71
70
  else
72
71
  {}
73
72
  end
@@ -26,39 +26,63 @@ module ExpressTemplates
26
26
  }
27
27
 
28
28
  def select_tag_args
29
- args = [field_name_attribute, select_options, field_options]
30
- args << html_options unless html_options.nil? or html_options.empty?
29
+ args = [field_name_attribute, select_options, select_helper_options]
31
30
  args
32
31
  end
33
32
 
34
- # Returns the options which will be supplied to the select_tag helper.
35
- def select_options
36
- options_specified = [Array, Hash, Proc].include?(@args.second.class) && @args.size > 2
37
- if options_specified
38
- if @args.second.respond_to?(:source) # can be a proc
39
- options = "#{@args.second.source}.call()"
40
- else
41
- options = @args.second
42
- end
33
+ def select_options_supplied?
34
+ [Array, Hash, Proc].include?(supplied_component_options[:options].class)
35
+ end
43
36
 
37
+ def use_supplied_options
38
+ opts = supplied_component_options[:options]
39
+ if opts.respond_to?(:call) # can be a proc
40
+ opts.call()
44
41
  else
45
- options = "@#{resource_var}.class.distinct(:#{field_name}).pluck(:#{field_name})"
42
+ opts
46
43
  end
44
+ end
47
45
 
48
- if belongs_to_association && !options_specified
49
- if belongs_to_association.polymorphic?
50
- "{{options_for_select([[]])}}"
51
- else
52
- "{{options_from_collection_for_select(#{related_collection}, :id, :#{option_name_method}, @#{resource_name}.#{field_name})}}"
53
- end
46
+ def generate_options_from_field_values
47
+ resource.class.distinct(field_name.to_sym).pluck(field_name.to_sym)
48
+ end
49
+
50
+ def options_from_supplied_or_field_values
51
+ if select_options_supplied?
52
+ use_supplied_options
53
+ else
54
+ generate_options_from_field_values
55
+ end
56
+ end
57
+
58
+ def options_from_belongs_to
59
+ if belongs_to_association.polymorphic?
60
+ helpers.options_for_select([[]]) # we can't really handle polymorhic yet
61
+ else
62
+ helpers.options_from_collection_for_select(related_collection, :id, option_name_method, resource.send(field_name))
63
+ end
64
+ end
65
+
66
+ def options_from_has_many_through
67
+ helpers.options_from_collection_for_select(related_collection, :id, option_name_method, resource.send(field_name).map(&:id))
68
+ end
69
+
70
+ def simple_options_with_selection
71
+ if selection = field_options[:selected]
72
+ helpers.options_for_select(options_from_supplied_or_field_values, selection)
73
+ else
74
+ helpers.options_for_select(options_from_supplied_or_field_values, resource.send(field_name))
75
+ end
76
+ end
77
+
78
+ # Returns the options which will be supplied to the select_tag helper.
79
+ def select_options
80
+ if belongs_to_association && !select_options_supplied?
81
+ options_from_belongs_to
54
82
  elsif has_many_through_association
55
- "{{options_from_collection_for_select(#{related_collection}, :id, :#{option_name_method}, @#{resource_name}.#{field_name}.map(&:id))}}"
83
+ options_from_has_many_through
56
84
  else
57
- if selection = field_options.delete(:selected)
58
- "{{options_for_select(#{options}, \"#{selection}\")}}"
59
- else
60
- "{{options_for_select(#{options}, @#{resource_name}.#{field_name})}}"
61
- end
85
+ simple_options_with_selection
62
86
  end
63
87
  end
64
88
 
@@ -74,26 +98,26 @@ module ExpressTemplates
74
98
  # If field_otions is omitted the Expander will be
75
99
  # in last or 3rd position and we don't want that
76
100
  defaults = {include_blank: true}
77
- defaults.merge(supplied_field_options.reject {|k,v| k.eql?(:select2)})
101
+ defaults.merge(supplied_component_options)
78
102
  end
79
103
 
80
- def html_options
81
- supplied_html_options
104
+ def select_helper_options
105
+ component_option_names = [:select2, :options, :selected]
106
+ add_select2_class( field_options.reject {|k,v| component_option_names.include?(k)})
82
107
  end
83
108
 
84
109
  protected
85
110
 
86
- def supplied_field_options
87
- if @args.size > 3 && @args[2].is_a?(Hash)
88
- @args[2]
89
- else
90
- {}
91
- end
111
+ def add_select2_class(helper_options)
112
+ add_class(helper_options[:class]) if helper_options[:class]
113
+ add_class('select2') if supplied_component_options[:select2] === true
114
+ helper_options[:class] = (class_list - ["select"]).to_s
115
+ helper_options
92
116
  end
93
117
 
94
- def supplied_html_options
95
- if @args.size > 4 && @args[3].is_a?(Hash)
96
- @args[3]
118
+ def supplied_component_options
119
+ if @args.last && @args.last.is_a?(Hash)
120
+ @args.last
97
121
  else
98
122
  {}
99
123
  end
@@ -102,4 +126,4 @@ module ExpressTemplates
102
126
  end
103
127
  end
104
128
  end
105
- end
129
+ end
@@ -17,7 +17,6 @@ module ExpressTemplates
17
17
  # need this because the collection_select helper does not provide
18
18
  # the hidden_field_tag trick (see rails api docs for select)
19
19
  hidden_field_tag(multi_field_name, '')
20
-
21
20
  collection_select(*collection_select_tag_args)
22
21
  }
23
22
  }
@@ -25,14 +24,13 @@ module ExpressTemplates
25
24
  def collection_select_tag_args
26
25
  [ resource_name,
27
26
  multi_field_name,
28
- select_options, :id, :name,
27
+ related_collection, :id, :name,
29
28
  field_options,
30
29
  html_options ]
31
30
  end
32
31
 
33
32
  def field_options
34
- selected_options_ruby = "@#{resource_name}.#{multi_field_name}".to_view_code
35
- super.merge(include_blank: false, selected: selected_options_ruby)
33
+ super.merge(include_blank: false)
36
34
  end
37
35
 
38
36
  def html_options
@@ -47,10 +45,6 @@ module ExpressTemplates
47
45
  end
48
46
  end
49
47
 
50
-
51
- def select_options
52
- "{{#{related_collection}}}"
53
- end
54
48
  end
55
49
  end
56
50
  end
@@ -3,11 +3,15 @@ module ExpressTemplates
3
3
  module Forms
4
4
  class Submit < FormComponent
5
5
 
6
- emits -> {
6
+ def build(*args)
7
7
  div(class: field_wrapper_class) {
8
- submit_tag(value, html_options)
8
+ if args.first.is_a?(String) or args.empty?
9
+ submit_tag(args.first || 'Save', (args[1]||{}))
10
+ else
11
+ submit_tag 'Save', (args[1] || {})
12
+ end
9
13
  }
10
- }
14
+ end
11
15
 
12
16
  def value
13
17
  if @args.first.is_a?(String)
@@ -17,9 +21,6 @@ module ExpressTemplates
17
21
  end
18
22
  end
19
23
 
20
- def html_options
21
- @config
22
- end
23
24
  end
24
25
  end
25
26
  end
@@ -11,8 +11,8 @@ module ExpressTemplates
11
11
  # Example:
12
12
  #
13
13
  # ```ruby
14
- # tree_for(:roles) {
15
- # "{{role.name}}"
14
+ # tree_for(:roles) { |role|
15
+ # role.name
16
16
  # }
17
17
  # ```
18
18
  #
@@ -36,51 +36,35 @@ module ExpressTemplates
36
36
  # </li>
37
37
  # </ul>
38
38
  #
39
- class TreeFor < Container
40
- def node_renderer
41
- return (-> (node, renderer) {
42
- ExpressTemplates::Indenter.for(:tree) do |ws, wsnl|
43
- "#{wsnl}<li>"+
44
- _yield +
45
- if node.children.any?
46
- ExpressTemplates::Indenter.for(:tree) do |ws, wsnl|
47
- "#{wsnl}<ul>" +
48
- node.children.map do |child|
49
- renderer.call(child, renderer)
50
- end.join +
51
- "#{wsnl}</ul>"
52
- end +
53
- "#{wsnl}</li>"
54
- else
55
- "</li>"
56
- end
57
- end
58
- }).source.sub(/\W_yield\W/, compile_children.lstrip)
39
+
40
+ class TreeFor < Configurable
41
+ emits -> (customize_block) {
42
+ @customize_block = customize_block
43
+ ul(id: config[:id], class: "#{config[:id]} tree") {
44
+ list_items(eval(config[:id].to_s))
45
+ }
46
+ }
47
+
48
+ def list_items(nodes)
49
+ nodes.each do |node|
50
+ list_item(node)
51
+ end
59
52
  end
60
53
 
61
- def compile
62
- collection = if @options[:collection]
63
- "#{@options[:collection].source}.call()"
54
+ def list_item(node)
55
+ li {
56
+ if @customize_block
57
+ @customize_block.call(node)
64
58
  else
65
- _variablize(@options[:id])
59
+ text_node "#{node.name}#{"\n" if node.children.any?}"
66
60
  end
67
- member = @options[:id].to_s.singularize
68
- return 'ExpressTemplates::Components::TreeFor.render_in(self) {
69
- node_renderer = '+node_renderer.gsub(/node/, member)+'
70
- ExpressTemplates::Indenter.for(:tree) do |ws, wsnl|
71
- "#{ws}<ul id=\"'+@options[:id]+'\" class=\"'+@options[:id]+' tree\">" +
72
- '+collection+'.map do |'+member+'|
73
- node_renderer.call('+member+', node_renderer)
74
- end.join +
75
- "#{wsnl}</ul>\n"
76
- end
77
- }'
61
+ if node.children.any?
62
+ ul {
63
+ list_items(node.children)
64
+ }
65
+ end
66
+ }
78
67
  end
79
-
80
- private
81
- def _variablize(sym)
82
- "@#{sym}"
83
- end
84
68
  end
85
69
  end
86
70
  end
@@ -1,3 +1,3 @@
1
1
  module ExpressTemplates
2
- VERSION = "0.5.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -2,33 +2,36 @@ require 'test_helper'
2
2
 
3
3
  class BaseTest < ActiveSupport::TestCase
4
4
 
5
+ def assigns
6
+ {}
7
+ end
8
+
5
9
  class NoLogic < ExpressTemplates::Components::Base
6
- has_markup -> {
10
+ emits {
7
11
  h1 { span "Some stuff" }
8
12
  }
9
13
  end
10
14
 
11
15
  test ".has_markup makes compile return the block passed through express compiled" do
12
- assert_equal %Q("<h1><span>Some stuff</span></h1>"), NoLogic.new.compile
16
+ assert_equal "<h1>\n <span>Some stuff</span>\n</h1>\n", ExpressTemplates.render(self) { no_logic }
13
17
  end
14
18
 
15
- test "components register themselves as macros" do
16
- assert ExpressTemplates::Expander.instance_methods.include?(:no_logic)
19
+ test "components register themselves as arbre builder methods" do
20
+ assert Arbre::Element::BuilderMethods.instance_methods.include?(:no_logic)
17
21
  end
18
22
 
19
23
  class Context
20
- def initialize ; @foo = ['bar', 'baz'] ; end
21
- end
22
-
23
- test "fragments and has_markup are synonyms for emits" do
24
- assert_equal NoLogic.method(:emits), NoLogic.method(:fragments)
25
- assert_equal NoLogic.method(:emits), NoLogic.method(:has_markup)
24
+ def assigns
25
+ {:foo => ['bar', 'baz']}
26
+ end
26
27
  end
27
28
 
28
- class Helpers < ECB
29
- helper :title_helper, &-> { @foo.first }
29
+ class HelperExample < ECB
30
+ def title_helper
31
+ foo.first
32
+ end
30
33
 
31
- emits -> {
34
+ emits {
32
35
  h1 {
33
36
  title_helper
34
37
  }
@@ -37,8 +40,7 @@ class BaseTest < ActiveSupport::TestCase
37
40
  end
38
41
 
39
42
  test "helpers defined in component are evaluated in context" do
40
- compiled = Helpers.new.compile
41
- assert_equal "<h1>bar</h1>", Context.new.instance_eval(Interpolator.transform(compiled))
43
+ assert_equal "<h1>bar</h1>\n", ExpressTemplates.render(Context.new) { helper_example }
42
44
  end
43
45
 
44
46
  end