express_admin 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_dependency "activesupport", "~> 4.2" # strictly speaking we only depend on active support
21
21
  s.add_dependency "parslet", "~> 1.6"
22
+ s.add_dependency "arbre"
22
23
  s.add_development_dependency "rails", "~> 4.2"
23
24
  s.add_development_dependency "pry", "~> 0"
24
25
  s.add_development_dependency "erubis", "~> 2.7"
@@ -0,0 +1,50 @@
1
+ module Arbre
2
+ class Context
3
+ def resource
4
+ helpers.resource
5
+ end
6
+ end
7
+
8
+ class Element
9
+
10
+ module BuilderMethods
11
+
12
+ # we do not want to check the arity of the
13
+ # block in express templates because components
14
+ # are expected to be able to contain other components or template code
15
+ # without use of a builder style syntax
16
+ def build_tag(klass, *args, &block)
17
+ tag = klass.new(arbre_context)
18
+ tag.parent = current_arbre_element
19
+
20
+ with_current_arbre_element tag do
21
+ tag.build(*args, &block)
22
+ end
23
+
24
+ tag
25
+ end
26
+ end
27
+
28
+ # Implements the method lookup chain. When you call a method that
29
+ # doesn't exist, we:
30
+ #
31
+ # 1. Try to call the method on the current DOM context
32
+ # 2. Return an assigned variable of the same name
33
+ # 3. Call the method on the helper object
34
+ # 4. Call super
35
+ #
36
+ def method_missing(name, *args, &block)
37
+ if current_arbre_element.respond_to?(name)
38
+ current_arbre_element.send name, *args, &block
39
+ elsif assigns && assigns.has_key?(name)
40
+ assigns[name]
41
+ elsif helpers.respond_to?(name)
42
+ current_arbre_element.add_child helpers.send(name, *args, &block)
43
+ else
44
+ super
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -24,6 +24,7 @@ class Proc
24
24
  def source
25
25
  @source ||= begin
26
26
  file, line_no = source_location
27
+ raise "no file provided by source_location: #{self}" if file.nil?
27
28
  raise "no line number provided for source_location: #{self}" if line_no.nil?
28
29
  tokens = Ripper.lex File.read(file)
29
30
  tokens_on_line = tokens.select {|pos, lbl, str| pos[0].eql?(line_no) }
@@ -1,13 +1,12 @@
1
1
  module ExpressTemplates
2
+ require 'arbre'
3
+ require 'arbre/patches'
2
4
  require 'core_extensions/proc'
3
5
  require 'core_extensions/string'
4
6
  require 'express_templates/indenter'
5
- require 'express_templates/macro'
6
- require 'express_templates/markup'
7
7
  require 'express_templates/components'
8
8
  require 'express_templates/template/handler'
9
9
  require 'express_templates/renderer'
10
- require 'express_templates/expander'
11
10
  require 'express_templates/compiler'
12
11
  require 'express_templates/interpolator'
13
12
  extend Renderer
@@ -1,3 +1,4 @@
1
+ require 'ostruct'
1
2
  module ExpressTemplates
2
3
  module Compiler
3
4
  def compile(template_or_src=nil, &block)
@@ -12,13 +13,7 @@ module ExpressTemplates
12
13
 
13
14
  template, src = _normalize(template_or_src)
14
15
 
15
- expander = Expander.new(template)
16
-
17
- compiled = expander.expand(src, &block).map(&:compile)
18
-
19
- return Interpolator.transform(compiled.join("+").gsub('"+"', '')).tap do |s|
20
- puts("\n"+template.inspect+"\nSource:\n#{template.try(:source)}\nInterpolated:\n#{s}\n") if ENV['DEBUG'].eql?('true')
21
- end
16
+ %Q[Arbre::Context.new(assigns.merge(template_virtual_path: @virtual_path), self) { #{src || block.source_body} }.to_s]
22
17
  end
23
18
 
24
19
  private
@@ -3,16 +3,8 @@ module ExpressTemplates
3
3
  end
4
4
  end
5
5
 
6
- require 'express_templates/expander'
7
6
  require 'express_templates/components/base'
8
- require 'express_templates/components/container'
9
- require 'express_templates/components/null_wrap'
10
- require 'express_templates/components/for_each'
11
- require 'express_templates/components/unless_block'
12
- require 'express_templates/components/row'
13
- require 'express_templates/components/column'
7
+ require 'express_templates/components/configurable'
14
8
  require 'express_templates/components/form_rails_support'
15
- require 'express_templates/components/content_for'
16
- require 'express_templates/components/table_for'
17
9
  require 'express_templates/components/tree_for'
18
10
  require 'express_templates/components/forms'
@@ -5,50 +5,46 @@ module ExpressTemplates
5
5
  # Components provide self-contained reusable view code meant to be shared
6
6
  # within a project or across many projects through a library of components
7
7
  #
8
- # Components gain their functionality through inclusion of Capabilities.
9
- #
10
- # Most Components are descendents of Components::Base.
11
- #
12
8
  module Components
13
9
 
14
10
  # Components::Base is the base class for ExpressTemplates view components.
15
11
  #
16
- # View components are available as macros in ExpressTemplates and may be
17
- # used to encapsulate common view patterns, behavior and functionality in
18
- # reusable classes that can be shared within and across projects.
19
- #
20
- # Components intended to provide a base framework for a library of reusable
21
- # components to cut development time across a multitude of projects.
22
- #
23
- # Components gain their functionality through including Capabilities.
24
- #
25
- # Example capabilities include:
26
- #
27
- # * Managing related ExpressTemplate fragments
28
- # * Compiling template fragments for evaluation in a View Context
29
- # * Specifying rendering logic to be executed in the View Context
30
- # * Potentially referencing external assets that may be required
31
- # for the component to work.
32
12
  #
33
- # Components::Base includes the following capabilities:
34
- #
35
- # * Capabilities::Templating
36
- # * Capabilities::Rendering
37
- # * Capabilities::Wrapping
38
- # * Capabilities::Iterating
39
- #
40
- class Base < Expander
41
- include ExpressTemplates::Macro
42
- include Capabilities::Templating
43
- include Capabilities::Rendering
44
- include Capabilities::Wrapping
45
- include Capabilities::Iterating
46
-
47
- def self.inherited(klass)
48
- ExpressTemplates::Expander.register_macros_for klass
13
+ class Base < Arbre::Component
14
+
15
+ def self.builder_method_and_class(method_name, klass)
16
+ Arbre::Element::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__
17
+ def #{method_name}(*args, &block)
18
+ insert_tag ::#{klass.name}, *args, &block
19
+ end
20
+ EOF
21
+ # puts "added #{method_name} -> #{klass.name}"
49
22
  end
50
23
 
51
- end
24
+ def self.emits(proc = nil, &block)
25
+ define_method(:build, &(proc || block))
26
+ end
52
27
 
28
+ def build(*args, block)
29
+ raise "#build method must be overridden"
30
+ end
31
+
32
+ def resource
33
+ helpers.resource
34
+ end
35
+
36
+ def self.inherited(subclass)
37
+ builder_method_and_class subclass.to_s.demodulize.underscore, subclass
38
+ end
39
+
40
+ def indent_level
41
+ parent_indent_level = parent.try(:indent_level) || 0
42
+ end
43
+
44
+ def to_s
45
+ children.to_s
46
+ end
47
+
48
+ end
53
49
  end
54
50
  end
@@ -4,15 +4,15 @@ module ExpressTemplates
4
4
 
5
5
  module Resourceful
6
6
  def namespace
7
- @config[:namespace] || infer_namespace
7
+ config[:namespace] || infer_namespace
8
8
  end
9
9
 
10
10
  def path_prefix
11
- @config[:path_prefix] || infer_path_prefix
11
+ config[:path_prefix] || infer_path_prefix
12
12
  end
13
13
 
14
14
  def resource_class
15
- resource_class = @config[:resource_class] || _namespaced_resource_class
15
+ resource_class = config[:resource_class] || _namespaced_resource_class
16
16
  resource_class.constantize
17
17
  end
18
18
 
@@ -26,10 +26,17 @@ module ExpressTemplates
26
26
  end
27
27
  end
28
28
 
29
+ def template_virtual_path
30
+ begin
31
+ super
32
+ rescue
33
+ nil
34
+ end
35
+ end
36
+
29
37
  def infer_namespace
30
- expander = @args.last
31
- if expander.try(:template)
32
- path_parts = expander.template.virtual_path.split('/')
38
+ if template_virtual_path
39
+ path_parts = template_virtual_path.split('/')
33
40
 
34
41
  case
35
42
  when path_parts.size == 4
@@ -50,9 +57,8 @@ module ExpressTemplates
50
57
  end
51
58
 
52
59
  def infer_path_prefix
53
- expander = @args.last
54
- if expander.try(:template)
55
- path_parts = expander.template.virtual_path.split('/')
60
+ if template_virtual_path
61
+ path_parts = template_virtual_path.split('/')
56
62
 
57
63
  case
58
64
  when path_parts.size == 4
@@ -75,7 +81,7 @@ module ExpressTemplates
75
81
  # TODO: this can now be inferred from the template.virtual_path
76
82
  # if not supplied...
77
83
  def resource_name
78
- @config[:id].to_s.singularize
84
+ config[:id].to_s.singularize
79
85
  end
80
86
 
81
87
  def collection_member_name
@@ -91,14 +97,15 @@ module ExpressTemplates
91
97
  end
92
98
 
93
99
  def collection
94
- @config[:collection] || collection_var
100
+ config[:collection] || helpers.collection
95
101
  end
96
102
 
97
103
  def collection_path
98
- if @config[:collection_path]
99
- @config[:collection_path]
104
+ if config[:collection_path]
105
+ config[:collection_path]
100
106
  else
101
- "#{collection_name_with_prefix}_path"
107
+ #super
108
+ helpers.instance_eval "#{collection_name_with_prefix}_path"
102
109
  end
103
110
  end
104
111
 
@@ -110,11 +117,16 @@ module ExpressTemplates
110
117
  end
111
118
  end
112
119
 
120
+ def resource_path_helper
121
+ "#{resource_name_with_path_prefix}_path"
122
+ end
123
+
113
124
  def resource_path(ivar=false)
114
- if @config[:resource_path]
115
- @config[:resource_path]
125
+ if config[:resource_path]
126
+ config[:resource_path]
116
127
  else
117
- "#{resource_name_with_path_prefix}_path(#{ivar ? '@' : ''}#{resource_name})"
128
+ # super
129
+ helpers.instance_eval("#{resource_path_helper}(#{ivar ? '@' : ''}#{resource_name})")
118
130
  end
119
131
  end
120
132
 
@@ -126,7 +138,7 @@ module ExpressTemplates
126
138
  end
127
139
  end
128
140
 
129
- def attributes
141
+ def resource_attributes
130
142
  resource_class.columns
131
143
  end
132
144
  end
@@ -0,0 +1,41 @@
1
+ module ExpressTemplates
2
+ module Components
3
+ class Configurable < Base
4
+
5
+ def self.emits(proc = nil, &block)
6
+ define_method(:markup, &(proc || block))
7
+ end
8
+
9
+ def build(*args, &block)
10
+ _process_args!(args)
11
+ if method(:markup).arity > 0
12
+ markup(block)
13
+ else
14
+ markup(&block)
15
+ end
16
+ end
17
+
18
+ def config
19
+ @config ||= {}
20
+ end
21
+
22
+ alias :my :config
23
+
24
+
25
+ protected
26
+
27
+ def _process_args!(args)
28
+ if args.first.kind_of?(Symbol)
29
+ config.merge!(id: args.shift)
30
+ attributes[:id] = config[:id]
31
+ end
32
+ args.each do |arg|
33
+ if arg.kind_of?(Hash)
34
+ config.merge!(arg)
35
+ end
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -5,16 +5,15 @@ module ExpressTemplates
5
5
  # would be provided by Rails' form helpers.
6
6
  #
7
7
  # An optional method may be speficied. Defaults to 'post'.
8
- class FormRailsSupport < Base
9
- include Capabilities::Configurable
10
- emits -> {
8
+ class FormRailsSupport < Configurable
9
+ emits -> (ctx) {
11
10
  div(style: 'display:none') {
12
- utf8_enforcer_tag
11
+ add_child helpers.utf8_enforcer_tag
13
12
  # NOTE: This should be moved into the forms module and made a FormComponent
14
13
  # to have access to the resource_name as this code assumes existence of
15
14
  # a resource method which may not exist
16
- method_tag(@config[:id] || "{{((resource.persisted? ? :put : :post) rescue :post)}}")
17
- token_tag
15
+ add_child helpers.send(:method_tag, (config[:id] || ((resource.persisted? ? :put : :post) rescue :post)))
16
+ helpers.send(:token_tag)
18
17
  }
19
18
  }
20
19
  end
@@ -5,7 +5,6 @@ module ExpressTemplates
5
5
  end
6
6
  end
7
7
 
8
- require 'express_templates/components/forms/form_support'
9
8
  require 'express_templates/components/forms/express_form'
10
9
  require 'express_templates/components/forms/form_component'
11
10
  require 'express_templates/components/forms/option_support'
@@ -12,7 +12,7 @@ module ExpressTemplates
12
12
  emits -> {
13
13
  div(class: field_wrapper_class) {
14
14
  label_tag(label_name, label_text)
15
- #{type}_field resource_var, field_name.to_sym
15
+ #{type}_field resource_var, field_name.to_sym, html_options
16
16
  }
17
17
  }
18
18
  end
@@ -35,19 +35,16 @@ RUBY
35
35
  emits -> {
36
36
  div(class: field_wrapper_class) {
37
37
  label_tag(label_name, label_text)
38
- text_area resource_var, field_name.to_sym
38
+ text_area resource_var, field_name.to_sym, html_options
39
39
  }
40
40
  }
41
41
  end
42
42
 
43
43
  class Hidden < FormComponent
44
44
  emits -> {
45
- hidden_field resource_var, field_name.to_sym
45
+ hidden_field resource_var, field_name.to_sym, html_options
46
46
  }
47
47
  end
48
-
49
-
50
48
  end
51
49
  end
52
50
  end
53
-
@@ -16,7 +16,7 @@ module ExpressTemplates
16
16
  end
17
17
 
18
18
  def label_after?
19
- !!@config[:label_after]
19
+ !!config[:label_after]
20
20
  end
21
21
 
22
22
  def field_options
@@ -1,55 +1,45 @@
1
1
  module ExpressTemplates
2
2
  module Components
3
3
  module Forms
4
- class ExpressForm < Base
5
- include Capabilities::Configurable
6
- include Capabilities::Parenting
7
- include Capabilities::Resourceful
8
- include Forms::FormSupport
9
-
10
- emits -> {
11
- form( form_args ) {
4
+ class ExpressForm < Configurable
5
+ include ExpressTemplates::Components::Capabilities::Resourceful
6
+
7
+ emits -> (block) {
8
+ form(form_tag_options ) {
12
9
  form_rails_support form_method
13
- _yield
10
+ block.call(self) if block
14
11
  }
15
12
  }
16
13
 
17
14
  def form_id
18
- "#{resource_name}_{{@#{resource_name}.id}}"
15
+ "#{resource_name}_#{resource.id}"
19
16
  end
20
17
 
21
18
  def form_method
22
- @config[:method]
19
+ config[:method].to_s.upcase || 'POST'
23
20
  end
24
21
 
22
+ def form_action
23
+ config[:action] || (resource.try(:persisted?) ? resource_path(ivar: true) : collection_path)
24
+ end
25
25
 
26
- def form_args
27
- # there are no put/patch emthods in HTML5, so we have to enforce post
28
- # need to find a better way to do this: id/action can be overridden but method
29
- # should always be :post IN THE FORM TAG
30
- args = {id: form_id, action: form_action}.merge!(@config).merge!(method: :post)
26
+ def form_tag_options
27
+ args = {id: form_id, action: form_action}.merge!(config).merge!(method: 'POST')
31
28
 
32
29
  if html_options = args.delete(:html_options)
33
30
  args.merge!(html_options)
34
31
  end
35
- args[:method] = args[:method].to_s.upcase
36
32
  args
37
33
  end
38
34
 
39
35
  def resource_name_for_path
40
- @config[:id].to_s
36
+ config[:id].to_s
41
37
  end
42
38
 
43
39
  def resource_name
44
- (@config[:resource_name] || @config[:id]).to_s
40
+ (config[:resource_name] || config[:id]).to_s
45
41
  end
46
42
 
47
- private
48
-
49
- def _modifying_resource?
50
- [:put, :patch].include? form_method
51
- end
52
-
53
43
  end
54
44
  end
55
45
  end