OSDN Git Service

change editor
[pettanr/pettanr.git] / app / assets / javascripts / locmare / form.js.coffee
1 # form_name_with_sub_form\r
2 # item: editing item\r
3 # mounted: true/false\r
4 # submit: string / 'submit'\r
5 # operators: \r
6 class Locmare.FormBase extends Backbone.View\r
7   tagName: 'form'\r
8   \r
9   initialize: (options) ->\r
10     @form_name = options.form_name #_with_sub_form\r
11     @use_name = options.use_name || 'default'\r
12     @item = options.item\r
13     @element_form = options.element_form\r
14     @submit = options.submit\r
15     @operators = options.operators\r
16     if /\./.test(@form_name)\r
17       @sub_form_names = @form_name.split('.')\r
18       @form_name = @sub_form_names.pop()\r
19       @root_form_name = @sub_form_names.shift()\r
20     else\r
21       @sub_form_names = []\r
22       #@form_name = @form_name\r
23       @root_form_name = @form_name\r
24     @manifest = LocalManifest.manifest().forms[@form_name].uses[@use_name]\r
25     @fields = {}\r
26     @on('change:field', @change)\r
27   \r
28   change: (field) ->\r
29     console.log(field.field_name)\r
30   \r
31   fold_extend_settings: (params) ->\r
32     @item.my_class().fold_extend_settings params[@item.item_name()]\r
33   \r
34   sub_form_name: () ->\r
35     r = _.map @sub_form_names, (name) ->\r
36       '[' + name + '_attributes' + ']'\r
37     r.join()\r
38   \r
39   form_field_name: (field_name) ->\r
40     @root_form_name + @sub_form_name() + '[' + field_name + ']'\r
41   \r
42   image_dir: () ->\r
43     '/images/'\r
44   \r
45   quit: () ->\r
46     null\r
47   \r
48 class Locmare.Form extends Locmare.FormBase\r
49   \r
50   @factory: (options) ->\r
51     custom_form = Pettanr.Views[Pettanr.camelize(options.item.model_name())].Form\r
52     if custom_form\r
53       new custom_form(options)\r
54     else\r
55       new Locmare.Form(options)\r
56   \r
57   initialize: (options) ->\r
58     super(options)\r
59     @submit = options.submit\r
60     @child_forms = {}\r
61     @item.boosts 'post'\r
62     @init_fields()\r
63   \r
64   render: () ->\r
65     if @item.isNew()\r
66       method_type = 'post'\r
67       action_url = @item.create_url()\r
68     else\r
69       method_type = 'put'\r
70       action_url = @item.edit_url()\r
71     @attr = {\r
72       method: method_type,\r
73       action: action_url\r
74     }\r
75     this.$el.attr(@attr)\r
76     this.$el.html('')\r
77     @error_explanation = null\r
78     @div_fields = new Locmare.FormModule.Fields({\r
79       parent: this, fields: @fields\r
80     })\r
81     #this.$el.append(@error_explanation.render().el) if not @error_explanation\r
82     this.$el.append(@div_fields.render().el)\r
83     if @element_form\r
84       _.each @item.my_class().child_models(), (element_model) =>\r
85         items = @item.element_items(element_model)\r
86         if @item.my_class().my_manifest().associations.is_has_one(element_model)\r
87           @add_element(items)\r
88         else\r
89           _.each items, (item) =>\r
90             @add_element(item)\r
91     if @submit\r
92       c = @submit_class()\r
93       @div_submit = new c({form: this})\r
94       this.$el.append(@div_submit.render().el)\r
95       @delegateEvents({'submit': method_type})\r
96     this\r
97   \r
98   refresh: () ->\r
99     _.each @fields, (field) =>\r
100       field.refresh()\r
101     _.each @child_forms, (child_form, name) =>\r
102       child_form.refresh()\r
103   \r
104   add_element: (element) ->\r
105     form = Locmare.Form.factory({\r
106       form_name: element.item_name(), \r
107       use_name: @use_name,\r
108       item: element, \r
109       element_form: @element_form, \r
110       submit: null, \r
111       operators: @operators,\r
112     })\r
113     this.$el.append(form.render().el)\r
114     mm = @item.my_class().my_manifest()\r
115     em = element.my_class().my_manifest()\r
116     if mm.associations.is_has_one(em)\r
117       @child_forms[element.item_name()] = form\r
118     else\r
119       @child_forms[element.table_name()] ||= []\r
120       @child_forms[element.table_name()].push(form)\r
121     form\r
122   \r
123   init_fields: () ->\r
124     _.each @manifest.field_names, (field_name) =>\r
125       field_manifest = @manifest.fields[field_name]\r
126       boost_name = @item.my_class().find_boost_name(field_name)\r
127       extend_model = if boost_name \r
128         @item.boosters[boost_name].extend_model()\r
129       else\r
130         null\r
131       if boost_name and extend_model # field is extend setting AND template has a extend model\r
132         extend_form_name = @item.boosters[boost_name].item_name()\r
133         extend_item = @item.boosters[boost_name].extend_item()\r
134         @fields[field_name] = new Locmare.ExtendForm({\r
135           parent: this, \r
136           form_name: extend_form_name, \r
137           use_name: @use_name,\r
138           item: extend_item, \r
139           mounted: @mounted, \r
140           operators: @operators, \r
141           field_name: field_name\r
142         })\r
143       else\r
144         @fields[field_name] = new Locmare.FormModule.Field({\r
145           form: this, \r
146           field_name: field_name, \r
147           field_manifest: field_manifest\r
148         })\r
149   \r
150   submits: () ->\r
151     {\r
152       default: Locmare.FormModule.SubmitModule.Default\r
153     }\r
154   \r
155   submit_class: () ->\r
156     @submits()[@submit]\r
157   \r
158   post: () ->\r
159     _.each @fields, (field) =>\r
160       field.fold() if field.is_extend()\r
161       @item.set(field.field_name, field.val())\r
162     @item.unset('id')  # isNew use flag that id attr set\r
163     @trigger('http_post', @item.create_url(), this)\r
164     return false\r
165   \r
166   put: () ->\r
167     _.each @fields, (field) =>\r
168       field.fold() if field.is_extend()\r
169       @item.set(field.field_name, field.val())\r
170     @trigger('http_post', @item.update_url(), this)\r
171     return false\r
172   \r
173   save: () ->\r
174     @listenTo(@item, 'save:success', @success)\r
175     @listenTo(@item, 'save:fail', @fail)\r
176     @item.save()\r
177   \r
178   success: (model, response) ->\r
179     if !Pettanr.cache.restore(@item.cache_key())\r
180       # entry item if item is new\r
181       Pettanr.cache.store(@item)\r
182     @trigger('success', model, response)\r
183   \r
184   fail: (model, response) ->\r
185     @trigger('fail', response)\r
186   \r
187   save_data: () ->\r
188     @item.my_class().child_models()\r
189     attrs = {}\r
190     _.each @fields, (field) =>\r
191       attrs[field.field_name] = @item.get(field.field_name)\r
192     _.each @child_forms, (child_form, name) =>\r
193       mm = @item.my_class().my_manifest()\r
194       em = child_form.item.my_class().my_manifest()\r
195       if mm.associations.is_has_one(em)\r
196         attrs[name + '_attributes'] = child_form.save_data()\r
197       else\r
198         attrs[name + '_attributes'] = []\r
199         _.each child_form, (form) =>\r
200           attrs[name + '_attributes'].push(form.save_data())\r
201     attrs\r
202   \r
203 class Locmare.ExtendForm extends Locmare.FormBase\r
204   tagName: 'div'\r
205   className: 'fields'\r
206   \r
207   initialize: (options) ->\r
208     @parent = options.parent\r
209     @field_name = options.field_name\r
210     super(options)\r
211     @listenTo(@item, 'input', @input)\r
212     @field = new Locmare.FormModule.Field({\r
213       form: @parent, \r
214       field_name: @field_name, \r
215       field_manifest: @parent.manifest.fields[@field_name]\r
216     })\r
217     @label = @field.label\r
218     @init_fields()\r
219   \r
220   render: () ->\r
221     this.$el.html('')\r
222     this.$el.append(@label.render().el) if not @label.hidden()\r
223     @div_fields = new Locmare.FormModule.Fields({\r
224       fields: @fields\r
225     })\r
226     this.$el.append(@div_fields.render().el)\r
227     this\r
228   \r
229   refresh: () ->\r
230     @field.refresh()\r
231   \r
232   input: (field) ->\r
233     a = {}\r
234     a[@field_name] = @val()\r
235     @parent.item.set(a, {silent: true})\r
236     @parent.item.trigger('input:' + @field_name + ':' + field)\r
237     @parent.item.trigger('input:' + @field_name)\r
238     @parent.item.trigger('input')\r
239   \r
240   fold: () ->\r
241     _.each @fields, (field) =>\r
242       @item.set(field.field_name, field.val())\r
243   \r
244   val: () ->\r
245     JSON.stringify(@item.attributes)\r
246   \r
247   init_fields: () ->\r
248     _.each @manifest.field_names, (field_name) =>\r
249       field_manifest = @manifest.fields[field_name]\r
250       @fields[field_name] = new Locmare.FormModule.ExtendField({\r
251         form: this, \r
252         field_name: field_name, \r
253         field_manifest: field_manifest\r
254       })\r
255   \r
256   form_field_name: (extend_field_name) ->\r
257     # parent is field\r
258     @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'\r
259   \r
260   is_extend: () ->\r
261     true\r
262   \r
263 class Locmare.FormModule\r
264 class Locmare.FormModule.Fields extends Backbone.View\r
265   tagName: 'div'\r
266   className: 'fields'\r
267   \r
268   initialize: (options) ->\r
269     @parent = options.parent\r
270     @fields = options.fields\r
271   \r
272   render: () ->\r
273     this.$el.html('')\r
274     _.each @fields, (field) =>\r
275       this.$el.append(field.render().el)\r
276       this.$el.append(field.rb.render().el) if field.rb\r
277     this\r
278   \r
279 class Locmare.FormModule.SubmitModule\r
280 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
281   tagName: 'div'\r
282   className: 'actions'\r
283   \r
284   initialize: (options) ->\r
285     @form = options.form\r
286   \r
287   render: () ->\r
288     caption = I18n.t(@submit_name())\r
289     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
290     this\r
291   \r
292   submit_name: () ->\r
293     if @form.item.isNew()\r
294       @form.item.table_name() + '.submit.new'\r
295     else\r
296       @form.item.table_name() + '.submit.edit'\r
297   \r