express_admin 1.7.5 → 1.7.7

Sign up to get free protection for your applications and to get access to all the features.
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