admin_assistant 0.0.1 → 1.0.0
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.
- 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
|