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,69 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- # Provides a form component with knowledge of any association
5
- # on the field and an means of loading the collection for supplying
6
- # options to the user.
7
- module OptionSupport
8
-
9
- def has_many_through_association
10
- if resource_class.respond_to?(:reflect_on_association)
11
- reflection = resource_class.reflect_on_association(field_name.to_sym)
12
- return reflection if reflection && reflection.macro.eql?(:has_many) && reflection.options.keys.include?(:through)
13
- end
14
- end
15
-
16
- # Reflect on any association and return it if the association type
17
- # is :belongs_to. Returns false if the association is not :belongs_to.
18
- # Returns nil if there was a problem reflecting.
19
- def belongs_to_association
20
- if resource_class.respond_to?(:reflect_on_association)
21
- # assumes the belongs_to association uses <name>_id
22
- reflection = resource_class.reflect_on_association(field_name.gsub(/_id$/, '').to_sym)
23
- if reflection && reflection.macro.eql?(:belongs_to)
24
- return reflection
25
- end
26
- end
27
- end
28
-
29
- # Provide ActiveRecord code to load the associated collection as
30
- # options for display.
31
- def related_collection
32
- reflection = belongs_to_association || has_many_through_association
33
- if reflection && !reflection.polymorphic?
34
- if cols.detect {|column| column.name.eql?('name') }
35
- reflection.klass.select(option_value_method.to_sym, option_name_method.to_sym).order(option_name_method.to_sym)
36
- else
37
- reflection.klass.all.sort_by(&option_name_method.to_sym)
38
- end
39
- end
40
- end
41
-
42
- protected
43
-
44
- def option_value_method
45
- :id
46
- end
47
-
48
- def cols
49
- @cols ||= (belongs_to_association||has_many_through_association).klass.columns
50
- end
51
-
52
- def option_name_method
53
- @option_name_method ||=
54
- if cols.detect {|column| column.name.eql?('name') } ||
55
- resource_class.instance_methods.include?(:name)
56
- :name
57
- else
58
- if string_col = cols.detect {|column| column.type.eql?(:string) }
59
- string_col.name.to_sym
60
- else
61
- :id
62
- end
63
- end
64
- end
65
-
66
- end
67
- end
68
- end
69
- end
@@ -1,65 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- class Radio < FormComponent
5
- include OptionSupport
6
-
7
- has_option :options, 'Supplies a list of options for the radio tag'
8
- has_option :label_wrapper_class, 'Specify a class for labels which wrap each radio option.'
9
-
10
- contains -> {
11
- label_tag(label_name, label_text)
12
- if option_values_specified?
13
- generate_options_from_specified_values
14
- else
15
- use_options_from_collection_radio_buttons_helper
16
- end
17
- }
18
-
19
- def use_options_from_collection_radio_buttons_helper
20
- collection_radio_buttons(resource_name, field_name.to_sym, collection_from_association,
21
- option_value_method, option_name_method,
22
- input_attributes) do |b|
23
- b.label(class: "radio") {
24
- b.radio_button + b.text
25
- }
26
- end
27
- end
28
-
29
- def option_values_specified?
30
- [Array, Hash].include?(option_collection.class)
31
- end
32
-
33
- def option_collection
34
- config[:options]
35
- end
36
-
37
- def generate_options_from_specified_values
38
- case
39
- when option_collection.kind_of?(Array)
40
- option_collection.each_with_index do |option, index|
41
- label(class: config[:label_wrapper_class]) {
42
- radio_button(resource_name, field_name.to_sym, option, class: 'radio')
43
- current_arbre_element.add_child option
44
- }
45
- end
46
- when option_collection.kind_of?(Hash)
47
- option_collection.each_pair do |key, value|
48
- label(class: config[:label_wrapper_class]) {
49
- radio_button(resource_name, field_name.to_sym, key, class: 'radio')
50
- current_arbre_element.add_child value
51
- }
52
- end
53
- else
54
- raise "Radio collection should be Array or Hash: #{option_collection.inspect}"
55
- end
56
- end
57
-
58
- def collection_from_association
59
- related_collection or raise "No association collection for: #{resource_name}.#{field_name}"
60
- end
61
-
62
- end
63
- end
64
- end
65
- end
@@ -1,126 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- # Provides a form Select component based on the Rails *select_tag* helper.
5
- #
6
- # The :options may be specified as an Array or Hash which will be
7
- # supplied to the *options_for_select* helper.
8
- #
9
- # If the :options are omitted, the component attempts to check
10
- # whether the field is an association. If an association exists,
11
- # the options will be generated using *options_from_collection_for_select*
12
- # with the assumption that :id and :name are the value and name fields
13
- # on the collection. If no association exists, we use all the existing
14
- # unique values for the field on the collection to which the resource belongs
15
- # as the list of possible values for the select.
16
- class Select < FormComponent
17
- include OptionSupport
18
-
19
- has_option :options, 'Select options. Can be Array, Hash, or Proc.'
20
- has_option :selected, 'The currently selected value; Used when options are supplied. Otherwise the value is taken from the resource.'
21
- has_option :include_blank, 'Whether or not to include a blank option.', default: true
22
- has_option :select2, 'Use select2 enhanced select box.', default: true
23
-
24
- contains -> {
25
- label_tag(label_name, label_text)
26
- select_tag(*select_tag_args)
27
- }
28
-
29
- def select_tag_args
30
- [field_name_attribute, select_options, select_helper_options]
31
- end
32
-
33
- def select_options_supplied?
34
- [Array, Hash, Proc].include?(config[:options].class)
35
- end
36
-
37
- def use_supplied_options
38
- opts = config[:options]
39
- if opts.respond_to?(:call) # can be a proc
40
- opts.call(resource)
41
- else
42
- opts
43
- end
44
- end
45
-
46
- def generate_options_from_field_values
47
- resource.class.distinct(field_name.to_sym).pluck(field_name.to_sym)
48
- end
49
-
50
- def normalize_for_helper(supplied_options)
51
- supplied_options.map do |opt|
52
- [opt.respond_to?(:name) ? opt.name : opt.to_s,
53
- opt.respond_to?(:id) ? opt.id : opt.to_s]
54
- end
55
- end
56
-
57
- def selected_value
58
- config[:selected]||resource.send(field_name)
59
- end
60
-
61
- def options_from_supplied_or_field_values
62
- if select_options_supplied?
63
- supplied_options = use_supplied_options
64
- if supplied_options.respond_to?(:map)
65
- helpers.options_for_select(
66
- normalize_for_helper(supplied_options),
67
- selected_value)
68
- else
69
- supplied_options
70
- end
71
- else
72
- generate_options_from_field_values
73
- end
74
- end
75
-
76
- def options_from_belongs_to
77
- if belongs_to_association.polymorphic?
78
- helpers.options_for_select([[]]) # we can't really handle polymorhic yet
79
- else
80
- helpers.options_from_collection_for_select(related_collection, :id, option_name_method, resource.send(field_name))
81
- end
82
- end
83
-
84
- def options_from_has_many_through
85
- helpers.options_from_collection_for_select(related_collection, :id, option_name_method, resource.send(field_name).map(&:id))
86
- end
87
-
88
- def simple_options_with_selection
89
- helpers.options_for_select(options_from_supplied_or_field_values, selected_value)
90
- end
91
-
92
- # Returns the options which will be supplied to the select_tag helper.
93
- def select_options
94
- if belongs_to_association && !select_options_supplied?
95
- options_from_belongs_to
96
- elsif has_many_through_association
97
- options_from_has_many_through
98
- else
99
- simple_options_with_selection
100
- end
101
- end
102
-
103
- def field_name_attribute
104
- if has_many_through_association
105
- "#{resource_name.singularize}[#{field_name.singularize}_ids]"
106
- else
107
- super
108
- end
109
- end
110
-
111
- def select_helper_options
112
- add_select2_class( input_attributes.merge(include_blank: !!config[:include_blank]) )
113
- end
114
-
115
- protected
116
-
117
- def add_select2_class(helper_options)
118
- classes = (helper_options[:class]||'').split(' ')
119
- classes << 'select2' if config[:select2] === true
120
- helper_options.merge(:class => classes.join(' '))
121
- end
122
-
123
- end
124
- end
125
- end
126
- end
@@ -1,45 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- # Provides a form Select component based on the Rails *collection_select* helper.
5
- class SelectCollection < Select
6
-
7
- has_option :multiple, "Allow multiple selections.", default: true
8
-
9
- contains -> {
10
- label_tag(label_name, label_text)
11
-
12
- # need this because the collection_select helper does not provide
13
- # the hidden_field_tag trick (see rails api docs for select)
14
- hidden_field_tag(multi_field_name, '')
15
- collection_select(*collection_select_tag_args)
16
- }
17
-
18
- def collection_select_tag_args
19
- [ resource_name,
20
- multi_field_name,
21
- related_collection, :id, :name,
22
- field_options,
23
- html_options ]
24
- end
25
-
26
- def field_options
27
- {include_blank: !!input_attributes.delete(:include_blank)}
28
- end
29
-
30
- def html_options
31
- input_attributes.reject {|k,v| k.eql?(:include_blank)}.merge(multiple: config[:multiple])
32
- end
33
-
34
- def multi_field_name
35
- if has_many_through_association
36
- "#{field_name.singularize}_ids"
37
- else
38
- raise "Only use select_collection for has_many :through. #{field_name} is not has_many :through"
39
- end
40
- end
41
-
42
- end
43
- end
44
- end
45
- end
@@ -1,30 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- class Submit < FormComponent
5
-
6
- has_option :button_class, 'The css class of the input button.'
7
- has_option :value, 'The value of the submit tag. Text show in button.',
8
- default: 'Save'
9
-
10
- contains -> {
11
- submit_tag(value, input_attributes)
12
- }
13
-
14
- before_build(exclusive: true) {
15
- add_class(config[:wrapper_class])
16
- remove_class('submit')
17
- }
18
-
19
- def resource_name
20
- parent_form ? super : nil
21
- end
22
-
23
- def value
24
- config[:value]
25
- end
26
-
27
- end
28
- end
29
- end
30
- end
@@ -1,16 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- end
5
- end
6
- end
7
-
8
- require 'express_templates/components/forms/express_form'
9
- require 'express_templates/components/forms/form_component'
10
- require 'express_templates/components/forms/option_support'
11
- require 'express_templates/components/forms/submit'
12
- require 'express_templates/components/forms/select'
13
- require 'express_templates/components/forms/select_collection'
14
- require 'express_templates/components/forms/radio'
15
- require 'express_templates/components/forms/checkbox'
16
- require 'express_templates/components/forms/basic_fields'
@@ -1,88 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Presenters
4
- #
5
- # Create an html <tt>table</tt> or <tt>ol</tt> (ordered list) for
6
- # a model object representing a tree of similar objects.
7
- #
8
- # The objects must respond to <tt>:children</tt>.
9
- #
10
- # The block is passed a NodeBuilder which may accept field names.
11
- #
12
- # Example:
13
- #
14
- # ```ruby
15
- # tree_for(:roles) { |role|
16
- # role.name
17
- # }
18
- # ```
19
- #
20
- # If the view has an @roles variable with a Role having children,
21
- # this will turn into markup such as the following:
22
- #
23
- # <ul id="roles" class="roles tree">
24
- # <li>SuperAdmin
25
- # <ul>
26
- # <li>Admin
27
- # <ul>
28
- # <li>Publisher
29
- # <ul>
30
- # <li>Author</li>
31
- # </ul>
32
- # </li>
33
- # <li>Auditor</li>
34
- # </ul>
35
- # </li>
36
- # </ul>
37
- # </li>
38
- # </ul>
39
- #
40
-
41
- class TreeFor < Configurable
42
-
43
- tag :ul
44
-
45
- has_attributes :class => 'tree'
46
- has_option :root, "Root of the tree. Defaults to collection with the same as the id.", type: :proc
47
-
48
- contains -> (&customize_block) {
49
- @customize_block = customize_block
50
- list_items(root_node)
51
- }
52
-
53
- before_build -> {
54
- add_class config[:id]
55
- }
56
-
57
- def root_node
58
- if config[:root] && config[:root].respond_to?(:call)
59
- config[:root].call
60
- else
61
- send(config[:id])
62
- end
63
- end
64
-
65
- def list_items(nodes)
66
- nodes.each do |node|
67
- list_item(node)
68
- end
69
- end
70
-
71
- def list_item(node)
72
- li {
73
- if @customize_block
74
- @customize_block.call(node)
75
- else
76
- text_node "#{node.name}#{"\n" if node.children.any?}"
77
- end
78
- if node.children.any?
79
- ul {
80
- list_items(node.children)
81
- }
82
- end
83
- }
84
- end
85
- end
86
- end
87
- end
88
- end
@@ -1,11 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- end
4
- end
5
-
6
- require 'express_templates/components/base'
7
- require 'express_templates/components/configurable'
8
- require 'express_templates/components/container'
9
- require 'express_templates/components/tree_for'
10
- require 'express_templates/components/forms'
11
- require 'express_templates/components/all'
@@ -1,47 +0,0 @@
1
- module ExpressTemplates
2
-
3
- # Tracks current indent level scoped to the current thread.
4
- #
5
- # May be used to track multiple indents simultaneously through
6
- # namespacing.
7
- class Indenter
8
-
9
- DEFAULT = 2
10
- WHITESPACE = " "*DEFAULT
11
-
12
- # Returns whitespace for the named indenter or yields to a block
13
- # for the named indentor.
14
- #
15
- # The block is passed the current whitespace indent.
16
- #
17
- # For convenience an optional second parameter is passed to the block
18
- # containing a newline at the beginning of the indent.
19
- def self.for name
20
- if block_given?
21
- current_indenters[name] += 1
22
- begin
23
- indent = WHITESPACE * current_indenters[name]
24
- yield indent, "\n#{indent}"
25
- ensure
26
- if current_indenters[name].eql?(-1)
27
- # if we have long-lived threads for some reason
28
- # we want to clean up after ourselves
29
- current_indenters.delete(name)
30
- else
31
- current_indenters[name] -= 1
32
- end
33
- end
34
- else
35
- return WHITESPACE * current_indenters[name]
36
- end
37
- end
38
-
39
- private
40
- # For thread safety, scope indentation to the current thread
41
- def self.current_indenters
42
- Thread.current[:indenters] ||= Hash.new {|hsh, key| hsh[key] = -1 }
43
- end
44
-
45
- end
46
-
47
- end
@@ -1,36 +0,0 @@
1
- require 'parslet'
2
-
3
- module ExpressTemplates
4
- class Interpolator < Parslet::Parser
5
- rule(:lbrace) { str('{{') }
6
- rule(:rbrace) { str('}}') }
7
- rule(:delim) { lbrace | rbrace }
8
- rule(:lpart) { (lbrace.absnt? >> any).repeat.as(:lpart) }
9
- rule(:rpart) { (rbrace.absnt? >> any).repeat.as(:rpart) }
10
- rule(:expression) { (text_with_interpolations).as(:expression) }
11
- rule(:interpolation) { (lbrace>>expression>>rbrace).as(:interpolation) }
12
- rule(:text) { (delim.absnt? >> any).repeat(1) }
13
- rule(:text_with_interpolations) { (text.as(:text) | interpolation).repeat }
14
- root(:text_with_interpolations)
15
-
16
- def self.transform(s)
17
- begin
18
- Transformer.new.apply(new.parse(s)).flatten.join
19
- rescue Parslet::ParseFailed => failure
20
- puts s
21
- puts failure.cause.ascii_tree
22
- raise failure
23
- end
24
- end
25
- end
26
-
27
- class Transformer < Parslet::Transform
28
- rule(:interpolation => simple(:expression)) {
29
- '#{'+expression+'}'
30
- }
31
- rule(:expression => sequence(:exp)) do
32
- exp.map(&:to_s).join.gsub('\\"', '"')
33
- end
34
- rule(:text => simple(:s)) { s.to_s }
35
- end
36
- end
@@ -1,9 +0,0 @@
1
- module ExpressTemplates
2
- module Renderer
3
- # render accepts source or block, evaluates the resulting string of ruby in the context provided
4
- def render context=nil, template_or_src=nil, &block
5
- compiled_template = compile(template_or_src, &block)
6
- context.instance_eval compiled_template
7
- end
8
- end
9
- end
@@ -1,32 +0,0 @@
1
- require 'ripper'
2
-
3
- module ExpressTemplates
4
- module Template
5
- class Handler
6
- def self.call(template)
7
- new.call(template)
8
- end
9
-
10
- def call(template)
11
- # call ripper stuff method
12
-
13
- # returns a string to be eval'd
14
- source = "(#{ExpressTemplates.compile(template)}).html_safe"
15
- warn_contains_logic(source) if ENV['NO_TEMPLATE_WARN'].nil? # pass the source code
16
- source
17
- end
18
-
19
- def warn_contains_logic(compiled_template)
20
- keywords = %w(if until unless case for do loop while) # array of conditional keywords
21
- tokens = []
22
- if Ripper.lex(compiled_template).select do |element| # since it outputs an array [[line, col], type, token]
23
- element[1]==:on_kw # type must match ':on_kw' type (type is keyword)
24
- 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
25
- tokens.each do |first|
26
- warn "PAGE TEMPLATE INCLUDES #{first[2]} STATEMENT AT LINE #{first[0][0]}: #{first}\n#{compiled_template}" # warn on first occurence of conditional logic
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,3 +0,0 @@
1
- module ExpressTemplates
2
- VERSION = "0.11.3"
3
- end
@@ -1,18 +0,0 @@
1
- module ExpressTemplates
2
- require 'arbre'
3
- require 'arbre/patches'
4
- require 'core_extensions/proc'
5
- require 'core_extensions/string'
6
- require 'express_templates/indenter'
7
- require 'express_templates/components'
8
- require 'express_templates/template/handler'
9
- require 'express_templates/renderer'
10
- require 'express_templates/compiler'
11
- require 'express_templates/interpolator'
12
- extend Renderer
13
- extend Compiler
14
- if defined?(Rails)
15
- ::ActionView::Template.register_template_handler :et, ExpressTemplates::Template::Handler
16
- end
17
-
18
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :express_templates do
3
- # # Task goes here
4
- # end
@@ -1,9 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CompilerTest < ActiveSupport::TestCase
4
- test ".compile returns a string" do
5
- source = "h1"
6
- result = ExpressTemplates.compile(source)
7
- assert_kind_of String, result
8
- end
9
- end