flexite 0.0.2

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 (170) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +12 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  6. data/app/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  7. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  8. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  9. data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  10. data/app/assets/images/flexite/glyphicons-halflings-white.png +0 -0
  11. data/app/assets/images/flexite/glyphicons-halflings.png +0 -0
  12. data/app/assets/javascripts/flexite/application.js +18 -0
  13. data/app/assets/javascripts/flexite/bootstrap.min.js +7 -0
  14. data/app/assets/javascripts/flexite/common.js.erb +2 -0
  15. data/app/assets/javascripts/flexite/jquery.min.js +2 -0
  16. data/app/assets/javascripts/flexite/tree.js.erb +83 -0
  17. data/app/assets/javascripts/flexite/treeview.js +1335 -0
  18. data/app/assets/stylesheets/flexite/application.css +29 -0
  19. data/app/assets/stylesheets/flexite/bootstrap-treeview.min.css +1 -0
  20. data/app/assets/stylesheets/flexite/bootstrap.min.css +5 -0
  21. data/app/assets/stylesheets/flexite/configs.css +8 -0
  22. data/app/assets/stylesheets/flexite/entries.css +4 -0
  23. data/app/assets/stylesheets/flexite/tree.css +21 -0
  24. data/app/assets/stylesheets/scaffold.css +56 -0
  25. data/app/controllers/flexite/application_controller.rb +25 -0
  26. data/app/controllers/flexite/configs_controller.rb +61 -0
  27. data/app/controllers/flexite/entries_controller.rb +82 -0
  28. data/app/factories/flexite/base_factory.rb +7 -0
  29. data/app/factories/flexite/service_factory.rb +19 -0
  30. data/app/forms/flexite/base_form.rb +24 -0
  31. data/app/forms/flexite/config/form.rb +12 -0
  32. data/app/forms/flexite/entry/array_form.rb +11 -0
  33. data/app/forms/flexite/entry/form.rb +16 -0
  34. data/app/helpers/flexite/application_helper.rb +15 -0
  35. data/app/helpers/flexite/configs_helper.rb +4 -0
  36. data/app/helpers/flexite/entries_helper.rb +46 -0
  37. data/app/models/flexite/arr_entry.rb +35 -0
  38. data/app/models/flexite/bool_entry.rb +19 -0
  39. data/app/models/flexite/config.rb +64 -0
  40. data/app/models/flexite/entry.rb +30 -0
  41. data/app/models/flexite/int_entry.rb +13 -0
  42. data/app/models/flexite/str_entry.rb +2 -0
  43. data/app/models/flexite/sym_entry.rb +17 -0
  44. data/app/services/flexite/action_service/result.rb +44 -0
  45. data/app/services/flexite/action_service.rb +30 -0
  46. data/app/services/flexite/config/create_service.rb +25 -0
  47. data/app/services/flexite/config/update_service.rb +28 -0
  48. data/app/services/flexite/data/hash.rb +17 -0
  49. data/app/services/flexite/data/migrators/yaml.rb +62 -0
  50. data/app/services/flexite/data/new.rb +87 -0
  51. data/app/services/flexite/entry/array_create_service.rb +69 -0
  52. data/app/services/flexite/entry/array_update_service.rb +69 -0
  53. data/app/services/flexite/entry/create_service.rb +31 -0
  54. data/app/services/flexite/entry/destroy_array_entry_service.rb +25 -0
  55. data/app/services/flexite/entry/destroy_service.rb +22 -0
  56. data/app/services/flexite/entry/update_service.rb +26 -0
  57. data/app/simple_form/array_input.rb +13 -0
  58. data/app/views/flexite/application/index.html.haml +14 -0
  59. data/app/views/flexite/configs/_form.html.haml +7 -0
  60. data/app/views/flexite/configs/create.js.haml +3 -0
  61. data/app/views/flexite/configs/edit.js.haml +1 -0
  62. data/app/views/flexite/configs/index.json.erb +10 -0
  63. data/app/views/flexite/configs/new.js.haml +1 -0
  64. data/app/views/flexite/configs/update.js.haml +2 -0
  65. data/app/views/flexite/entries/_form.html.haml +11 -0
  66. data/app/views/flexite/entries/_new_array_entry_form.html.haml +7 -0
  67. data/app/views/flexite/entries/_popup.html.haml +18 -0
  68. data/app/views/flexite/entries/_types_dropdown.html.haml +8 -0
  69. data/app/views/flexite/entries/create.js.haml +4 -0
  70. data/app/views/flexite/entries/destroy.js.haml +4 -0
  71. data/app/views/flexite/entries/destroy_array_entry.js.haml +6 -0
  72. data/app/views/flexite/entries/edit.js.haml +1 -0
  73. data/app/views/flexite/entries/new.js.haml +1 -0
  74. data/app/views/flexite/entries/new_array_entry.js.haml +1 -0
  75. data/app/views/flexite/entries/select_type.js.haml +1 -0
  76. data/app/views/flexite/entries/types/_arr_entry.html.haml +19 -0
  77. data/app/views/flexite/entries/types/_bool_entry.html.haml +4 -0
  78. data/app/views/flexite/entries/types/_int_entry.html.haml +4 -0
  79. data/app/views/flexite/entries/types/_str_entry.html.haml +4 -0
  80. data/app/views/flexite/entries/types/_sym_entry.html.haml +1 -0
  81. data/app/views/flexite/entries/update.js.haml +1 -0
  82. data/app/views/flexite/shared/_messages.html.haml +5 -0
  83. data/app/views/flexite/shared/_show_flash.js.haml +5 -0
  84. data/app/views/layouts/flexite/application.html.haml +11 -0
  85. data/config/initializers/simple_form.rb +143 -0
  86. data/config/initializers/simple_form_bootstrap.rb +43 -0
  87. data/config/locales/simple_form.en.yml +26 -0
  88. data/config/routes.rb +17 -0
  89. data/db/migrate/20180503102555_create_flexite_configs.rb +14 -0
  90. data/db/migrate/20180503103109_create_flexite_entries.rb +14 -0
  91. data/lib/flexite/cached_node.rb +19 -0
  92. data/lib/flexite/configuration.rb +24 -0
  93. data/lib/flexite/engine.rb +18 -0
  94. data/lib/flexite/flexy.rb +13 -0
  95. data/lib/flexite/nodes_hash.rb +5 -0
  96. data/lib/flexite/version.rb +3 -0
  97. data/lib/flexite.rb +44 -0
  98. data/lib/tasks/flexite_tasks.rake +20 -0
  99. data/test/dummy/README.rdoc +261 -0
  100. data/test/dummy/Rakefile +7 -0
  101. data/test/dummy/app/assets/javascripts/application.js +15 -0
  102. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  103. data/test/dummy/app/controllers/application_controller.rb +3 -0
  104. data/test/dummy/app/helpers/application_helper.rb +2 -0
  105. data/test/dummy/config/application.rb +59 -0
  106. data/test/dummy/config/application.yml +599 -0
  107. data/test/dummy/config/boot.rb +10 -0
  108. data/test/dummy/config/database.yml +25 -0
  109. data/test/dummy/config/environment.rb +5 -0
  110. data/test/dummy/config/environments/development.rb +40 -0
  111. data/test/dummy/config/environments/production.rb +67 -0
  112. data/test/dummy/config/environments/test.rb +37 -0
  113. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  114. data/test/dummy/config/initializers/flexite.rb +5 -0
  115. data/test/dummy/config/initializers/inflections.rb +15 -0
  116. data/test/dummy/config/initializers/mime_types.rb +5 -0
  117. data/test/dummy/config/initializers/secret_token.rb +7 -0
  118. data/test/dummy/config/initializers/session_store.rb +8 -0
  119. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  120. data/test/dummy/config/locales/en.yml +5 -0
  121. data/test/dummy/config/routes.rb +3 -0
  122. data/test/dummy/config.ru +4 -0
  123. data/test/dummy/db/development.sqlite3 +0 -0
  124. data/test/dummy/db/schema.rb +39 -0
  125. data/test/dummy/db/seeds.rb +3 -0
  126. data/test/dummy/db/test.sqlite3 +0 -0
  127. data/test/dummy/log/development.log +86588 -0
  128. data/test/dummy/public/404.html +26 -0
  129. data/test/dummy/public/422.html +26 -0
  130. data/test/dummy/public/500.html +25 -0
  131. data/test/dummy/public/favicon.ico +0 -0
  132. data/test/dummy/script/rails +6 -0
  133. data/test/dummy/tmp/cache/assets/C67/060/sprockets%2Ffaf176441f0544dd2b51901280044b40 +0 -0
  134. data/test/dummy/tmp/cache/assets/C9D/530/sprockets%2Fdcd49c063327c12052812f41c20a8e74 +0 -0
  135. data/test/dummy/tmp/cache/assets/CA3/270/sprockets%2F502b740063f8ec15e7e12811da71c772 +0 -0
  136. data/test/dummy/tmp/cache/assets/CDC/060/sprockets%2F8ff1d307d1b36810549d0829722b7aea +0 -0
  137. data/test/dummy/tmp/cache/assets/CDE/120/sprockets%2F5fd8b3fa3724451579552aed373410ce +0 -0
  138. data/test/dummy/tmp/cache/assets/CF8/980/sprockets%2F4e5077b95460dc34d7c9d7d9880e7b47 +0 -0
  139. data/test/dummy/tmp/cache/assets/D00/4C0/sprockets%2F603c6d7b825c2f4a6422b3d4af4e6203 +0 -0
  140. data/test/dummy/tmp/cache/assets/D00/C40/sprockets%2F999847c008fb4ce26fff5607c39d8358 +0 -0
  141. data/test/dummy/tmp/cache/assets/D09/A30/sprockets%2F2a71e20a2f3544acb51956504cd8d8e9 +0 -0
  142. data/test/dummy/tmp/cache/assets/D0D/E60/sprockets%2F90ea9eaa4671ec2d76703bae31972634 +0 -0
  143. data/test/dummy/tmp/cache/assets/D2A/160/sprockets%2Fbe17d4d0be4b381500e2824bbe273d70 +0 -0
  144. data/test/dummy/tmp/cache/assets/D2E/700/sprockets%2Fb21f85e0940bbcb3a8914c9cb0b07218 +0 -0
  145. data/test/dummy/tmp/cache/assets/D39/CD0/sprockets%2F0e8f6981475e49ea9fe14698fa57e4e9 +0 -0
  146. data/test/dummy/tmp/cache/assets/D40/590/sprockets%2F181dd5673b58f1ec4c89e50028bfad60 +0 -0
  147. data/test/dummy/tmp/cache/assets/D46/870/sprockets%2Fd880bdf72c5d0009b88fda8521439dc8 +0 -0
  148. data/test/dummy/tmp/cache/assets/D48/5F0/sprockets%2Fe6a83afb2d92f4692ffb391b5285a518 +0 -0
  149. data/test/dummy/tmp/cache/assets/D4B/A20/sprockets%2Febde89014596e655c35df9c4a01ee636 +0 -0
  150. data/test/dummy/tmp/cache/assets/D54/A50/sprockets%2Ff49839d906f69fd92904ebac07a3a38e +0 -0
  151. data/test/dummy/tmp/cache/assets/D69/B50/sprockets%2F4186e2787004e19ceb0c4afed46cf04b +0 -0
  152. data/test/dummy/tmp/cache/assets/D6D/C20/sprockets%2F112e96fea93f5f1e31d2077f1cdaf283 +0 -0
  153. data/test/dummy/tmp/cache/assets/D7A/8F0/sprockets%2F8eefc5f9824d950317a5c4a2e68b3c4e +0 -0
  154. data/test/dummy/tmp/cache/assets/DB3/360/sprockets%2F24b1f98ad736884b91d6ebeb2fc68ed8 +0 -0
  155. data/test/dummy/tmp/cache/assets/DD2/E90/sprockets%2Ff01f48c96ba588d15b20dd57ed3ccb7f +0 -0
  156. data/test/dummy/tmp/cache/assets/DEE/0C0/sprockets%2Feedcd74856542eedb5ea3ab1b1502ca4 +0 -0
  157. data/test/dummy/tmp/cache/assets/DF1/210/sprockets%2Ff4fe7dba1445ba1b668aaa1bd34ca984 +0 -0
  158. data/test/dummy/tmp/cache/assets/E44/790/sprockets%2Fefb8d8ea9e97da9d675a8bfa1d5de343 +0 -0
  159. data/test/fixtures/flexite/configs.yml +7 -0
  160. data/test/fixtures/flexite/entries.yml +13 -0
  161. data/test/flexite_test.rb +7 -0
  162. data/test/functional/flexite/configs_controller_test.rb +51 -0
  163. data/test/functional/flexite/entries_controller_test.rb +51 -0
  164. data/test/integration/navigation_test.rb +10 -0
  165. data/test/test_helper.rb +15 -0
  166. data/test/unit/flexite/config_test.rb +9 -0
  167. data/test/unit/flexite/entry_test.rb +9 -0
  168. data/test/unit/helpers/flexite/configs_helper_test.rb +6 -0
  169. data/test/unit/helpers/flexite/entries_helper_test.rb +6 -0
  170. metadata +366 -0
@@ -0,0 +1,69 @@
1
+ require_dependency 'flexite/action_service'
2
+
3
+ module Flexite
4
+ class Entry::ArrayUpdateService < ActionService
5
+ def call
6
+ if @form.invalid?
7
+ return failure
8
+ end
9
+
10
+ process_entries
11
+ end
12
+
13
+ private
14
+
15
+ def process_entries
16
+ Entry.transaction do
17
+ update_entries(@form.entries)
18
+ create_entries(@form.new_entries, @form.id)
19
+ end
20
+
21
+ success
22
+ rescue => exc
23
+ exc_failure(exc)
24
+ end
25
+
26
+ def update_entries(entries)
27
+ entries.each do |_, entry|
28
+ if respond_to?("save_#{entry[:type].demodulize.underscore}", true)
29
+ send("save_#{entry[:type].demodulize.underscore}", entry)
30
+ else
31
+ save_entry(entry)
32
+ end
33
+ end
34
+ end
35
+
36
+ def create_entries(new_entries, parent_id)
37
+ return if new_entries.blank?
38
+
39
+ new_entries.each do |_, entry|
40
+ klass = entry[:type].constantize
41
+ klass.create({parent_id: parent_id, parent_type: klass.base_class.sti_name, value: entry[:value]}, without_protection: true)
42
+ end
43
+ end
44
+
45
+
46
+ def save_arr_entry(entry)
47
+ update_entries(entry[:entries])
48
+ create_entries(entry[:new_entries], entry[:id])
49
+ end
50
+
51
+ def save_entry(entry)
52
+ entry[:type].constantize.update(entry[:id], value: entry[:value])
53
+ end
54
+
55
+ protected
56
+
57
+ def failure
58
+ Result.new(success: false, endpoint: { status: 400 })
59
+ end
60
+
61
+ def exc_failure(exc)
62
+ Result.new(success: false, message: exc.message, endpoint: { status: 500 })
63
+ end
64
+
65
+ def success
66
+ Result.new(flash: { type: :success, message: 'Entry was updated!' })
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ require_dependency 'flexite/action_service'
2
+
3
+ module Flexite
4
+ class Entry
5
+ class CreateService < ActionService
6
+ def call
7
+ if @form.invalid?
8
+ return failure
9
+ end
10
+
11
+ @record = @form.type.constantize.create do |record|
12
+ record.value = @form.value
13
+ record.parent_id = @form.parent_id
14
+ record.parent_type = @form.parent_type
15
+ end
16
+
17
+ success
18
+ end
19
+
20
+ private
21
+
22
+ def success
23
+ Result.new(flash: { type: :success, message: 'Entry was created!' }, data: { record: @record })
24
+ end
25
+
26
+ def failure
27
+ Result.new(success: false, endpoint: { status: 400 })
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ require_dependency 'flexite/action_service'
2
+
3
+ module Flexite
4
+ class Entry
5
+ class DestroyArrayEntryService < ActionService
6
+ def call
7
+ if @form.id.present?
8
+ Entry.destroy(@form.id)
9
+ end
10
+
11
+ success
12
+ end
13
+
14
+ protected
15
+
16
+ def failure
17
+ Result.new(success: false, endpoint: { status: 400 })
18
+ end
19
+
20
+ def success
21
+ Result.new(flash: { type: :success, message: 'Entry was deleted!' })
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ require_dependency 'flexite/action_service'
2
+
3
+ module Flexite
4
+ class Entry
5
+ class DestroyService < ActionService
6
+ def call
7
+ @record = Entry.destroy(@form.id)
8
+ success
9
+ end
10
+
11
+ protected
12
+
13
+ def failure
14
+ Result.new(success: false, endpoint: { status: 400 })
15
+ end
16
+
17
+ def success
18
+ Result.new(flash: { type: :success, message: 'Entry was deleted!' }, data: { parent_id: @record.parent_id })
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ require_dependency 'flexite/action_service'
2
+
3
+ module Flexite
4
+ class Entry::UpdateService < ActionService
5
+ def call
6
+ if @form.invalid?
7
+ return failure
8
+ end
9
+
10
+ @form.type.constantize.update(@form.id, value: @form.value)
11
+ success
12
+ end
13
+
14
+ private
15
+
16
+ protected
17
+
18
+ def failure
19
+ Result.new(success: false, endpoint: { status: 400 })
20
+ end
21
+
22
+ def success
23
+ Result.new(flash: { type: :success, message: 'Entry was updated!' })
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ class ArrayInput < SimpleForm::Inputs::StringInput
2
+ def input
3
+ input_html_options[:type] ||= input_type
4
+
5
+ Array(object.public_send(attribute_name)).map do |array_el|
6
+ @builder.text_field(nil, input_html_options.merge(value: array_el, name: "#{object_name}[#{attribute_name}][]"))
7
+ end.join.html_safe
8
+ end
9
+
10
+ def input_type
11
+ :text
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ #tree-buttons.row
2
+ .col-md-4.pos-fixed
3
+ %button#new-node-btn.btn.btn-success New node
4
+ %button#edit-node-btn.btn.btn-success Edit node
5
+ %button#delete-node-btn.btn.btn-danger Delete
6
+ = link_to 'Reload cache', reload_configs_path, remote: true, class: 'btn btn-info'
7
+ = back_to_app
8
+ .row#tree-container
9
+ .col-md-4
10
+ #tree
11
+ .col-md-4
12
+ #section-2.pos-fixed
13
+ .col-md-4
14
+ #section-3.pos-fixed
@@ -0,0 +1,7 @@
1
+ = simple_form_for @config_form, remote: true do |f|
2
+ = f.input :id, as: :hidden
3
+ = f.input :name, as: :string, input_html: { class: 'form-control', placeholder: 'Name' }, label: false
4
+ = f.input :config_id, collection: Flexite::Config.not_selectable, label_method: :name, value_method: :id,
5
+ input_html: { class: 'form-control', placeholder: 'Parent' }, label: false, prompt: 'Select parent'
6
+ = f.input :selectable, as: :boolean, label: false, wrapper_html: { class: 'checkbox' }
7
+ = f.button :submit, class: 'btn btn-success'
@@ -0,0 +1,3 @@
1
+ $flexite("#section-2").html("");
2
+ = render 'flexite/shared/show_flash'
3
+ tree.addNode("#{j @node.to_json.html_safe}", "#{@parent_id}");
@@ -0,0 +1 @@
1
+ $flexite("#section-2").html("#{j render 'form'}")
@@ -0,0 +1,10 @@
1
+ [
2
+ <% cache @cache_key do %>
3
+ <% @configs.each_with_index do |config, index| %>
4
+ <% cache config do %>
5
+ <%= config.to_tree_node.to_json.html_safe %>
6
+ <%= ',' if index != @configs.size - 1 %>
7
+ <% end %>
8
+ <% end %>
9
+ <% end %>
10
+ ]
@@ -0,0 +1 @@
1
+ $flexite("#section-2").html("#{j render 'form'}")
@@ -0,0 +1,2 @@
1
+ = render 'flexite/shared/show_flash'
2
+ tree.editNode("#{j @node.to_json.html_safe}");
@@ -0,0 +1,11 @@
1
+ = simple_form_for @entry_form, remote: true do |f|
2
+ - if @entry_form.type.present?
3
+ = render "types/#{@entry_form.view_type}", f: f
4
+ = f.input :id, as: :hidden
5
+ = f.input :type, as: :hidden
6
+ = f.input :parent_id, as: :hidden
7
+ = f.input :parent_type, as: :hidden
8
+ = f.button :submit, class: 'btn btn-success'
9
+
10
+ - if @entry_form.persisted?
11
+ = link_to 'Delete', entry_path(f.object, type: @entry_form.type), method: :delete, remote: true, class: 'btn btn-danger'
@@ -0,0 +1,7 @@
1
+ = simple_fields_for *@form_options do |f|
2
+ = f.simple_fields_for :new_entries, @entry_form, index: @index do |f|
3
+ %div{ id: "#{f.object_name}-#{@index}" }
4
+ = f.input :type, as: :hidden
5
+ = render "types/#{@entry_form.view_type}", f: f,
6
+ delete_link: link_to('Delete', destroy_array_entries_path(id: nil, type: @entry_form.type, selector: "#{f.object_name}-#{@index}"),
7
+ remote: true, method: :delete, class: 'btn btn-danger')
@@ -0,0 +1,18 @@
1
+ .modal.fade#edit-entry{ role: :dialog, aria: { hidden: 'true' } }
2
+ .modal-dialog
3
+ .modal-content
4
+ .modal-header
5
+ %button.close{ type: :button, data: { dismiss: :modal }, aria: { label: 'Close' } }
6
+ %span{ aria: { hidden: 'true' } }
7
+ &times;
8
+ %h4.modal-title#edit-entry-title
9
+ .modal-body#edit-entry-body
10
+ .modal-footer
11
+ %button.btn.btn-primary{ onclick: "$flexite('form[id^=edit_entry]').submit();" } Save
12
+ %button.btn.btn-secondary{ data: { dismiss: :modal } } Close
13
+
14
+ :javascript
15
+ $flexite("#edit-entry").on("hidden.bs.modal", function () {
16
+ $flexite("#edit-entry #edit-entry-title").text("");
17
+ $flexite("#edit-entry-body").html("");
18
+ });
@@ -0,0 +1,8 @@
1
+ = form_for :entry, url: new_entry_path, remote: true, method: 'GET' do |f|
2
+ = f.hidden_field :parent_id, value: @config.id
3
+ = f.hidden_field :parent_type, value: @config.class.name
4
+ .form-inline
5
+ = entry_type_select(f)
6
+ = f.submit 'Add entry', class: 'btn btn-success'
7
+
8
+ #new-entry
@@ -0,0 +1,4 @@
1
+ $flexite("#section-2").html("#{j render 'form'}");
2
+ = render 'flexite/shared/show_flash'
3
+
4
+ tree.setDataHref("#{edit_entry_path(@entry, format: :js)}");
@@ -0,0 +1,4 @@
1
+ $flexite("#section-2").html("");
2
+ = render 'flexite/shared/show_flash'
3
+
4
+ tree.setDataHref("#{select_type_entries_path(@parent_id, format: :js)}");
@@ -0,0 +1,6 @@
1
+ $flexite("[id='#{@selector}']").remove();
2
+ $flexite("#flash").html("#{j render 'flexite/shared/messages'}");
3
+ $flexite("#flash").delay(1800).hide("slow").promise().then(function() {
4
+ $flexite("#flash").html("");
5
+ $flexite("#flash").show();
6
+ });
@@ -0,0 +1 @@
1
+ $flexite("#section-2").html("#{j render 'form'}")
@@ -0,0 +1 @@
1
+ $flexite("#section-2 #new-entry").html("#{j render 'form'}")
@@ -0,0 +1 @@
1
+ $flexite("#array-entries-#{@form_index}").append("#{j render 'new_array_entry_form'}");
@@ -0,0 +1 @@
1
+ $flexite("#section-2").html("#{j render 'types_dropdown'}")
@@ -0,0 +1,19 @@
1
+ = render_entries(f.object.entries, f)
2
+
3
+ .form-group.form-inline
4
+ = entry_type_select
5
+ = f.button :button, 'Add entry', type: :button, class: 'btn btn-success', id: "add_array_entry-#{f.object.id}"
6
+ - if local_assigns[:delete_link].present?
7
+ = delete_link
8
+
9
+ -# TODO: fix index population related to array entry vs simple entry
10
+ :javascript
11
+ $flexite("#add_array_entry-#{f.object.id}").on("click", function () {
12
+ $flexite.get("#{new_array_entries_path}", {
13
+ parent_id: "#{f.object.id}",
14
+ form_index: "#{f.options[:index]}",
15
+ prefix: "#{f.object_name}",
16
+ index: $flexite("[id^='entry_new_entries_'][id$='_value']").size(),
17
+ type: $flexite(this).parent().find("#new_entry_type").val()
18
+ });
19
+ });
@@ -0,0 +1,4 @@
1
+ = f.input :value, label: false do
2
+ = f.input :value, collection: [[:true, 1], [:false, 0]], input_html: { class: 'form-control' }, include_blank: false, label: false
3
+ - if local_assigns[:delete_link].present?
4
+ = delete_link
@@ -0,0 +1,4 @@
1
+ = f.input :value, label: false do
2
+ = f.input :value, as: :integer, input_html: { class: 'form-control', placeholder: 'Number' }, label: false
3
+ - if local_assigns[:delete_link].present?
4
+ = delete_link
@@ -0,0 +1,4 @@
1
+ = f.input :value, label: false do
2
+ = f.input :value, as: :string, input_html: { class: 'form-control', placeholder: 'String' }, label: false
3
+ - if local_assigns[:delete_link].present?
4
+ = delete_link
@@ -0,0 +1 @@
1
+ = render 'types/str_entry', f: f, delete_link: local_assigns[:delete_link]
@@ -0,0 +1 @@
1
+ = render 'flexite/shared/show_flash'
@@ -0,0 +1,5 @@
1
+ .row
2
+ - flash.each do |type, value|
3
+ .col-md-8.alert{ class: "alert-#{type}", role: :alert }
4
+ %strong
5
+ = value
@@ -0,0 +1,5 @@
1
+ $flexite("#flash").html("#{j render 'flexite/shared/messages'}");
2
+ $flexite("#flash").delay(1800).hide("slow").promise().then(function() {
3
+ $flexite("#flash").html("");
4
+ $flexite("#flash").show();
5
+ });
@@ -0,0 +1,11 @@
1
+ %html
2
+ %head
3
+ %title Flexite
4
+ = stylesheet_link_tag 'flexite/application', media: :all
5
+ = javascript_include_tag 'flexite/application'
6
+ = csrf_meta_tags
7
+ %body
8
+ #flash
9
+ = render 'flexite/shared/messages'
10
+ .container-fluid#main-container
11
+ = yield
@@ -0,0 +1,143 @@
1
+ require 'simple_form'
2
+ # Use this setup block to configure all options available in SimpleForm.
3
+ SimpleForm.setup do |config|
4
+ # Wrappers are used by the form builder to generate a
5
+ # complete input. You can remove any component from the
6
+ # wrapper, change the order or even add your own to the
7
+ # stack. The options given below are used to wrap the
8
+ # whole input.
9
+ config.wrappers :default, :class => :input,
10
+ :hint_class => :field_with_hint, :error_class => :field_with_errors do |b|
11
+ ## Extensions enabled by default
12
+ # Any of these extensions can be disabled for a
13
+ # given input by passing: `f.input EXTENSION_NAME => false`.
14
+ # You can make any of these extensions optional by
15
+ # renaming `b.use` to `b.optional`.
16
+
17
+ # Determines whether to use HTML5 (:email, :url, ...)
18
+ # and required attributes
19
+ b.use :html5
20
+
21
+ # Calculates placeholders automatically from I18n
22
+ # You can also pass a string as f.input :placeholder => "Placeholder"
23
+ b.use :placeholder
24
+
25
+ ## Optional extensions
26
+ # They are disabled unless you pass `f.input EXTENSION_NAME => :lookup`
27
+ # to the input. If so, they will retrieve the values from the model
28
+ # if any exists. If you want to enable the lookup for any of those
29
+ # extensions by default, you can change `b.optional` to `b.use`.
30
+
31
+ # Calculates maxlength from length validations for string inputs
32
+ b.optional :maxlength
33
+
34
+ # Calculates pattern from format validations for string inputs
35
+ b.optional :pattern
36
+
37
+ # Calculates min and max from length validations for numeric inputs
38
+ b.optional :min_max
39
+
40
+ # Calculates readonly automatically from readonly attributes
41
+ b.optional :readonly
42
+
43
+ ## Inputs
44
+ b.use :label_input
45
+ b.use :hint, :wrap_with => { :tag => :span, :class => :hint }
46
+ b.use :error, :wrap_with => { :tag => :span, :class => :error }
47
+ end
48
+
49
+ # The default wrapper to be used by the FormBuilder.
50
+ config.default_wrapper = :default
51
+
52
+ # Define the way to render check boxes / radio buttons with labels.
53
+ # Defaults to :nested for bootstrap config.
54
+ # :inline => input + label
55
+ # :nested => label > input
56
+ config.boolean_style = :nested
57
+
58
+ # Default class for buttons
59
+ config.button_class = 'btn'
60
+
61
+ # Method used to tidy up errors. Specify any Rails Array method.
62
+ # :first lists the first message for each field.
63
+ # Use :to_sentence to list all errors for each field.
64
+ # config.error_method = :first
65
+
66
+ # Default tag used for error notification helper.
67
+ config.error_notification_tag = :div
68
+
69
+ # CSS class to add for error notification helper.
70
+ config.error_notification_class = 'alert alert-error'
71
+
72
+ # ID to add for error notification helper.
73
+ # config.error_notification_id = nil
74
+
75
+ # Series of attempts to detect a default label method for collection.
76
+ # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
77
+
78
+ # Series of attempts to detect a default value method for collection.
79
+ # config.collection_value_methods = [ :id, :to_s ]
80
+
81
+ # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
82
+ # config.collection_wrapper_tag = nil
83
+
84
+ # You can define the class to use on all collection wrappers. Defaulting to none.
85
+ # config.collection_wrapper_class = nil
86
+
87
+ # You can wrap each item in a collection of radio/check boxes with a tag,
88
+ # defaulting to :span. Please note that when using :boolean_style = :nested,
89
+ # SimpleForm will force this option to be a label.
90
+ # config.item_wrapper_tag = :span
91
+
92
+ # You can define a class to use in all item wrappers. Defaulting to none.
93
+ # config.item_wrapper_class = nil
94
+
95
+ # How the label text should be generated altogether with the required text.
96
+ # config.label_text = lambda { |label, required| "#{required} #{label}" }
97
+
98
+ # You can define the class to use on all labels. Default is nil.
99
+ config.label_class = 'control-label'
100
+
101
+ # You can define the class to use on all forms. Default is simple_form.
102
+ # config.form_class = :simple_form
103
+
104
+ # You can define which elements should obtain additional classes
105
+ # config.generate_additional_classes_for = [:wrapper, :label, :input]
106
+
107
+ # Whether attributes are required by default (or not). Default is true.
108
+ # config.required_by_default = true
109
+
110
+ # Tell browsers whether to use default HTML5 validations (novalidate option).
111
+ # Default is enabled.
112
+ config.browser_validations = false
113
+
114
+ # Collection of methods to detect if a file type was given.
115
+ # config.file_methods = [ :mounted_as, :file?, :public_filename ]
116
+
117
+ # Custom mappings for input types. This should be a hash containing a regexp
118
+ # to match as key, and the input type that will be used when the field name
119
+ # matches the regexp as value.
120
+ # config.input_mappings = { /count/ => :integer }
121
+
122
+ # Custom wrappers for input types. This should be a hash containing an input
123
+ # type as key and the wrapper that will be used for all inputs with specified type.
124
+ # config.wrapper_mappings = { :string => :prepend }
125
+
126
+ # Default priority for time_zone inputs.
127
+ # config.time_zone_priority = nil
128
+
129
+ # Default priority for country inputs.
130
+ # config.country_priority = nil
131
+
132
+ # Default size for text inputs.
133
+ # config.default_input_size = 50
134
+
135
+ # When false, do not use translations for labels.
136
+ # config.translate_labels = true
137
+
138
+ # Automatically discover new inputs in Rails' autoload path.
139
+ # config.inputs_discovery = true
140
+
141
+ # Cache SimpleForm inputs discovery
142
+ # config.cache_discovery = !Rails.env.development?
143
+ end
@@ -0,0 +1,43 @@
1
+ # Use this setup block to configure all options available in SimpleForm.
2
+ SimpleForm.setup do |config|
3
+ config.wrappers :bootstrap, :tag => 'div', :class => 'form-group', :error_class => 'error' do |b|
4
+ b.use :html5
5
+ b.use :placeholder
6
+ b.use :label
7
+ b.use :input
8
+ b.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
9
+ b.use :hint, :wrap_with => { :tag => 'p', :class => 'help-block' }
10
+ end
11
+
12
+ config.wrappers :prepend, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
13
+ b.use :html5
14
+ b.use :placeholder
15
+ b.use :label
16
+ b.wrapper :tag => 'div', :class => 'controls' do |input|
17
+ input.wrapper :tag => 'div', :class => 'input-prepend' do |prepend|
18
+ prepend.use :input
19
+ end
20
+ input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
21
+ input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
22
+ end
23
+ end
24
+
25
+ config.wrappers :append, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
26
+ b.use :html5
27
+ b.use :placeholder
28
+ b.use :label
29
+ b.wrapper :tag => 'div', :class => 'controls' do |input|
30
+ input.wrapper :tag => 'div', :class => 'input-append' do |append|
31
+ append.use :input
32
+ end
33
+ input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
34
+ input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
35
+ end
36
+ end
37
+
38
+ # Wrappers for forms and inputs using the Bootstrap toolkit.
39
+ # Check the Bootstrap docs (http://getbootstrap.com/2.3.2/)
40
+ # to learn about the different styles for forms and inputs,
41
+ # buttons and other elements.
42
+ config.default_wrapper = :bootstrap
43
+ end
@@ -0,0 +1,26 @@
1
+ en:
2
+ simple_form:
3
+ "yes": 'Yes'
4
+ "no": 'No'
5
+ required:
6
+ text: 'required'
7
+ mark: '*'
8
+ # You can uncomment the line below if you need to overwrite the whole required html.
9
+ # When using html, text and mark won't be used.
10
+ # html: '<abbr title="required">*</abbr>'
11
+ error_notification:
12
+ default_message: "Please review the problems below:"
13
+ # Labels and hints examples
14
+ # labels:
15
+ # defaults:
16
+ # password: 'Password'
17
+ # user:
18
+ # new:
19
+ # email: 'E-mail to sign in.'
20
+ # edit:
21
+ # email: 'E-mail.'
22
+ # hints:
23
+ # defaults:
24
+ # username: 'User name to sign in.'
25
+ # password: 'No special characters, please.'
26
+
data/config/routes.rb ADDED
@@ -0,0 +1,17 @@
1
+ Flexite::Engine.routes.draw do
2
+ resources :entries do
3
+ collection do
4
+ get 'new_array' => 'entries#new_array_entry'
5
+ delete 'destroy_array' => 'entries#destroy_array_entry'
6
+ get ':parent_id/select_type' => 'entries#select_type', as: :select_type
7
+ end
8
+ end
9
+
10
+ resources :configs do
11
+ resources :entries
12
+ resources :configs, only: [:index, :new]
13
+ get :reload, on: :collection
14
+ end
15
+
16
+ root to: 'application#index'
17
+ end
@@ -0,0 +1,14 @@
1
+ class CreateFlexiteConfigs < ActiveRecord::Migration
2
+ def change
3
+ create_table :flexite_configs do |t|
4
+ t.string :name
5
+ t.integer :created_by
6
+ t.boolean :selectable, default: true
7
+ t.references :config
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :flexite_configs, :config_id
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateFlexiteEntries < ActiveRecord::Migration
2
+ def change
3
+ create_table :flexite_entries do |t|
4
+ t.string :value
5
+ t.string :type
6
+ t.references :parent, polymorphic: true
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :flexite_entries, :parent_id
12
+ add_index :flexite_entries, :parent_type
13
+ end
14
+ end