OSDN Git Service

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