wallaby 4.1.6

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 (209) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +29 -0
  4. data/app/assets/javascripts/wallaby/application.js +15 -0
  5. data/app/assets/javascripts/wallaby/form.js +8 -0
  6. data/app/assets/stylesheets/wallaby/application.scss +51 -0
  7. data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
  8. data/app/assets/stylesheets/wallaby/base/_layout.scss +14 -0
  9. data/app/assets/stylesheets/wallaby/base/_mixins.scss +0 -0
  10. data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
  11. data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
  12. data/app/assets/stylesheets/wallaby/base/_vars.scss +5 -0
  13. data/app/assets/stylesheets/wallaby/components/_forms.scss +53 -0
  14. data/app/assets/stylesheets/wallaby/components/_nav.scss +19 -0
  15. data/app/assets/stylesheets/wallaby/components/_pagination.scss +105 -0
  16. data/app/assets/stylesheets/wallaby/components/_tables.scss +78 -0
  17. data/app/assets/stylesheets/wallaby/components/_text.scss +11 -0
  18. data/app/assets/stylesheets/wallaby/form.scss +11 -0
  19. data/app/assets/stylesheets/wallaby/summernote.scss.erb +7 -0
  20. data/app/controllers/wallaby/application_controller.rb +21 -0
  21. data/app/controllers/wallaby/core_controller.rb +28 -0
  22. data/app/controllers/wallaby/resources_controller.rb +134 -0
  23. data/app/controllers/wallaby/secure_controller.rb +42 -0
  24. data/app/routes/wallaby/resources_router.rb +52 -0
  25. data/app/security/ability.rb +33 -0
  26. data/app/views/layouts/wallaby/_footer.html.erb +2 -0
  27. data/app/views/layouts/wallaby/_header.html.erb +57 -0
  28. data/app/views/layouts/wallaby/_navs.html.erb +1 -0
  29. data/app/views/layouts/wallaby/application.html.erb +22 -0
  30. data/app/views/layouts/wallaby/error.html.erb +20 -0
  31. data/app/views/wallaby/core/home.html.erb +5 -0
  32. data/app/views/wallaby/errors/access_denied.html.erb +1 -0
  33. data/app/views/wallaby/errors/not_authenticated.html.erb +1 -0
  34. data/app/views/wallaby/errors/not_found.html.erb +6 -0
  35. data/app/views/wallaby/errors/unprocessable_entity.erb +1 -0
  36. data/app/views/wallaby/resources/_form.html.erb +12 -0
  37. data/app/views/wallaby/resources/_index_actions.html.erb +1 -0
  38. data/app/views/wallaby/resources/_resource_actions.html.erb +3 -0
  39. data/app/views/wallaby/resources/edit.html.erb +14 -0
  40. data/app/views/wallaby/resources/form/_belongs_to.html.erb +21 -0
  41. data/app/views/wallaby/resources/form/_bigint.html.erb +9 -0
  42. data/app/views/wallaby/resources/form/_binary.html.erb +12 -0
  43. data/app/views/wallaby/resources/form/_bit.html.erb +9 -0
  44. data/app/views/wallaby/resources/form/_bit_varying.html.erb +9 -0
  45. data/app/views/wallaby/resources/form/_boolean.html.erb +14 -0
  46. data/app/views/wallaby/resources/form/_cidr.html.erb +9 -0
  47. data/app/views/wallaby/resources/form/_citext.html.erb +21 -0
  48. data/app/views/wallaby/resources/form/_color.html.erb +20 -0
  49. data/app/views/wallaby/resources/form/_date.html.erb +29 -0
  50. data/app/views/wallaby/resources/form/_daterange.html.erb +37 -0
  51. data/app/views/wallaby/resources/form/_datetime.html.erb +30 -0
  52. data/app/views/wallaby/resources/form/_decimal.html.erb +9 -0
  53. data/app/views/wallaby/resources/form/_email.html.erb +5 -0
  54. data/app/views/wallaby/resources/form/_float.html.erb +9 -0
  55. data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +13 -0
  56. data/app/views/wallaby/resources/form/_has_many.html.erb +13 -0
  57. data/app/views/wallaby/resources/form/_has_one.html.erb +7 -0
  58. data/app/views/wallaby/resources/form/_hstore.html.erb +25 -0
  59. data/app/views/wallaby/resources/form/_inet.html.erb +9 -0
  60. data/app/views/wallaby/resources/form/_int4range.html.erb +18 -0
  61. data/app/views/wallaby/resources/form/_int8range.html.erb +18 -0
  62. data/app/views/wallaby/resources/form/_integer.html.erb +9 -0
  63. data/app/views/wallaby/resources/form/_json.html.erb +23 -0
  64. data/app/views/wallaby/resources/form/_jsonb.html.erb +23 -0
  65. data/app/views/wallaby/resources/form/_ltree.html.erb +5 -0
  66. data/app/views/wallaby/resources/form/_macaddr.html.erb +9 -0
  67. data/app/views/wallaby/resources/form/_money.html.erb +12 -0
  68. data/app/views/wallaby/resources/form/_numrange.html.erb +18 -0
  69. data/app/views/wallaby/resources/form/_password.html.erb +5 -0
  70. data/app/views/wallaby/resources/form/_point.html.erb +18 -0
  71. data/app/views/wallaby/resources/form/_string.html.erb +5 -0
  72. data/app/views/wallaby/resources/form/_text.html.erb +21 -0
  73. data/app/views/wallaby/resources/form/_time.html.erb +29 -0
  74. data/app/views/wallaby/resources/form/_tsrange.html.erb +38 -0
  75. data/app/views/wallaby/resources/form/_tstzrange.html.erb +38 -0
  76. data/app/views/wallaby/resources/form/_tsvector.html.erb +5 -0
  77. data/app/views/wallaby/resources/form/_uuid.html.erb +9 -0
  78. data/app/views/wallaby/resources/form/_xml.html.erb +23 -0
  79. data/app/views/wallaby/resources/index/_belongs_to.html.erb +1 -0
  80. data/app/views/wallaby/resources/index/_bigint.html.erb +1 -0
  81. data/app/views/wallaby/resources/index/_binary.html.erb +1 -0
  82. data/app/views/wallaby/resources/index/_bit.html.erb +5 -0
  83. data/app/views/wallaby/resources/index/_bit_varying.html.erb +5 -0
  84. data/app/views/wallaby/resources/index/_boolean.html.erb +5 -0
  85. data/app/views/wallaby/resources/index/_cidr.html.erb +6 -0
  86. data/app/views/wallaby/resources/index/_citext.html.erb +12 -0
  87. data/app/views/wallaby/resources/index/_color.html.erb +5 -0
  88. data/app/views/wallaby/resources/index/_date.html.erb +7 -0
  89. data/app/views/wallaby/resources/index/_daterange.html.erb +8 -0
  90. data/app/views/wallaby/resources/index/_datetime.html.erb +7 -0
  91. data/app/views/wallaby/resources/index/_decimal.html.erb +1 -0
  92. data/app/views/wallaby/resources/index/_email.html.erb +1 -0
  93. data/app/views/wallaby/resources/index/_float.html.erb +1 -0
  94. data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +11 -0
  95. data/app/views/wallaby/resources/index/_has_many.html.erb +11 -0
  96. data/app/views/wallaby/resources/index/_has_one.html.erb +1 -0
  97. data/app/views/wallaby/resources/index/_hstore.html.erb +12 -0
  98. data/app/views/wallaby/resources/index/_inet.html.erb +6 -0
  99. data/app/views/wallaby/resources/index/_int4range.html.erb +7 -0
  100. data/app/views/wallaby/resources/index/_int8range.html.erb +7 -0
  101. data/app/views/wallaby/resources/index/_integer.html.erb +1 -0
  102. data/app/views/wallaby/resources/index/_json.html.erb +12 -0
  103. data/app/views/wallaby/resources/index/_jsonb.html.erb +12 -0
  104. data/app/views/wallaby/resources/index/_ltree.html.erb +12 -0
  105. data/app/views/wallaby/resources/index/_macaddr.html.erb +5 -0
  106. data/app/views/wallaby/resources/index/_money.html.erb +1 -0
  107. data/app/views/wallaby/resources/index/_numrange.html.erb +7 -0
  108. data/app/views/wallaby/resources/index/_point.html.erb +6 -0
  109. data/app/views/wallaby/resources/index/_string.html.erb +12 -0
  110. data/app/views/wallaby/resources/index/_text.html.erb +12 -0
  111. data/app/views/wallaby/resources/index/_time.html.erb +6 -0
  112. data/app/views/wallaby/resources/index/_tsrange.html.erb +8 -0
  113. data/app/views/wallaby/resources/index/_tstzrange.html.erb +8 -0
  114. data/app/views/wallaby/resources/index/_tsvector.html.erb +12 -0
  115. data/app/views/wallaby/resources/index/_uuid.html.erb +12 -0
  116. data/app/views/wallaby/resources/index/_xml.html.erb +12 -0
  117. data/app/views/wallaby/resources/index.html.erb +66 -0
  118. data/app/views/wallaby/resources/new.html.erb +14 -0
  119. data/app/views/wallaby/resources/shared/_resource_nav.html.erb +29 -0
  120. data/app/views/wallaby/resources/show/_belongs_to.html.erb +7 -0
  121. data/app/views/wallaby/resources/show/_bigint.html.erb +1 -0
  122. data/app/views/wallaby/resources/show/_binary.html.erb +1 -0
  123. data/app/views/wallaby/resources/show/_bit.html.erb +5 -0
  124. data/app/views/wallaby/resources/show/_bit_varying.html.erb +5 -0
  125. data/app/views/wallaby/resources/show/_boolean.html.erb +5 -0
  126. data/app/views/wallaby/resources/show/_cidr.html.erb +6 -0
  127. data/app/views/wallaby/resources/show/_citext.html.erb +1 -0
  128. data/app/views/wallaby/resources/show/_color.html.erb +5 -0
  129. data/app/views/wallaby/resources/show/_date.html.erb +7 -0
  130. data/app/views/wallaby/resources/show/_daterange.html.erb +7 -0
  131. data/app/views/wallaby/resources/show/_datetime.html.erb +6 -0
  132. data/app/views/wallaby/resources/show/_decimal.html.erb +1 -0
  133. data/app/views/wallaby/resources/show/_email.html.erb +1 -0
  134. data/app/views/wallaby/resources/show/_float.html.erb +1 -0
  135. data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +5 -0
  136. data/app/views/wallaby/resources/show/_has_many.html.erb +5 -0
  137. data/app/views/wallaby/resources/show/_has_one.html.erb +1 -0
  138. data/app/views/wallaby/resources/show/_hstore.html.erb +5 -0
  139. data/app/views/wallaby/resources/show/_inet.html.erb +6 -0
  140. data/app/views/wallaby/resources/show/_int4range.html.erb +7 -0
  141. data/app/views/wallaby/resources/show/_int8range.html.erb +7 -0
  142. data/app/views/wallaby/resources/show/_integer.html.erb +1 -0
  143. data/app/views/wallaby/resources/show/_json.html.erb +5 -0
  144. data/app/views/wallaby/resources/show/_jsonb.html.erb +5 -0
  145. data/app/views/wallaby/resources/show/_ltree.html.erb +1 -0
  146. data/app/views/wallaby/resources/show/_macaddr.html.erb +5 -0
  147. data/app/views/wallaby/resources/show/_money.html.erb +1 -0
  148. data/app/views/wallaby/resources/show/_numrange.html.erb +7 -0
  149. data/app/views/wallaby/resources/show/_point.html.erb +6 -0
  150. data/app/views/wallaby/resources/show/_string.html.erb +1 -0
  151. data/app/views/wallaby/resources/show/_text.html.erb +1 -0
  152. data/app/views/wallaby/resources/show/_time.html.erb +6 -0
  153. data/app/views/wallaby/resources/show/_tsrange.html.erb +7 -0
  154. data/app/views/wallaby/resources/show/_tstzrange.html.erb +7 -0
  155. data/app/views/wallaby/resources/show/_tsvector.html.erb +1 -0
  156. data/app/views/wallaby/resources/show/_uuid.html.erb +5 -0
  157. data/app/views/wallaby/resources/show/_xml.html.erb +5 -0
  158. data/app/views/wallaby/resources/show.html.erb +31 -0
  159. data/app/views/wallaby/shared/_flash_messages.html.erb +13 -0
  160. data/config/locales/en.yml +29 -0
  161. data/config/routes.rb +34 -0
  162. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +105 -0
  163. data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +18 -0
  164. data/lib/adaptors/wallaby/active_record/model_decorator.rb +81 -0
  165. data/lib/adaptors/wallaby/active_record/model_finder.rb +12 -0
  166. data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +44 -0
  167. data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +50 -0
  168. data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +47 -0
  169. data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +16 -0
  170. data/lib/adaptors/wallaby/active_record/model_operator.rb +82 -0
  171. data/lib/adaptors/wallaby/active_record.rb +2 -0
  172. data/lib/decorators/wallaby/resource_decorator.rb +78 -0
  173. data/lib/errors/wallaby/deprecated.rb +4 -0
  174. data/lib/errors/wallaby/general_error.rb +4 -0
  175. data/lib/errors/wallaby/invalid_error.rb +4 -0
  176. data/lib/errors/wallaby/model_not_found.rb +4 -0
  177. data/lib/errors/wallaby/not_authenticated.rb +4 -0
  178. data/lib/errors/wallaby/not_implemented.rb +4 -0
  179. data/lib/errors/wallaby/operation_not_found.rb +4 -0
  180. data/lib/errors/wallaby/resource_not_found.rb +4 -0
  181. data/lib/forms/wallaby/form_builder.rb +30 -0
  182. data/lib/handlers/wallaby/cached_compiled_erb.rb +14 -0
  183. data/lib/helpers/wallaby/application_helper.rb +30 -0
  184. data/lib/helpers/wallaby/core_helper.rb +50 -0
  185. data/lib/helpers/wallaby/form_helper.rb +21 -0
  186. data/lib/helpers/wallaby/links_helper.rb +83 -0
  187. data/lib/helpers/wallaby/paginatable_helper.rb +9 -0
  188. data/lib/helpers/wallaby/resources_helper.rb +55 -0
  189. data/lib/helpers/wallaby/secure_helper.rb +25 -0
  190. data/lib/helpers/wallaby/sorting_helper.rb +43 -0
  191. data/lib/helpers/wallaby/styling_helper.rb +57 -0
  192. data/lib/interfaces/wallaby/mode.rb +18 -0
  193. data/lib/interfaces/wallaby/model_decorator.rb +58 -0
  194. data/lib/interfaces/wallaby/model_finder.rb +5 -0
  195. data/lib/interfaces/wallaby/model_operator.rb +31 -0
  196. data/lib/services/wallaby/decorator_finder.rb +16 -0
  197. data/lib/services/wallaby/lookup_context_wrapper.rb +40 -0
  198. data/lib/services/wallaby/map.rb +53 -0
  199. data/lib/services/wallaby/model_servicer.rb +38 -0
  200. data/lib/services/wallaby/servicer_finder.rb +5 -0
  201. data/lib/tasks/wallaby_tasks.rake +4 -0
  202. data/lib/utils/wallaby/utils.rb +31 -0
  203. data/lib/wallaby/configuration/models.rb +17 -0
  204. data/lib/wallaby/configuration/security.rb +30 -0
  205. data/lib/wallaby/configuration.rb +49 -0
  206. data/lib/wallaby/engine.rb +89 -0
  207. data/lib/wallaby/version.rb +3 -0
  208. data/lib/wallaby.rb +5 -0
  209. metadata +459 -0
@@ -0,0 +1,52 @@
1
+ if Rails.env.development?
2
+ # NOTE: Rails reload! will hit here
3
+ Rails.logger.debug '--> [ Wallaby ] Ready to preload and clear cache on reload. <--'
4
+ GC.start
5
+ Rails.cache.delete_matched 'wallaby/*'
6
+
7
+ # NOTE: we search for subclasses of Wallaby::ResourcesController and Wallaby::ResourceDecorator.
8
+ # therefore, under development environment, we need to preload all classes under /app folder in main_app
9
+ # using `require` is not working for preloading, we need to constantize the class names to make Rails reload classes properly
10
+ Wallaby::ApplicationController
11
+
12
+ def preload(file_pattern)
13
+ Dir[ file_pattern ].each do |file_path|
14
+ begin
15
+ name = file_path[ %r(app/[^/]+/(.+)\.rb), 1 ].gsub('concerns/', '')
16
+ name.classify.constantize
17
+ rescue NameError, LoadError => e
18
+ Rails.logger.debug "PRELOAD ERROR: #{ e.message }"
19
+ end
20
+ end
21
+ end
22
+
23
+ preload 'app/models/**.rb'
24
+ preload 'app/**/*.rb'
25
+ end
26
+
27
+ class Wallaby::ResourcesRouter
28
+ DEFAULT_CONTROLLER = Wallaby::ResourcesController
29
+
30
+ def call(env)
31
+ params = env['action_dispatch.request.path_parameters']
32
+ controller = find_controller_by params[:resources]
33
+ params[:action] = check_action_name_by controller, params
34
+
35
+ controller.action(params[:action]).call env
36
+ rescue AbstractController::ActionNotFound, Wallaby::ModelNotFound => e
37
+ params[:error] = e
38
+ DEFAULT_CONTROLLER.action(:not_found).call env
39
+ end
40
+
41
+ private
42
+ def find_controller_by(resources_name)
43
+ model_class = Wallaby::Utils.to_model_class resources_name
44
+ Wallaby::Map.controller_map[model_class] || DEFAULT_CONTROLLER
45
+ end
46
+
47
+ def check_action_name_by(controller, params)
48
+ params[:id].try do |id_action|
49
+ id_action if controller.public_method_defined? id_action
50
+ end || params[:action]
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+ # Define abilities for the passed in user here. For example:
6
+ #
7
+ # user ||= User.new # guest user (not logged in)
8
+ # if user.admin?
9
+ # can :manage, :all
10
+ # else
11
+ # can :read, :all
12
+ # end
13
+ #
14
+ # The first argument to `can` is the action you are giving the user
15
+ # permission to do.
16
+ # If you pass :manage it will apply to every action. Other common actions
17
+ # here are :read, :create, :update and :destroy.
18
+ #
19
+ # The second argument is the resource the user can perform the action on.
20
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
21
+ # class of the resource.
22
+ #
23
+ # The third argument is an optional hash of conditions to further filter the
24
+ # objects.
25
+ # For example, here the user can only update published articles.
26
+ #
27
+ # can :update, Article, :published => true
28
+ #
29
+ # See the wiki for details:
30
+ # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
31
+ can :manage, :all
32
+ end
33
+ end
@@ -0,0 +1,2 @@
1
+ <footer>
2
+ </footer>
@@ -0,0 +1,57 @@
1
+ <header>
2
+ <nav class="top-nav navbar navbar-default">
3
+ <div class="container-fluid">
4
+ <%# Brand %>
5
+ <div class="navbar-header">
6
+ <%# Mobile Menu Toggler %>
7
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-menu" aria-expanded="false">
8
+ <span class="sr-only">Toggle navigation</span>
9
+ <span class="icon-bar"></span>
10
+ <span class="icon-bar"></span>
11
+ <span class="icon-bar"></span>
12
+ </button>
13
+ <%# //Mobile Menu Toggler %>
14
+ <a class="navbar-brand" href="<%= wallaby_engine.root_path %>">Wallaby Admin</a>
15
+ </div>
16
+ <%# //Brand %>
17
+
18
+ <div id="top-menu" class="collapse navbar-collapse">
19
+ <%# Resources navigation %>
20
+ <ul class="nav navbar-nav">
21
+ <li class="dropdown">
22
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
23
+ <%= current_model_label %>
24
+ <span class="caret"></span>
25
+ </a>
26
+ <ul class="dropdown-menu">
27
+ <% model_classes.each do |model_class| %>
28
+ <li><%= index_link model_class %> </li>
29
+ <% end %>
30
+ </ul>
31
+ </li>
32
+ </ul>
33
+ <%= render 'layouts/wallaby/navs' %>
34
+ <%# //Resources navigation %>
35
+ <%# User account %>
36
+ <% if current_user.present? %>
37
+ <ul class="nav navbar-nav navbar-right">
38
+ <li role="separator" class="divider"></li>
39
+ <li>
40
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
41
+ <%= user_portrait %>
42
+ <span class="visible-xs-inline-block">User</span>
43
+ <span class="caret"></span>
44
+ </a>
45
+ <% if logout_path.present? %>
46
+ <ul class="dropdown-menu">
47
+ <li><%= link_to 'Sign out', logout_path, method: logout_method %></li>
48
+ </ul>
49
+ <% end %>
50
+ </li>
51
+ </ul>
52
+ <% end %>
53
+ <%# //User account %>
54
+ </div>
55
+ </div>
56
+ </nav>
57
+ </header>
@@ -0,0 +1 @@
1
+ <% # can be overriden %>
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%= I18n.locale %>">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+
7
+ <title><%= page_title %></title>
8
+
9
+ <%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
10
+ <%= yield :custom_stylesheet %>
11
+ <%= csrf_meta_tags %>
12
+ </head>
13
+ <body class="application <%= body_class %>">
14
+ <%= render 'layouts/wallaby/header' %>
15
+ <main>
16
+ <%= yield %>
17
+ </main>
18
+ <%= render 'layouts/wallaby/footer' %>
19
+ <%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
20
+ <%= yield :custom_javascript %>
21
+ </body>
22
+ </html>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%= I18n.locale %>">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+
7
+ <title><%= page_title %></title>
8
+
9
+ <%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
10
+ <%= yield :custom_stylesheet %>
11
+ <%= csrf_meta_tags %>
12
+ </head>
13
+ <body class="error <%= body_class %>">
14
+ <main>
15
+ <%= yield %>
16
+ </main>
17
+ <%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
18
+ <%= yield :custom_javascript %>
19
+ </body>
20
+ </html>
@@ -0,0 +1,5 @@
1
+ <h1>
2
+ Welcome
3
+ </h1>
4
+ <%# TODO: turn this page into intro maybe? %>
5
+ <%= render 'wallaby/shared/flash_messages' %>
@@ -0,0 +1 @@
1
+ <%= @exception.message %>
@@ -0,0 +1 @@
1
+ <%= @exception.message %>
@@ -0,0 +1,6 @@
1
+ <% error = @exception || params[:error] %>
2
+ <% if error %>
3
+ <p>
4
+ <%= error.message %> not found.
5
+ </p>
6
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= @exception.message %>
@@ -0,0 +1,12 @@
1
+ <% decorated.errors[:base].try do |messages| %>
2
+ <% Array(messages).each do |message| %>
3
+ <div class="alert alert-danger alert-dismissible" role="alert">
4
+ <%= raw message %>
5
+ </div>
6
+ <% end %>
7
+ <% end %>
8
+ <% decorated.form_field_names.each do |field_name| %>
9
+ <%= form_type_partial_render decorated.form_type_of(field_name).to_s, field_name: field_name, form: form %>
10
+ <% end %>
11
+ <%= form.submit class: 'btn btn-primary' %>
12
+ <%= cancel_link class: 'btn btn-default' %>
@@ -0,0 +1 @@
1
+ <%= new_link(current_model_class, class: 'btn btn-primary') { ct 'link.new' } %>
@@ -0,0 +1,3 @@
1
+ <%= show_link(decorated, class: 'text-info') { itooltip ct('link.show'), 'link' } %>
2
+ <%= edit_link(decorated) { itooltip ct('link.edit'), 'pencil' } %>
3
+ <%= delete_link(decorated) { itooltip ct('link.delete'), 'trash' } %>
@@ -0,0 +1,14 @@
1
+ <% decorated = decorate resource %>
2
+ <section>
3
+ <%= render 'wallaby/resources/shared/resource_nav' %>
4
+ <div class="page-header">
5
+ <h1>Edit # <%= decorated.id %></h1>
6
+ </div>
7
+ <%= render 'wallaby/shared/flash_messages' %>
8
+ <%= form_for decorated, url: wallaby_engine.resource_path, method: :put, html: { :multipart => true }, builder: Wallaby::FormBuilder do |form| %>
9
+ <%= render 'form', form: form, decorated: decorated %>
10
+ <% end %>
11
+ </section>
12
+
13
+ <% content_for :custom_stylesheet, stylesheet_link_tag('wallaby/form', media: 'all', 'data-turbolinks-track' => true) %>
14
+ <% content_for :custom_javascript, javascript_include_tag('wallaby/form', 'data-turbolinks-track' => true) %>
@@ -0,0 +1,21 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label metadata[:foreign_key], metadata[:label] %>
3
+ <div class="row">
4
+ <% if metadata[:is_polymorphic] %>
5
+ <div class="col-xs-6 col-sm-3">
6
+ <%= form.select metadata[:polymorphic_type], metadata[:polymorphic_list].try(:map, &:to_s), { include_blank: true }, { class: 'form-control' } %>
7
+ </div>
8
+ <div class="col-xs-3">
9
+ <%= form.text_field metadata[:foreign_key], class: 'form-control' %>
10
+ </div>
11
+ <% else %>
12
+ <div class="col-xs-6 col-sm-3">
13
+ <%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { include_blank: true }, { class: 'form-control' } %>
14
+ <p class="help-block">
15
+ <%= new_link metadata[:class], prepend: 'Or' %>
16
+ </p>
17
+ </div>
18
+ <% end %>
19
+ </div>
20
+ <%= form.error_messages field_name %>
21
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.number_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-3">
5
+ <%= form.label field_name, class: 'btn btn-default' do %>
6
+ <%= form.file_field field_name, class: 'hidden' %>
7
+ <%= icon 'upload' %> <%= ct 'lable.upload' %>
8
+ <% end %>
9
+ </div>
10
+ </div>
11
+ <%= form.error_messages field_name %>
12
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.number_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.number_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-12">
5
+ <label class="radio-inline">
6
+ <%= form.radio_button field_name, true %> Yes
7
+ </label>
8
+ <label class="radio-inline">
9
+ <%= form.radio_button field_name, false %> No
10
+ </label>
11
+ </div>
12
+ </div>
13
+ <%= form.error_messages field_name %>
14
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.text_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,21 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <%= form.text_area field_name, class: 'form-control', data: { init: 'summernote' } %>
4
+ <%= form.error_messages field_name %>
5
+ </div>
6
+
7
+ <% unless @summernote_init %>
8
+ <% @summernote_init = true %>
9
+ <% content_for :custom_javascript do %>
10
+ <% javascript_tag do %>
11
+ jQuery(function($) {
12
+ $('textarea[data-init="summernote"]').summernote({
13
+ height: 150,
14
+ codemirror: { // codemirror options
15
+ theme: 'monokai'
16
+ }
17
+ })
18
+ })
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.text_field field_name, class: 'form-control', data: { init: 'colorpicker' } %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
10
+
11
+ <% unless @colorpicker_init %>
12
+ <% @colorpicker_init = true %>
13
+ <% content_for :custom_javascript do %>
14
+ <% javascript_tag do %>
15
+ jQuery(function($) {
16
+ $('[data-init="colorpicker"]').minicolors({ theme: 'bootstrap' })
17
+ })
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,29 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <div class="input-group date" data-init='datepicker'>
6
+ <%= form.text_field field_name, class: 'form-control' %>
7
+ <span class="input-group-addon"><%= icon 'calendar' %></span>
8
+ </div>
9
+ </div>
10
+ </div>
11
+ <%= form.error_messages field_name %>
12
+ </div>
13
+
14
+ <% unless @datepicker_init %>
15
+ <% @datepicker_init = true %>
16
+ <% content_for :custom_javascript do %>
17
+ <% javascript_tag do %>
18
+ jQuery(function($) {
19
+ $('[data-init="datepicker"]').each(function() {
20
+ var $input = $('input', this)
21
+ $input.val(moment($input.attr('value')).format('YYYY-MM-DD'))
22
+ $(this).datetimepicker({
23
+ format: 'YYYY-MM-DD'
24
+ })
25
+ })
26
+ })
27
+ <% end %>
28
+ <% end %>
29
+ <% end %>
@@ -0,0 +1,37 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <div class="input-group date" data-init='datepicker'>
6
+ <span class="input-group-addon">F</span>
7
+ <%= form.text_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
8
+ <span class="input-group-addon"><%= icon 'calendar' %></span>
9
+ </div>
10
+ </div>
11
+ <div class="col-xs-6 col-sm-3">
12
+ <div class="input-group date" data-init='datepicker'>
13
+ <span class="input-group-addon">T</span>
14
+ <%= form.text_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
15
+ <span class="input-group-addon"><%= icon 'calendar' %></span>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <%= form.error_messages field_name %>
20
+ </div>
21
+
22
+ <% unless @datepicker_init %>
23
+ <% @datepicker_init = true %>
24
+ <% content_for :custom_javascript do %>
25
+ <% javascript_tag do %>
26
+ jQuery(function($) {
27
+ $('[data-init="datepicker"]').each(function() {
28
+ var $input = $('input', this)
29
+ $input.val(moment($input.attr('value')).format('YYYY-MM-DD'))
30
+ $(this).datetimepicker({
31
+ format: 'YYYY-MM-DD'
32
+ })
33
+ })
34
+ })
35
+ <% end %>
36
+ <% end %>
37
+ <% end %>
@@ -0,0 +1,30 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <div class="input-group date" data-init='datetimepicker'>
6
+ <%= form.text_field field_name, value: value, class: 'form-control' %>
7
+ <span class="input-group-addon"><%= icon 'calendar' %></span>
8
+ </div>
9
+ </div>
10
+ </div>
11
+ <%= form.error_messages field_name %>
12
+ </div>
13
+
14
+ <% unless @datetimepicker_init %>
15
+ <% @datetimepicker_init = true %>
16
+ <% content_for :custom_javascript do %>
17
+ <% javascript_tag do %>
18
+ jQuery(function($) {
19
+ $('[data-init="datetimepicker"]').each(function() {
20
+ var $input = $('input', this)
21
+ $input.val(moment($input.attr('value')).format('YYYY-MM-DD HH:mm'))
22
+ $(this).datetimepicker({
23
+ format: 'YYYY-MM-DD HH:mm',
24
+ sideBySide: true
25
+ })
26
+ })
27
+ })
28
+ <% end %>
29
+ <% end %>
30
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.number_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <%= form.email_field field_name, class: 'form-control' %>
4
+ <%= form.error_messages field_name %>
5
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.number_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,13 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label metadata[:foreign_key], metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { }, { class: 'form-control', multiple: true } %>
6
+ <p class="help-block">
7
+ Press CTRL to select/deselect multiple items.
8
+ <%= new_link metadata[:class], prepend: 'Or' %>
9
+ </p>
10
+ </div>
11
+ </div>
12
+ <%= form.error_messages field_name %>
13
+ </div>
@@ -0,0 +1,13 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label metadata[:foreign_key], metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { }, { class: 'form-control', multiple: true } %>
6
+ <p class="help-block">
7
+ Press CTRL to select/deselect multiple items.
8
+ <%= new_link metadata[:class], prepend: 'Or' %>
9
+ </p>
10
+ </div>
11
+ </div>
12
+ <%= form.error_messages field_name %>
13
+ </div>
@@ -0,0 +1,7 @@
1
+ <% # TODO: consider to pass new_link default params to create %>
2
+ <div class="form-group <%= form.error_class field_name %>">
3
+ <%= form.label field_name, metadata[:label] %>
4
+ <div>
5
+ <%= value.present? ? edit_link(value) : new_link(metadata[:class]) %>
6
+ </div>
7
+ </div>
@@ -0,0 +1,25 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <%= form.text_area field_name, value: value.to_s[%r(\A{(.*)}\Z), 1], class: 'form-control', data: { init: 'codemirror', mode: 'ruby' } %>
4
+ <%= form.error_messages field_name %>
5
+ <p class="help-block">
6
+ Format: <code>"KEY1" => "VALUE1", "KEY2" => "VALUE2"</code>
7
+ </p>
8
+ </div>
9
+
10
+ <% unless @codemirror_init %>
11
+ <% @codemirror_init = true %>
12
+ <% content_for :custom_javascript do %>
13
+ <% javascript_tag do %>
14
+ jQuery(function($) {
15
+ $('textarea[data-init="codemirror"]').each(function (index, element) {
16
+ CodeMirror.fromTextArea(element, {
17
+ mode: $(element).data('mode'),
18
+ theme: "default",
19
+ lineNumbers: true
20
+ });
21
+ })
22
+ })
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <%= form.text_field field_name, class: 'form-control' %>
6
+ </div>
7
+ </div>
8
+ <%= form.error_messages field_name %>
9
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <div class="input-group">
6
+ <span class="input-group-addon">F</span>
7
+ <%= form.number_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
8
+ </div>
9
+ </div>
10
+ <div class="col-xs-6 col-sm-3">
11
+ <div class="input-group">
12
+ <span class="input-group-addon">T</span>
13
+ <%= form.number_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ <%= form.error_messages field_name %>
18
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <div class="row">
4
+ <div class="col-xs-6 col-sm-3">
5
+ <div class="input-group">
6
+ <span class="input-group-addon">F</span>
7
+ <%= form.number_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
8
+ </div>
9
+ </div>
10
+ <div class="col-xs-6 col-sm-3">
11
+ <div class="input-group">
12
+ <span class="input-group-addon">T</span>
13
+ <%= form.number_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ <%= form.error_messages field_name %>
18
+ </div>