1 # form_name_with_sub_form
\r
3 # submit: string / 'submit'
\r
4 class Locmare.FormBase extends Pettanr.View
\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
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
23 @on('change:field', @change)
\r
27 fold_extend_settings: (params) ->
\r
28 @item.my_class().fold_extend_settings params[@item.item_name()]
\r
30 sub_form_name: () ->
\r
31 r = _.map @sub_form_names, (name) ->
\r
32 '[' + name + '_attributes' + ']'
\r
35 form_field_name: (field_name) ->
\r
36 @root_form_name + @sub_form_name() + '[' + field_name + ']'
\r
44 class Locmare.Form extends Locmare.FormBase
\r
46 @factory: (options) ->
\r
47 custom_form = Pettanr.Views[Pettanr.camelize(options.item.model_name())].Form
\r
49 new custom_form(options)
\r
51 new Locmare.Form(options)
\r
53 initialize: (options) ->
\r
55 @submit = options.submit
\r
61 this.$el.attr(@form_attr())
\r
64 @error_explanation = null
\r
65 @div_fields = new Locmare.FormModule.Fields({
\r
66 parent: this, fields: @fields
\r
68 #this.$el.append(@error_explanation.render().el) if not @error_explanation
\r
69 this.$el.append(@div_fields.render().el)
\r
70 @add_elements() if @element_form
\r
73 @div_submit = new c({form: this})
\r
74 this.$el.append(@div_submit.render().el)
\r
75 @delegateEvents({'submit': @method_type()})
\r
80 method: @method_type(),
\r
81 action: @action_url()
\r
85 _.each @fields, (field) =>
\r
87 _.each @child_forms, (child_form, name) =>
\r
88 child_form.refresh()
\r
97 return null if !@submit # element has not create actions
\r
103 add_elements: () ->
\r
104 _.each @item.my_class().child_models(), (element_model) =>
\r
105 items = @item.element_items(element_model)
\r
106 if @item.my_class().my_manifest().associations.is_has_one(element_model)
\r
107 @add_element(items)
\r
109 _.each items, (item) =>
\r
112 add_element: (element) ->
\r
113 form = Locmare.Form.factory({
\r
114 form_name: element.item_name(),
\r
115 use_name: @use_name,
\r
117 element_form: @element_form,
\r
120 this.$el.append(form.render().el)
\r
121 mm = @item.my_class().my_manifest()
\r
122 em = element.my_class().my_manifest()
\r
123 child_element_name = mm.associations.child_element_name(element.my_class())
\r
124 if mm.associations.is_has_one(em)
\r
125 @child_forms[child_element_name] = form
\r
127 @child_forms[child_element_name] ||= []
\r
128 @child_forms[child_element_name].push(form)
\r
131 remove_elements: () ->
\r
132 _.each @child_forms, (child_form, name) =>
\r
133 child_form.item.set({_destroy: true}, {silent: true})
\r
134 child_form.remove_elements()
\r
137 _.each @manifest.field_names, (field_name) =>
\r
138 field_manifest = @manifest.fields[field_name]
\r
139 boost_name = @item.my_class().find_boost_name(field_name)
\r
140 extend_model = if boost_name
\r
141 @item.boosters[boost_name].extend_model()
\r
144 if boost_name and extend_model # field is extend setting AND template has a extend model
\r
145 extend_form_name = @item.boosters[boost_name].item_name()
\r
146 extend_item = @item.boosters[boost_name].extend_item()
\r
147 @fields[field_name] = new Locmare.ExtendForm({
\r
149 form_name: extend_form_name,
\r
150 use_name: @use_name,
\r
151 item: extend_item,
\r
152 field_name: field_name
\r
155 @fields[field_name] = new Locmare.FormModule.Field({
\r
157 field_name: field_name,
\r
158 field_manifest: field_manifest
\r
163 default: Locmare.FormModule.SubmitModule.Default
\r
166 submit_class: () ->
\r
167 @submits()[@submit]
\r
170 _.each @fields, (field) =>
\r
171 field.fold() if field.is_extend()
\r
172 @item.set(field.field_name, field.val())
\r
173 @item.unset('id') # isNew use flag that id attr set
\r
174 @trigger('http_post', @item.create_url(), this)
\r
178 _.each @fields, (field) =>
\r
179 field.fold() if field.is_extend()
\r
180 @item.set(field.field_name, field.val())
\r
181 @trigger('http_post', @item.update_url(), this)
\r
185 @listenTo(@item, 'save:success', @success)
\r
186 @listenTo(@item, 'save:fail', @fail)
\r
189 success: (model, response) ->
\r
190 # strip element's attributes
\r
191 m = @item.my_class().my_manifest().classify()
\r
192 pure_item = new m(model.pure_attributes())
\r
193 if !Pettanr.cache.restore(model.cache_key())
\r
195 pure_item.url = model.default_url()
\r
196 Pettanr.cache.store(pure_item)
\r
199 @trigger('success', model, response)
\r
201 fail: (model, response) ->
\r
202 @trigger('fail', response)
\r
207 save_data: (inspire = false) ->
\r
208 @item.my_class().child_models()
\r
210 _.each @fields, (field) =>
\r
211 attrs[field.field_name] = @item.get(field.field_name)
\r
212 delete attrs['id'] if @item.isNew()
\r
213 _.each @child_forms, (child_form, name) =>
\r
214 mm = @item.my_class().my_manifest()
\r
215 em = child_form.item.my_class().my_manifest()
\r
216 if mm.associations.is_has_one(em)
\r
217 d = child_form.save_data(inspire)
\r
220 delete d[@item.item_name() + '_id']
\r
221 attrs[name + '_attributes'] = d
\r
223 attrs[name + '_attributes'] = []
\r
224 _.each child_form, (form) =>
\r
225 d = form.save_data(inspire)
\r
228 delete d[@item.item_name() + '_id']
\r
229 attrs[name + '_attributes'].push(d)
\r
232 append_guidance: () ->
\r
235 class Locmare.ExtendForm extends Locmare.FormBase
\r
237 className: 'fields'
\r
239 initialize: (options) ->
\r
240 @parent = options.parent
\r
241 @field_name = options.field_name
\r
243 @listenTo(@item, 'input', @input)
\r
244 @field = new Locmare.FormModule.Field({
\r
246 field_name: @field_name,
\r
247 field_manifest: @parent.manifest.fields[@field_name]
\r
249 @label = @field.label
\r
255 this.$el.append(@label.render().el) if not @label.hidden()
\r
256 @div_fields = new Locmare.FormModule.Fields({
\r
259 this.$el.append(@div_fields.render().el)
\r
267 a[@field_name] = @val()
\r
268 @parent.item.set(a, {silent: true})
\r
269 @parent.item.trigger('input:' + @field_name + ':' + field)
\r
270 @parent.item.trigger('input:' + @field_name)
\r
271 @parent.item.trigger('input')
\r
274 _.each @fields, (field) =>
\r
275 @item.set(field.field_name, field.val())
\r
278 JSON.stringify(@item.attributes)
\r
281 _.isEmpty(@manifest.field_names)
\r
284 _.each @manifest.field_names, (field_name) =>
\r
285 field_manifest = @manifest.fields[field_name]
\r
286 @fields[field_name] = new Locmare.FormModule.ExtendField({
\r
288 field_name: field_name,
\r
289 field_manifest: field_manifest
\r
292 form_field_name: (extend_field_name) ->
\r
294 @parent.form_field_name(@field_name) + '[' + extend_field_name + ']'
\r
299 has_row_break: () ->
\r
303 if @has_row_break()
\r
308 class Locmare.FormModule
\r
309 class Locmare.FormModule.Fields extends Pettanr.View
\r
311 className: 'fields'
\r
313 initialize: (options) ->
\r
314 @parent = options.parent
\r
315 @fields = options.fields
\r
319 _.each @fields, (field) =>
\r
320 this.$el.append(field.render().el)
\r
321 this.$el.append(field.row_break()) if field.has_row_break()
\r
324 class Locmare.FormModule.SubmitModule
\r
325 class Locmare.FormModule.SubmitModule.Default extends Pettanr.View
\r
327 className: 'actions'
\r
329 initialize: (options) ->
\r
330 @form = options.form
\r
333 caption = I18n.t(@submit_name())
\r
334 this.$el.html('<input type="submit" name="commit" class="submit" value="' + caption + '"></input>')
\r
338 if @form.item.isNew()
\r
339 @form.item.table_name() + '.submit.new'
\r
341 @form.item.table_name() + '.submit.edit'
\r