OSDN Git Service

mrg
[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.last\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 = @item.boosters[boost_name].model_name\r
86         extend_item = @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   \r
123   initialize: (options) ->\r
124     @parent = options.parent\r
125     @field_name = options.field_name\r
126     super(options)\r
127     @field = new Locmare.FormModule.Field({\r
128       form: @parent, \r
129       field_name: @field_name, \r
130       field_manifest: @parent.manifest.fields[@field_name]\r
131     })\r
132     @label = @field.label\r
133     @init_fields()\r
134   \r
135   init_fields: () ->\r
136     _this = this\r
137     _.each _this.manifest.field_names, (field_name) ->\r
138       field_manifest = _this.manifest.fields[field_name]\r
139       _this.fields[field_name] = new Locmare.FormModule.ExtendField({\r
140         form: _this, \r
141         field_name: field_name, \r
142         field_manifest: field_manifest\r
143       })\r
144   \r
145   form_field_name: (field_name) ->\r
146     # parent is field\r
147     @parent.form_field_name(field_name)  + '[' + field_name + ']'\r
148   \r
149 class Locmare.FormModule\r
150 class Locmare.FormModule.Fields extends Backbone.View\r
151   tagName: 'div'\r
152   className: 'fields'\r
153   \r
154   initialize: (options) ->\r
155     @fields = options.fields\r
156   \r
157   render: () ->\r
158     this.$el.html('')\r
159     _this = this\r
160     _.each @fields, (field) ->\r
161       _this.$el.append(field.render().el)\r
162       _this.$el.append(field.rb.render().el) if field.rb\r
163     this\r
164   \r
165 class Locmare.FormModule.SubmitModule\r
166 class Locmare.FormModule.SubmitModule.Default extends Backbone.View\r
167   tagName: 'div'\r
168   className: 'actions'\r
169   \r
170   initialize: (options) ->\r
171     @form = options.form\r
172   \r
173   render: () ->\r
174     caption = I18n.t(@submit_name())\r
175     this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')\r
176     this\r
177   \r
178   submit_name: () ->\r
179     if @form.item.isNew()\r
180       @form.item.table_name() + '.submit.new'\r
181     else\r
182       @form.item.table_name() + '.submit.edit'\r
183   \r