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