itsf_backend 1.0.1

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 (169) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +43 -0
  4. data/Rakefile +21 -0
  5. data/app/assets/images/itsf/backend/favicon.png +0 -0
  6. data/app/assets/javascripts/itsf/backend/application.js +21 -0
  7. data/app/assets/javascripts/itsf/backend/application/ace.coffee +51 -0
  8. data/app/assets/javascripts/itsf/backend/application/acts-as-list.coffee +21 -0
  9. data/app/assets/javascripts/itsf/backend/application/auto-submit.coffee +21 -0
  10. data/app/assets/javascripts/itsf/backend/application/autofocus-last.coffee +4 -0
  11. data/app/assets/javascripts/itsf/backend/application/drop-down-hover.coffee +8 -0
  12. data/app/assets/javascripts/itsf/backend/application/itsf-logo.coffee +24 -0
  13. data/app/assets/javascripts/itsf/backend/vendor/jQueryRotate.js +339 -0
  14. data/app/assets/javascripts/itsf/backend/vendor/jquery.redirect.js +119 -0
  15. data/app/assets/javascripts/itsf_backend.js +1 -0
  16. data/app/assets/stylesheets/itsf/backend/application.css.less +30 -0
  17. data/app/assets/stylesheets/itsf/backend/application/ace.css.less +6 -0
  18. data/app/assets/stylesheets/itsf/backend/application/basic-page.css.less +10 -0
  19. data/app/assets/stylesheets/itsf/backend/application/bootstrap-extensions.css.less +48 -0
  20. data/app/assets/stylesheets/itsf/backend/application/bottom-margin-extension.css.less +9 -0
  21. data/app/assets/stylesheets/itsf/backend/application/button-responsive.css.less +7 -0
  22. data/app/assets/stylesheets/itsf/backend/application/check-box-margin-fix.css.less +5 -0
  23. data/app/assets/stylesheets/itsf/backend/application/code.css.less +6 -0
  24. data/app/assets/stylesheets/itsf/backend/application/form-errors.css.less +6 -0
  25. data/app/assets/stylesheets/itsf/backend/application/form-inline-margin-fixes.css.less +9 -0
  26. data/app/assets/stylesheets/itsf/backend/application/hexagon.css.less +161 -0
  27. data/app/assets/stylesheets/itsf/backend/application/itsf-dashboard-panels.css.less +9 -0
  28. data/app/assets/stylesheets/itsf/backend/application/itsf-logo.css.less +107 -0
  29. data/app/assets/stylesheets/itsf/backend/application/navigation-logo.css.less +5 -0
  30. data/app/assets/stylesheets/itsf/backend/application/panel-footer-pagination.css.less +8 -0
  31. data/app/assets/stylesheets/itsf/backend/application/panel-with-actions.css.less +21 -0
  32. data/app/assets/stylesheets/itsf/backend/application/table-actions.css.less +9 -0
  33. data/app/assets/stylesheets/itsf/backend/application/table-responsive.css.less +3 -0
  34. data/app/assets/stylesheets/itsf/backend/bootstrap_and_overrides.css.less +34 -0
  35. data/app/assets/stylesheets/itsf/backend/vendor/timeline.min.css +1 -0
  36. data/app/assets/stylesheets/itsf_backend.css +3 -0
  37. data/app/concerns/routing/service_concern.rb +12 -0
  38. data/app/controllers/concerns/controller/acts_as_list_concern.rb +13 -0
  39. data/app/controllers/concerns/controller/acts_as_published_concern.rb +13 -0
  40. data/app/controllers/concerns/controller/pagination_concern.rb +15 -0
  41. data/app/controllers/concerns/controller/pundit_namespaced_authorize_concern.rb +19 -0
  42. data/app/controllers/concerns/controller/ransack_concern.rb +25 -0
  43. data/app/controllers/concerns/controller/rest_actions_concern_with_pundit.rb +93 -0
  44. data/app/controllers/itsf/backend/application_controller.rb +6 -0
  45. data/app/controllers/itsf/backend/base_controller.rb +34 -0
  46. data/app/controllers/itsf/backend/dashboard_controller.rb +20 -0
  47. data/app/controllers/itsf/backend/home_controller.rb +27 -0
  48. data/app/controllers/itsf/backend/resource/base_controller.rb +35 -0
  49. data/app/controllers/itsf/backend/service/base_controller.rb +29 -0
  50. data/app/extensions/concerns/head_row/acts_as_list_extensions.rb +11 -0
  51. data/app/extensions/concerns/head_row/association_extensions.rb +14 -0
  52. data/app/extensions/concerns/head_row/paperclip_extensions.rb +11 -0
  53. data/app/extensions/concerns/head_row/published_extensions.rb +11 -0
  54. data/app/extensions/concerns/head_row/ransack_extensions.rb +7 -0
  55. data/app/extensions/concerns/head_row/timestamp_extensions.rb +21 -0
  56. data/app/extensions/concerns/object_extensions.rb +8 -0
  57. data/app/extensions/concerns/ransack_form_builder_extensions.rb +72 -0
  58. data/app/extensions/concerns/resource_row/acts_as_list_extensions.rb +28 -0
  59. data/app/extensions/concerns/resource_row/association_extensions.rb +22 -0
  60. data/app/extensions/concerns/resource_row/paperclip_extensions.rb +18 -0
  61. data/app/extensions/concerns/resource_row/published_extensions.rb +24 -0
  62. data/app/extensions/concerns/resource_row/timestamp_extensions.rb +23 -0
  63. data/app/extensions/concerns/simple_form_form_builder_extensions.rb +28 -0
  64. data/app/helpers/itsf/backend/application_helper.rb +9 -0
  65. data/app/policies/itsf/backend/base_policy.rb +67 -0
  66. data/app/policies/itsf/backend/dashboard_policy.rb +14 -0
  67. data/app/policies/itsf/backend/engine_policy.rb +14 -0
  68. data/app/policies/itsf/backend/service/base_policy.rb +29 -0
  69. data/app/presenters/bootstrap_table_presenter.rb.old +106 -0
  70. data/app/views/itsf/backend/dashboard/_dashboard_panel.html.haml +18 -0
  71. data/app/views/itsf/backend/dashboard/index.html.haml +7 -0
  72. data/app/views/itsf/backend/home/_dashboard_panel.html.haml +26 -0
  73. data/app/views/itsf/backend/home/_index_extras.html.haml +0 -0
  74. data/app/views/itsf/backend/home/index.html.haml +14 -0
  75. data/app/views/itsf/backend/i18n/_navigation.html.haml +10 -0
  76. data/app/views/itsf/backend/resource/base/_form.html.haml +2 -0
  77. data/app/views/itsf/backend/resource/base/_form_errors.html.haml +6 -0
  78. data/app/views/itsf/backend/resource/base/_scopes.html.haml +1 -0
  79. data/app/views/itsf/backend/resource/base/_search.html.haml +3 -0
  80. data/app/views/itsf/backend/resource/base/_show.html.haml +2 -0
  81. data/app/views/itsf/backend/resource/base/_show_extras.html.haml +0 -0
  82. data/app/views/itsf/backend/resource/base/_table.html.haml +2 -0
  83. data/app/views/itsf/backend/resource/base/_table_actions.html.haml +15 -0
  84. data/app/views/itsf/backend/resource/base/edit.html.haml +17 -0
  85. data/app/views/itsf/backend/resource/base/index.html.haml +48 -0
  86. data/app/views/itsf/backend/resource/base/new.html.haml +15 -0
  87. data/app/views/itsf/backend/resource/base/show.html.haml +28 -0
  88. data/app/views/itsf/backend/service/base/_form.html.haml +0 -0
  89. data/app/views/itsf/backend/service/base/_form_errors.html.haml +6 -0
  90. data/app/views/itsf/backend/service/base/_messages.html.erb +5 -0
  91. data/app/views/itsf/backend/service/base/index.html.haml +18 -0
  92. data/app/views/itsf/backend/service/base/invoke.html.haml +16 -0
  93. data/app/views/itsf/backend/service/base/success.html.haml +13 -0
  94. data/app/views/layouts/itsf/backend/_footer.html.haml +1 -0
  95. data/app/views/layouts/itsf/backend/_logo.html.haml +4 -0
  96. data/app/views/layouts/itsf/backend/_main_navigation.html.haml +6 -0
  97. data/app/views/layouts/itsf/backend/_main_navigation_drop_down.html.haml +20 -0
  98. data/app/views/layouts/itsf/backend/base.html.haml +56 -0
  99. data/config/initializers/assets.rb +3 -0
  100. data/config/initializers/extend_object.rb +1 -0
  101. data/config/initializers/extend_ransack_form_builder.rb +4 -0
  102. data/config/initializers/extend_simple_form_form_builder.rb +5 -0
  103. data/config/locales/de.yml +104 -0
  104. data/config/locales/en.yml +99 -0
  105. data/config/rbac.yml +7 -0
  106. data/config/routes.rb +3 -0
  107. data/lib/generators/itsf/backend/home_controller/home_controller_generator.rb +77 -0
  108. data/lib/generators/itsf/backend/home_controller/templates/home_controller.rb +6 -0
  109. data/lib/generators/itsf/backend/home_controller/templates/routes.source +2 -0
  110. data/lib/generators/itsf/backend/install/install_generator.rb +23 -0
  111. data/lib/generators/itsf/backend/install/templates/backend_controller.rb +2 -0
  112. data/lib/generators/itsf/backend/install/templates/initializer.rb +95 -0
  113. data/lib/generators/itsf/backend/install/templates/routes.source +9 -0
  114. data/lib/generators/itsf/backend/resource/resource_generator.rb +96 -0
  115. data/lib/generators/itsf/backend/resource/templates/controller.rb +34 -0
  116. data/lib/generators/itsf/backend/resource/templates/routes.source +2 -0
  117. data/lib/itsf/backend.rb +11 -0
  118. data/lib/itsf/backend/configuration.rb +38 -0
  119. data/lib/itsf/backend/engine.rb +16 -0
  120. data/lib/itsf/backend/features.rb +13 -0
  121. data/lib/itsf/backend/policies.rb +13 -0
  122. data/lib/itsf/backend/spec_helpers.rb +47 -0
  123. data/lib/itsf/backend/version.rb +5 -0
  124. data/lib/itsf_backend.rb +21 -0
  125. data/lib/tasks/itsf/backend_tasks.rake +4 -0
  126. data/spec/dummy/README.rdoc +28 -0
  127. data/spec/dummy/Rakefile +6 -0
  128. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  129. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  130. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  131. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  132. data/spec/dummy/app/models/post.rb +2 -0
  133. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  134. data/spec/dummy/bin/bundle +3 -0
  135. data/spec/dummy/bin/rails +4 -0
  136. data/spec/dummy/bin/rake +4 -0
  137. data/spec/dummy/bin/setup +29 -0
  138. data/spec/dummy/config.ru +4 -0
  139. data/spec/dummy/config/application.rb +38 -0
  140. data/spec/dummy/config/boot.rb +5 -0
  141. data/spec/dummy/config/database.yml +25 -0
  142. data/spec/dummy/config/environment.rb +5 -0
  143. data/spec/dummy/config/environments/development.rb +41 -0
  144. data/spec/dummy/config/environments/production.rb +79 -0
  145. data/spec/dummy/config/environments/test.rb +42 -0
  146. data/spec/dummy/config/initializers/assets.rb +11 -0
  147. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  148. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  149. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  150. data/spec/dummy/config/initializers/inflections.rb +16 -0
  151. data/spec/dummy/config/initializers/itsf_backend.rb +15 -0
  152. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  153. data/spec/dummy/config/initializers/session_store.rb +3 -0
  154. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  155. data/spec/dummy/config/locales/en.yml +23 -0
  156. data/spec/dummy/config/routes.rb +56 -0
  157. data/spec/dummy/config/secrets.yml +22 -0
  158. data/spec/dummy/db/migrate/20151024185112_create_posts.rb +10 -0
  159. data/spec/dummy/db/schema.rb +15 -0
  160. data/spec/dummy/public/404.html +67 -0
  161. data/spec/dummy/public/422.html +67 -0
  162. data/spec/dummy/public/500.html +66 -0
  163. data/spec/dummy/public/favicon.ico +0 -0
  164. data/spec/factories/posts.rb +6 -0
  165. data/spec/models/post_spec.rb +5 -0
  166. data/spec/rails_helper.rb +52 -0
  167. data/spec/spec_helper.rb +90 -0
  168. data/spec/support/addons.rb +3 -0
  169. metadata +688 -0
@@ -0,0 +1,67 @@
1
+ module Itsf::Backend
2
+ class BasePolicy
3
+ attr_reader :user, :record
4
+
5
+ def initialize(user, record)
6
+ @user = user
7
+ @record = record
8
+ end
9
+
10
+ def index?
11
+ # false
12
+ authorize_with_rbac(user, record, __method__)
13
+ end
14
+
15
+ def show?
16
+ scope.where(id: record.id).exists?
17
+ end
18
+
19
+ def create?
20
+ # false
21
+ authorize_with_rbac(user, record, __method__)
22
+ end
23
+
24
+ def new?
25
+ create?
26
+ end
27
+
28
+ def update?
29
+ # false
30
+ authorize_with_rbac(user, record, __method__)
31
+ end
32
+
33
+ def edit?
34
+ update?
35
+ end
36
+
37
+ def destroy?
38
+ # false
39
+ authorize_with_rbac(user, record, __method__)
40
+ end
41
+
42
+ def scope
43
+ Pundit.policy_scope!(user, record.class)
44
+ end
45
+
46
+ class Scope
47
+ attr_reader :user, :scope
48
+
49
+ def initialize(user, scope)
50
+ @user = user
51
+ @scope = scope
52
+ end
53
+
54
+ def resolve
55
+ scope
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def authorize_with_rbac(user, record, method_name)
62
+ resource_name = record.class == Class ? record.name : record.class.name
63
+ permission_identifier = "#{resource_name.underscore}/#{method_name.to_s.chomp('?')}"
64
+ allowed = user.respond_to?(:allowed_to?) ? user.allowed_to?(permission_identifier) : true
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,14 @@
1
+ module Itsf::Backend
2
+ class DashboardPolicy < Struct.new(:user, :dashboard)
3
+ def access?
4
+ permission_identifier = self.class.name.gsub('Policy', '').underscore
5
+ allowed = user.respond_to?(:allowed_to?) ? user.allowed_to?(permission_identifier) : true
6
+ if allowed
7
+ Rails.logger.info "Allowed access to #{permission_identifier} for #{user}"
8
+ else
9
+ Rails.logger.info "Denied access to #{permission_identifier} for #{user}"
10
+ end
11
+ allowed
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Itsf::Backend
2
+ class EnginePolicy < Struct.new(:user, :engine)
3
+ def access?
4
+ permission_identifier = self.class.name.gsub('Policy', '').underscore
5
+ allowed = user.respond_to?(:allowed_to?) ? user.allowed_to?(permission_identifier) : true
6
+ if allowed
7
+ Rails.logger.debug "User #{user} is allowed to access #{permission_identifier}"
8
+ else
9
+ Rails.logger.debug "User #{user} is not allowed to access #{permission_identifier}"
10
+ end
11
+ allowed
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ module Itsf::Backend
2
+ class Service::BasePolicy
3
+ attr_reader :user, :service
4
+
5
+ def initialize(user, service)
6
+ @user = user
7
+ @service = service
8
+ end
9
+
10
+ def index?
11
+ authorize_with_rbac(user, service, __method__)
12
+ end
13
+
14
+ def invoke?
15
+ authorize_with_rbac(user, service, __method__)
16
+ end
17
+
18
+ def call?
19
+ invoke?
20
+ end
21
+
22
+ private
23
+
24
+ def authorize_with_rbac(user, service_class, method_name)
25
+ permission_identifier = "#{service_class.name.underscore}/#{method_name.to_s.chomp('?')}"
26
+ user.respond_to?(:allowed_to?) ? user.allowed_to?(permission_identifier) : true
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,106 @@
1
+ class BootstrapTablePresenter < Admino::Table::Presenter
2
+ private
3
+
4
+ def table_html_options
5
+ { class: 'table table-striped table-hover table-admino table-scrollable table-condensed' }
6
+ end
7
+
8
+ def head_row(collection_klass, query, view_context)
9
+ HeadRow.new(collection_klass, query, view_context)
10
+ end
11
+
12
+ def resource_row(resource, view_context)
13
+ ResourceRow.new(resource, view_context)
14
+ end
15
+
16
+ class HeadRow < Admino::Table::HeadRow
17
+ def column(*args, &block)
18
+ attribute_name, label, html_options = parse_column_args(args)
19
+
20
+ if label.nil?
21
+ label = column_label(attribute_name)
22
+ elsif label.is_a? Symbol
23
+ label = column_label(label)
24
+ end
25
+
26
+ html_options = complete_column_html_options(
27
+ attribute_name,
28
+ html_options
29
+ )
30
+
31
+ # sorting_scope = html_options.delete(:sorting)
32
+ # sorting_html_options = html_options.delete(:sorting_html_options) { {} }
33
+
34
+ # if sorting_scope
35
+ # raise ArgumentError, 'query object is required' unless query
36
+ # label = query.sorting.scope_link(sorting_scope, label, sorting_html_options)
37
+ # end
38
+ if Itsf::Backend.features?(:ransack)
39
+ html_options.reverse_merge!(sortable: true, sortable_options: [])
40
+ sortable = html_options.delete(:sortable)
41
+ sortable_options = html_options.delete(:sortable_options)
42
+ if sortable_options.empty?
43
+ sortable_options << attribute_name
44
+ sortable_options << resource_klass.human_attribute_name(attribute_name)
45
+ end
46
+
47
+
48
+ if sortable
49
+ label = h.sort_link(h.instance_variable_get("@q"), *sortable_options)
50
+ # label = h.sort_link(h.instance_variable_get("@q"), attribute_name)
51
+ else
52
+ label = label.to_s
53
+ end
54
+ end
55
+
56
+ @columns << h.content_tag(:th, label, html_options)
57
+ end
58
+ end
59
+
60
+ class ResourceRow < Admino::Table::ResourceRow
61
+ # def to_html
62
+ # buffer = @columns
63
+
64
+ # if @actions.any?
65
+ # html_options = column_html_options(:actions)
66
+ # buffer << h.content_tag(:td, html_options) do
67
+ # actions_wrapper do
68
+ # @actions.join(" ").html_safe
69
+ # end
70
+ # end
71
+ # end
72
+
73
+ # buffer.html_safe
74
+ # end
75
+
76
+ # def actions_wrapper(&block)
77
+ # h.content_tag(:div, { class: 'btn-group' }, &block)
78
+ # end
79
+
80
+ # def edit_action_url
81
+ # view_context.edit_resource_url(resource)
82
+ # end
83
+
84
+ # def destroy_action_url
85
+ # view_context.resource_url(resource)
86
+ # end
87
+
88
+ # def show_action_html_options
89
+ # { class: 'btn btn-default btn-xs' }
90
+ # end
91
+
92
+ # def edit_action_html_options
93
+ # { class: 'btn btn-default btn-xs' }
94
+ # end
95
+
96
+ # def destroy_action_html_options
97
+ # {
98
+ # method: :delete,
99
+ # class: 'btn btn-danger btn-xs',
100
+ # data: {
101
+ # confirm: I18n.t('confirmations.delete')
102
+ # }
103
+ # }
104
+ # end
105
+ end
106
+ end
@@ -0,0 +1,18 @@
1
+ .panel.panel-default.panel-with-actions.itsf-dashboard-panel
2
+ .panel-heading
3
+ .panel-title
4
+ = t("classes.#{engine.name.underscore}")
5
+ .panel-actions
6
+ = link_to(t('.view'), main_app.send("#{engine.engine_name}_path"), class: 'btn btn-primary btn-xs')
7
+
8
+ %table.table.table-striped.table-hover.table-condensed
9
+ - "#{engine.to_s.deconstantize}::Configuration".constantize.registered_controllers.call.each do |kontroller|
10
+ - if !Itsf::Backend.features?(:pundit) || policy(kontroller.resource_class).index?
11
+ %tr
12
+ %th.col-md-3= kontroller.resource_class.model_name.human(count: :other)
13
+ %td.item-count
14
+ %span.label.label-default
15
+ - if respond_to?(:current_user) && current_user.respond_to?(:last_sign_in_at) && kontroller.resource_class.respond_to?(:column_names) && kontroller.resource_class.column_names.include?('updated_at')
16
+ = "#{kontroller.resource_class.where("updated_at > ?", current_user.last_sign_in_at).count}/#{kontroller.resource_class.count}"
17
+ - else
18
+ = kontroller.resource_class.count
@@ -0,0 +1,7 @@
1
+ #page-title.bottom-margin-1
2
+ %h3= t('.title', engine_name: t(controller.class.name.deconstantize.underscore.gsub('/', '_')))
3
+
4
+ - Itsf::Backend::Configuration.backend_engines.each do |engine|
5
+ - if !Itsf::Backend.features?(:pundit) || engine_policy(engine).access?
6
+ .col-lg-6= render 'dashboard_panel', engine: engine
7
+
@@ -0,0 +1,26 @@
1
+ .panel.panel-default
2
+ .panel-heading
3
+ .panel-title
4
+ = t(".resources")
5
+ %table.table.table-striped.table-hover.table-condensed
6
+ - "#{engine.to_s.deconstantize}::Configuration".constantize.registered_controllers.call.each do |kontroller|
7
+ %tr
8
+ %th.col-md-3= kontroller.resource_class.model_name.human(count: :other)
9
+ %td.text-left
10
+ %span.label.label-default
11
+ - if respond_to?(:current_user) && current_user.respond_to?(:last_sign_in_at) && kontroller.resource_class.respond_to?(:column_names) && kontroller.resource_class.column_names.include?('updated_at')
12
+ = "#{kontroller.resource_class.where("updated_at > ?", current_user.last_sign_in_at).count}/#{kontroller.resource_class.count}"
13
+ - else
14
+ = kontroller.resource_class.count
15
+ %td.text-right= link_to(t('.view'), { controller: kontroller.name.underscore.gsub('_controller', '') }, id: "link-to-#{kontroller.name.underscore.gsub('_controller', '').gsub(/[\/_]/, '-')}-index" ,class: 'btn btn-primary btn-xs')
16
+
17
+
18
+ .panel.panel-default
19
+ .panel-heading
20
+ .panel-title
21
+ = t(".services")
22
+ %table.table.table-striped.table-hover.table-condensed
23
+ - "#{engine.to_s.deconstantize}::Configuration".constantize.registered_services.call.each do |kontroller|
24
+ %tr
25
+ %th.col-md-3= t("classes.#{kontroller.service_class.name.underscore}")
26
+ %td.text-right= link_to(t('.view'), { controller: kontroller.name.underscore.gsub('_controller', '') }, id: "link-to-#{kontroller.name.underscore.gsub('_controller', '').gsub(/[\/_]/, '-')}-invoke" ,class: 'btn btn-primary btn-xs')
@@ -0,0 +1,14 @@
1
+ #page-title.bottom-margin-1
2
+ %h3= t('.title', engine_name: t("classes.#{engine.name.underscore}"))
3
+
4
+ .col-lg-12= render 'dashboard_panel', engine: engine
5
+
6
+ .col-lg-12= render 'index_extras', engine: engine
7
+
8
+ .col-lg-12
9
+ .well.well-sm
10
+ .btn-container-right
11
+ - if main_app.respond_to?(:itsf_backend_path)
12
+ = link_to(main_app.itsf_backend_path, class: 'btn btn-default btn-responsive') do
13
+ %span.glyphicon.glyphicon-arrow-left
14
+ %span.btn-text= t('.back')
@@ -0,0 +1,10 @@
1
+ %li.dropdown.active
2
+ = link_to('#', { class: 'dropdown-toggle', 'data-toggle': 'dropdown', role: 'button', 'aria-haspopup': true, 'aria-expanded': false }) do
3
+ = t("classes.#{I18n.name.underscore}")
4
+ %span.caret
5
+ %ul.dropdown-menu
6
+ - I18n.available_locales.reject{ |l| I18n.locale == l }.each do |locale|
7
+ %li{ class: (I18n.locale == locale ? 'active' : nil) }
8
+ = link_to(locale: locale) do
9
+ - I18n.with_locale(locale) do
10
+ = t("locales.#{locale}")
@@ -0,0 +1,2 @@
1
+ - resource_class.attribute_names.delete_if { |name| Itsf::Backend.hidden_attributes_for[:edit].include?(name.to_sym) }.each do |name|
2
+ = form.input name
@@ -0,0 +1,6 @@
1
+ - if resource.errors.any?
2
+ .error-explanation.alert.alert-danger
3
+ .error-heading= t('errors.template.header', count: resource.errors.count, model: resource.model_name.human)
4
+ %ul
5
+ - resource.errors.full_messages.each do |msg|
6
+ %li= msg
@@ -0,0 +1 @@
1
+ = form.scope :all
@@ -0,0 +1,3 @@
1
+ .form-group
2
+ - if resource_class.respond_to?(:columns_hash)
3
+ = form.full_text_search *resource_class.columns_hash.delete_if{ |k, v| !v.cast_type.is_a?(ActiveRecord::Type::String) }.keys, autofocus: :last
@@ -0,0 +1,2 @@
1
+ - resource_class.attribute_names.delete_if { |name| Itsf::Backend.hidden_attributes_for[:show].include?(name.to_sym) }.each do |name|
2
+ = table.row name
@@ -0,0 +1,2 @@
1
+ - resource_class.attribute_names.delete_if { |name| Itsf::Backend.hidden_attributes_for[:index].include?(name.to_sym) }.each do |name|
2
+ = table.column name
@@ -0,0 +1,15 @@
1
+ = table.column(:actions) do |resource|
2
+ - id_base = "link-to-#{controller.class.name.underscore.gsub('_controller', '').gsub(/[\/_]/, '-')}-#{resource.to_param}"
3
+ .btn-group
4
+ - if !Itsf::Backend.features?(:pundit) || policy(resource).show?
5
+ = link_to(resource_path(resource), id: "#{id_base}-show", class: 'btn btn-xs btn-responsive btn-default') do
6
+ %span.glyphicon.glyphicon-eye-open
7
+ %span.btn-text= t('.show')
8
+ - if !Itsf::Backend.features?(:pundit) || policy(resource).edit?
9
+ = link_to(edit_resource_path(resource), id: "#{id_base}-edit", class: 'btn btn-xs btn-responsive btn-default') do
10
+ %span.glyphicon.glyphicon-pencil
11
+ %span.btn-text= t('.edit')
12
+ - if !Itsf::Backend.features?(:pundit) || policy(resource).destroy?
13
+ = link_to(resource_path(resource), id: "#{id_base}-destroy", class: 'btn btn-xs btn-responsive btn-danger', method: :delete, data: { confirm: I18n.t('.confirmations.delete') }) do
14
+ %span.glyphicon.glyphicon-fire
15
+ %span.btn-text= t('.destroy')
@@ -0,0 +1,17 @@
1
+ .panel.panel-default
2
+ .panel-heading
3
+ %h1= t('.title', inflections)
4
+ .panel-body
5
+ = simple_form_for(@resource, url: resource_path(@resource)) do |f|
6
+ = render partial: 'form_errors', locals: { resource: f.object }
7
+ = render 'form', form: f
8
+ = f.button :submit, class: 'btn btn-success'
9
+ .panel-footer
10
+
11
+ .well.well-sm
12
+ = link_to resource_path(@resource), class: 'btn btn-primary btn-responsive' do
13
+ %span.glyphicon.glyphicon-eye-open
14
+ %span.btn-text= t('.show')
15
+ = link_to collection_path, class: 'btn btn-default btn-responsive pull-right' do
16
+ %span.glyphicon.glyphicon-arrow-left
17
+ %span.btn-text= t('.back')
@@ -0,0 +1,48 @@
1
+ #page-title.bottom-margin-1
2
+ .row
3
+ .col-xs-8
4
+ %h1
5
+ = t('.title', inflections)
6
+ %span.label.label-default= Itsf::Backend.features?(:kaminari) ? "#{@collection.total_count}/#{resource_class.count}" : @collection.count
7
+ .col-xs-4
8
+ #page-actions.btn-container-right
9
+ .btn-group
10
+ - if !Itsf::Backend.features?(:pundit) || policy(resource_class).new?
11
+ = link_to new_resource_path, id: "link-to-#{controller.class.name.underscore.gsub('_controller', '').gsub(/[\/_]/, '-')}-new", class: 'btn btn-success btn-responsive' do
12
+ %span.glyphicon.glyphicon-plus
13
+ %span.btn-text= t('.new', inflections)
14
+
15
+ .panel.panel-default.panel-with-actions
16
+ - if Itsf::Backend.features?(:ransack)
17
+ .panel-body
18
+ #filter
19
+ = search_form_for(@q, url: collection_path, class: 'form-inline', html: { 'data-auto-submit': true }) do |f|
20
+ #scopes.bottom-margin-1
21
+ = render 'scopes', form: f
22
+ #search.bottom-margin-1
23
+ = render 'search', form: f
24
+ #filter-actions.btn-group
25
+ - if f.is_a?(SimpleForm::FormBuilder)
26
+ = f.button :submit, t('ransack.search'), class: 'btn btn-success'
27
+ = link_to t('ransack.reset'), {},class: 'btn btn-danger'
28
+ - else
29
+ = f.submit
30
+
31
+ .table-responsive
32
+ = render_collection(@collection, resource_class, as: :bootstrap_table) do |table|
33
+ = render 'table', table: table
34
+ = render 'table_actions', table: table
35
+
36
+ .panel-footer
37
+ - if Itsf::Backend.features?(:kaminari)
38
+ .row
39
+ .col-md-4
40
+ .col-md-4
41
+ .text-center= paginate @collection, theme: 'twitter-bootstrap-3'
42
+ .col-md-4
43
+
44
+ .well.well-sm
45
+ .btn-container-right
46
+ = link_to root_path, class: 'btn btn-default btn-responsive' do
47
+ %span.glyphicon.glyphicon-arrow-left
48
+ %span.btn-text= t('.back')
@@ -0,0 +1,15 @@
1
+ %div.panel.panel-default
2
+ %div.panel-heading
3
+ %h1= t('.title', inflections)
4
+ %div.panel-body
5
+ = simple_form_for(@resource, url: collection_path) do |f|
6
+ = render partial: 'form_errors', locals: { resource: f.object }
7
+ = render 'form', form: f
8
+ = f.button :submit, class: 'btn btn-success'
9
+ %div.panel-footer
10
+
11
+ .well.well-sm
12
+ .btn-container-right
13
+ = link_to collection_path, class: 'btn btn-default btn-responsive' do
14
+ %span.glyphicon.glyphicon-arrow-left
15
+ %span.btn-text= t('.back')