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