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
@@ -5,6 +5,14 @@ class AdminAssistant
|
|
5
5
|
def initialize(admin_assistant)
|
6
6
|
@admin_assistant = admin_assistant
|
7
7
|
end
|
8
|
+
|
9
|
+
def [](column_name)
|
10
|
+
ColumnConfigLookup.new(
|
11
|
+
column_name,
|
12
|
+
[@admin_assistant.base_settings, form, index, show, index.search],
|
13
|
+
@admin_assistant
|
14
|
+
)
|
15
|
+
end
|
8
16
|
|
9
17
|
def actions(*a)
|
10
18
|
if a.empty?
|
@@ -14,28 +22,114 @@ class AdminAssistant
|
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
17
|
-
def
|
18
|
-
@admin_assistant.
|
19
|
-
end
|
20
|
-
|
21
|
-
def label(column, label)
|
22
|
-
@admin_assistant.custom_column_labels[column.to_s] = label
|
25
|
+
def destroy(&block)
|
26
|
+
@admin_assistant.custom_destroy = block
|
23
27
|
end
|
24
28
|
|
25
29
|
def form
|
26
|
-
|
30
|
+
f = @admin_assistant.form_settings
|
31
|
+
block_given? ? yield(f) : f
|
27
32
|
end
|
28
33
|
|
29
34
|
def index
|
30
|
-
|
35
|
+
i = @admin_assistant.index_settings
|
36
|
+
block_given? ? yield(i) : i
|
37
|
+
end
|
38
|
+
|
39
|
+
def model_class_name=(mcn)
|
40
|
+
@admin_assistant.model_class_name = mcn
|
41
|
+
end
|
42
|
+
|
43
|
+
def show
|
44
|
+
s = @admin_assistant.show_settings
|
45
|
+
block_given? ? yield(s) : s
|
46
|
+
end
|
47
|
+
|
48
|
+
class ColumnConfigLookup
|
49
|
+
def initialize(column_name, settingses, admin_assistant)
|
50
|
+
@column_name, @settingses, @admin_assistant =
|
51
|
+
column_name, settingses, admin_assistant
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing(meth, *args)
|
55
|
+
match = meth
|
56
|
+
if match.to_s =~ /^(.*)=$/
|
57
|
+
match = $1.to_sym
|
58
|
+
elsif match.to_s =~ /^(.*)\?$/
|
59
|
+
match = $1.to_sym
|
60
|
+
end
|
61
|
+
setting = @settingses.detect { |setting|
|
62
|
+
setting.column_config_args.keys.include?(match)
|
63
|
+
}
|
64
|
+
if setting
|
65
|
+
setting[@column_name].send(meth, *args)
|
66
|
+
else
|
67
|
+
super
|
68
|
+
end
|
69
|
+
end
|
31
70
|
end
|
32
71
|
end
|
33
72
|
|
34
|
-
class
|
73
|
+
class ColumnConfig
|
74
|
+
def initialize(fields_config)
|
75
|
+
@fields_config = fields_config
|
76
|
+
@values = {}
|
77
|
+
end
|
78
|
+
|
79
|
+
def method_missing_matching_fields_config(meth, block, *args)
|
80
|
+
field_type = @fields_config[meth]
|
81
|
+
if field_type == :accessor
|
82
|
+
@values[meth]
|
83
|
+
elsif field_type == :boolean
|
84
|
+
@values[meth] = true
|
85
|
+
elsif field_type == :block
|
86
|
+
if block
|
87
|
+
@values[meth] = block
|
88
|
+
else
|
89
|
+
@values[meth]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_field_from_method(meth, target_field_type, &block)
|
95
|
+
@fields_config.detect { |fn, ft|
|
96
|
+
meth.to_s =~ block.call(fn) && ft == target_field_type
|
97
|
+
}.first
|
98
|
+
end
|
99
|
+
|
100
|
+
def method_missing_maybe_setter(meth, *args)
|
101
|
+
field_name = find_field_from_method(meth, :accessor) { |fn| /^#{fn}=$/ }
|
102
|
+
@values[field_name] = args.first if field_name
|
103
|
+
end
|
104
|
+
|
105
|
+
def method_missing(meth, *args, &block)
|
106
|
+
if @fields_config[meth]
|
107
|
+
return method_missing_matching_fields_config(meth, block, *args)
|
108
|
+
elsif meth.to_s =~ /=$/
|
109
|
+
result = method_missing_maybe_setter(meth, *args)
|
110
|
+
return result unless result.nil?
|
111
|
+
elsif meth.to_s =~ /\?$/
|
112
|
+
field_name = find_field_from_method(meth, :boolean) { |fn|
|
113
|
+
/^#{fn}\?$/
|
114
|
+
}
|
115
|
+
return !@values[field_name].nil? if field_name
|
116
|
+
end
|
117
|
+
super
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class AbstractSettings
|
35
122
|
attr_reader :column_names
|
36
123
|
|
37
124
|
def initialize(admin_assistant)
|
38
125
|
@admin_assistant = admin_assistant
|
126
|
+
@column_configs = HashWithIndifferentAccess.new { |h, k|
|
127
|
+
h[k] = ColumnConfig.new(column_config_args)
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
def [](column_name)
|
132
|
+
@column_configs[column_name]
|
39
133
|
end
|
40
134
|
|
41
135
|
def columns(*args)
|
@@ -43,62 +137,155 @@ class AdminAssistant
|
|
43
137
|
end
|
44
138
|
end
|
45
139
|
|
46
|
-
class
|
47
|
-
|
140
|
+
class BaseSettings < AbstractSettings
|
141
|
+
def all_polymorphic_types
|
142
|
+
@column_configs.values.map(&:polymorphic_types).flatten.compact
|
143
|
+
end
|
144
|
+
|
145
|
+
def column_config_args
|
146
|
+
{:boolean_labels => :accessor, :label => :accessor,
|
147
|
+
:polymorphic_types => :accessor}
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class FormSettings < AbstractSettings
|
152
|
+
attr_reader :submit_buttons
|
48
153
|
|
49
154
|
def initialize(admin_assistant)
|
50
155
|
super
|
51
|
-
@inputs = {}
|
52
156
|
@submit_buttons = []
|
53
|
-
@read_only = []
|
54
157
|
end
|
55
158
|
|
56
|
-
def
|
159
|
+
def column_config_args
|
160
|
+
{:clear_link => :accessor, :datetime_select_options => :accessor,
|
161
|
+
:date_select_options => :accessor, :default => :block,
|
162
|
+
:description => :accessor, :exclude_blank => :boolean,
|
163
|
+
:image_size => :accessor, :input => :accessor,
|
164
|
+
:read_only => :boolean, :select_options => :accessor,
|
165
|
+
:text_area_options => :accessor, :write_once => :boolean
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
def columns_for_edit(*args)
|
170
|
+
if args.empty?
|
171
|
+
@columns_for_edit || column_names
|
172
|
+
else
|
173
|
+
@columns_for_edit = args
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def columns_for_new(*args)
|
57
178
|
if args.empty?
|
58
|
-
@
|
179
|
+
@columns_for_new || column_names
|
59
180
|
else
|
60
|
-
|
181
|
+
@columns_for_new = args
|
61
182
|
end
|
62
183
|
end
|
184
|
+
|
185
|
+
def column_names
|
186
|
+
@column_names || @admin_assistant.default_column_names
|
187
|
+
end
|
63
188
|
end
|
64
189
|
|
65
|
-
class IndexSettings <
|
66
|
-
attr_reader :actions, :
|
67
|
-
attr_accessor :total_entries
|
190
|
+
class IndexSettings < AbstractSettings
|
191
|
+
attr_reader :actions, :right_column_links, :search_settings, :sort_by
|
68
192
|
|
69
193
|
def initialize(admin_assistant)
|
70
194
|
super
|
71
|
-
@actions =
|
72
|
-
@
|
73
|
-
@boolean_labels = {}
|
74
|
-
@link_to_args = {}
|
195
|
+
@actions = ActiveSupport::OrderedHash.new
|
196
|
+
@right_column_links = []
|
75
197
|
@search_fields = []
|
198
|
+
@search_settings = SearchSettings.new @admin_assistant
|
199
|
+
@sort_by = "#{admin_assistant.model_class.table_name}.id desc"
|
76
200
|
end
|
77
201
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
202
|
+
def column_config_args
|
203
|
+
{:image_size => :accessor, :link_to_args => :block,
|
204
|
+
:sort_by => :accessor}
|
205
|
+
end
|
206
|
+
|
207
|
+
def conditions(str = nil, &block)
|
208
|
+
if str.nil? && block.nil?
|
209
|
+
@conditions
|
210
|
+
elsif str
|
211
|
+
@conditions = str
|
212
|
+
elsif block
|
213
|
+
@conditions = block
|
85
214
|
end
|
86
215
|
end
|
87
216
|
|
88
|
-
def
|
89
|
-
block ? (@
|
217
|
+
def header(&block)
|
218
|
+
block ? (@header = block) : @header
|
90
219
|
end
|
91
220
|
|
92
|
-
def
|
93
|
-
|
221
|
+
def include(*associations)
|
222
|
+
if associations.empty?
|
223
|
+
@include
|
224
|
+
else
|
225
|
+
@include = associations
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def search(*columns)
|
230
|
+
if block_given?
|
231
|
+
yield @search_settings
|
232
|
+
elsif columns.empty?
|
233
|
+
@search_settings
|
234
|
+
else
|
235
|
+
@search_settings.columns *columns
|
236
|
+
end
|
94
237
|
end
|
95
238
|
|
96
239
|
def sort_by(*sb)
|
97
240
|
if sb.empty?
|
98
241
|
@sort_by
|
99
242
|
else
|
100
|
-
@sort_by = sb
|
243
|
+
@sort_by = sb.first
|
101
244
|
end
|
102
245
|
end
|
246
|
+
|
247
|
+
def total_entries(&block)
|
248
|
+
block ? (@total_entries = block) : @total_entries
|
249
|
+
end
|
250
|
+
|
251
|
+
class SearchSettings < AbstractSettings
|
252
|
+
attr_reader :column_names
|
253
|
+
|
254
|
+
def initialize(admin_assistant)
|
255
|
+
super
|
256
|
+
@column_names = []
|
257
|
+
@default_search_includes = []
|
258
|
+
end
|
259
|
+
|
260
|
+
def column_config_args
|
261
|
+
{:blank_checkbox => :accessor, :comparators => :accessor,
|
262
|
+
:conditions => :block, :field_type => :accessor,
|
263
|
+
:match_text_fields_for_association => :boolean}
|
264
|
+
end
|
265
|
+
|
266
|
+
def columns(*c)
|
267
|
+
@column_names = c
|
268
|
+
end
|
269
|
+
|
270
|
+
def default_search_includes(*includes)
|
271
|
+
if includes.empty?
|
272
|
+
@default_search_includes
|
273
|
+
else
|
274
|
+
@default_search_includes = includes
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
class ShowSettings < AbstractSettings
|
281
|
+
attr_reader :model_class_name_block
|
282
|
+
|
283
|
+
def column_config_args
|
284
|
+
{}
|
285
|
+
end
|
286
|
+
|
287
|
+
def model_class_name(&block)
|
288
|
+
@model_class_name_block = block
|
289
|
+
end
|
103
290
|
end
|
104
291
|
end
|