OSDN Git Service

fix mg fail
[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     @item = options.item\r
12     @mounted = options.mounted\r
13     @submit = options.submit\r
14     @operators = options.operators\r
15     if /\./.test(@form_name)\r
16       @sub_form_names = @form_name.split('.')\r
17       @form_name = @sub_form_names.pop()\r
18       @root_form_name = @sub_form_names.shift()\r
19     else\r
20       @sub_form_names = []\r
21       #@form_name = @form_name\r
22       @root_form_name = @form_name\r
23     @manifest = LocalManifest.manifest().forms[@form_name]\r
24     @fields = {}\r
25     @on('change:field', @change)\r
26   \r
27   change: (field) ->\r
28     console.log(field.field_name)\r
29   \r
30   fold_extend_settings: (params) ->\r
31     @item.my_class().fold_extend_settings params[@item.item_name()]\r
32   \r
33   sub_form_name: () ->\r
34     r = _.map @sub_form_names, (name) ->\r
35       '[' + name + '_attributes' + ']'\r
36     r.join()\r
37   \r
38   form_field_name: (field_name) ->\r
39     @root_form_name + @sub_form_name() + '[' + field_name + ']'\r
40   \r
41   image_dir: () ->\r
42     '/images/'\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     @action = options.action\r
57     @child_forms = {}\r
58     @item.boosts 'post'\r
59     @init_fields()\r
60   \r
61   render: () ->\r
62     method_type = if @item.isNew()\r
63       'post'\r
64     else\r
65       'put'\r
66     @attr = {\r
67       method: method_type,\r
68       action: @action\r
69     }\r
70     this.$el.attr(@attr)\r
71     this.$el.html('')\r
72     @error_explanation = null\r
73     @div_fields = new Locmare.FormModule.Fields({\r
74       parent: this, fields: @fields\r
75     })\r
76     #this.$el.append(@error_explanation.render().el) if not @error_explanation\r
77     this.$el.append(@div_fields.render().el)\r
78     if @submit\r
79       c = @submit_class()\r
80       @div_submit = new c({form: this})\r
81       this.$el.append(@div_submit.render().el)\r
82       @delegateEvents({'submit': method_type})\r
83     this\r
84   \r
85   add_element: (element) ->\r
86     form = Locmare.Form.factory({\r
87       form_name: element.item_name(), \r
88       item: element, \r
89       mounted: @mounted, \r
90       submit: null, \r
91       operators: @operators,\r
92       action: '/' + element.table_name() + '/' + Pettanr.to_s(element.get('id'))\r
93     })\r
94     this.$el.append(form.render().el)\r
95     mm = @item.my_class().my_manifest()\r
96     em = element.my_class().my_manifest()\r
97     if mm.associations.is_has_one(em)\r
98       @child_forms[element.item_name()] = form\r
99     else\r
100       @child_forms[element.table_name()] ||= []\r
101       @child_forms[element.table_name()].push(form)\r
102     form\r
103   \r
104   init_fields: () ->\r
105     _.each @manifest.field_names, (field_name) =>\r
106       field_manifest = @manifest.fields[field_name]\r
107       boost_name = @item.my_class().find_boost_name(field_name)\r
108       extend_model = if boost_name \r
109         @item.boosters[boost_name].extend_model()\r
110       else\r
111         null\r
112       if boost_name and extend_model # field is extend setting AND template has a extend model\r
113         extend_form_name = @item.boosters[boost_name].item_name()\r
114         extend_item = @item.boosters[boost_name].extend_item()\r
115         @fields[field_name] = new Locmare.ExtendForm({\r
116           parent: this, \r
117           form_name: extend_form_name, \r
118           item: extend_item, \r
119           mounted: @mounted, \r
120           operators: @operators, \r
121           field_name: field_name\r
122         })\r
123       else\r
124         @fields[field_name] = new Locmare.FormModule.Field({\r
125           form: this, \r
126           field_name: field_name, \r
127           field_manifest: field_manifest\r
128         })\r
129   \r
130   submits: () ->\r
131     {\r
132       default: Locmare.FormModule.SubmitModule.Default\r
133     }\r
134   \r
135   submit_class: () ->\r
136     @submits()[@submit]\r
137   \r
138   post: () ->\r
139     _.each @fields, (field) =>\r
140       @item.set(field.field_name, field.val())\r
141     if @item.save()\r
142       window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
143       return false\r
144     else\r
145       alert('invalid')\r
146   \r
147   put: () ->\r
148     _.each @fields, (field) =>\r
149       @item.set(field.field_name, field.val())\r
150     @item.overwrite({operators: @operators})\r
151     attrs = @make_attrs()\r
152     if @item.save(attrs)\r
153       window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
154       return false\r
155     else\r
156       alert('invalid')\r
157   \r
158   save_data: () ->\r
159     @item.my_class().child_models()\r
160     attrs = {}\r
161     _.each @fields, (field) =>\r
162       attrs[field.field_name] = @item.get(field.field_name)\r
163     _.each @child_forms, (child_form, name) =>\r
164       mm = @item.my_class().my_manifest()\r
165       em = child_form.item.my_class().my_manifest()\r
166       if mm.associations.is_has_one(em)\r
167         attrs[name + '_attributes'] = child_form.save_data()\r
168       else\r
169         attrs[name + '_attributes'] = []\r
170         _.each child_form, (form) =>\r
171           attrs[name + '_attributes'].push(form.save_data())\r
172     attrs\r
173   \r
174 class Locmare.ExtendForm extends Locmare.FormBase\r
175   tagName: 'div'\r
176   className: 'fields'\r
177   \r
178   initialize: (options) ->\r
179     @parent = options.parent\r
180     @field_name = options.field_name\r
181     super(options)\r
182     @field = new Locmare.FormModule.Field({\r
183       form: @parent, \r
184       field_name: @field_name, \r
185       field_manifest: @parent.manifest.fields[@field_name]\r
186     })\r
187     @label = @field.label\r
188     @init_fields()\r
189   \r
190   render: () ->\r
191     this.$el.html('')\r
192     @div_fields = new Locmare.FormModule.Fields({\r
193       fields: @fields\r
194     })\r
195     this.$el.append(@div_fields.render().el)\r
196     this\r
197   \r
198   init_fields: () ->\r
199     _.each @manifest.field_names, (field_name) =>\r
200       field_manifest = @manifest.fields[field_name]\r
201       @fields[field_name] = new Locmare.FormModule.ExtendField({\r
202         form: this, \r
203         field_name: field_name, \r
204         field_manifest: field_manifest\r
205       })\r
206   \r
207   form_field_name: (extend_field_name) ->\r
208     # parent is field\r
209     @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'\r
210   \r
211 class Locmare.FormModule\r
212 class Locmare.FormModule.Fields extends Backbone.View\r
213   tagName: 'div'\r
214   className: 'fields'\r
215   \r
216   initialize: (options) ->\r
217     @parent = options.parent\r
218     @fields = options.fields\r
219   \r
220   render: () ->\r
221     this.$el.html('')\r
222     _.each @fields, (field) =>\r
223       this.$el.append(field.render().el)\r
224       this.$el.append(field.rb.render().el) if field.rb\r
225     this\r
226   \r
227 class Locmare.FormModule.SubmitModule\r
228 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
229   tagName: 'div'\r
230   className: 'actions'\r
231   \r
232   initialize: (options) ->\r
233     @form = options.form\r
234   \r
235   render: () ->\r
236     caption = I18n.t(@submit_name())\r
237     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
238     this\r
239   \r
240   submit_name: () ->\r
241     if @form.item.isNew()\r
242       @form.item.table_name() + '.submit.new'\r
243     else\r
244       @form.item.table_name() + '.submit.edit'\r
245   \r