brain_damage 0.1.0

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 (215) hide show
  1. checksums.yaml +7 -0
  2. data/.byebug_history +32 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +4 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +7 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +41 -0
  10. data/Rakefile +6 -0
  11. data/app/assets/javascripts/ajax_delete.js.coffee +14 -0
  12. data/app/assets/javascripts/ajax_form.js.coffee +94 -0
  13. data/app/assets/javascripts/autocomplete-input.js.coffee +43 -0
  14. data/app/assets/javascripts/autocomplete-list.js.coffee +41 -0
  15. data/app/assets/javascripts/autocomplete-simple-select.js.coffee +39 -0
  16. data/app/assets/javascripts/autocomplete.js.coffee +17 -0
  17. data/app/assets/javascripts/brain_damage.js +3 -0
  18. data/app/assets/javascripts/datepicker.js.coffee +49 -0
  19. data/app/assets/javascripts/document_validity_input.js.coffee +16 -0
  20. data/app/assets/javascripts/expandable-list.js.coffee +16 -0
  21. data/app/assets/javascripts/form_initializer.js.coffee +8 -0
  22. data/app/assets/javascripts/helpers/conditionally-visible-field.js.coffee +13 -0
  23. data/app/assets/javascripts/hideable_content.js.coffee +25 -0
  24. data/app/assets/javascripts/inline_edit.js.coffee +58 -0
  25. data/app/assets/javascripts/label_file_field.js.coffee +22 -0
  26. data/app/assets/javascripts/label_file_field_ui_initializer.js.coffee +10 -0
  27. data/app/assets/javascripts/list_item.js.coffee +10 -0
  28. data/app/assets/javascripts/nested_form_controls.js.coffee +84 -0
  29. data/app/assets/javascripts/polymorphic_hibrid_input.js.coffee +14 -0
  30. data/app/assets/javascripts/polymorphic_select_input.js.coffee +28 -0
  31. data/app/assets/javascripts/rails.validations.actionView.js.coffee +18 -0
  32. data/app/assets/javascripts/scroll_loader.js.coffee +28 -0
  33. data/app/assets/javascripts/searchable_contents.js.coffee +62 -0
  34. data/app/assets/javascripts/selectable-list.js.coffee +92 -0
  35. data/app/assets/javascripts/sensible_to_ajax_view.js.coffee +60 -0
  36. data/app/assets/javascripts/single_page_manager.js.coffee +60 -0
  37. data/app/assets/javascripts/stylesheets/_custom-best-in-place.css.sass +12 -0
  38. data/app/assets/javascripts/stylesheets/_top-search.css.sass +0 -0
  39. data/app/assets/javascripts/stylesheets/application.css +0 -0
  40. data/app/assets/javascripts/trailing_form.js.coffee +16 -0
  41. data/app/assets/javascripts/ui_initializer.js.coffee +23 -0
  42. data/app/assets/javascripts/underscore.min.js +6 -0
  43. data/app/assets/stylesheets/brain_damage.css.sass +214 -0
  44. data/app/views/brain_damage/_empty.html.haml +1 -0
  45. data/app/views/brain_damage/empty.html.haml +1 -0
  46. data/bin/console +14 -0
  47. data/bin/setup +7 -0
  48. data/brain_damage.gemspec +36 -0
  49. data/lib/brain_damage.rb +16 -0
  50. data/lib/brain_damage/brain_damage_helper.rb +75 -0
  51. data/lib/brain_damage/version.rb +3 -0
  52. data/lib/generators/brain_damage/full/full_generator.rb +37 -0
  53. data/lib/generators/brain_damage/lib/controller/controller_generator.rb +45 -0
  54. data/lib/generators/brain_damage/lib/controller/templates/controller.rb +9 -0
  55. data/lib/generators/brain_damage/lib/controller/templates/private_methods/get_partial_locals.rb +3 -0
  56. data/lib/generators/brain_damage/lib/controller/templates/private_methods/set_singular_table_name.rb +3 -0
  57. data/lib/generators/brain_damage/lib/controller/templates/private_methods/singular_table_name_params.rb +3 -0
  58. data/lib/generators/brain_damage/lib/controller/templates/public_methods/create.rb +21 -0
  59. data/lib/generators/brain_damage/lib/controller/templates/public_methods/destroy.rb +14 -0
  60. data/lib/generators/brain_damage/lib/controller/templates/public_methods/edit.rb +2 -0
  61. data/lib/generators/brain_damage/lib/controller/templates/public_methods/index.rb +3 -0
  62. data/lib/generators/brain_damage/lib/controller/templates/public_methods/new.rb +3 -0
  63. data/lib/generators/brain_damage/lib/controller/templates/public_methods/show.rb +2 -0
  64. data/lib/generators/brain_damage/lib/controller/templates/public_methods/update.rb +25 -0
  65. data/lib/generators/brain_damage/lib/field.rb +163 -0
  66. data/lib/generators/brain_damage/lib/field_white_list.rb +21 -0
  67. data/lib/generators/brain_damage/lib/includes.rb +12 -0
  68. data/lib/generators/brain_damage/lib/migration.rb +76 -0
  69. data/lib/generators/brain_damage/lib/model/model_generator.rb +115 -0
  70. data/lib/generators/brain_damage/lib/model/templates/model.rb +12 -0
  71. data/lib/generators/brain_damage/lib/parametizer.rb +19 -0
  72. data/lib/generators/brain_damage/lib/relation/base.rb +50 -0
  73. data/lib/generators/brain_damage/lib/relation/belongs_to.rb +29 -0
  74. data/lib/generators/brain_damage/lib/relation/has_and_belongs_to_many.rb +22 -0
  75. data/lib/generators/brain_damage/lib/relation/has_many.rb +35 -0
  76. data/lib/generators/brain_damage/lib/relation/has_one.rb +18 -0
  77. data/lib/generators/brain_damage/lib/resource.rb +150 -0
  78. data/lib/generators/brain_damage/lib/ruby_simple_parser/block.rb +33 -0
  79. data/lib/generators/brain_damage/lib/ruby_simple_parser/class_definition.rb +19 -0
  80. data/lib/generators/brain_damage/lib/ruby_simple_parser/code_line.rb +16 -0
  81. data/lib/generators/brain_damage/lib/ruby_simple_parser/global_context.rb +8 -0
  82. data/lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb +107 -0
  83. data/lib/generators/brain_damage/lib/ruby_simple_parser/method.rb +23 -0
  84. data/lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb +114 -0
  85. data/lib/generators/brain_damage/lib/ruby_simple_parser/ruby_simple_parser.rb +11 -0
  86. data/lib/generators/brain_damage/lib/templateable/base.rb +53 -0
  87. data/lib/generators/brain_damage/lib/templateable/class_templateable.rb +88 -0
  88. data/lib/generators/brain_damage/lib/templateable/field_templateable.rb +42 -0
  89. data/lib/generators/brain_damage/lib/templateable/view_templateable.rb +23 -0
  90. data/lib/generators/brain_damage/lib/views/displays/base.rb +14 -0
  91. data/lib/generators/brain_damage/lib/views/displays/bright_text.rb +14 -0
  92. data/lib/generators/brain_damage/lib/views/displays/collection_list.rb +22 -0
  93. data/lib/generators/brain_damage/lib/views/displays/default.rb +11 -0
  94. data/lib/generators/brain_damage/lib/views/displays/foreign_single_page_manager.rb +46 -0
  95. data/lib/generators/brain_damage/lib/views/displays/hidden.rb +26 -0
  96. data/lib/generators/brain_damage/lib/views/displays/inline_editable.rb +27 -0
  97. data/lib/generators/brain_damage/lib/views/displays/link_to.rb +42 -0
  98. data/lib/generators/brain_damage/lib/views/displays/linked_collection_list.rb +26 -0
  99. data/lib/generators/brain_damage/lib/views/displays/templates/bright_text.html.haml +7 -0
  100. data/lib/generators/brain_damage/lib/views/displays/templates/collection_list.html.haml +31 -0
  101. data/lib/generators/brain_damage/lib/views/displays/templates/custom.html.haml +5 -0
  102. data/lib/generators/brain_damage/lib/views/displays/templates/default.html.haml +4 -0
  103. data/lib/generators/brain_damage/lib/views/displays/templates/foreign_single_page_manager.html.haml +1 -0
  104. data/lib/generators/brain_damage/lib/views/displays/templates/inline_editable.html.haml +8 -0
  105. data/lib/generators/brain_damage/lib/views/displays/templates/link_to.html.haml +9 -0
  106. data/lib/generators/brain_damage/lib/views/displays/templates/linked_collection_list.html.haml +31 -0
  107. data/lib/generators/brain_damage/lib/views/displays/templates/text.html.haml +4 -0
  108. data/lib/generators/brain_damage/lib/views/displays/templates/yes_or_no.html.haml +4 -0
  109. data/lib/generators/brain_damage/lib/views/displays/text.rb +43 -0
  110. data/lib/generators/brain_damage/lib/views/factory.rb +29 -0
  111. data/lib/generators/brain_damage/lib/views/inputs/autocompletable.rb +26 -0
  112. data/lib/generators/brain_damage/lib/views/inputs/autocompletable_multiple_selection.rb +25 -0
  113. data/lib/generators/brain_damage/lib/views/inputs/autocompletable_simple_selection.rb +21 -0
  114. data/lib/generators/brain_damage/lib/views/inputs/base.rb +23 -0
  115. data/lib/generators/brain_damage/lib/views/inputs/checkbox.rb +14 -0
  116. data/lib/generators/brain_damage/lib/views/inputs/collection_checkboxes.rb +10 -0
  117. data/lib/generators/brain_damage/lib/views/inputs/collection_select.rb +11 -0
  118. data/lib/generators/brain_damage/lib/views/inputs/default.rb +11 -0
  119. data/lib/generators/brain_damage/lib/views/inputs/hierarchy_picker.rb +11 -0
  120. data/lib/generators/brain_damage/lib/views/inputs/nested_form.rb +34 -0
  121. data/lib/generators/brain_damage/lib/views/inputs/nested_on_hideable.rb +22 -0
  122. data/lib/generators/brain_damage/lib/views/inputs/polymorphic_hybrid.rb +44 -0
  123. data/lib/generators/brain_damage/lib/views/inputs/polymorphic_select.rb +33 -0
  124. data/lib/generators/brain_damage/lib/views/inputs/templates/autocompletable_multiple_selection.html.haml +20 -0
  125. data/lib/generators/brain_damage/lib/views/inputs/templates/autocompletable_simple_selection.html.haml +25 -0
  126. data/lib/generators/brain_damage/lib/views/inputs/templates/checkbox.html.haml +3 -0
  127. data/lib/generators/brain_damage/lib/views/inputs/templates/collection_checkboxes.html.haml +6 -0
  128. data/lib/generators/brain_damage/lib/views/inputs/templates/collection_select.html.haml +9 -0
  129. data/lib/generators/brain_damage/lib/views/inputs/templates/custom.html.haml +5 -0
  130. data/lib/generators/brain_damage/lib/views/inputs/templates/default.html.haml +1 -0
  131. data/lib/generators/brain_damage/lib/views/inputs/templates/file.html.haml +5 -0
  132. data/lib/generators/brain_damage/lib/views/inputs/templates/hierarchy_picker.html.haml +19 -0
  133. data/lib/generators/brain_damage/lib/views/inputs/templates/nested_form.html.haml +2 -0
  134. data/lib/generators/brain_damage/lib/views/inputs/templates/polymorphic_hybrid.html.haml +20 -0
  135. data/lib/generators/brain_damage/lib/views/inputs/templates/polymorphic_select.html.haml +22 -0
  136. data/lib/generators/brain_damage/lib/views/inputs/templates/simple_select.html.haml +1 -0
  137. data/lib/generators/brain_damage/lib/views/inputs/templates/text.html.haml +1 -0
  138. data/lib/generators/brain_damage/lib/views/labels/base.rb +26 -0
  139. data/lib/generators/brain_damage/lib/views/labels/default.rb +15 -0
  140. data/lib/generators/brain_damage/lib/views/labels/templates/default.html.haml +6 -0
  141. data/lib/generators/brain_damage/lib/views/modules/inline_editable.rb +16 -0
  142. data/lib/generators/brain_damage/lib/views/schemas/autocompletable.rb +36 -0
  143. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/base.rb +26 -0
  144. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_links.html.haml +8 -0
  145. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_multiple_selection.html.haml +6 -0
  146. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_simple_selection.html.haml +6 -0
  147. data/lib/generators/brain_damage/lib/views/schemas/base.rb +97 -0
  148. data/lib/generators/brain_damage/lib/views/schemas/base/base.rb +86 -0
  149. data/lib/generators/brain_damage/lib/views/schemas/base/form.rb +24 -0
  150. data/lib/generators/brain_damage/lib/views/schemas/base/templates/_fields.html.haml +10 -0
  151. data/lib/generators/brain_damage/lib/views/schemas/base/templates/_form.html.haml +15 -0
  152. data/lib/generators/brain_damage/lib/views/schemas/base/templates/index.html.haml +16 -0
  153. data/lib/generators/brain_damage/lib/views/schemas/base/templates/list/_index.html.haml +4 -0
  154. data/lib/generators/brain_damage/lib/views/schemas/base/templates/list/_item.html.haml +5 -0
  155. data/lib/generators/brain_damage/lib/views/schemas/base/templates/new.html.haml +3 -0
  156. data/lib/generators/brain_damage/lib/views/schemas/base/templates/show.html.haml +9 -0
  157. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_header.html.haml +5 -0
  158. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_index.html.haml +8 -0
  159. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_item.html.haml +5 -0
  160. data/lib/generators/brain_damage/lib/views/schemas/custom.rb +36 -0
  161. data/lib/generators/brain_damage/lib/views/schemas/factory.rb +13 -0
  162. data/lib/generators/brain_damage/lib/views/schemas/inline_editable.rb +27 -0
  163. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/base.rb +20 -0
  164. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/field.rb +47 -0
  165. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/inline_edit.rb +10 -0
  166. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/templates/inline_edit/_field.html.haml +33 -0
  167. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/templates/inline_edit/_inline_edit.html.haml +0 -0
  168. data/lib/generators/brain_damage/lib/views/schemas/nested_fields.rb +14 -0
  169. data/lib/generators/brain_damage/lib/views/schemas/nested_fields/base.rb +20 -0
  170. data/lib/generators/brain_damage/lib/views/schemas/nested_fields/templates/_nested.fields.html.haml +33 -0
  171. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager.rb +22 -0
  172. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/base.rb +40 -0
  173. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/list_item.rb +16 -0
  174. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/_single_page_manager.html.haml +20 -0
  175. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/index.html.haml +1 -0
  176. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_index.form.html.haml +20 -0
  177. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_index.html.haml +27 -0
  178. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.display.html.haml +5 -0
  179. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.form.html.haml +21 -0
  180. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.html.haml +33 -0
  181. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_simple.html.haml +4 -0
  182. data/lib/generators/brain_damage/lib/views/views_generator.rb +37 -0
  183. data/lib/generators/brain_damage/resource/USAGE +8 -0
  184. data/lib/generators/brain_damage/resource/helpers.rb +117 -0
  185. data/lib/generators/brain_damage/resource/monkeys/string.rb +17 -0
  186. data/lib/generators/brain_damage/resource/resource_generator.rb +139 -0
  187. data/lib/generators/brain_damage/resource/templates/controller.rb +40 -0
  188. data/lib/generators/brain_damage/resource/templates/inputs/_simple_select.html.haml +1 -0
  189. data/lib/generators/brain_damage/resource/templates/views/common/_fields.html.haml +11 -0
  190. data/lib/generators/brain_damage/resource/templates/views/common/show.html.haml +11 -0
  191. data/lib/generators/brain_damage/resource/templates/views/full_entity/_form.html.haml +13 -0
  192. data/lib/generators/brain_damage/resource/templates/views/full_entity/_index.body.html.haml +4 -0
  193. data/lib/generators/brain_damage/resource/templates/views/full_entity/_index.html.haml +5 -0
  194. data/lib/generators/brain_damage/resource/templates/views/full_entity/_table.header.html.haml +7 -0
  195. data/lib/generators/brain_damage/resource/templates/views/full_entity/_table.item.html.haml +8 -0
  196. data/lib/generators/brain_damage/resource/templates/views/full_entity/index.html.haml +16 -0
  197. data/lib/generators/brain_damage/resource/templates/views/full_entity/new.html.haml +3 -0
  198. data/lib/generators/brain_damage/resource/templates/views/scaffold/_menu.entry.html.haml +1 -0
  199. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_form.html.haml +15 -0
  200. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_index.body.html.haml +4 -0
  201. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_single_page_manager.html.haml +17 -0
  202. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.form.html.haml +21 -0
  203. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.header.html.haml +12 -0
  204. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.html.haml +27 -0
  205. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.form.html.haml +21 -0
  206. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.html.haml +32 -0
  207. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.show.html.haml +13 -0
  208. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/index.html.haml +4 -0
  209. data/lib/generators/brain_damage/resource/templates/views/special/_fields.show.inline.html.haml +10 -0
  210. data/lib/generators/brain_damage/resource/templates/views/special/_inline_edit.html.haml +2 -0
  211. data/lib/generators/brain_damage/resource/templates/views/special/_inner.show.inline.html.haml +20 -0
  212. data/lib/generators/brain_damage/resource/templates/views/special/_nested.fields.html.haml +33 -0
  213. data/lib/generators/brain_damage/resource/templates/views/special/_show.inline.html.haml +10 -0
  214. data/lib/generators/brain_damage/resource/templates/views/special/_trailing_form.show.inline.html.haml +12 -0
  215. metadata +328 -0
@@ -0,0 +1 @@
1
+ = r '<%= plural_table_name %>/single_page_manager'
@@ -0,0 +1,20 @@
1
+ - table_form_id = bd_id 'single-page-manager-table-form'
2
+ - <%= singular_table_name %> ||= @<%= singular_table_name %>
3
+
4
+ - @single_page_manager_options ||= Hash.new(false)
5
+ - @single_page_manager_options[:cancel_button] = true
6
+
7
+ .brain-damage-single-page-manager-index-form{id: table_form_id}
8
+ - if @single_page_manager_options[:explicit_form]
9
+ .brain-damage-hideable-content.brain-damage-add-form-wrapper
10
+ = r '<%= plural_table_name %>/form', <%= singular_table_name %>: <%= singular_table_name %>
11
+
12
+ - else
13
+ .ui.basic.small.icon.button.brain-damage-show
14
+ %i.add.icon
15
+
16
+ .brain-damage-hideable-content.brain-damage-add-form-wrapper{ colspan: 99, style: 'display: none' }
17
+ = r '<%= plural_table_name %>/form', <%= singular_table_name %>: <%= singular_table_name %>
18
+
19
+ :javascript
20
+ new BrainDamage.TrailingForm("##{table_form_id}")
@@ -0,0 +1,27 @@
1
+ - single_page_manager_table_id = bd_id "brain-damage-single-page-manager-table"
2
+
3
+ - <%= plural_table_name %> ||= @<%= plural_table_name %>
4
+ - <%= singular_table_name %>_prototype ||= <%= name %>.new
5
+
6
+ - @single_page_manager_options ||= Hash.new(false)
7
+ - @single_page_manager_options[:cancel_button] = true
8
+ - @single_page_manager_options.merge!(single_page_manager_options) if defined? single_page_manager_options
9
+
10
+ .ui.form.brain-damage-list{ id: single_page_manager_table_id }
11
+ .brain-damage-list-header
12
+ - if @single_page_manager_options[:leading_form]
13
+ - @single_page_manager_options[:form_context] = :leading_form
14
+ = r "<%= plural_table_name %>/list/index.form", <%= singular_table_name %>: <%= singular_table_name %>_prototype
15
+
16
+ - <%= plural_table_name %>.each do |<%= singular_table_name %>|
17
+ = r "<%= plural_table_name %>/list/item", <%= singular_table_name %>: <%= singular_table_name %>
18
+
19
+ - if @single_page_manager_options[:trailing_form]
20
+ - @single_page_manager_options[:form_context] = :trailing_form
21
+ = r "<%= plural_table_name %>/list/index.form", <%= singular_table_name %>: <%= singular_table_name %>_prototype
22
+
23
+ - @single_page_manager_options[:form_context] = nil
24
+
25
+ - unless @single_page_manager_options[:single_page_manager_script_duplicate_guard]
26
+ :javascript
27
+ new BrainDamage.SinglePageManager("##{single_page_manager_table_id}");
@@ -0,0 +1,5 @@
1
+ <% for field in displayable_fields(:list_item) -%>
2
+ .field
3
+ %label= <%= field.label.text %>
4
+ <%= field.display(:list_item).render.indent 1 %>
5
+ <% end -%>
@@ -0,0 +1,21 @@
1
+ - <%= singular_table_name %> = <%= singular_table_name %> || @<%= singular_table_name %> || <%= name %>.new
2
+
3
+ - @single_page_manager_options ||= Hash.new(false)
4
+ - nested_on ||= @single_page_manager_options[:nested_on]
5
+
6
+ = form_for <%= singular_table_name %>, html: { class: 'ui form' }, remote: true, validate: true do |f|
7
+ = r '<%= plural_table_name %>/fields', <%= singular_table_name %>: <%= singular_table_name %>, nested_on: nested_on, f: f
8
+
9
+ = hidden_field_tag 'partial_locals[single_page_manager_options]', @single_page_manager_options.to_json
10
+
11
+ .actions
12
+ - if <%= singular_table_name %>.persisted?
13
+ %button.ui.small.icon.primary.button{ type: :submit }
14
+ %i.save.icon
15
+
16
+ .ui.small.basic.icon.button.brain-damage-cancel
17
+ %i.remove.icon
18
+
19
+ - else
20
+ = f.submit cet('actions.add'), class: 'ui primary button'
21
+ .ui.basic.button.brain-damage-cancel= cet('actions.cancel')
@@ -0,0 +1,33 @@
1
+ - <%= singular_table_name %> ||= @<%= singular_table_name %>
2
+
3
+ - if defined?(single_page_manager_options)
4
+ - @single_page_manager_options = JSON.parse(single_page_manager_options).symbolize_keys
5
+
6
+ - else
7
+ - @single_page_manager_options ||= Hash.new false
8
+
9
+ - @single_page_manager_options[:nested_on] = nested_on if defined? nested_on
10
+
11
+ .brain-damage-list-item-wrapper
12
+ .brain-damage-list-item
13
+ = r "<%= plural_table_name %>/list/item.display", <%= singular_table_name %>: <%= singular_table_name %>
14
+
15
+ .brain-damage-actions-wrapper
16
+ .brain-damage-actions.ui.mini.transparent.icon.buttons
17
+ - if <%= viewable_guard %>
18
+ = link_to <%= singular_table_name %>, class: 'ui button' do
19
+ %i.eye.icon
20
+
21
+ - if <%= editable_guard %>
22
+ %a.ui.button
23
+ %i.brain-damage-edit.edit.icon
24
+
25
+ - if <%= deletable_guard %>
26
+ = link_to <%= singular_table_name %>, method: :delete, remote: true, data: { confirm: t('actions.confirm_delete') }, class: 'brain-damage-delete ui button' do
27
+ %i.trash.icon
28
+
29
+ - if <%= editable_guard %>
30
+ .brain-damage-edit-list-item
31
+ = r '<%= plural_table_name %>/list/item.form', <%= singular_table_name %>: <%= singular_table_name %>
32
+
33
+ <%= item_separator.indent 1 %>
@@ -0,0 +1,4 @@
1
+ - <%= plural_table_name %> ||= @<%= plural_table_name %>
2
+
3
+ - <%= plural_table_name %>.each do |<%= singular_table_name %>|
4
+ %div= r "<%= plural_table_name %>/list/item.display", <%= singular_table_name %>: <%= singular_table_name %>
@@ -0,0 +1,37 @@
1
+ require_relative '../templateable/Base'
2
+ require_relative 'schemas/factory'
3
+
4
+ module BrainDamage
5
+ class ViewsGenerator
6
+ def initialize(resource)
7
+ @schemas = []
8
+ @views = {}
9
+ @resource = resource
10
+
11
+ add_schema :custom
12
+ end
13
+
14
+ def generate
15
+ end
16
+
17
+ def add_schema(name)
18
+ schema = BrainDamage::ViewSchemas::Factory.create name, @resource
19
+ @schemas << schema
20
+ yield schema if block_given?
21
+ schema.ensure_views_descriptions
22
+
23
+ schema.views.each do |name, object|
24
+ @views[name] = object unless @views[name]
25
+ end
26
+ end
27
+
28
+ def views
29
+ @views.values
30
+ end
31
+
32
+ private
33
+ def dir
34
+ __dir__
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate brain_damage Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,117 @@
1
+ module BrainDamage
2
+ module ResourceHelpers
3
+ attr_accessor :default_indentation
4
+
5
+ def display_field_names(field_names, options = {})
6
+ options = {
7
+ indentation: default_indentation,
8
+ join: "\n"
9
+ }.merge options
10
+
11
+ field_names.map { |field_name|
12
+ display_for(field_name, options[:indentation])
13
+ }.join options[:join]
14
+ end
15
+
16
+ def display_for(field_name, options = {})
17
+ indentation = options[:indentation] || default_indentation
18
+ options = options.except :indentation
19
+
20
+ options[:identifier] ||= :default
21
+
22
+ display = @resource.fields[field_name].display(options[:identifier])
23
+
24
+ if display
25
+ html = display.render
26
+ else
27
+ html = ''
28
+ puts "ERROR: Unable to find a suitable display for #{field_name} (@ #{options[:identifier]})"
29
+ end
30
+
31
+ indent_or_die html, indentation
32
+ end
33
+
34
+ def label_for(field_name, options = {})
35
+ indentation = options[:indentation] || default_indentation
36
+ options = options.except :indentation
37
+
38
+ options[:identifier] ||= :default
39
+
40
+ begin
41
+ indent_or_die @resource.fields[field_name].label(options[:identifier]).render, indentation
42
+ rescue
43
+ puts "ERROR on #{field_name}"
44
+ end
45
+ end
46
+
47
+ def display_with_label_for(field_name, options = {})
48
+ indentation = options[:indentation] || default_indentation
49
+ options[:indentation] = 0
50
+
51
+ inner_html = [label_for(field_name, options), display_for(field_name, options)].join "\n"
52
+ indent_or_die inner_html, indentation
53
+ end
54
+
55
+ def input_for(field_name, options = {})
56
+ indentation = options[:indentation] || default_indentation
57
+ options = options.except :indentation
58
+
59
+ options[:identifier] ||= :default
60
+
61
+ # if block_given?
62
+ # args[:encapsulated_block] = encapsulate_block_in_view_context(&block)
63
+ # end
64
+
65
+ unless @resource.fields[field_name]
66
+ puts "ERROR: can't find field #{field_name}"
67
+ return ''
68
+ end
69
+
70
+ input = @resource.fields[field_name].input(options[:identifier])
71
+
72
+ if input
73
+ html = input.render
74
+ else
75
+ html = ''
76
+ puts "ERROR: Unable to find a suitable input for #{field_name} (@ #{options[:identifier]})"
77
+ end
78
+
79
+ indent_or_die html, indentation
80
+ end
81
+
82
+ def input_with_label_for(field_name, options = {})
83
+ indentation = options[:indentation] || default_indentation
84
+ options[:indentation] = 0
85
+
86
+ inner_html = [label_for(field_name, options), input_for(field_name, options)].join "\n"
87
+ indent_or_die inner_html, indentation
88
+ end
89
+
90
+ def label_text_for(field_name, options = {})
91
+ options[:context] ||= :default
92
+
93
+ label = @resource.fields[field_name].label(options[:context])
94
+ if label
95
+ label.rendered_text
96
+ else
97
+ puts "ERROR: Unable to find a suitable label for #{field_name} (@ #{options[:identifier]})"
98
+ ''
99
+ end
100
+ end
101
+
102
+ def indent_or_die(html, indentation = default_indentation)
103
+ return html.indent indentation if html
104
+ false
105
+ end
106
+
107
+ def encapsulate_block_in_view_context(&block)
108
+ Proc.new do |*args|
109
+ self.send(:capture, *args, &block)
110
+ end
111
+ end
112
+
113
+ def template_hook(arg)
114
+ ''
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,17 @@
1
+ class String
2
+ def indent(level = 1, spaces_per_level = 2)
3
+ self.gsub(/^/, ' ' * spaces_per_level.to_i * level.to_i)
4
+ end
5
+
6
+ def indent!(level = 1, spaces_per_level = 2)
7
+ self.gsub!(/^/, ' ' * spaces_per_level.to_i * level.to_i)
8
+ end
9
+
10
+ def indentation
11
+ length - lstrip.length
12
+ end
13
+
14
+ def indentation_level(spaces_per_level = 2)
15
+ indentation / spaces_per_level
16
+ end
17
+ end
@@ -0,0 +1,139 @@
1
+ require 'rails/generators/resource_helpers'
2
+ require 'rails/generators/rails/model/model_generator'
3
+ require 'active_support/core_ext/object/blank'
4
+
5
+ require_relative '../lib/resource'
6
+ require_relative 'monkeys/string'
7
+ require_relative 'helpers'
8
+
9
+ module BrainDamage
10
+ class ResourceGenerator < Rails::Generators::ModelGenerator
11
+ include Rails::Generators::ModelHelpers
12
+ include Rails::Generators::ResourceHelpers
13
+ include BrainDamage::ResourceHelpers
14
+
15
+ source_root File.expand_path('../templates', __FILE__)
16
+
17
+ class_option :description, desc: "The .rb file with description for this resource"
18
+
19
+ class << self
20
+ attr_accessor :resource
21
+ attr_accessor :resource_root
22
+ end
23
+
24
+ def self.start(args, config)
25
+ self.resource = get_resource_description args
26
+
27
+ args = resource.parametizer.as_cmd_parameters + ['--force', '--no-test-framework', '--no-routes'] # always force views
28
+ @ignore_migration = self.resource.migration.skip?
29
+
30
+ if @ignore_migration
31
+ args << '--no-migration'
32
+ end
33
+
34
+ hook_for :resource_route, required: true, in: :rails unless self.has_already_added_route?
35
+
36
+ model_file_name = File.join('app/models', "#{@resource.name.underscore.downcase}.rb")
37
+ resource.model.setup model_file_name
38
+
39
+ super
40
+ end
41
+
42
+ def set_resource_object
43
+ @resource = self.class.resource
44
+ @resource.setup self
45
+ end
46
+
47
+ def generate_controller
48
+ file_name = File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
49
+ @resource.controller.setup file_name
50
+ create_file(@resource.controller.current_file_name) { @resource.controller.generate }
51
+ end
52
+
53
+ def generate_model
54
+ create_file(@resource.model.current_file_name) { @resource.model.generate }
55
+ end
56
+
57
+ def generate_views
58
+ @resource.views.views.each do |view|
59
+ target_file_name = File.join('app/views/', controller_file_name, view.file_name)
60
+
61
+ unless Templateable::ViewTemplateable.skip_overwrite? target_file_name
62
+ create_file(target_file_name) { view.render }
63
+ end
64
+ end
65
+ end
66
+
67
+ def improve_migration_code
68
+ return if @ignore_migration
69
+ file_name = @resource.migration.migration_file_full_path
70
+
71
+ return unless file_name and File.exists? file_name
72
+ file_contents = File.read file_name
73
+
74
+ File.open(file_name, 'w+') do |f|
75
+ f.write @resource.migration.improve_code file_contents
76
+ end
77
+ end
78
+
79
+ protected
80
+ def self.get_resource_description(args)
81
+ initializers = [get_base_file, get_description_file_from_args(args)].reject(&:nil?)
82
+ BrainDamage::Resource.new initializers, { root: resource_root }
83
+ end
84
+
85
+ def self.get_base_file
86
+ base_file = Rails.root+'desc/base.rb'
87
+ return File.open base_file if File.exists? base_file
88
+ end
89
+
90
+ def self.get_description_file_from_args(args)
91
+ description = args.select{ |arg|
92
+ arg.starts_with? '--description' or arg.starts_with? '-d'
93
+ }.first
94
+
95
+ return nil unless description
96
+
97
+ file_name = description.split('=').last.strip
98
+
99
+ if file_name =~ /^\d+/
100
+ full_file_name = Rails.root+'desc/'+file_name
101
+
102
+ else
103
+ # Try to find a directory
104
+ file_glob = '*.'+file_name
105
+ full_file_name = Dir[Rails.root+'desc/'+file_glob].first
106
+
107
+ if full_file_name.blank?
108
+ # No directory? Try a file
109
+ file_glob += '.rb'
110
+ full_file_name = Dir[Rails.root+'desc/'+file_glob].first
111
+ end
112
+ end
113
+
114
+ if full_file_name.blank?
115
+ raise "Couldn't find any file related with #{description}"
116
+ else
117
+ if File.directory? full_file_name
118
+ self.resource_root = full_file_name
119
+ return File.open "#{resource_root}/#{file_name.gsub(/^\d+\./, '')}.rb"
120
+ end
121
+
122
+ return File.open full_file_name
123
+ end
124
+ end
125
+
126
+ def self.has_already_added_route?
127
+ File.read(Rails.root+'config/routes.rb').include? "resources :#{resource.name.pluralize.underscore}"
128
+ end
129
+
130
+ def handler
131
+ :haml
132
+ end
133
+
134
+ def method_missing(method, *args, &block)
135
+ puts "BrainDamage: Failed to delegate #{method} (on: #{self.class.to_s})"
136
+ super
137
+ end
138
+ end
139
+ end