OSDN Git Service

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