OSDN Git Service

add manifest
[pettanr/pettanr.git] / lib / manifest.rb
1
2 module Pettanr
3   class Manifest
4     class ModelConf
5       def initialize manifest
6         @conf = conf || {}
7       end
8       
9       def type
10         @conf['type'] || 'default'
11       end
12       
13       def name
14         @conf['name'] || 'edit_template'
15       end
16       
17     end
18     
19     def initialize manifest
20       @manifest = manifest || {}
21     end
22     
23     def models
24     end
25     
26     def profiles
27     end
28     
29   end
30   
31   manifest = Manifest.new JSON.parse(
32     open(Rails.root + 'public/manifest.json').read
33   )
34   
35   module Cross
36     class ModelConf
37       def initialize manifest
38         @conf = conf || {}
39       end
40       
41       def type
42         @conf['type'] || 'default'
43       end
44       
45       def name
46         @conf['name'] || 'edit_template'
47       end
48       
49     end
50     
51     class Profiler
52       class Item
53         def initialize item, attribute_name, attribute_conf
54           @attribute_conf = attribute_conf || {}
55         end
56         
57         def label
58           label = item.class.human_attribute_name(field_name)
59         end
60         
61         def value
62           case field_conf['type']
63           when 'datetime'
64             if item.attributes[field_name]
65               l item.attributes[field_name]
66             else
67               item.attributes[field_name]
68             end
69           else
70             item.attributes[field_name]
71           end
72         end
73         
74         def note
75           if field_conf['source']
76             case field_conf['source']['type']
77             when 'magic_number'
78               t_selected_item(field_conf['source']['key'], item.attributes[field_name])
79             when 'model'
80             else
81             end
82           end
83         end
84         
85       end
86       
87       def initialize item, roles, cross
88         item_name = item.class.to_s.underscore
89         profiler_conf = ProfilerConf.new cross['profiles'][item_name]
90         edit_conf = EditConf.new conf['edit']
91       end
92       
93       def header
94         ender 'system/filer.html', :items => [item], :model => item.class, :roles => roles, :pager => nil 
95       end
96       
97       def each_column
98         profiler_conf['fields'].each do |field_name|
99           yield label, value, note
100         end
101       end
102       
103       def each_belongs_to
104         profiler_conf['fields'].each do |field_name|
105           yield label, value, note
106         end
107       end
108       
109       def each_has_many
110         profiler_conf['fields'].each do |field_name|
111           yield label, value, note
112         end
113       end
114       
115       def each_has_one
116         profiler_conf['fields'].each do |field_name|
117           yield label, value, note
118         end
119       end
120       
121     end
122     
123     class Filer
124       class EditConf
125         def initialize conf
126           @conf = conf || {}
127         end
128         
129         def type
130           @conf['type'] || 'default'
131         end
132         
133         def name
134           @conf['name'] || 'edit_template'
135         end
136         
137       end
138       
139       class Symbol 
140         def initialize symbol_conf
141           @symbol_conf = symbol_conf || {}
142           @link_conf = @symbol_conf['link'] || {'type' => 'action', 'name' => 'show'}
143           @type_conf = @symbol_conf['type'] || 'image'
144           @link_method = self.link_method
145           @tag_method = self.tag_method
146         end
147         
148         def link_method
149           case @link_conf['type']
150           when 'action'
151             case @link_conf['name']
152             when 'show'
153               :link_action_show
154             else
155               :link_action_else
156             end
157           when 'none'
158             :link_none
159           when 'url_column'
160             :link_url_column
161           else
162             :link_else
163           end
164         end
165         
166         def tag_method
167           tag = case @type_conf
168           when 'image'
169             :tag_image
170           when 'picture'
171             :tag_picture
172           when 'template'
173             :tag_template
174           else
175             :tag_else
176           end
177         end
178         
179         def link_action_show view, item
180           view.polymorphic_path(item)
181         end
182         
183         def link_action_else view, item
184           view.polymorphic_path(item, :action => @link_conf['name'])
185         end
186         
187         def link_none view, item
188           ''
189         end
190         
191         def link_url_column view, item
192           item.__send__(@link_conf['name']).to_s
193         end
194         
195         def link_else view, item
196           ''
197         end
198         
199         def tag_image view, item
200           view.tag(:img, :src => @symbol_conf['name'], :width => 64, :height => 64)
201         end
202         
203         def tag_picture view, item
204           view.tag(:img, item.__send__(@symbol_conf['name']))
205         end
206         
207         def tag_template view, item
208           view.render item.path_name + '/' + @symbol_conf['name'], :item => item
209           nil
210         end
211         
212         def tag_else view, item
213           'no.png'
214         end
215         
216         def render view, item
217           link = self.__send__(@link_method, view, item)
218           tag = self.__send__(@tag_method, view, item)
219           unless tag.blank?
220             link_to_unless link.blank?, tag, link
221           end
222         end
223         
224         
225       end
226       
227       class Caption
228         def initialize caption_conf
229           @caption_conf = caption_conf || {}
230           @link_conf = @symbol_conf['link'] || {'type' => 'action', 'name' => 'show'}
231           @type_conf = @symbol_conf['type'] || 'column'
232           @link_method = self.link_method
233           @tag_method = self.tag_method
234         end
235         
236         def link_method
237           case @link_conf['type']
238           when 'action'
239             case @link_conf['name']
240             when 'show'
241               :link_action_show
242             else
243               :link_action_else
244             end
245           when 'none'
246             :link_none
247           when 'url_column'
248             :link_url_column
249           else
250             :link_else
251           end
252         end
253         
254         def tag_method
255           tag = case @type_conf
256           when 'column'
257             :tag_column
258           when 'method'
259             :tag_method
260           else
261             :tag_else
262           end
263         end
264         
265         def link_action_show view, item
266           view.polymorphic_path(item)
267         end
268         
269         def link_action_else view, item
270           view.polymorphic_path(item, :action => @link_conf['name'])
271         end
272         
273         def link_none view, item
274           ''
275         end
276         
277         def link_url_column view, item
278           item.__send__(@link_conf['name']).to_s
279         end
280         
281         def link_else view, item
282           ''
283         end
284         
285         def tag_column view, item
286           item.attributes[caption['name']]
287         end
288         
289         def tag_method view, item
290           item.__send__(caption['name']).to_s
291         end
292         
293         def tag_else view, item
294           'no caption'
295         end
296         
297         def render view, item
298           unless caption_type == 'none'
299             link = self.__send__(@link_method, view, item)
300             tag = self.__send__(@tag_method, view, item)
301             tag = 'no caption' if tag.blank? 
302             unless tag.blank?
303               link_to_unless link.blank?, tag, link
304             end
305           end
306         end
307         
308       end
309       
310       class Summary
311         def initialize summary_conf
312           @summary_conf = summary_conf || {}
313           @type_conf = @summary_conf['type'] || 'none'
314           @type_method = self.type_method
315         end
316         
317         def type_method
318           case @type_conf
319           when 'none'
320             :type_none
321           when 'template'
322             :type_template
323           else
324             :type_none
325           end
326         end
327         
328         def type_none view, item
329           ''
330         end
331         
332         def type_template view, item
333           view.render item.path_name + '/' + @summary_conf['name'], :item => item
334         end
335         
336         def render view, item
337           self.__send__(@type_method, view, item)
338         end
339         
340       end
341       
342       class Icon
343         def initialize icon_conf
344           @icon_conf = icon_conf || {}
345         end
346         
347         def render view, item
348           view.link_to view.icon_tag(item.class.to_s, :object => item, :size => 64), 
349             view.polymorphic_path(item, :format => :prof)
350         end
351         
352       end
353       
354       class Date
355         def initialize date_conf
356           @date_conf = date_conf || {}
357         
358         def render view, item
359           view.distance_of_time_in_words_to_now item.updated_at
360         end
361         
362       end
363       
364       class Edit
365         def initialize edit_conf
366           @edit_conf = edit_conf || {}
367           @type_conf = @edit_conf['type'] || 'default'
368           @type_method = self.type_method
369         end
370         
371         def type_method
372           case @type_conf
373           when 'default'
374             :type_default
375           when 'account'
376             :type_account
377           when 'template'
378             :type_template
379           when 'none'
380             :type_none
381           else
382             :type_none
383           end
384         end
385         
386         def type_default view, item
387           if item.own? roles
388             view.link_to tag(:img, :src => view.asset_path('edit.png'), :width => 32, :height => 32), 
389               view.polymorphic_path(item, :action => :edit)
390             view.link_to tag(:img, :src => view.asset_path('remove.png'), :width => 32, :height => 32), 
391               item, confirm: 'Are you sure?', :method => :delete
392           end
393         end
394         
395         def type_account view, item
396           if item.own? roles
397             view.link_to tag(:img, :src => view.asset_path('edit.png'), :width => 32, :height => 32), 
398               '/home/configure'
399           end
400         end
401         
402         def type_template view, item
403           view.render item.path_name + '/' + @edit_conf['name'], :item => item
404         end
405         
406         def type_none view, item
407           ''
408         end
409         
410         def render view, item
411           self.__send__(@type_method, view, item)
412         end
413         
414       end
415       
416       class FileItem
417         def initialize item, symbol, caption, summary, icon, date, edit
418           edit_conf = EditConf.new conf['edit']
419           @item = item
420           @symbol = symbol
421           @caption = caption
422           @summary = summary
423           @icon = icon
424           @date = date
425           @edit = edit
426         end
427         
428         def symbol view
429           @symbol.render view, item
430         end
431         
432         def caption view
433           @caption.render view, item
434         end
435         
436         def summary view
437           @summary.render view, item
438         end
439         
440         def icon view
441           @icon.render view, item
442         end
443         
444         def date view
445           @date.render view, item
446         end
447         
448         def edit view
449           @edit.render view, item
450         end
451       
452       end
453       
454       def initialize model, cross
455         @model = model
456         @filer_conf = cross['filers'][@model.item_name] || {}
457         @symbol = Symbol.new @filer_conf['symbol']
458         @caption = Caption.new @filer_conf['caption']
459         @summary = Summary.new @filer_conf['summary']
460         @icon = Icon.new @filer_conf['icon']
461         @date = Date.new @filer_conf['date']
462         @edit = Edit.new @filer_conf['edit']
463       end
464       
465       def list page, page_size
466         @page = @model.page_number params[:page]
467         @page_size = @model.page_size params[:page_size]
468         list_method = 'list' || configurations['models'][@model.to_s.underscore]['select']['method']
469         @items = @model.__send__(list_method, @page, @page_size).map {|item| 
470           FileItem.new item, @symbol, @caption, @summary, @icon, @date, @edit
471         }
472       end
473       
474       def symbol_action_show item, view
475         view.polymorphic_path(item)
476       end
477       
478       def symbol_action_name item, view
479         view.polymorphic_path(item, :action => link['name'])
480       end
481       
482     end
483   end
484 end
485