redmine_extensions 0.0.39 → 0.1.01

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/redmine_extensions/redmine_extensions.js +30 -59
  3. data/app/controllers/easy_settings_controller.rb +1 -1
  4. data/app/helpers/redmine_extensions/application_helper.rb +108 -65
  5. data/app/helpers/redmine_extensions/rendering_helper.rb +5 -0
  6. data/app/presenters/easy_query_adapter_presenter.rb +50 -0
  7. data/app/views/common/_collapsible_module_layout.html.erb +13 -0
  8. data/app/views/easy_entity_assignments/_assignments_container.html.erb +10 -15
  9. data/app/views/easy_entity_assignments/_query_index.html.erb +2 -10
  10. data/app/views/easy_queries/_easy_query_tile.html.erb +7 -0
  11. data/app/views/easy_settings/edit.html.erb +1 -1
  12. data/config/routes.rb +3 -7
  13. data/lib/generators/redmine_extensions/entity/templates/_form.html.erb.erb +1 -1
  14. data/lib/generators/redmine_extensions/entity/templates/_sidebar.html.erb.erb +8 -8
  15. data/lib/generators/redmine_extensions/entity/templates/context_menu.html.erb.erb +7 -7
  16. data/lib/generators/redmine_extensions/entity/templates/custom_field.rb.erb +7 -7
  17. data/lib/generators/redmine_extensions/entity/templates/edit.html.erb.erb +16 -16
  18. data/lib/generators/redmine_extensions/entity/templates/index.api.rsb.erb +5 -5
  19. data/lib/generators/redmine_extensions/entity/templates/index.html.erb.erb +4 -4
  20. data/lib/generators/redmine_extensions/entity/templates/mail_added.html.erb.erb +1 -1
  21. data/lib/generators/redmine_extensions/entity/templates/mail_added.text.erb.erb +2 -2
  22. data/lib/generators/redmine_extensions/entity/templates/mail_updated.text.erb.erb +2 -2
  23. data/lib/generators/redmine_extensions/entity/templates/migration.rb.erb +9 -9
  24. data/lib/generators/redmine_extensions/entity/templates/new.html.erb.erb +16 -16
  25. data/lib/generators/redmine_extensions/entity/templates/query.rb.erb +1 -1
  26. data/lib/generators/redmine_extensions/entity/templates/routes.rb.erb +12 -12
  27. data/lib/generators/redmine_extensions/entity/templates/show.html.erb.erb +37 -37
  28. data/lib/redmine_extensions/easy_query_adapter.rb +107 -88
  29. data/lib/redmine_extensions/easy_query_helpers/outputs.rb +69 -0
  30. data/lib/redmine_extensions/engine.rb +11 -1
  31. data/lib/redmine_extensions/query_output.rb +41 -25
  32. data/lib/redmine_extensions/query_outputs/list_output.rb +14 -0
  33. data/lib/redmine_extensions/query_outputs/tile_output.rb +19 -0
  34. data/lib/redmine_extensions/redmine_patches/patches.rb +2 -3
  35. data/lib/redmine_extensions/version.rb +1 -1
  36. data/spec/redmine/bin/about +0 -0
  37. data/spec/redmine/bin/bundle +0 -0
  38. data/spec/redmine/bin/rails +0 -0
  39. data/spec/redmine/bin/rake +0 -0
  40. data/spec/redmine/extra/svn/reposman.rb +0 -0
  41. data/spec/redmine/public/dispatch.fcgi.example +0 -0
  42. data/spec/redmine/script/about +0 -0
  43. data/spec/redmine/script/rails +0 -0
  44. metadata +1978 -1972
  45. data/lib/redmine_extensions/query_outputs/table_output.rb +0 -18
@@ -1,17 +1,17 @@
1
- <%%= title l(:heading_<%= model_name_underscored %>_edit) %>
2
-
3
- <%%= form_for([@project, @<%= model_name_underscored %>], html: {multipart: <%= acts_as_attachable? %>, id: '<%= model_name_underscored %>_form', class: 'tabular'}) do |f| %>
4
- <%%= error_messages_for @<%= model_name_underscored %> %>
5
-
6
- <div class="box">
7
- <%%= render partial: 'form', locals: {<%= model_name_underscored %>: @<%= model_name_underscored %>} %>
8
- </div>
9
-
10
- <p>
11
- <%%= submit_tag l(:button_update), title: l(:button_update) %>
12
- </p>
13
- <%% end %>
14
- <%% ### PAGE CUSTOMS ########################################################## %>
15
- <%% content_for :sidebar do %>
16
- <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
1
+ <%%= title l(:heading_<%= model_name_underscored %>_edit) %>
2
+
3
+ <%%= form_for([@project, @<%= model_name_underscored %>], html: {multipart: <%= acts_as_attachable? %>, id: '<%= model_name_underscored %>_form', class: 'tabular'}) do |f| %>
4
+ <%%= error_messages_for @<%= model_name_underscored %> %>
5
+
6
+ <div class="box">
7
+ <%%= render partial: 'form', locals: {<%= model_name_underscored %>: @<%= model_name_underscored %>} %>
8
+ </div>
9
+
10
+ <p>
11
+ <%%= submit_tag l(:button_update), title: l(:button_update) %>
12
+ </p>
13
+ <%% end %>
14
+ <%% ### PAGE CUSTOMS ########################################################## %>
15
+ <%% content_for :sidebar do %>
16
+ <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
17
17
  <%% end %>
@@ -1,5 +1,5 @@
1
- api.array :<%= model_name_pluralize_underscored %>, api_meta(total_count: @entity_count, offset: @offset, limit: @limit) do
2
- @entities.each do |<%= model_name_underscored %>|
3
- render_api_<%= model_name_underscored %>(api, <%= model_name_underscored %>)
4
- end
5
- end
1
+ api.array :<%= model_name_pluralize_underscored %>, api_meta(total_count: @entity_count, offset: @offset, limit: @limit) do
2
+ @entities.each do |<%= model_name_underscored %>|
3
+ render_api_<%= model_name_underscored %>(api, <%= model_name_underscored %>)
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
- <%%= render @query %>
2
- <%% ### PAGE CUSTOMS ########################################################## %>
3
- <%% content_for :sidebar do %>
4
- <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
1
+ <%%= render @query %>
2
+ <%% ### PAGE CUSTOMS ########################################################## %>
3
+ <%% content_for :sidebar do %>
4
+ <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
5
5
  <%% end %>
@@ -1 +1 @@
1
- <h1><%%= link_to(@<%= model_name_underscored %>.to_s, @<%= model_name_underscored %>_url) %></h1>
1
+ <h1><%%= link_to(@<%= model_name_underscored %>.to_s, @<%= model_name_underscored %>_url) %></h1>
@@ -1,2 +1,2 @@
1
- <%%= @<%= model_name_underscored %>.to_s %>
2
- <%%= @<%= model_name_underscored %>_url %>
1
+ <%%= @<%= model_name_underscored %>.to_s %>
2
+ <%%= @<%= model_name_underscored %>_url %>
@@ -1,2 +1,2 @@
1
- <%%= @<%= model_name_underscored %>.to_s %>
2
- <%%= @<%= model_name_underscored %>_url %>
1
+ <%%= @<%= model_name_underscored %>.to_s %>
2
+ <%%= @<%= model_name_underscored %>_url %>
@@ -1,9 +1,9 @@
1
- class Create<%= model_name_pluralize_underscored.camelize %> < ActiveRecord::Migration
2
- def change
3
- create_table :<%= model_name_pluralize_underscored %>, force: true do |t|
4
- <%- db_columns.each do |column_name, column_attrs| -%>
5
- t.<%= column_attrs[:type] %> :<%= column_name %>, null: <%= column_attrs[:null] %>
6
- <%- end -%>
7
- end
8
- end
9
- end
1
+ class Create<%= model_name_pluralize_underscored.camelize %> < ActiveRecord::Migration
2
+ def change
3
+ create_table :<%= model_name_pluralize_underscored %>, force: true do |t|
4
+ <%- db_columns.each do |column_name, column_attrs| -%>
5
+ t.<%= column_attrs[:type] %> :<%= column_name %>, null: <%= column_attrs[:null] %>
6
+ <%- end -%>
7
+ end
8
+ end
9
+ end
@@ -1,17 +1,17 @@
1
- <%%= title l(:heading_<%= model_name_underscored %>_new) %>
2
-
3
- <%%= form_for([@project, @<%= model_name_underscored %>], html: {multipart: <%= acts_as_attachable? %>, id: '<%= model_name_underscored %>_form', class: 'tabular'}) do |f| %>
4
- <%%= error_messages_for @<%= model_name_underscored %> %>
5
-
6
- <div class="box">
7
- <%%= render partial: 'form', locals: {<%= model_name_underscored %>: @<%= model_name_underscored %>} %>
8
- </div>
9
-
10
- <p>
11
- <%%= submit_tag l(:button_create), title: l(:button_create) %>
12
- </p>
13
- <%% end %>
14
- <%% ### PAGE CUSTOMS ########################################################## %>
15
- <%% content_for :sidebar do %>
16
- <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
1
+ <%%= title l(:heading_<%= model_name_underscored %>_new) %>
2
+
3
+ <%%= form_for([@project, @<%= model_name_underscored %>], html: {multipart: <%= acts_as_attachable? %>, id: '<%= model_name_underscored %>_form', class: 'tabular'}) do |f| %>
4
+ <%%= error_messages_for @<%= model_name_underscored %> %>
5
+
6
+ <div class="box">
7
+ <%%= render partial: 'form', locals: {<%= model_name_underscored %>: @<%= model_name_underscored %>} %>
8
+ </div>
9
+
10
+ <p>
11
+ <%%= submit_tag l(:button_create), title: l(:button_create) %>
12
+ </p>
13
+ <%% end %>
14
+ <%% ### PAGE CUSTOMS ########################################################## %>
15
+ <%% content_for :sidebar do %>
16
+ <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
17
17
  <%% end %>
@@ -30,7 +30,7 @@ class <%= model_name %>Query < EasyQuery
30
30
  @available_columns
31
31
  end
32
32
 
33
- def default_list_columns
33
+ def default_columns_names
34
34
  super.presence || <%= db_columns.collect{|column_name, column_options| (column_options[:query_column_name] || column_name).to_sym}[0..3].to_s %>.flat_map{|c| [c.to_s, c.to_sym]}
35
35
  end
36
36
 
@@ -1,13 +1,13 @@
1
- <% if project? %>
2
- resources :projects do
3
- resources :<%= model_name_pluralize_underscored %>
4
- end
5
- <% end %>
6
- resources :<%= model_name_pluralize_underscored %> do
7
- collection do
8
- get 'autocomplete'
9
- get 'bulk_edit'
10
- post 'bulk_update'
11
- get 'context_menu'
12
- end
1
+ <% if project? %>
2
+ resources :projects do
3
+ resources :<%= model_name_pluralize_underscored %>
4
+ end
5
+ <% end %>
6
+ resources :<%= model_name_pluralize_underscored %> do
7
+ collection do
8
+ get 'autocomplete'
9
+ get 'bulk_edit'
10
+ post 'bulk_update'
11
+ get 'context_menu'
12
+ end
13
13
  end
@@ -1,38 +1,38 @@
1
- <%%= title @<%= model_name_underscored %> %>
2
- <div class="issue">
3
- <table class="attributes">
4
- <%%= issue_fields_rows do |rows| %>
5
- <%- safe_columns.each_with_index do |column, idx| -%>
6
- <%- next if description_column? && column[0] == description_column -%>
7
- <%- if idx % 2 == 0 -%>
8
- <%% rows.left ::<%= model_name %>.human_attribute_name(:<%= column[0] %>), format_object(@<%= model_name_underscored %>.<%= column[0] %>) %>
9
- <%- else -%>
10
- <%% rows.right ::<%= model_name %>.human_attribute_name(:<%= column[0] %>), format_object(@<%= model_name_underscored %>.<%= column[0] %>) %>
11
- <%- end -%>
12
- <%- end -%>
13
- <%% end %>
14
- <%%= render_custom_fields_rows(@<%= model_name_underscored %>) %>
15
- <%%= call_hook(:view_<%= model_name_pluralize_underscored %>_show_details_bottom, :<%= model_name_underscored %> => @<%= model_name_underscored %>) %>
16
- </table>
17
- <%- if description_column? -%>
18
- <%% if !@<%= model_name_underscored %>.<%= description_column %>.blank? %>
19
- <hr />
20
- <div class="description">
21
- <p><strong><%%= ::<%= model_name %>.human_attribute_name(:<%= description_column %>) %></strong></p>
22
- <div class="wiki">
23
- <%%= textilizable @<%= model_name_underscored %>, :<%= description_column %>, attachments: @<%= model_name_underscored %>.attachments %>
24
- </div>
25
- </div>
26
- <%% end %>
27
- <%- end -%>
28
- <%- if acts_as_attachable? -%>
29
- <%% if @<%= model_name_underscored %>.attachments.any? -%>
30
- <hr />
31
- <%%= link_to_attachments @<%= model_name_underscored %>, :thumbnails => true %>
32
- <%% end %>
33
- <%- end -%>
34
- </div>
35
- <%% ### PAGE CUSTOMS ########################################################## %>
36
- <%% content_for :sidebar do %>
37
- <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
1
+ <%%= title @<%= model_name_underscored %> %>
2
+ <div class="issue">
3
+ <table class="attributes">
4
+ <%%= issue_fields_rows do |rows| %>
5
+ <%- safe_columns.each_with_index do |column, idx| -%>
6
+ <%- next if description_column? && column[0] == description_column -%>
7
+ <%- if idx % 2 == 0 -%>
8
+ <%% rows.left ::<%= model_name %>.human_attribute_name(:<%= column[0] %>), format_object(@<%= model_name_underscored %>.<%= column[0] %>) %>
9
+ <%- else -%>
10
+ <%% rows.right ::<%= model_name %>.human_attribute_name(:<%= column[0] %>), format_object(@<%= model_name_underscored %>.<%= column[0] %>) %>
11
+ <%- end -%>
12
+ <%- end -%>
13
+ <%% end %>
14
+ <%%= render_custom_fields_rows(@<%= model_name_underscored %>) %>
15
+ <%%= call_hook(:view_<%= model_name_pluralize_underscored %>_show_details_bottom, :<%= model_name_underscored %> => @<%= model_name_underscored %>) %>
16
+ </table>
17
+ <%- if description_column? -%>
18
+ <%% if !@<%= model_name_underscored %>.<%= description_column %>.blank? %>
19
+ <hr />
20
+ <div class="description">
21
+ <p><strong><%%= ::<%= model_name %>.human_attribute_name(:<%= description_column %>) %></strong></p>
22
+ <div class="wiki">
23
+ <%%= textilizable @<%= model_name_underscored %>, :<%= description_column %>, attachments: @<%= model_name_underscored %>.attachments %>
24
+ </div>
25
+ </div>
26
+ <%% end %>
27
+ <%- end -%>
28
+ <%- if acts_as_attachable? -%>
29
+ <%% if @<%= model_name_underscored %>.attachments.any? -%>
30
+ <hr />
31
+ <%%= link_to_attachments @<%= model_name_underscored %>, :thumbnails => true %>
32
+ <%% end %>
33
+ <%- end -%>
34
+ </div>
35
+ <%% ### PAGE CUSTOMS ########################################################## %>
36
+ <%% content_for :sidebar do %>
37
+ <%%= render :partial => '<%= model_name_pluralize_underscored %>/sidebar' %>
38
38
  <%% end %>
@@ -19,138 +19,157 @@ module RedmineExtensions
19
19
  module ClassMethods
20
20
  end
21
21
  end
22
- end
23
22
 
24
- class EasyQueryAdapter < Query
23
+ module QueryAdapter
25
24
 
26
- after_initialize :after_initialize
25
+ # after_initialize :after_initialize
27
26
 
28
- def after_initialize
29
- self.filters ||= {}
30
- end
27
+ # def after_initialize
28
+ # self.filters ||= {}
29
+ # end
31
30
 
32
- def default_find_include
33
- [].freeze
34
- end
31
+ attr_writer :outputs
35
32
 
36
- def default_find_preload
37
- [].freeze
38
- end
33
+ def outputs
34
+ @outputs ||= ['list']
35
+ end
39
36
 
40
- def default_find_joins
41
- [].freeze
42
- end
37
+ def output=(output_t)
38
+ self.outputs = Array.wrap(output_t)
39
+ end
43
40
 
44
- def default_list_columns
45
- [].freeze
46
- end
41
+ def filters
42
+ super || {}
43
+ end
47
44
 
48
- def formatter
49
- @formatter
50
- end
45
+ def default_find_include
46
+ [].freeze
47
+ end
51
48
 
52
- def init_formatter(object)
53
- return @formatter if @formatter
49
+ def default_find_preload
50
+ [].freeze
51
+ end
52
+
53
+ def default_find_joins
54
+ [].freeze
55
+ end
54
56
 
55
- if entity
56
- begin
57
- formatter_klass = "#{entity}Formatter".constantize
58
- rescue NameError
57
+ def default_list_columns
58
+ [].freeze
59
+ end
60
+
61
+ def formatter
62
+ @formatter
63
+ end
64
+
65
+ def init_formatter(object)
66
+ return @formatter if @formatter
67
+
68
+ if entity
69
+ begin
70
+ formatter_klass = "#{entity}Formatter".constantize
71
+ rescue NameError
72
+ end
59
73
  end
74
+
75
+ formatter_klass ||= EasyEntityFormatter
76
+ @formatter = formatter_klass.new(object)
60
77
  end
61
78
 
62
- formatter_klass ||= EasyEntityFormatter
63
- @formatter = formatter_klass.new(object)
64
- end
79
+ def entity
80
+ self.class.queried_class
81
+ end
65
82
 
66
- def entity
67
- self.class.queried_class
68
- end
83
+ def entity_scope
84
+ if !@entity_scope.nil?
85
+ @entity_scope
86
+ elsif entity.respond_to?(:visible)
87
+ entity.visible
88
+ else
89
+ entity
90
+ end
91
+ end
92
+
93
+ def set_entity_scope(entity, reference_collection = nil)
94
+ return nil if entity.nil? || reference_collection.nil?
95
+
96
+ @entity_scope = entity.send(reference_collection.to_sym)
97
+
98
+ self.filters = {}
69
99
 
70
- def entity_scope
71
- if !@entity_scope.nil?
72
100
  @entity_scope
73
- elsif entity.respond_to?(:visible)
74
- entity.visible
75
- else
76
- entity
77
101
  end
78
- end
79
-
80
- def set_entity_scope(entity, reference_collection = nil)
81
- return nil if entity.nil? || reference_collection.nil?
82
102
 
83
- @entity_scope = entity.send(reference_collection.to_sym)
103
+ def create_entity_scope(options={})
104
+ scope = entity_scope.where(statement)
84
105
 
85
- self.filters = {}
106
+ includes = default_find_include.dup
107
+ includes.concat(Array.wrap(options[:includes]))
86
108
 
87
- @entity_scope
88
- end
109
+ preload = default_find_preload.dup
110
+ preload.concat(Array.wrap(options[:preload]))
89
111
 
90
- def create_entity_scope(options={})
91
- scope = entity_scope.where(statement)
112
+ joins = default_find_joins.dup
113
+ joins.concat(Array.wrap(options[:joins]))
92
114
 
93
- includes = default_find_include.dup
94
- includes.concat(Array.wrap(options[:includes]))
115
+ filters.keys.each do |filter|
116
+ f = available_filters[filter]
117
+ next if f.blank?
95
118
 
96
- preload = default_find_preload.dup
97
- preload.concat(Array.wrap(options[:preload]))
119
+ includes.concat(Array.wrap(f[:includes])) if f[:includes]
120
+ joins.concat(Array.wrap(f[:joins])) if f[:joins]
121
+ end if filters
98
122
 
99
- joins = default_find_joins.dup
100
- joins.concat(Array.wrap(options[:joins]))
123
+ columns.each do |c|
124
+ includes.concat(Array.wrap(c.includes)) if c.includes
125
+ joins.concat(Array.wrap(c.joins)) if c.joins
126
+ preload.concat(Array.wrap(c.preload)) if c.preload
127
+ end
101
128
 
102
- filters.keys.each do |filter|
103
- f = available_filters[filter]
104
- next if f.blank?
129
+ if project
130
+ includes << :project
131
+ end
105
132
 
106
- includes.concat(Array.wrap(f[:includes])) if f[:includes]
107
- joins.concat(Array.wrap(f[:joins])) if f[:joins]
108
- end if filters
133
+ includes.uniq!
134
+ joins.uniq!
135
+ preload.uniq!
109
136
 
110
- columns.each do |c|
111
- includes.concat(Array.wrap(c.includes)) if c.includes
112
- joins.concat(Array.wrap(c.joins)) if c.joins
113
- preload.concat(Array.wrap(c.preload)) if c.preload
137
+ scope.includes(includes).references(includes).joins(joins).preload(preload)
114
138
  end
115
139
 
116
- if project
117
- includes << :project
140
+ def entities(options={})
141
+ create_entity_scope(options).order(options[:order]).to_a
118
142
  end
119
143
 
120
- includes.uniq!
121
- joins.uniq!
122
- preload.uniq!
144
+ def add_available_column(name, options={})
145
+ @available_columns ||= []
123
146
 
124
- scope.includes(includes).references(includes).joins(joins).preload(preload)
125
- end
126
-
127
- def entities(options={})
128
- create_entity_scope(options).order(options[:order]).to_a
129
- end
147
+ @available_columns << QueryColumn.new(name.to_sym, options)
148
+ end
130
149
 
131
- def add_available_column(name, options={})
132
- @available_columns ||= []
150
+ def to_partial_path
151
+ 'easy_queries/index'
152
+ end
133
153
 
134
- @available_columns << QueryColumn.new(name.to_sym, options)
135
- end
154
+ def default_columns_names
155
+ default_list_columns
156
+ end
136
157
 
137
- def to_partial_path
138
- 'easy_queries/index'
139
- end
158
+ def queried_table_name
159
+ entity.table_name
160
+ end
140
161
 
141
- def default_columns_names
142
- default_list_columns
143
162
  end
144
163
 
145
- def queried_table_name
146
- entity.table_name
147
- end
164
+ end
148
165
 
166
+ class EasyQueryAdapter < Query
149
167
  end
150
168
 
151
169
  if Redmine::Plugin.installed?(:easy_extensions)
152
170
  # EasyQuery exist
153
171
  else
154
172
  QueryColumn.send(:include, RedmineExtensions::QueryColumnAdapter)
173
+ RedmineExtensions::PatchManager.register_model_patch('Query', "RedmineExtensions::QueryAdapter")
155
174
  EasyQuery = EasyQueryAdapter
156
175
  end
@@ -0,0 +1,69 @@
1
+ module RedmineExtensions
2
+ module EasyQueryHelpers
3
+ # ----- OUTPUTS HELPER CLASS ----
4
+ class Outputs
5
+ include Enumerable
6
+
7
+ def initialize(presenter, view_context = nil)
8
+ if presenter.is_a?(RedmineExtensions::BasePresenter)
9
+ @presenter = presenter
10
+ @query = @presenter.model
11
+ else
12
+ @presenter = @query = presenter
13
+ end
14
+ @view_context = view_context
15
+ end
16
+
17
+ def view_context
18
+ @view_context || @presenter.h
19
+ end
20
+
21
+ def outputs
22
+ @outputs ||= enabled_outputs.map{|o| RedmineExtensions::QueryOutput.output_klass_for(o).new(@presenter, self) }.sort_by{|a| a.order}
23
+ end
24
+
25
+ def each(style = :enabled, &block)
26
+ if style == :enabled
27
+ outputs.each(&block)
28
+ else
29
+ available_outputs.each(&block)
30
+ end
31
+ end
32
+
33
+ def enabled_outputs
34
+ res = @query.outputs
35
+ res << 'list' if res.empty? && available_outputs.empty?
36
+ res
37
+ end
38
+
39
+ def available_output_names
40
+ @available_output_names ||= RedmineExtensions::QueryOutput.available_outputs_for( @query )
41
+ end
42
+
43
+ def available_outputs
44
+ @available_outputs ||= RedmineExtensions::QueryOutput.available_output_klasses_for( @query ).map{|klass| klass.new(@presenter, self) }
45
+ end
46
+
47
+ def output_enabled?(output)
48
+ enabled_outputs.include?(output.to_s)
49
+ end
50
+
51
+ def render_edit_selects(style=:check_box, options={})
52
+ available_output_instances.map{|o| o.render_edit_box(style, options) }.join('').html_safe
53
+ end
54
+
55
+ def render_edit
56
+ outputs.map{ |output| output.render_edit }.join('').html_safe
57
+ end
58
+
59
+ def method_missing(name, *args)
60
+ if name.to_s.ends_with?('?')
61
+ output_enabled?(name.to_s[0..-2])
62
+ else
63
+ super
64
+ end
65
+ end
66
+ end
67
+
68
+ end #EasyQueryHelpers
69
+ end #RedmineExtensions
@@ -4,6 +4,15 @@ require 'redmine_extensions/redmine_patches/patches'
4
4
  module RedmineExtensions
5
5
  class Engine < ::Rails::Engine
6
6
 
7
+ def self.automount!(path = nil)
8
+ engine = self
9
+ path ||= engine.to_s.underscore.split('/').first
10
+ Rails.application.routes.draw do
11
+ mount engine => path
12
+ resources :easy_settings, only: [:edit]
13
+ end
14
+ end
15
+
7
16
  config.generators do |g|
8
17
  g.test_framework :rspec, :fixture => false
9
18
  g.fixture_replacement :factory_girl, :dir => 'spec/factories'
@@ -16,7 +25,8 @@ module RedmineExtensions
16
25
 
17
26
  #config.to_prepare goes after Reloader.to_prepare
18
27
  ActionDispatch::Reloader.to_prepare do
19
- RedmineExtensions::QueryOutput.register_output :table, RedmineExtensions::QueryOutputs::TableOutput
28
+ RedmineExtensions::QueryOutput.register_output RedmineExtensions::QueryOutputs::ListOutput
29
+ RedmineExtensions::QueryOutput.register_output RedmineExtensions::QueryOutputs::TileOutput
20
30
  # RedmineExtensions::BasePresenter.register 'RedmineExtensions::EasyQueryPresenter', 'EasyQuery'
21
31
  # ApplicationController.send :include, RedmineExtensions::RailsPatches::ControllerQueryHelpers
22
32
  ApplicationController.send :include, RedmineExtensions::RenderingHelper