express_admin 1.4.4 → 1.4.5

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/app/assets/stylesheets/express_admin/shared/_forms.sass +15 -2
  4. data/app/components/express_admin/definition_list.rb +8 -5
  5. data/app/components/express_admin/smart_form.rb +2 -1
  6. data/app/components/express_admin/smart_table.rb +3 -6
  7. data/app/views/layouts/express_admin/external.html.et +1 -1
  8. data/app/views/shared/express_admin/_messages.html.et +1 -1
  9. data/config/initializers/tinymce-rails.rb +1 -0
  10. data/config/tinymce.yml +4 -2
  11. data/lib/express_admin/version.rb +1 -1
  12. data/test/dummy/db/test.sqlite3 +0 -0
  13. data/test/dummy/test/components/definition_list_test.rb +71 -0
  14. data/test/dummy/test/components/definition_table_test.rb +72 -0
  15. data/test/dummy/test/components/flash_messages_test.rb +35 -0
  16. data/test/dummy/test/components/icon_link_test.rb +77 -0
  17. data/test/dummy/test/components/icon_test.rb +31 -0
  18. data/test/dummy/test/components/mega_menu_test.rb +45 -0
  19. data/test/dummy/test/components/module_sidebar_test.rb +56 -0
  20. data/test/dummy/test/components/widget_box_test.rb +30 -0
  21. data/vendor/gems/express_templates/Gemfile.lock +1 -1
  22. data/vendor/gems/express_templates/README.md +1 -1
  23. data/vendor/gems/express_templates/express_templates-0.9.3.gem +0 -0
  24. data/vendor/gems/express_templates/express_templates-0.9.4.gem +0 -0
  25. data/vendor/gems/express_templates/lib/core_extensions/proc.rb +13 -1
  26. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +1 -0
  27. data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +10 -1
  28. data/vendor/gems/express_templates/lib/express_templates/components/forms/form_component.rb +2 -0
  29. data/vendor/gems/express_templates/lib/express_templates/components/tree_for.rb +1 -1
  30. data/vendor/gems/express_templates/lib/express_templates/template/handler.rb +17 -1
  31. data/vendor/gems/express_templates/lib/express_templates/version.rb +1 -1
  32. data/vendor/gems/express_templates/test/components/forms/basic_fields_test.rb +58 -0
  33. data/vendor/gems/express_templates/test/components/forms/submit_test.rb +4 -0
  34. data/vendor/gems/express_templates/test/components/tree_for_test.rb +1 -6
  35. data/vendor/gems/express_templates/test/core_extensions/proc_test.rb +10 -1
  36. data/vendor/gems/express_templates/test/dummy/log/test.log +4761 -0
  37. data/vendor/gems/express_templates/test/handler_test.rb +24 -0
  38. data/vendor/gems/express_templates/test/test_helper.rb +5 -5
  39. metadata +21 -3
  40. data/app/assets/stylesheets/express_admin/components/_modals.sass +0 -7
@@ -99,7 +99,13 @@ module ExpressTemplates
99
99
  else
100
100
  definition[:type] || []
101
101
  end
102
- valid_type_names.map(&:to_s).map(&:classify).map(&:constantize)
102
+ valid_type_names.map do |type_name|
103
+ if type_name.eql?(:boolean)
104
+ type_name
105
+ else
106
+ type_name.to_s.classify.constantize
107
+ end
108
+ end
103
109
  end
104
110
 
105
111
  def _is_valid?(value, definition)
@@ -108,6 +114,9 @@ module ExpressTemplates
108
114
  true
109
115
  elsif valid_types.include?(value.class)
110
116
  true
117
+ elsif valid_types.include?(:boolean) &&
118
+ [1, 0, true, false].include?(value)
119
+ true
111
120
  else
112
121
  false
113
122
  end
@@ -8,6 +8,8 @@ module ExpressTemplates
8
8
  before_build -> {
9
9
  set_attribute(:id, "#{resource_name}_#{field_name}_wrapper")
10
10
  add_class(config[:wrapper_class])
11
+ add_class('error') if resource.respond_to?(:errors) &&
12
+ resource.errors.include?(field_name.to_sym)
11
13
  }
12
14
 
13
15
  has_option :wrapper_class, 'Override the class of the wrapping div of a form component', default: 'field-wrapper'
@@ -45,7 +45,7 @@ module ExpressTemplates
45
45
 
46
46
  contains -> (&customize_block) {
47
47
  @customize_block = customize_block
48
- list_items(eval(config[:id].to_s))
48
+ list_items(send(config[:id]))
49
49
  }
50
50
 
51
51
  before_build -> {
@@ -1,3 +1,5 @@
1
+ require 'ripper'
2
+
1
3
  module ExpressTemplates
2
4
  module Template
3
5
  class Handler
@@ -6,10 +8,24 @@ module ExpressTemplates
6
8
  end
7
9
 
8
10
  def call(template)
11
+ # call ripper stuff method
12
+
13
+ warn_contains_logic("(#{ExpressTemplates.compile(template)}).html_safe") # pass the source code
9
14
  # returns a string to be eval'd
10
15
  "(#{ExpressTemplates.compile(template)}).html_safe"
11
16
  end
12
17
 
18
+ def warn_contains_logic(compiled_template)
19
+ keywords = %w(if until unless case for do loop while) # array of conditional keywords
20
+ tokens = []
21
+ if Ripper.lex(compiled_template).select do |element| # since it outputs an array [[line, col], type, token]
22
+ element[1]==:on_kw # type must match ':on_kw' type (type is keyword)
23
+ end.each { |match| tokens.push(match) if keywords.include? match[2] } # check if token is in given /keyword/ array, then push to new array match
24
+ tokens.each do |first|
25
+ warn "PAGE TEMPLATE INCLUDES #{first[2]} STATEMENT AT LINE #{first[0][0]}: #{first}\n#{compiled_template}" # warn on first occurence of conditional logic
26
+ end
27
+ end
28
+ end
13
29
  end
14
30
  end
15
- end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module ExpressTemplates
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.4"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'active_model'
2
3
 
3
4
  class BasicFieldsTest < ActiveSupport::TestCase
4
5
 
@@ -89,4 +90,61 @@ class BasicFieldsTest < ActiveSupport::TestCase
89
90
  assert_match /<input class="hidden form-field" value="ninja" type="hidden" name="foo\[bar\]" id="foo_bar"/, html
90
91
  end
91
92
 
93
+ def resource_with_errors
94
+ mock_resource = resource
95
+ class << mock_resource
96
+ def errors
97
+ errors = ActiveModel::Errors.new(self)
98
+ errors.add(:name, "Can't be Foo")
99
+ errors
100
+ end
101
+ end
102
+ mock_resource
103
+ end
104
+
105
+ def has_error_class
106
+ /div[^>]*class="[^"]*error[^"]*"/
107
+ end
108
+
109
+ def has_error_class_on(field, html)
110
+ md = html.match(/(<div[^>]*id="[^"]*#{field}_wrapper[^"]*"[^>]*>)/)
111
+ assert md, "field has no wrapper"
112
+ return !!md[1].match(has_error_class)
113
+ end
114
+
115
+ test "adds error class if there are errors on a field with no input attributes" do
116
+ html_with_error = arbre(resource: resource_with_errors) {
117
+ express_form(:foo) {
118
+ text :name
119
+ text :body
120
+ }
121
+ }
122
+ assert resource_with_errors.errors.any?
123
+ assert assigns[:resource].errors.any?
124
+ assert has_error_class_on(:name, html_with_error), "name field has no error when expected"
125
+ refute has_error_class_on(:body, html_with_error), "body field has error class when it should not"
126
+ end
127
+
128
+ test "adds error class if there are errors on a field with no class set" do
129
+ html_with_error = arbre(resource: resource_with_errors) {
130
+ express_form(:foo) {
131
+ text :name, value: 'ninja'
132
+ }
133
+ }
134
+ assert resource_with_errors.errors.any?
135
+ assert assigns[:resource].errors.any?
136
+ assert_match has_error_class, html_with_error
137
+ end
138
+
139
+ test "adds error to class if there are errors on a field with existing class" do
140
+ html_with_error = arbre(resource: resource_with_errors) {
141
+ express_form(:foo) {
142
+ text :name, value: 'ninja', class: 'slug'
143
+ }
144
+ }
145
+ assert resource_with_errors.errors.any?
146
+ assert assigns[:resource].errors.any?
147
+ assert_match has_error_class, html_with_error
148
+ end
149
+
92
150
  end
@@ -7,6 +7,10 @@ class Stuff
7
7
  end
8
8
 
9
9
  class SubmitTest < ActiveSupport::TestCase
10
+
11
+ def assigns
12
+ {resource: nil}
13
+ end
10
14
  test "submit takes string param for value" do
11
15
  fragment = -> (ctx) {
12
16
  submit value: "Save it!"
@@ -2,11 +2,6 @@ require 'test_helper'
2
2
  require 'ostruct'
3
3
 
4
4
  class TreeForTest < ActiveSupport::TestCase
5
- class Context
6
- def initialize(roles)
7
- @roles = roles
8
- end
9
- end
10
5
 
11
6
  class Role
12
7
  attr :name, :children
@@ -17,7 +12,7 @@ class TreeForTest < ActiveSupport::TestCase
17
12
  end
18
13
 
19
14
  def roles
20
- [Role.new('SuperAdmin', children:
15
+ @roles ||= [Role.new('SuperAdmin', children:
21
16
  [Role.new('Admin', children:
22
17
  [Role.new('Publisher', children:
23
18
  [Role.new('Author')]),
@@ -68,7 +68,7 @@ class ProcTest < ActiveSupport::TestCase
68
68
  assert_equal 'foo', Proc.from_source(src).call
69
69
  end
70
70
 
71
- test ".source_body captures full body when parens around parameters not provided" do
71
+ test "#source_body captures full body when parens around parameters not provided" do
72
72
  block = return_block { something(:one, "two") }
73
73
  assert_equal 'something(:one, "two")', block.source_body
74
74
  block = return_block -> { something :one, "two" }
@@ -78,4 +78,13 @@ class ProcTest < ActiveSupport::TestCase
78
78
  # assert_equal 'something :one, "two"', block.source_body
79
79
  end
80
80
 
81
+ def return_proc_value(*args, options)
82
+ options.values.first.values.first
83
+ end
84
+
85
+ test "#source works when a proc is inside a hash literal" do
86
+ block = return_proc_value(:one, two: {a: -> {'proc_inside'}})
87
+ assert_equal "-> {'proc_inside'}", block.source
88
+ end
89
+
81
90
  end