OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[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     @attr = {\r
66       method: @method_type(),\r
67       action: @action_url()\r
68     }\r
69     this.$el.attr(@attr)\r
70     this.$el.html('')\r
71     @error_explanation = null\r
72     @div_fields = new Locmare.FormModule.Fields({\r
73       parent: this, fields: @fields\r
74     })\r
75     #this.$el.append(@error_explanation.render().el) if not @error_explanation\r
76     this.$el.append(@div_fields.render().el)\r
77     if @element_form\r
78       _.each @item.my_class().child_models(), (element_model) =>\r
79         items = @item.element_items(element_model)\r
80         if @item.my_class().my_manifest().associations.is_has_one(element_model)\r
81           @add_element(items)\r
82         else\r
83           _.each items, (item) =>\r
84             @add_element(item)\r
85     if @submit\r
86       c = @submit_class()\r
87       @div_submit = new c({form: this})\r
88       this.$el.append(@div_submit.render().el)\r
89       @delegateEvents({'submit': @method_type()})\r
90     this\r
91   \r
92   refresh: () ->\r
93     _.each @fields, (field) =>\r
94       field.refresh()\r
95     _.each @child_forms, (child_form, name) =>\r
96       child_form.refresh()\r
97   \r
98   method_type: () ->\r
99     if @item.isNew()\r
100       'post'\r
101     else\r
102       'put'\r
103   \r
104   action_url: () ->\r
105     return null if !@submit    # element has not create actions\r
106     if @item.isNew()\r
107       @item.create_url()\r
108     else\r
109       @item.edit_url()\r
110   \r
111   add_element: (element) ->\r
112     form = Locmare.Form.factory({\r
113       form_name: element.item_name(), \r
114       use_name: @use_name,\r
115       item: element, \r
116       element_form: @element_form, \r
117       submit: null, \r
118       operators: @operators,\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     if mm.associations.is_has_one(em)\r
124       @child_forms[element.item_name()] = form\r
125     else\r
126       @child_forms[element.table_name()] ||= []\r
127       @child_forms[element.table_name()].push(form)\r
128     form\r
129   \r
130   init_fields: () ->\r
131     _.each @manifest.field_names, (field_name) =>\r
132       field_manifest = @manifest.fields[field_name]\r
133       boost_name = @item.my_class().find_boost_name(field_name)\r
134       extend_model = if boost_name \r
135         @item.boosters[boost_name].extend_model()\r
136       else\r
137         null\r
138       if boost_name and extend_model # field is extend setting AND template has a extend model\r
139         extend_form_name = @item.boosters[boost_name].item_name()\r
140         extend_item = @item.boosters[boost_name].extend_item()\r
141         @fields[field_name] = new Locmare.ExtendForm({\r
142           parent: this, \r
143           form_name: extend_form_name, \r
144           use_name: @use_name,\r
145           item: extend_item, \r
146           mounted: @mounted, \r
147           operators: @operators, \r
148           field_name: field_name\r
149         })\r
150       else\r
151         @fields[field_name] = new Locmare.FormModule.Field({\r
152           form: this, \r
153           field_name: field_name, \r
154           field_manifest: field_manifest\r
155         })\r
156   \r
157   submits: () ->\r
158     {\r
159       default: Locmare.FormModule.SubmitModule.Default\r
160     }\r
161   \r
162   submit_class: () ->\r
163     @submits()[@submit]\r
164   \r
165   post: () ->\r
166     _.each @fields, (field) =>\r
167       field.fold() if field.is_extend()\r
168       @item.set(field.field_name, field.val())\r
169     @item.unset('id')  # isNew use flag that id attr set\r
170     @trigger('http_post', @item.create_url(), this)\r
171     return false\r
172   \r
173   put: () ->\r
174     _.each @fields, (field) =>\r
175       field.fold() if field.is_extend()\r
176       @item.set(field.field_name, field.val())\r
177     @trigger('http_post', @item.update_url(), this)\r
178     return false\r
179   \r
180   save: () ->\r
181     @listenTo(@item, 'save:success', @success)\r
182     @listenTo(@item, 'save:fail', @fail)\r
183     @item.save()\r
184   \r
185   success: (model, response) ->\r
186     if !Pettanr.cache.restore(@item.cache_key())\r
187       # entry item if item is new\r
188       Pettanr.cache.store(@item)\r
189     @trigger('success', model, response)\r
190   \r
191   fail: (model, response) ->\r
192     @trigger('fail', response)\r
193   \r
194   save_data: () ->\r
195     @item.my_class().child_models()\r
196     attrs = {}\r
197     _.each @fields, (field) =>\r
198       attrs[field.field_name] = @item.get(field.field_name)\r
199     _.each @child_forms, (child_form, name) =>\r
200       mm = @item.my_class().my_manifest()\r
201       em = child_form.item.my_class().my_manifest()\r
202       if mm.associations.is_has_one(em)\r
203         attrs[name + '_attributes'] = child_form.save_data()\r
204       else\r
205         attrs[name + '_attributes'] = []\r
206         _.each child_form, (form) =>\r
207           attrs[name + '_attributes'].push(form.save_data())\r
208     attrs\r
209   \r
210 class Locmare.ExtendForm extends Locmare.FormBase\r
211   tagName: 'div'\r
212   className: 'fields'\r
213   \r
214   initialize: (options) ->\r
215     @parent = options.parent\r
216     @field_name = options.field_name\r
217     super(options)\r
218     @listenTo(@item, 'input', @input)\r
219     @field = new Locmare.FormModule.Field({\r
220       form: @parent, \r
221       field_name: @field_name, \r
222       field_manifest: @parent.manifest.fields[@field_name]\r
223     })\r
224     @label = @field.label\r
225     @init_fields()\r
226   \r
227   render: () ->\r
228     this.$el.html('')\r
229     this.$el.append(@label.render().el) if not @label.hidden()\r
230     @div_fields = new Locmare.FormModule.Fields({\r
231       fields: @fields\r
232     })\r
233     this.$el.append(@div_fields.render().el)\r
234     this\r
235   \r
236   refresh: () ->\r
237     @field.refresh()\r
238   \r
239   input: (field) ->\r
240     a = {}\r
241     a[@field_name] = @val()\r
242     @parent.item.set(a, {silent: true})\r
243     @parent.item.trigger('input:' + @field_name + ':' + field)\r
244     @parent.item.trigger('input:' + @field_name)\r
245     @parent.item.trigger('input')\r
246   \r
247   fold: () ->\r
248     _.each @fields, (field) =>\r
249       @item.set(field.field_name, field.val())\r
250   \r
251   val: () ->\r
252     JSON.stringify(@item.attributes)\r
253   \r
254   init_fields: () ->\r
255     _.each @manifest.field_names, (field_name) =>\r
256       field_manifest = @manifest.fields[field_name]\r
257       @fields[field_name] = new Locmare.FormModule.ExtendField({\r
258         form: this, \r
259         field_name: field_name, \r
260         field_manifest: field_manifest\r
261       })\r
262   \r
263   form_field_name: (extend_field_name) ->\r
264     # parent is field\r
265     @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'\r
266   \r
267   is_extend: () ->\r
268     true\r
269   \r
270 class Locmare.FormModule\r
271 class Locmare.FormModule.Fields extends Backbone.View\r
272   tagName: 'div'\r
273   className: 'fields'\r
274   \r
275   initialize: (options) ->\r
276     @parent = options.parent\r
277     @fields = options.fields\r
278   \r
279   render: () ->\r
280     this.$el.html('')\r
281     _.each @fields, (field) =>\r
282       this.$el.append(field.render().el)\r
283       this.$el.append(field.rb.render().el) if field.rb\r
284     this\r
285   \r
286 class Locmare.FormModule.SubmitModule\r
287 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
288   tagName: 'div'\r
289   className: 'actions'\r
290   \r
291   initialize: (options) ->\r
292     @form = options.form\r
293   \r
294   render: () ->\r
295     caption = I18n.t(@submit_name())\r
296     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
297     this\r
298   \r
299   submit_name: () ->\r
300     if @form.item.isNew()\r
301       @form.item.table_name() + '.submit.new'\r
302     else\r
303       @form.item.table_name() + '.submit.edit'\r
304   \r