OSDN Git Service

add editor event
[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     @item.boosts 'post'\r
58     @init_fields()\r
59   \r
60   render: () ->\r
61     method_type = if @item.isNew()\r
62       'post'\r
63     else\r
64       'put'\r
65     @attr = {\r
66       method: method_type,\r
67       action: @action\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 @submit\r
78       c = @submit_class()\r
79       @div_submit = new c({form: this})\r
80       this.$el.append(@div_submit.render().el)\r
81       @delegateEvents({'submit': method_type})\r
82     this\r
83   \r
84   init_fields: () ->\r
85     _this = this\r
86     _.each _this.manifest.field_names, (field_name) ->\r
87       field_manifest = _this.manifest.fields[field_name]\r
88       boost_name = _this.item.my_class().find_boost_name(field_name)\r
89       extend_model = if boost_name \r
90         _this.item.boosters[boost_name].extend_model()\r
91       else\r
92         null\r
93       if boost_name and extend_model # field is extend setting AND template has a extend model\r
94         extend_form_name = _this.item.boosters[boost_name].item_name()\r
95         extend_item = _this.item.boosters[boost_name].extend_item()\r
96         _this.fields[field_name] = new Locmare.ExtendForm({\r
97           parent: _this, \r
98           form_name: extend_form_name, \r
99           item: extend_item, \r
100           mounted: _this.mounted, \r
101           operators: _this.operators, \r
102           field_name: field_name\r
103         })\r
104       else\r
105         _this.fields[field_name] = new Locmare.FormModule.Field({\r
106           form: _this, \r
107           field_name: field_name, \r
108           field_manifest: field_manifest\r
109         })\r
110   \r
111   submits: () ->\r
112     {\r
113       default: Locmare.FormModule.SubmitModule.Default\r
114     }\r
115   \r
116   submit_class: () ->\r
117     @submits()[@submit]\r
118   \r
119   post: () ->\r
120     _this = this\r
121     _.each @fields, (field) ->\r
122       _this.item.set(field.field_name, field.val())\r
123     if @item.save()\r
124       window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
125       return false\r
126     else\r
127       alert('invalid')\r
128   \r
129   put: () ->\r
130     _this = this\r
131     _.each @fields, (field) ->\r
132       _this.item.set(field.field_name, field.val())\r
133     @item.overwrite({operators: @operators})\r
134     if @item.save()\r
135       window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
136       return false\r
137     else\r
138       alert('invalid')\r
139   \r
140 class Locmare.ExtendForm extends Locmare.FormBase\r
141   tagName: 'div'\r
142   className: 'fields'\r
143   \r
144   initialize: (options) ->\r
145     @parent = options.parent\r
146     @field_name = options.field_name\r
147     super(options)\r
148     @field = new Locmare.FormModule.Field({\r
149       form: @parent, \r
150       field_name: @field_name, \r
151       field_manifest: @parent.manifest.fields[@field_name]\r
152     })\r
153     @label = @field.label\r
154     @init_fields()\r
155   \r
156   render: () ->\r
157     this.$el.html('')\r
158     @div_fields = new Locmare.FormModule.Fields({\r
159       fields: @fields\r
160     })\r
161     this.$el.append(@div_fields.render().el)\r
162     this\r
163   \r
164   init_fields: () ->\r
165     _this = this\r
166     _.each _this.manifest.field_names, (field_name) ->\r
167       field_manifest = _this.manifest.fields[field_name]\r
168       _this.fields[field_name] = new Locmare.FormModule.ExtendField({\r
169         form: _this, \r
170         field_name: field_name, \r
171         field_manifest: field_manifest\r
172       })\r
173   \r
174   form_field_name: (extend_field_name) ->\r
175     # parent is field\r
176     @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'\r
177   \r
178 class Locmare.FormModule\r
179 class Locmare.FormModule.Fields extends Backbone.View\r
180   tagName: 'div'\r
181   className: 'fields'\r
182   \r
183   initialize: (options) ->\r
184     @parent = options.parent\r
185     @fields = options.fields\r
186   \r
187   render: () ->\r
188     this.$el.html('')\r
189     _this = this\r
190     _.each @fields, (field) ->\r
191       _this.$el.append(field.render().el)\r
192       _this.$el.append(field.rb.render().el) if field.rb\r
193     this\r
194   \r
195 class Locmare.FormModule.SubmitModule\r
196 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
197   tagName: 'div'\r
198   className: 'actions'\r
199   \r
200   initialize: (options) ->\r
201     @form = options.form\r
202   \r
203   render: () ->\r
204     caption = I18n.t(@submit_name())\r
205     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
206     this\r
207   \r
208   submit_name: () ->\r
209     if @form.item.isNew()\r
210       @form.item.table_name() + '.submit.new'\r
211     else\r
212       @form.item.table_name() + '.submit.edit'\r
213   \r