admin_assistant 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +3 -28
- data/Rakefile +18 -10
- data/init.rb +1 -0
- data/install.rb +5 -1
- data/lib/admin_assistant/active_record_column.rb +211 -0
- data/lib/admin_assistant/association_target.rb +35 -0
- data/lib/admin_assistant/belongs_to_column.rb +186 -0
- data/lib/admin_assistant/builder.rb +222 -35
- data/lib/admin_assistant/column.rb +266 -297
- data/lib/admin_assistant/default_search_column.rb +41 -0
- data/lib/admin_assistant/file_column_column.rb +73 -0
- data/lib/admin_assistant/form_view.rb +7 -68
- data/lib/admin_assistant/helper.rb +4 -2
- data/lib/admin_assistant/index.rb +101 -81
- data/lib/admin_assistant/paperclip_column.rb +45 -0
- data/lib/admin_assistant/polymorphic_belongs_to_column.rb +102 -0
- data/lib/admin_assistant/request/autocomplete.rb +47 -0
- data/lib/admin_assistant/request/base.rb +176 -0
- data/lib/admin_assistant/request/create.rb +27 -0
- data/lib/admin_assistant/request/destroy.rb +15 -0
- data/lib/admin_assistant/request/edit.rb +11 -0
- data/lib/admin_assistant/request/index.rb +26 -0
- data/lib/admin_assistant/request/new.rb +19 -0
- data/lib/admin_assistant/request/show.rb +24 -0
- data/lib/admin_assistant/request/update.rb +44 -0
- data/lib/admin_assistant/search.rb +82 -0
- data/lib/admin_assistant/show_view.rb +20 -0
- data/lib/admin_assistant/virtual_column.rb +61 -0
- data/lib/admin_assistant.rb +190 -85
- data/lib/javascripts/admin_assistant.js +253 -0
- data/lib/stylesheets/activescaffold.css +219 -0
- data/lib/stylesheets/default.css +119 -0
- data/lib/views/_polymorphic_field_search.html.erb +89 -0
- data/lib/views/_restricted_autocompleter.html.erb +53 -0
- data/lib/views/autocomplete.html.erb +11 -0
- data/lib/views/form.html.erb +6 -3
- data/lib/views/index.html.erb +53 -46
- data/lib/views/show.html.erb +19 -0
- data/vendor/ar_query/MIT-LICENSE +20 -0
- data/vendor/ar_query/README +0 -0
- data/vendor/ar_query/init.rb +1 -0
- data/vendor/ar_query/install.rb +1 -0
- data/vendor/ar_query/lib/ar_query.rb +137 -0
- data/vendor/ar_query/spec/ar_query_spec.rb +253 -0
- data/vendor/ar_query/tasks/ar_query_tasks.rake +0 -0
- data/vendor/ar_query/uninstall.rb +1 -0
- metadata +39 -16
- data/lib/admin_assistant/request.rb +0 -183
- data/lib/stylesheets/admin_assistant.css +0 -75
@@ -0,0 +1,73 @@
|
|
1
|
+
class AdminAssistant
|
2
|
+
class FileColumnColumn < Column
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def contains?(column_name)
|
10
|
+
column_name.to_s == @name
|
11
|
+
end
|
12
|
+
|
13
|
+
class View < AdminAssistant::Column::View
|
14
|
+
def file_exists?(record)
|
15
|
+
if @file_exists_method
|
16
|
+
@file_exists_method.call record
|
17
|
+
else
|
18
|
+
!source_for_image_tag(record).nil?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def image_html(record)
|
23
|
+
@action_view.image_tag(
|
24
|
+
source_for_image_tag(record), :size => @image_size
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def source_for_image_tag(record)
|
29
|
+
if @file_url_method
|
30
|
+
@file_url_method.call record
|
31
|
+
else
|
32
|
+
@action_view.instance_variable_set :@record, record
|
33
|
+
@action_view.url_for_file_column 'record', @column.name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class FormView < View
|
39
|
+
include AdminAssistant::Column::FormViewMethods
|
40
|
+
|
41
|
+
def default_html(form)
|
42
|
+
if file_exists?(form.object)
|
43
|
+
check_box_tag = @action_view.check_box_tag(
|
44
|
+
"#{form.object.class.name.underscore}[#{name}(destroy)]"
|
45
|
+
)
|
46
|
+
<<-HTML
|
47
|
+
<p>Current image:<br />#{image_html(form.object)}</p>
|
48
|
+
<p>Remove: #{check_box_tag}</p>
|
49
|
+
<p>Update: #{form.file_field(name)}</p>
|
50
|
+
HTML
|
51
|
+
else
|
52
|
+
"<p>Add: #{form.file_field(name)}</p>"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class IndexView < View
|
58
|
+
include AdminAssistant::Column::IndexViewMethods
|
59
|
+
|
60
|
+
def unconfigured_html(record)
|
61
|
+
image_html(record) if file_exists?(record)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class ShowView < View
|
66
|
+
include AdminAssistant::Column::ShowViewMethods
|
67
|
+
|
68
|
+
def html(record)
|
69
|
+
image_html(record) if file_exists?(record)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -13,52 +13,17 @@ class AdminAssistant
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def after_column_html(column)
|
17
|
-
if after = render_from_custom_template("_after_#{column.name}_input")
|
18
|
-
after
|
19
|
-
else
|
20
|
-
helper_method = "after_#{column.name}_input"
|
21
|
-
if @action_view.respond_to?(helper_method)
|
22
|
-
@action_view.send(helper_method, @record)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def column_html(column, rails_form)
|
28
|
-
hff = render_from_custom_template "_#{column.name}_input"
|
29
|
-
hff ||= column_html_from_helper_method(column)
|
30
|
-
hff ||= if settings.read_only.include?(column.name)
|
31
|
-
column.form_value(@record)
|
32
|
-
elsif column.respond_to?(:add_to_form)
|
33
|
-
column.add_to_form(rails_form)
|
34
|
-
else
|
35
|
-
virtual_column_html column
|
36
|
-
end
|
37
|
-
if ah = after_column_html(column)
|
38
|
-
hff << ah
|
39
|
-
end
|
40
|
-
hff
|
41
|
-
end
|
42
|
-
|
43
|
-
def column_html_from_helper_method(column)
|
44
|
-
html_method = "#{column.name}_html_for_form"
|
45
|
-
if @action_view.respond_to?(html_method)
|
46
|
-
@action_view.send(html_method, @record)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
16
|
def column_names
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
}
|
17
|
+
if %w(new create).include?(@action_view.action_name)
|
18
|
+
settings.columns_for_new
|
19
|
+
elsif %w(edit update).include?(@action_view.action_name)
|
20
|
+
settings.columns_for_edit
|
21
|
+
end
|
57
22
|
end
|
58
23
|
|
59
24
|
def columns
|
60
|
-
@admin_assistant.
|
61
|
-
c.
|
25
|
+
@admin_assistant.accumulate_columns(column_names).map { |c|
|
26
|
+
c.form_view @action_view, @admin_assistant
|
62
27
|
}
|
63
28
|
end
|
64
29
|
|
@@ -83,18 +48,6 @@ class AdminAssistant
|
|
83
48
|
@admin_assistant.model_class
|
84
49
|
end
|
85
50
|
|
86
|
-
def render_from_custom_template(slug)
|
87
|
-
template = File.join(
|
88
|
-
RAILS_ROOT, 'app/views', controller.controller_path, "#{slug}.html.erb"
|
89
|
-
)
|
90
|
-
if File.exist?(template)
|
91
|
-
@action_view.render(
|
92
|
-
:file => template,
|
93
|
-
:locals => {model_class.name.underscore.to_sym => @record}
|
94
|
-
)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
51
|
def settings
|
99
52
|
@admin_assistant.form_settings
|
100
53
|
end
|
@@ -106,19 +59,5 @@ class AdminAssistant
|
|
106
59
|
def title
|
107
60
|
(@record.id ? "Edit" : "New") + " #{@admin_assistant.model_class_name}"
|
108
61
|
end
|
109
|
-
|
110
|
-
def virtual_column_html(column)
|
111
|
-
input_name = "#{model_class.name.underscore}[#{column.name}]"
|
112
|
-
input_type = settings.inputs[column.name.to_sym]
|
113
|
-
fv = column.form_value @record
|
114
|
-
if input_type
|
115
|
-
if input_type == :check_box
|
116
|
-
@action_view.send(:check_box_tag, input_name, '1', fv) +
|
117
|
-
@action_view.send(:hidden_field_tag, input_name, '0')
|
118
|
-
end
|
119
|
-
else
|
120
|
-
@action_view.send(:text_field_tag, input_name, fv)
|
121
|
-
end
|
122
|
-
end
|
123
62
|
end
|
124
63
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
class AdminAssistant
|
2
2
|
module Helper
|
3
|
-
def admin_assistant_includes
|
4
|
-
|
3
|
+
def admin_assistant_includes(opts = {})
|
4
|
+
theme = opts[:theme] || 'default'
|
5
|
+
stylesheet_link_tag("admin_assistant/#{theme}") +
|
6
|
+
javascript_include_tag('admin_assistant')
|
5
7
|
end
|
6
8
|
end
|
7
9
|
end
|
@@ -2,32 +2,37 @@ require 'ar_query'
|
|
2
2
|
|
3
3
|
class AdminAssistant
|
4
4
|
class Index
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
attr_reader :controller_methods
|
6
|
+
|
7
|
+
def initialize(admin_assistant, url_params = {}, controller_methods = {})
|
8
|
+
@admin_assistant, @url_params, @controller_methods =
|
9
|
+
admin_assistant, url_params, controller_methods
|
8
10
|
end
|
9
11
|
|
10
12
|
def belongs_to_sort_column
|
11
|
-
|
12
|
-
|
13
|
+
@admin_assistant.accumulate_belongs_to_columns(column_names).detect { |c|
|
14
|
+
c.name.to_s == sort
|
13
15
|
}
|
14
16
|
end
|
15
17
|
|
18
|
+
def column_names
|
19
|
+
settings.column_names || model_class.columns.map(&:name)
|
20
|
+
end
|
21
|
+
|
16
22
|
def columns
|
17
|
-
|
18
|
-
@admin_assistant.column_name_or_assoc_name(c.name)
|
19
|
-
}
|
20
|
-
@admin_assistant.columns column_names
|
23
|
+
@admin_assistant.accumulate_columns column_names
|
21
24
|
end
|
22
25
|
|
23
|
-
def
|
26
|
+
def conditions_from_settings
|
24
27
|
settings.conditions
|
25
28
|
end
|
26
29
|
|
27
30
|
def find_include
|
31
|
+
fi = settings.include || []
|
28
32
|
if by_assoc = belongs_to_sort_column
|
29
|
-
by_assoc.name
|
33
|
+
fi << by_assoc.name
|
30
34
|
end
|
35
|
+
fi
|
31
36
|
end
|
32
37
|
|
33
38
|
def model_class
|
@@ -53,25 +58,34 @@ class AdminAssistant
|
|
53
58
|
:order => order_sql, :include => find_include,
|
54
59
|
:per_page => 25, :page => @url_params[:page]
|
55
60
|
)
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
if @controller_methods[:conditions_for_index]
|
62
|
+
sql = @controller_methods[:conditions_for_index].call
|
63
|
+
ar_query.condition_sqls << sql if sql
|
64
|
+
elsif conditions_from_settings
|
65
|
+
if conditions_from_settings.respond_to?(:call)
|
66
|
+
conditions_sql = conditions_from_settings.call @url_params
|
67
|
+
else
|
68
|
+
conditions_sql = conditions_from_settings
|
69
|
+
end
|
59
70
|
ar_query.condition_sqls << conditions_sql if conditions_sql
|
60
71
|
end
|
72
|
+
search.add_to_query(ar_query)
|
61
73
|
if settings.total_entries
|
62
|
-
ar_query
|
74
|
+
ar_query.total_entries = settings.total_entries.call
|
63
75
|
end
|
64
|
-
@records = model_class.paginate :all, ar_query
|
76
|
+
@records = model_class.paginate :all, ar_query.to_hash
|
65
77
|
end
|
66
78
|
@records
|
67
79
|
end
|
68
80
|
|
69
81
|
def search
|
70
|
-
@search ||= Search.new(
|
82
|
+
@search ||= AdminAssistant::Search.new(
|
83
|
+
@admin_assistant, @url_params['search']
|
84
|
+
)
|
71
85
|
end
|
72
86
|
|
73
|
-
def
|
74
|
-
|
87
|
+
def search_requested?
|
88
|
+
!@url_params['search'].blank?
|
75
89
|
end
|
76
90
|
|
77
91
|
def settings
|
@@ -79,14 +93,17 @@ class AdminAssistant
|
|
79
93
|
end
|
80
94
|
|
81
95
|
def sort
|
82
|
-
@url_params[:sort]
|
96
|
+
@url_params[:sort] ||
|
97
|
+
(settings.sort_by.to_s if settings.sort_by.is_a?(Symbol))
|
83
98
|
end
|
84
99
|
|
85
100
|
def sort_column
|
86
|
-
if
|
101
|
+
if sort
|
87
102
|
columns.detect { |c|
|
88
|
-
c.name.to_s ==
|
103
|
+
c.name.to_s == sort
|
89
104
|
} || belongs_to_sort_column
|
105
|
+
elsif settings.sort_by.is_a?(Symbol)
|
106
|
+
columns.detect { |c| c.name == settings.sort_by.to_s }
|
90
107
|
end
|
91
108
|
end
|
92
109
|
|
@@ -95,86 +112,89 @@ class AdminAssistant
|
|
95
112
|
end
|
96
113
|
|
97
114
|
def view(action_view)
|
98
|
-
View.new
|
115
|
+
@view ||= View.new(self, action_view, @admin_assistant)
|
99
116
|
end
|
100
117
|
|
101
|
-
class
|
102
|
-
def initialize(
|
103
|
-
@
|
104
|
-
|
118
|
+
class View
|
119
|
+
def initialize(index, action_view, admin_assistant)
|
120
|
+
@index, @action_view, @admin_assistant =
|
121
|
+
index, action_view, admin_assistant
|
105
122
|
end
|
106
123
|
|
107
|
-
def
|
108
|
-
@
|
109
|
-
end
|
110
|
-
|
111
|
-
def add_to_query(ar_query)
|
112
|
-
columns.each do |column|
|
113
|
-
column.add_to_query ar_query
|
114
|
-
end
|
124
|
+
def ajax_toggle_allowed?
|
125
|
+
@admin_assistant.update?
|
115
126
|
end
|
116
127
|
|
117
128
|
def columns
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
default_terms, @admin_assistant.model_class
|
122
|
-
)]
|
123
|
-
else
|
124
|
-
columns = search_field_names.map { |column_name|
|
125
|
-
@admin_assistant.column column_name.to_s
|
129
|
+
unless @columns
|
130
|
+
@columns = @index.columns.map { |c|
|
131
|
+
c.index_view @action_view, @admin_assistant, :index => @index
|
126
132
|
}
|
127
|
-
columns.each do |c|
|
128
|
-
c.search_terms = @search_params[c.name]
|
129
|
-
end
|
130
|
-
columns
|
131
133
|
end
|
134
|
+
@columns
|
132
135
|
end
|
133
136
|
|
134
|
-
def
|
135
|
-
|
136
|
-
opts = {:search => self}
|
137
|
-
if c.respond_to?(:name)
|
138
|
-
opts[:boolean_labels] = settings.boolean_labels[c.name]
|
139
|
-
end
|
140
|
-
c.view(action_view, opts)
|
141
|
-
}
|
142
|
-
end
|
143
|
-
|
144
|
-
def default_terms
|
145
|
-
@search_params if @search_params.is_a?(String)
|
137
|
+
def destroy?
|
138
|
+
@destroy ||= @admin_assistant.destroy?
|
146
139
|
end
|
147
140
|
|
148
|
-
def
|
141
|
+
def edit?
|
142
|
+
@edit ||= @admin_assistant.edit?
|
149
143
|
end
|
150
144
|
|
151
|
-
def
|
152
|
-
if
|
153
|
-
|
145
|
+
def header
|
146
|
+
if block = @index.settings.header
|
147
|
+
block.call @action_view.params
|
154
148
|
else
|
155
|
-
|
149
|
+
@admin_assistant.model_class_name.pluralize.capitalize
|
156
150
|
end
|
157
151
|
end
|
158
|
-
|
159
|
-
def
|
160
|
-
|
152
|
+
|
153
|
+
def right_column?
|
154
|
+
edit? or destroy? or show? or !right_column_lambdas.empty?
|
161
155
|
end
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
@index, @action_view = index, action_view
|
156
|
+
|
157
|
+
def right_column_lambdas
|
158
|
+
@right_column_lambdas ||=
|
159
|
+
@admin_assistant.index_settings.right_column_links
|
167
160
|
end
|
168
161
|
|
169
|
-
def
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
:
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
162
|
+
def right_column_links(record)
|
163
|
+
links = ""
|
164
|
+
if edit?
|
165
|
+
links << @action_view.link_to(
|
166
|
+
'Edit', :action => 'edit', :id => record.id
|
167
|
+
) << " "
|
168
|
+
end
|
169
|
+
if destroy?
|
170
|
+
links << @action_view.link_to_remote(
|
171
|
+
'Delete',
|
172
|
+
:url => {:action => 'destroy', :id => record.id},
|
173
|
+
:confirm => 'Are you sure?',
|
174
|
+
:success =>
|
175
|
+
"Effect.Fade('#{@admin_assistant.model_class.name.underscore}_#{record.id}')",
|
176
|
+
:method => :delete
|
177
|
+
) << ' '
|
178
|
+
end
|
179
|
+
if show?
|
180
|
+
links << @action_view.link_to(
|
181
|
+
'Show', :action => 'show', :id => record.id
|
182
|
+
) << ' '
|
183
|
+
end
|
184
|
+
right_column_lambdas.each do |lambda|
|
185
|
+
link_args = lambda.call record
|
186
|
+
links << @action_view.link_to(*link_args)
|
187
|
+
end
|
188
|
+
if @action_view.respond_to?(:extra_right_column_links_for_index)
|
189
|
+
links << @action_view.extra_right_column_links_for_index(
|
190
|
+
record
|
191
|
+
) || ''
|
192
|
+
end
|
193
|
+
links
|
194
|
+
end
|
195
|
+
|
196
|
+
def show?
|
197
|
+
@show ||= @admin_assistant.show?
|
178
198
|
end
|
179
199
|
end
|
180
200
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class AdminAssistant
|
2
|
+
class PaperclipColumn < Column
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def contains?(column_name)
|
10
|
+
column_name.to_s == @name ||
|
11
|
+
column_name.to_s =~
|
12
|
+
/^#{@name}_(file_name|content_type|file_size|updated_at)$/
|
13
|
+
end
|
14
|
+
|
15
|
+
class View < AdminAssistant::Column::View
|
16
|
+
def image_html(record)
|
17
|
+
@action_view.image_tag record.send(@column.name).url
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class FormView < View
|
22
|
+
include AdminAssistant::Column::FormViewMethods
|
23
|
+
|
24
|
+
def default_html(form)
|
25
|
+
form.file_field name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class IndexView < View
|
30
|
+
include AdminAssistant::Column::IndexViewMethods
|
31
|
+
|
32
|
+
def html(record)
|
33
|
+
image_html record
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ShowView < View
|
38
|
+
include AdminAssistant::Column::ShowViewMethods
|
39
|
+
|
40
|
+
def html(record)
|
41
|
+
image_html record
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
class AdminAssistant
|
2
|
+
class PolymorphicBelongsToColumn < Column
|
3
|
+
def initialize(belongs_to_assoc)
|
4
|
+
@belongs_to_assoc = belongs_to_assoc
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_to_query_condition(ar_query_condition, search)
|
8
|
+
kv = (key_value = search.send(association_foreign_key)) &&
|
9
|
+
!key_value.blank?
|
10
|
+
tv = (type_value = search.send(foreign_type_field)) &&
|
11
|
+
!type_value.blank?
|
12
|
+
if kv and tv
|
13
|
+
ar_query_condition.add_condition do |subcond|
|
14
|
+
subcond.boolean_join = :and
|
15
|
+
subcond.sqls << "#{association_foreign_key} = ?"
|
16
|
+
subcond.bind_vars << key_value
|
17
|
+
subcond.sqls << "#{foreign_type_field} = ?"
|
18
|
+
subcond.bind_vars << type_value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def association_foreign_key
|
24
|
+
@belongs_to_assoc.association_foreign_key
|
25
|
+
end
|
26
|
+
|
27
|
+
def attributes_for_search_object(search_params)
|
28
|
+
atts = {}
|
29
|
+
atts[association_foreign_key.to_sym] =
|
30
|
+
search_params[association_foreign_key]
|
31
|
+
atts[foreign_type_field.to_sym] = search_params[foreign_type_field]
|
32
|
+
if !atts[foreign_type_field.to_sym].blank?
|
33
|
+
atts[name.to_sym] = Module.const_get(
|
34
|
+
search_params[foreign_type_field]
|
35
|
+
).find_by_id(search_params[association_foreign_key])
|
36
|
+
else
|
37
|
+
atts[name.to_sym] = nil
|
38
|
+
end
|
39
|
+
atts
|
40
|
+
end
|
41
|
+
|
42
|
+
def contains?(column_name)
|
43
|
+
column_name.to_s == name
|
44
|
+
end
|
45
|
+
|
46
|
+
def foreign_type_field
|
47
|
+
@belongs_to_assoc.options[:foreign_type]
|
48
|
+
end
|
49
|
+
|
50
|
+
def match_text_fields_in_search
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def name
|
55
|
+
@belongs_to_assoc.name.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
class FormView < AdminAssistant::Column::View
|
59
|
+
include AdminAssistant::Column::FormViewMethods
|
60
|
+
|
61
|
+
def default_html(form)
|
62
|
+
opts_for_select = @polymorphic_types.map { |t| [t.name, t.name] }
|
63
|
+
form.select(name + '_type', opts_for_select, @select_options) + " " +
|
64
|
+
form.text_field(name + '_id', :class => 'integer')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class IndexView < AdminAssistant::Column::View
|
69
|
+
include AdminAssistant::Column::IndexViewMethods
|
70
|
+
|
71
|
+
def value(record)
|
72
|
+
v = record.send name
|
73
|
+
if v
|
74
|
+
target = AssociationTarget.new v.class
|
75
|
+
str = target.name.capitalize
|
76
|
+
fv = target.assoc_value v
|
77
|
+
if fv
|
78
|
+
str << " '#{fv}'"
|
79
|
+
else
|
80
|
+
str << " #{v.id}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class SearchView < AdminAssistant::Column::View
|
87
|
+
include AdminAssistant::Column::SearchViewMethods
|
88
|
+
|
89
|
+
def html(form)
|
90
|
+
@action_view.send(
|
91
|
+
:render,
|
92
|
+
:file => AdminAssistant.template_file('_polymorphic_field_search'),
|
93
|
+
:use_full_path => false,
|
94
|
+
:locals => {
|
95
|
+
:record => @search, :column => @column,
|
96
|
+
:polymorphic_types => @polymorphic_types
|
97
|
+
}
|
98
|
+
)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class AdminAssistant
|
2
|
+
module Request
|
3
|
+
class Autocomplete < Base
|
4
|
+
def associated_class
|
5
|
+
@associated_class ||= Module.const_get(
|
6
|
+
underscored_assoc_class_name.camelize
|
7
|
+
)
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
render_template_file(
|
12
|
+
'autocomplete', :layout => false,
|
13
|
+
:locals => {
|
14
|
+
:records => records, :prefix => underscored_assoc_class_name,
|
15
|
+
:associated_class => associated_class
|
16
|
+
}
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def records
|
21
|
+
action =~ /autocomplete_(.*)/
|
22
|
+
associated_class = Module.const_get $1.camelize
|
23
|
+
target = AssociationTarget.new associated_class
|
24
|
+
field = target.default_name_method
|
25
|
+
associated_class.find(
|
26
|
+
:all,
|
27
|
+
:conditions => [
|
28
|
+
"LOWER(#{field}) like ?",
|
29
|
+
"%#{search_string.downcase unless search_string.nil?}%"
|
30
|
+
],
|
31
|
+
:limit => 10, :order => "length(#{field}), lower(#{field})"
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def search_string
|
36
|
+
@controller.params[
|
37
|
+
"#{underscored_assoc_class_name}_autocomplete_input"
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
def underscored_assoc_class_name
|
42
|
+
action =~ /autocomplete_(.*)/
|
43
|
+
$1
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|