express_admin 1.7.5 → 1.7.7

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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/express_admin/components/command_button.js.coffee +25 -0
  3. data/app/assets/stylesheets/express_admin/components/_command_button.sass +6 -1
  4. data/app/assets/stylesheets/express_admin/globals/_variables.sass +2 -0
  5. data/app/assets/stylesheets/express_admin/plugins/_select2.sass +3 -0
  6. data/app/assets/stylesheets/express_admin/screen.sass +0 -2
  7. data/app/assets/stylesheets/express_admin/shared/_tables.sass +2 -0
  8. data/app/components/express_admin/command_button.rb +9 -3
  9. data/app/components/express_admin/definition_table.rb +1 -1
  10. data/app/components/express_admin/smart_table.rb +6 -0
  11. data/app/views/layouts/devise.html.erb +19 -0
  12. data/config/initializers/postgresql_trigram.rb +13 -0
  13. data/db/migrate/20150928044202_install_trigram.rb +18 -0
  14. data/lib/express_admin/engine.rb +4 -2
  15. data/lib/express_admin/search.rb +51 -0
  16. data/lib/express_admin/standard_actions.rb +18 -5
  17. data/lib/express_admin/version.rb +1 -1
  18. data/test/dummy/db/test.sqlite3 +0 -0
  19. data/test/dummy/test/components/command_button_test.rb +2 -2
  20. metadata +22 -160
  21. data/app/assets/stylesheets/express_admin/shared/_buttons.sass +0 -3
  22. data/app/assets/stylesheets/express_admin/shared/_tabs.sass +0 -25
  23. data/vendor/gems/express_templates/CHANGELOG.md +0 -12
  24. data/vendor/gems/express_templates/Gemfile +0 -16
  25. data/vendor/gems/express_templates/LICENSE +0 -21
  26. data/vendor/gems/express_templates/README.md +0 -133
  27. data/vendor/gems/express_templates/Rakefile +0 -32
  28. data/vendor/gems/express_templates/express_templates.gemspec +0 -32
  29. data/vendor/gems/express_templates/lib/arbre/patches.rb +0 -76
  30. data/vendor/gems/express_templates/lib/core_extensions/proc.rb +0 -103
  31. data/vendor/gems/express_templates/lib/core_extensions/string.rb +0 -25
  32. data/vendor/gems/express_templates/lib/express_templates/compiler.rb +0 -22
  33. data/vendor/gems/express_templates/lib/express_templates/components/all.rb +0 -28
  34. data/vendor/gems/express_templates/lib/express_templates/components/base.rb +0 -156
  35. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +0 -213
  36. data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +0 -181
  37. data/vendor/gems/express_templates/lib/express_templates/components/container.rb +0 -45
  38. data/vendor/gems/express_templates/lib/express_templates/components/forms/basic_fields.rb +0 -52
  39. data/vendor/gems/express_templates/lib/express_templates/components/forms/checkbox.rb +0 -37
  40. data/vendor/gems/express_templates/lib/express_templates/components/forms/express_form.rb +0 -48
  41. data/vendor/gems/express_templates/lib/express_templates/components/forms/form_component.rb +0 -88
  42. data/vendor/gems/express_templates/lib/express_templates/components/forms/option_support.rb +0 -69
  43. data/vendor/gems/express_templates/lib/express_templates/components/forms/radio.rb +0 -65
  44. data/vendor/gems/express_templates/lib/express_templates/components/forms/select.rb +0 -126
  45. data/vendor/gems/express_templates/lib/express_templates/components/forms/select_collection.rb +0 -45
  46. data/vendor/gems/express_templates/lib/express_templates/components/forms/submit.rb +0 -30
  47. data/vendor/gems/express_templates/lib/express_templates/components/forms.rb +0 -16
  48. data/vendor/gems/express_templates/lib/express_templates/components/tree_for.rb +0 -88
  49. data/vendor/gems/express_templates/lib/express_templates/components.rb +0 -11
  50. data/vendor/gems/express_templates/lib/express_templates/indenter.rb +0 -47
  51. data/vendor/gems/express_templates/lib/express_templates/interpolator.rb +0 -36
  52. data/vendor/gems/express_templates/lib/express_templates/renderer.rb +0 -9
  53. data/vendor/gems/express_templates/lib/express_templates/template/handler.rb +0 -32
  54. data/vendor/gems/express_templates/lib/express_templates/version.rb +0 -3
  55. data/vendor/gems/express_templates/lib/express_templates.rb +0 -18
  56. data/vendor/gems/express_templates/lib/tasks/express_templates.rake +0 -4
  57. data/vendor/gems/express_templates/test/compiler_test.rb +0 -9
  58. data/vendor/gems/express_templates/test/components/base_test.rb +0 -67
  59. data/vendor/gems/express_templates/test/components/capabilities/resourceful_test.rb +0 -63
  60. data/vendor/gems/express_templates/test/components/configurable_test.rb +0 -140
  61. data/vendor/gems/express_templates/test/components/forms/basic_fields_test.rb +0 -158
  62. data/vendor/gems/express_templates/test/components/forms/checkbox_test.rb +0 -51
  63. data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +0 -62
  64. data/vendor/gems/express_templates/test/components/forms/radio_test.rb +0 -112
  65. data/vendor/gems/express_templates/test/components/forms/select_test.rb +0 -129
  66. data/vendor/gems/express_templates/test/components/forms/submit_test.rb +0 -36
  67. data/vendor/gems/express_templates/test/components/tree_for_test.rb +0 -70
  68. data/vendor/gems/express_templates/test/core_extensions/proc_test.rb +0 -90
  69. data/vendor/gems/express_templates/test/core_extensions/string_test.rb +0 -20
  70. data/vendor/gems/express_templates/test/dummy/Rakefile +0 -6
  71. data/vendor/gems/express_templates/test/dummy/app/assets/javascripts/application.js +0 -13
  72. data/vendor/gems/express_templates/test/dummy/app/assets/stylesheets/application.css +0 -15
  73. data/vendor/gems/express_templates/test/dummy/app/controllers/application_controller.rb +0 -5
  74. data/vendor/gems/express_templates/test/dummy/app/controllers/hello_controller.rb +0 -5
  75. data/vendor/gems/express_templates/test/dummy/app/helpers/application_helper.rb +0 -2
  76. data/vendor/gems/express_templates/test/dummy/app/views/hello/show.html.et +0 -6
  77. data/vendor/gems/express_templates/test/dummy/app/views/layouts/application.html.et +0 -15
  78. data/vendor/gems/express_templates/test/dummy/bin/bundle +0 -3
  79. data/vendor/gems/express_templates/test/dummy/bin/rails +0 -4
  80. data/vendor/gems/express_templates/test/dummy/bin/rake +0 -4
  81. data/vendor/gems/express_templates/test/dummy/config/application.rb +0 -26
  82. data/vendor/gems/express_templates/test/dummy/config/boot.rb +0 -5
  83. data/vendor/gems/express_templates/test/dummy/config/environment.rb +0 -5
  84. data/vendor/gems/express_templates/test/dummy/config/environments/development.rb +0 -37
  85. data/vendor/gems/express_templates/test/dummy/config/environments/production.rb +0 -82
  86. data/vendor/gems/express_templates/test/dummy/config/environments/test.rb +0 -40
  87. data/vendor/gems/express_templates/test/dummy/config/initializers/assets.rb +0 -8
  88. data/vendor/gems/express_templates/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  89. data/vendor/gems/express_templates/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  90. data/vendor/gems/express_templates/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  91. data/vendor/gems/express_templates/test/dummy/config/initializers/inflections.rb +0 -16
  92. data/vendor/gems/express_templates/test/dummy/config/initializers/mime_types.rb +0 -4
  93. data/vendor/gems/express_templates/test/dummy/config/initializers/session_store.rb +0 -3
  94. data/vendor/gems/express_templates/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  95. data/vendor/gems/express_templates/test/dummy/config/locales/en.yml +0 -23
  96. data/vendor/gems/express_templates/test/dummy/config/routes.rb +0 -4
  97. data/vendor/gems/express_templates/test/dummy/config/secrets.yml +0 -22
  98. data/vendor/gems/express_templates/test/dummy/config.ru +0 -4
  99. data/vendor/gems/express_templates/test/dummy/public/404.html +0 -67
  100. data/vendor/gems/express_templates/test/dummy/public/422.html +0 -67
  101. data/vendor/gems/express_templates/test/dummy/public/500.html +0 -66
  102. data/vendor/gems/express_templates/test/dummy/public/favicon.ico +0 -0
  103. data/vendor/gems/express_templates/test/dummy/test/controllers/hello_controller_test.rb +0 -14
  104. data/vendor/gems/express_templates/test/dummy/test/helpers/hello_helper_test.rb +0 -4
  105. data/vendor/gems/express_templates/test/express_templates_test.rb +0 -23
  106. data/vendor/gems/express_templates/test/handler_test.rb +0 -148
  107. data/vendor/gems/express_templates/test/indenter_test.rb +0 -27
  108. data/vendor/gems/express_templates/test/interpolator_test.rb +0 -80
  109. data/vendor/gems/express_templates/test/performance_test.rb +0 -97
  110. data/vendor/gems/express_templates/test/test_helper.rb +0 -178
  111. data/vendor/gems/foundation_apps_styles/Gemfile +0 -4
  112. data/vendor/gems/foundation_apps_styles/LICENSE.txt +0 -21
  113. data/vendor/gems/foundation_apps_styles/README.md +0 -41
  114. data/vendor/gems/foundation_apps_styles/Rakefile +0 -13
  115. data/vendor/gems/foundation_apps_styles/bin/console +0 -14
  116. data/vendor/gems/foundation_apps_styles/bin/setup +0 -7
  117. data/vendor/gems/foundation_apps_styles/foundation_apps_styles.gemspec +0 -24
  118. data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles/version.rb +0 -3
  119. data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles.rb +0 -6
  120. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/account.svg +0 -44
  121. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/action.svg +0 -38
  122. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/ban.svg +0 -17
  123. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bell.svg +0 -22
  124. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bookmark.svg +0 -14
  125. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cart.svg +0 -35
  126. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/chevron.svg +0 -28
  127. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-check.svg +0 -25
  128. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-x.svg +0 -25
  129. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cog.svg +0 -17
  130. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/comment-square.svg +0 -14
  131. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/dashboard.svg +0 -38
  132. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/document.svg +0 -28
  133. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/envelope.svg +0 -44
  134. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/flag.svg +0 -24
  135. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/home.svg +0 -28
  136. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/lock.svg +0 -55
  137. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/magnifying-glass.svg +0 -26
  138. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/person.svg +0 -62
  139. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/reload.svg +0 -19
  140. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/share-boxed.svg +0 -17
  141. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/star.svg +0 -14
  142. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/thumb.svg +0 -38
  143. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/zoom.svg +0 -56
  144. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_global.scss +0 -131
  145. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_includes.scss +0 -33
  146. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_settings.scss +0 -614
  147. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_accordion.scss +0 -72
  148. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_action-sheet.scss +0 -265
  149. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_block-list.scss +0 -360
  150. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button-group.scss +0 -197
  151. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button.scss +0 -205
  152. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_card.scss +0 -93
  153. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_extras.scss +0 -54
  154. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_forms.scss +0 -460
  155. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_grid.scss +0 -422
  156. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_iconic.scss +0 -95
  157. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_label.scss +0 -134
  158. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_list.scss +0 -19
  159. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_menu-bar.scss +0 -382
  160. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_modal.scss +0 -129
  161. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_motion.scss +0 -525
  162. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_notification.scss +0 -207
  163. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_off-canvas.scss +0 -169
  164. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_panel.scss +0 -134
  165. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_popup.scss +0 -68
  166. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_switch.scss +0 -134
  167. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_tabs.scss +0 -100
  168. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_title-bar.scss +0 -135
  169. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_typography.scss +0 -345
  170. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_utilities.scss +0 -160
  171. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation-apps.css +0 -6146
  172. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation.scss +0 -50
  173. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_breakpoints.scss +0 -154
  174. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_functions.scss +0 -343
  175. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_images.scss +0 -19
  176. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_mixins.scss +0 -123
  177. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/vendor/_normalize.scss +0 -424
@@ -1,67 +0,0 @@
1
- require 'test_helper'
2
-
3
- class BaseTest < ActiveSupport::TestCase
4
-
5
- class Context
6
- def assigns
7
- {}
8
- end
9
- end
10
-
11
- def render(&block)
12
- ExpressTemplates.render(Context.new, &block)
13
- end
14
-
15
- class UnorderedList < ExpressTemplates::Components::Base
16
- tag :ul
17
-
18
- has_attributes :class => 'something',
19
- 'data-foo' => 'something-else'
20
-
21
- contains {
22
- li { "Some stuff" }
23
- }
24
- end
25
-
26
- test ".tag_name determines the enclosing tag" do
27
- assert_match /^\<ul/, render { unordered_list }
28
- end
29
-
30
- test ".has_attributes creates default attributes" do
31
- assert_match /class="[^"]*something[^"]*"/, render { unordered_list }
32
- assert_match /data-foo="[^"]*something-else[^"]*"/, render { unordered_list }
33
- end
34
-
35
- test ".contains places fragment inside the enclosing tag" do
36
- markup = render { unordered_list }
37
- assert_match /\<ul.*\<li.*\/li\>.*\/ul\>/, markup.gsub("\n", '')
38
- end
39
-
40
- test "class name is dasherized instead of underscored" do
41
- assert_match /class="[^"]*unordered-list[^"]*"/, render { unordered_list }
42
- end
43
-
44
- test "options are passed to html attributes" do
45
- assert_match /rows="5"/, render { unordered_list(rows: 5) }
46
- end
47
-
48
- test "class option adds a class, does not override" do
49
- markup = render { unordered_list(class: 'extra') }
50
- assert_match /class="[^"]*something[^"]*"/, markup
51
- assert_match /class="[^"]*unordered-list[^"]*"/, markup
52
- assert_match /class="[^"]*extra[^"]*"/, markup
53
- end
54
-
55
- class BeforeBuildHook < ExpressTemplates::Components::Base
56
- before_build :add_my_foo
57
-
58
- def add_my_foo
59
- set_attribute('data-foo', 'bar')
60
- end
61
- end
62
-
63
- test "before_build hook runs before build" do
64
- assert_match /data-foo="bar"/, render { before_build_hook }
65
- end
66
-
67
- end
@@ -1,63 +0,0 @@
1
- require 'test_helper'
2
-
3
- module AdminModule
4
- module Engine
5
- end
6
- class SmartThing < ExpressTemplates::Components::Configurable
7
- include ExpressTemplates::Components::Capabilities::Resourceful
8
-
9
- attr_accessor :virtual_path, :config
10
-
11
- def initialize(virtual_path, config = {})
12
- @virtual_path = virtual_path
13
- @config = config
14
- @args = [self]
15
- end
16
-
17
- def template_virtual_path
18
- @virtual_path
19
- end
20
- end
21
- end
22
-
23
- module Admin; end
24
-
25
- class FooBar; end
26
-
27
- class Something; end
28
-
29
- module ExpressTemplates
30
-
31
- class ResourcefulTest < ActiveSupport::TestCase
32
- test 'infers namespace and path prefix within an engine and scope' do
33
- smart_thing = AdminModule::SmartThing.new('admin_module/admin/something/index')
34
- assert_equal 'admin_module', smart_thing.namespace
35
- assert_equal 'admin', smart_thing.path_prefix
36
- end
37
-
38
- test 'infers a namespace and no prefix within an engine' do
39
- # if defined? ExpressFoo::Engine
40
- smart_thing = AdminModule::SmartThing.new('admin_module/something/index')
41
- assert_equal 'admin_module', smart_thing.namespace
42
- assert_equal nil, smart_thing.path_prefix
43
- end
44
-
45
- test 'no namespace, infers prefix within a scope within an app' do
46
- # else of case above
47
- smart_thing = AdminModule::SmartThing.new('admin/something/index')
48
- assert_equal nil, smart_thing.namespace
49
- assert_equal 'admin', smart_thing.path_prefix
50
- end
51
-
52
- test 'no namespace, no prefix within an app' do
53
- smart_thing = AdminModule::SmartThing.new('somethings/index')
54
- assert_equal nil, smart_thing.namespace
55
- assert_equal nil, smart_thing.path_prefix
56
- end
57
-
58
- test "#resource_class returns resource_class option if specified" do
59
- assert_equal FooBar, AdminModule::SmartThing.new('somethings/index', resource_class: 'FooBar').resource_class
60
- assert_equal Something, AdminModule::SmartThing.new('somethings/index', id: :something).resource_class
61
- end
62
- end
63
- end
@@ -1,140 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ConfigurableTest < ActiveSupport::TestCase
4
-
5
- class Context
6
- def assigns
7
- {}
8
- end
9
- end
10
-
11
- def render(&block)
12
- ExpressTemplates.render(Context.new, &block)
13
- end
14
-
15
- ETCC = ExpressTemplates::Components::Configurable
16
-
17
- class ConfigurableComponent < ETCC
18
- end
19
-
20
- test "renders first argument as dom id" do
21
- assert_match /id="foo"/, render { configurable_component(:foo) }
22
- end
23
-
24
- test "has no id attribute if not specified" do
25
- assert_no_match /id="foo"/, render { configurable_component }
26
- end
27
-
28
- class ConfigWithOption < ETCC
29
- has_option :thing, 'Something about things'
30
- end
31
-
32
- test "supports option declaration" do
33
- markup = render { config_with_option }
34
- assert_equal %Q(<div class="config-with-option"></div>\n), markup
35
- end
36
-
37
- test "does not pass declared options as html attributes" do
38
- markup = render { config_with_option(thing: 'whatever') }
39
- assert_equal %Q(<div class="config-with-option"></div>\n), markup
40
- end
41
-
42
- test "unrecognized options raises an exception" do
43
- assert_raises(ArgumentError) do
44
- class ConfigWithUnrecognizedOptions < ETCC
45
- has_option :title, 'asdfasdf', something_unrecognized: 'whatever'
46
- end
47
- end
48
- end
49
-
50
- class ConfigWithDefaultOption < ETCC
51
- has_option :rows, 'Number of rows', type: :integer, default: 5, attribute: true
52
- end
53
-
54
- test "default values are supported" do
55
- markup = render { config_with_default_option }
56
- assert_equal %Q(<div class="config-with-default-option" rows="5"></div>\n), markup
57
- end
58
-
59
- test "default values for attributes can be overridden" do
60
- markup = render { config_with_default_option(rows: 999) }
61
- assert_equal %Q(<div class="config-with-default-option" rows="999"></div>\n), markup
62
- end
63
-
64
- class ConfigWithRequiredOptions < ETCC
65
- has_option :title, 'adds a title', required: true
66
- end
67
-
68
- test "required options are required" do
69
- assert_raises(RuntimeError) do
70
- render { config_with_required_options }
71
- end
72
- assert render { config_with_required_options(title: 'foo') }
73
- end
74
-
75
- class ConfigWithOptionValues < ETCC
76
- has_option :virtual, 'gets the virtual_attributes of a resource', values: -> (*) { resource_class.virtual_attributes }
77
-
78
- def resource_class
79
- OpenStruct.new(virtual_attributes: [:password, :password_confirmation])
80
- end
81
- end
82
-
83
- test "values can be set for options" do
84
- component = ConfigWithOptionValues.new
85
- assert_equal [:password, :password_confirmation], component.instance_eval(&ConfigWithOptionValues.new.supported_options[:virtual][:values])
86
- end
87
-
88
- class ConfigSubclass < ConfigWithRequiredOptions
89
- has_option :status, 'something'
90
- end
91
-
92
- test "options are inherited" do
93
- assert_equal [:title, :status], ConfigSubclass.supported_options.keys
94
- end
95
-
96
- class ConfigArgument < ETCC
97
- has_argument :name, "The name.", type: :string
98
-
99
- has_option :something, "else"
100
-
101
- contains {
102
- text_node config[:name]
103
- }
104
- end
105
-
106
- test ".has_argument adds a positional configuration argument" do
107
- assert_equal :name, ConfigArgument.new.supported_arguments.keys.last
108
- assert_equal "The name.", ConfigArgument.new.supported_arguments.values.last[:description]
109
- end
110
-
111
- test ".has_argument makes builder arguments accessible by name according to position" do
112
- html = render &-> {
113
- config_argument :bar, 'Foo'
114
- }
115
- assert_match />Foo</, html
116
- end
117
-
118
- class ConfigAnotherArgument < ConfigArgument
119
- has_argument :title, "comes after name", type: :string
120
- end
121
-
122
- test ".has_argument appends supported arguments in order of inheritence" do
123
- assert_equal [:id, :name, :title], ConfigAnotherArgument.new.supported_arguments.keys
124
- end
125
-
126
- class ConfigOverwriteId < ConfigArgument
127
- has_argument :id, 'Should overwrite :id',
128
- as: :foo, type: :symbol
129
- contains -> {
130
- text_node config[:foo]
131
- }
132
- end
133
-
134
- test ".has_argument as: allows overwrite of inherited argument" do
135
- html = render {
136
- config_overwrite_id(:whatever, 'Ignore me')
137
- }
138
- assert_match /div.*>whatever/, html
139
- end
140
- end
@@ -1,158 +0,0 @@
1
- require 'test_helper'
2
- require 'active_model'
3
-
4
- class BasicFieldsTest < ActiveSupport::TestCase
5
-
6
- BASIC_FIELDS = %w(email phone text password color file date datetime
7
- datetime_local number range
8
- search telephone time url week)
9
-
10
- def assigns
11
- {foo: resource}
12
- end
13
-
14
- def helpers
15
- mock_action_view do
16
- def foos_path
17
- '/foos'
18
- end
19
- end
20
- end
21
-
22
- def field_type_map
23
- Hash[BASIC_FIELDS.map {|f| [f, f]}].merge(
24
- {'phone' => 'tel',
25
- 'telephone' => 'tel',
26
- 'datetime_local' => 'datetime-local' })
27
- end
28
-
29
- def label_html
30
- '<label for="foo_bar">Bar</label>'
31
- end
32
-
33
- test "all fields work" do
34
- BASIC_FIELDS.each do |type|
35
- fragment = -> (ctx) {
36
- express_form(:foo) {
37
- send(type, :bar)
38
- }
39
- }
40
- html = arbre(&fragment)
41
- assert_match label_html, html
42
- assert_match(/input.*type="#{field_type_map[type]}"/, html)
43
- # assert_match "#{type}_field(:foo, :bar, {})", arbre(&fragment)
44
- end
45
- end
46
-
47
- test "passing html options to fields work" do
48
- options = {style: 'width: 10em;'}
49
- ['email'].each do |type|
50
- html = arbre {
51
- express_form(:foo) {
52
- send(type, :bar, options)
53
- }
54
- }
55
- assert_match label_html, html
56
- assert_match /input.*type="#{field_type_map[type]}"/, html
57
- assert_match /input.*style="width: 10em;"/, html
58
- end
59
- end
60
-
61
- test "textarea uses rails text_area helper" do
62
- html = arbre {
63
- express_form(:foo) {
64
- textarea :bar
65
- }
66
- }
67
- assert_match label_html, html
68
- assert_match /<textarea name="foo\[bar\]" id="foo_bar"><\/textarea>/, html.gsub("\n", '')
69
- end
70
-
71
- test "textarea passes additional html options to rails helper" do
72
- html = arbre {
73
- express_form(:foo) {
74
- textarea :bar, rows: 5, class: 'tinymce form-field'
75
- }
76
- }
77
- assert_match label_html, html
78
- assert_match /<textarea name="foo\[bar\]" id="foo_bar" rows="5" class="tinymce form-field"><\/textarea>/, html.gsub("\n", '')
79
- end
80
-
81
- test "hidden uses rails hidden_tag helper" do
82
- html = arbre {
83
- express_form(:foo) {
84
- hidden :bar
85
- }
86
- }
87
- assert_no_match label_html, html
88
- assert_match '<input type="hidden"', html
89
- end
90
-
91
- test "hidden field passes additional html options to rails helper" do
92
- html = arbre {
93
- express_form(:foo) {
94
- hidden :bar, class: 'hidden form-field', value: 'ninja'
95
- }
96
- }
97
- assert_no_match label_html, html
98
- assert_match /<input type="hidden" name="foo\[bar\]" id="foo_bar" value="ninja" class="hidden form-field"/, html
99
- end
100
-
101
- def resource_with_errors
102
- mock_resource = resource
103
- class << mock_resource
104
- def errors
105
- errors = ActiveModel::Errors.new(self)
106
- errors.add(:name, "Can't be Foo")
107
- errors
108
- end
109
- end
110
- mock_resource
111
- end
112
-
113
- def has_error_class
114
- /div[^>]*class="[^"]*error[^"]*"/
115
- end
116
-
117
- def has_error_class_on(field, html)
118
- md = html.match(/(<div[^>]*id="[^"]*#{field}_wrapper[^"]*"[^>]*>)/)
119
- assert md, "field has no wrapper"
120
- return !!md[1].match(has_error_class)
121
- end
122
-
123
- test "adds error class if there are errors on a field with no input attributes" do
124
- html_with_error = arbre(foo: resource_with_errors) {
125
- express_form(:foo) {
126
- text :name
127
- text :body
128
- }
129
- }
130
- assert resource_with_errors.errors.any?
131
- assert assigns[:foo].errors.any?
132
- assert has_error_class_on(:name, html_with_error), "name field has no error when expected"
133
- refute has_error_class_on(:body, html_with_error), "body field has error class when it should not"
134
- end
135
-
136
- test "adds error class if there are errors on a field with no class set" do
137
- html_with_error = arbre(foo: resource_with_errors) {
138
- express_form(:foo) {
139
- text :name, value: 'ninja'
140
- }
141
- }
142
- assert resource_with_errors.errors.any?
143
- assert assigns[:foo].errors.any?
144
- assert_match has_error_class, html_with_error
145
- end
146
-
147
- test "adds error to class if there are errors on a field with existing class" do
148
- html_with_error = arbre(foo: resource_with_errors) {
149
- express_form(:foo) {
150
- text :name, value: 'ninja', class: 'slug'
151
- }
152
- }
153
- assert resource_with_errors.errors.any?
154
- assert assigns[:foo].errors.any?
155
- assert_match has_error_class, html_with_error
156
- end
157
-
158
- end
@@ -1,51 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Account
4
- end
5
-
6
- class CheckboxTest < ActiveSupport::TestCase
7
-
8
- def assigns
9
- {account: resource}
10
- end
11
-
12
- def helpers
13
- mock_action_view do
14
- def accounts_path
15
- '/accounts'
16
- end
17
- end
18
- end
19
-
20
-
21
- test "checkbox places the label before the input" do
22
- html = arbre(account: resource) {
23
- express_form(:account) {
24
- checkbox :eula
25
- }
26
- }
27
- label = '<label for="account_eula"'
28
- field = 'input type="checkbox" value="1" name="account\[eula\]"'
29
- assert_match /#{label}/, html
30
- assert_match /#{field}/, html
31
- label_idx = html.index(label)
32
- field_idx = html.index(field.gsub('\\', ''))
33
- assert (field_idx > label_idx), "label must come first"
34
- end
35
-
36
- test "checkbox respects label_after: true " do
37
- html = arbre(account: resource) {
38
- express_form(:account) {
39
- checkbox :eula, label_after: true
40
- }
41
- }
42
- label = '<label for="account_eula"'
43
- field = 'input type="checkbox" value="1" name="account\[eula\]"'
44
- assert_match /#{label}/, html
45
- assert_match /#{field}/, html
46
- label_idx = html.index(label)
47
- field_idx = html.index(field.gsub('\\', ''))
48
- assert (field_idx < label_idx), "label must come after when label_after: true"
49
- end
50
-
51
- end
@@ -1,62 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Foo
4
- def self.columns ; [] ; end
5
- end
6
-
7
- class ExpressFormTest < ActiveSupport::TestCase
8
-
9
- def simplest_form
10
- arbre(foo: resource) {
11
- express_form(:foo) {
12
- submit value: 'Save it!'
13
- }
14
- }
15
- end
16
-
17
- def helpers
18
- mock_action_view do
19
- def foos_path
20
- '/foos'
21
- end
22
- end
23
- end
24
-
25
- test "simplest form renders" do
26
- assert simplest_form
27
- end
28
-
29
- test "simplest form will have the proper id" do
30
- assert_match /<form.*id="foo_1"/, simplest_form
31
- end
32
-
33
- test "simplest form contains form tag" do
34
- assert_match "<form", simplest_form
35
- end
36
-
37
- test "express_form contents are inside the form" do
38
- assert_match /<form.*submit.*\/form>/, simplest_form.gsub("\n",'')
39
- end
40
-
41
- test "simplest form contains rails form helpers" do
42
- compiled_src = simplest_form
43
- assert_match "input name=\"utf8\" type=\"hidden\"", compiled_src
44
- assert_match "input type=\"hidden\" name=\"_method\"", compiled_src
45
- assert_match "name=\"authenticity_token\" value=\"AUTH_TOKEN\"", compiled_src
46
- assert_match /<form.*authenticity_token.*\/form>/, compiled_src.gsub("\n",'')
47
- end
48
-
49
- test "simplest_form contains submit" do
50
- assert_match '<input type="submit" name="commit" value="Save it!" />', simplest_form
51
- end
52
-
53
- test "simplest_form uses form_action for the action" do
54
- form_open_tag = simplest_form.match(/<form[^>]*>/)[0]
55
- assert_match 'action="/foos"', form_open_tag
56
- end
57
-
58
- test "express_form default method is POST" do
59
- assert_match 'method="POST"', simplest_form
60
- end
61
-
62
- end
@@ -1,112 +0,0 @@
1
- require 'test_helper'
2
-
3
- class RadioTest < ActiveSupport::TestCase
4
-
5
- def assigns
6
- {person: ::Person.new}
7
- end
8
-
9
- def helpers
10
- mock_action_view do
11
- def people_path
12
- '/people'
13
- end
14
-
15
- def employees_path
16
- '/employees'
17
- end
18
- end
19
- end
20
-
21
- test "radio requires a parent component" do
22
- assert_raises(RuntimeError) {
23
- html = arbre {
24
- radio :preferred_email_format, options: ['HTML', 'Text']
25
- }
26
- }
27
- end
28
-
29
- def radio_with_array_options
30
- html = arbre {
31
- express_form(:person) {
32
- radio :preferred_email_format, options: ['HTML', 'Text']
33
- }
34
- }
35
- end
36
-
37
- test "radio has correct label field name and text" do
38
- assert_match /<label for="person_preferred_email_format"/,
39
- radio_with_array_options
40
- end
41
-
42
- test "radio options present with class 'radio'" do
43
- assert_match /<input.*class="radio"/,
44
- radio_with_array_options
45
- end
46
-
47
- def radio_with_hash_options
48
- html = arbre {
49
- express_form(:person) {
50
- radio :subscribed, options: {1 => 'Yes', 0 => 'No'}, label_wrapper_class: 'my-wrapper'
51
- }
52
- }
53
- end
54
-
55
- test "radio options may be specified with a hash" do
56
- compiled = radio_with_hash_options
57
- assert_match '<label class="my-wrapper">', compiled
58
- assert_match 'input class="radio" type="radio" value="0" name="person[subscribed]" id="person_subscribed_0" />No', compiled
59
- assert_match 'input class="radio" type="radio" value="1" name="person[subscribed]" id="person_subscribed_1" />Yes', compiled
60
- end
61
-
62
- test "radio throws error if given improper options" do
63
- assert_raises(RuntimeError) {
64
- html = arbre {
65
- express_form(:person) {
66
- radio :subscribed, "Garbage options"
67
- }
68
- }
69
- }
70
- end
71
-
72
- def radio_with_options_omitted
73
- html = arbre(employee: resource) {
74
- express_form(:employee) {
75
- radio :department_id
76
- }
77
- }
78
- end
79
-
80
- class ::Department < ::Gender
81
- def self.order(*)
82
- all
83
- end
84
- def self.all
85
- return [new(1, 'Accounting'), new(2, 'Marketing')]
86
- end
87
- end
88
- class ::Employee
89
- def self.reflect_on_association(name)
90
- if name.eql? :department
91
- dummy_association = Object.new
92
- class << dummy_association
93
- def macro ; :belongs_to ; end
94
- def klass ; ::Department ; end
95
- def polymorphic? ; false ; end
96
- end
97
- return dummy_association
98
- end
99
- end
100
- end
101
-
102
- test "radio options from collection when options omitted" do
103
- assert_match /input type="radio" value="1" name="employee\[department_id\]" id="employee_department_id_1"/,
104
- radio_with_options_omitted
105
- end
106
-
107
- # test "radio supports html options"
108
-
109
- # test "html_options passed correctly when collection is omitted"
110
-
111
- # test "radio helper options passed to collection_radio_buttons"
112
- end