OSDN Git Service

add bucket
[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   \r
26   fold_extend_settings: (params) ->\r
27     @item.my_class().fold_extend_settings params[@item.item_name()]\r
28   \r
29   sub_form_name: () ->\r
30     r = _.map @sub_form_names, (name) ->\r
31       '[' + name + '_attributes' + ']'\r
32     r.join()\r
33   \r
34   form_field_name: (field_name) ->\r
35     @root_form_name + @sub_form_name() + '[' + field_name + ']'\r
36   \r
37   image_dir: () ->\r
38     '/images/'\r
39   \r
40 class Locmare.Form extends Locmare.FormBase\r
41   events: {\r
42     'submit': 'post'\r
43   }\r
44   \r
45   initialize: (options) ->\r
46     super(options)\r
47     @submit = options.submit\r
48     @action = options.action\r
49     @item.boosts 'post'\r
50     @init_fields()\r
51   \r
52   render: () ->\r
53     m = if @item.isNew()\r
54       'post'\r
55     else\r
56       'put'\r
57     @attr = {\r
58       method: m,\r
59       action: @action\r
60     }\r
61     this.$el.attr(@attr)\r
62     this.$el.html('')\r
63     @error_explanation = null\r
64     @div_fields = new Locmare.FormModule.Fields({\r
65       fields: @fields\r
66     })\r
67     #this.$el.append(@error_explanation.render().el) if not @error_explanation\r
68     this.$el.append(@div_fields.render().el)\r
69     if @submit\r
70       c = @submit_class()\r
71       @div_submit = new c({form: this})\r
72       this.$el.append(@div_submit.render().el)\r
73     this\r
74   \r
75   init_fields: () ->\r
76     _this = this\r
77     _.each _this.manifest.field_names, (field_name) ->\r
78       field_manifest = _this.manifest.fields[field_name]\r
79       boost_name = _this.item.my_class().find_boost_name(field_name)\r
80       extend_model = if boost_name \r
81         _this.item.boosters[boost_name].extend_model()\r
82       else\r
83         null\r
84       if boost_name and extend_model # field is extend setting AND template has a extend model\r
85         extend_form_name = _this.item.boosters[boost_name].model_name()\r
86         extend_item = _this.item.boosters[boost_name].extend_item()\r
87         _this.fields[field_name] = new Locmare.ExtendForm({\r
88           parent: _this, \r
89           form_name: extend_form_name, \r
90           item: extend_item, \r
91           mounted: _this.mounted, \r
92           operators: _this.operators, \r
93           field_name: field_name\r
94         })\r
95       else\r
96         _this.fields[field_name] = new Locmare.FormModule.Field({\r
97           form: _this, \r
98           field_name: field_name, \r
99           field_manifest: field_manifest\r
100         })\r
101   \r
102   submits: () ->\r
103     {\r
104       default: Locmare.FormModule.SubmitModule.Default\r
105     }\r
106   \r
107   submit_class: () ->\r
108     @submits()[@submit]\r
109   \r
110   post: () ->\r
111     attr = {}\r
112     _this = this\r
113     _.each @fields, (field) ->\r
114       _this.item.set(field.field_name, field.val())\r
115     if @item.save()\r
116       window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
117       return false\r
118     else\r
119       alert('invalid')\r
120   \r
121 class Locmare.ExtendForm extends Locmare.FormBase\r
122   tagName: 'div'\r
123   className: 'fields'\r
124   \r
125   initialize: (options) ->\r
126     @parent = options.parent\r
127     @field_name = options.field_name\r
128     super(options)\r
129     @field = new Locmare.FormModule.Field({\r
130       form: @parent, \r
131       field_name: @field_name, \r
132       field_manifest: @parent.manifest.fields[@field_name]\r
133     })\r
134     @label = @field.label\r
135     @init_fields()\r
136   \r
137   render: () ->\r
138     this.$el.html('')\r
139     @div_fields = new Locmare.FormModule.Fields({\r
140       fields: @fields\r
141     })\r
142     this.$el.append(@div_fields.render().el)\r
143     this\r
144   \r
145   init_fields: () ->\r
146     _this = this\r
147     _.each _this.manifest.field_names, (field_name) ->\r
148       field_manifest = _this.manifest.fields[field_name]\r
149       _this.fields[field_name] = new Locmare.FormModule.ExtendField({\r
150         form: _this, \r
151         field_name: field_name, \r
152         field_manifest: field_manifest\r
153       })\r
154   \r
155   form_field_name: (extend_field_name) ->\r
156     # parent is field\r
157     @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'\r
158   \r
159 class Locmare.FormModule\r
160 class Locmare.FormModule.Fields extends Backbone.View\r
161   tagName: 'div'\r
162   className: 'fields'\r
163   \r
164   initialize: (options) ->\r
165     @fields = options.fields\r
166   \r
167   render: () ->\r
168     this.$el.html('')\r
169     _this = this\r
170     _.each @fields, (field) ->\r
171       _this.$el.append(field.render().el)\r
172       _this.$el.append(field.rb.render().el) if field.rb\r
173     this\r
174   \r
175 class Locmare.FormModule.SubmitModule\r
176 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
177   tagName: 'div'\r
178   className: 'actions'\r
179   \r
180   initialize: (options) ->\r
181     @form = options.form\r
182   \r
183   render: () ->\r
184     caption = I18n.t(@submit_name())\r
185     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
186     this\r
187   \r
188   submit_name: () ->\r
189     if @form.item.isNew()\r
190       @form.item.table_name() + '.submit.new'\r
191     else\r
192       @form.item.table_name() + '.submit.edit'\r
193   \r