# form_name_with_sub_form\r
# item: editing item\r
-# mounted: true/false\r
# submit: string / 'submit'\r
-# operators: \r
class Locmare.FormBase extends Backbone.View\r
tagName: 'form'\r
\r
initialize: (options) ->\r
@form_name = options.form_name #_with_sub_form\r
+ @use_name = options.use_name || 'default'\r
@item = options.item\r
- @mounted = options.mounted\r
+ @element_form = options.element_form\r
@submit = options.submit\r
- @operators = options.operators\r
if /\./.test(@form_name)\r
@sub_form_names = @form_name.split('.')\r
@form_name = @sub_form_names.pop()\r
@sub_form_names = []\r
#@form_name = @form_name\r
@root_form_name = @form_name\r
- @manifest = LocalManifest.manifest().forms[@form_name]\r
+ @manifest = LocalManifest.manifest().forms[@form_name].uses[@use_name]\r
@fields = {}\r
+ @on('change:field', @change)\r
+ \r
+ change: (field) ->\r
+ console.log(field.field_name)\r
\r
fold_extend_settings: (params) ->\r
@item.my_class().fold_extend_settings params[@item.item_name()]\r
image_dir: () ->\r
'/images/'\r
\r
+ quit: () ->\r
+ null\r
+ \r
class Locmare.Form extends Locmare.FormBase\r
\r
+ @factory: (options) ->\r
+ custom_form = Pettanr.Views[Pettanr.camelize(options.item.model_name())].Form\r
+ if custom_form\r
+ new custom_form(options)\r
+ else\r
+ new Locmare.Form(options)\r
+ \r
initialize: (options) ->\r
super(options)\r
@submit = options.submit\r
- @action = options.action\r
+ @child_forms = {}\r
@item.boosts 'post'\r
@init_fields()\r
\r
render: () ->\r
- method_type = if @item.isNew()\r
- 'post'\r
- else\r
- 'put'\r
- @attr = {\r
- method: method_type,\r
- action: @action\r
- }\r
- this.$el.attr(@attr)\r
+ this.$el.attr(@form_attr())\r
this.$el.html('')\r
@error_explanation = null\r
@div_fields = new Locmare.FormModule.Fields({\r
- fields: @fields\r
+ parent: this, fields: @fields\r
})\r
#this.$el.append(@error_explanation.render().el) if not @error_explanation\r
this.$el.append(@div_fields.render().el)\r
+ @add_elements() if @element_form\r
if @submit\r
c = @submit_class()\r
@div_submit = new c({form: this})\r
this.$el.append(@div_submit.render().el)\r
- @delegateEvents({'submit': method_type})\r
+ @delegateEvents({'submit': @method_type()})\r
this\r
\r
+ form_attr: () ->\r
+ {\r
+ method: @method_type(),\r
+ action: @action_url()\r
+ }\r
+ \r
+ refresh: () ->\r
+ _.each @fields, (field) =>\r
+ field.refresh()\r
+ _.each @child_forms, (child_form, name) =>\r
+ child_form.refresh()\r
+ \r
+ method_type: () ->\r
+ if @item.isNew()\r
+ 'post'\r
+ else\r
+ 'put'\r
+ \r
+ action_url: () ->\r
+ return null if !@submit # element has not create actions\r
+ if @item.isNew()\r
+ @item.create_url()\r
+ else\r
+ @item.edit_url()\r
+ \r
+ add_elements: () ->\r
+ _.each @item.my_class().child_models(), (element_model) =>\r
+ items = @item.element_items(element_model)\r
+ if @item.my_class().my_manifest().associations.is_has_one(element_model)\r
+ @add_element(items)\r
+ else\r
+ _.each items, (item) =>\r
+ @add_element(item)\r
+ \r
+ add_element: (element) ->\r
+ form = Locmare.Form.factory({\r
+ form_name: element.item_name(), \r
+ use_name: @use_name,\r
+ item: element, \r
+ element_form: @element_form, \r
+ submit: null, \r
+ })\r
+ this.$el.append(form.render().el)\r
+ mm = @item.my_class().my_manifest()\r
+ em = element.my_class().my_manifest()\r
+ child_element_name = mm.associations.child_element_name(element.my_class())\r
+ if mm.associations.is_has_one(em)\r
+ @child_forms[child_element_name] = form\r
+ else\r
+ @child_forms[child_element_name] ||= []\r
+ @child_forms[child_element_name].push(form)\r
+ form\r
+ \r
+ remove_elements: () ->\r
+ _.each @child_forms, (child_form, name) =>\r
+ child_form.item.set({_destroy: true}, {silent: true})\r
+ child_form.remove_elements()\r
+ \r
init_fields: () ->\r
- _this = this\r
- _.each _this.manifest.field_names, (field_name) ->\r
- field_manifest = _this.manifest.fields[field_name]\r
- boost_name = _this.item.my_class().find_boost_name(field_name)\r
+ _.each @manifest.field_names, (field_name) =>\r
+ field_manifest = @manifest.fields[field_name]\r
+ boost_name = @item.my_class().find_boost_name(field_name)\r
extend_model = if boost_name \r
- _this.item.boosters[boost_name].extend_model()\r
+ @item.boosters[boost_name].extend_model()\r
else\r
null\r
if boost_name and extend_model # field is extend setting AND template has a extend model\r
- extend_form_name = _this.item.boosters[boost_name].model_name()\r
- extend_item = _this.item.boosters[boost_name].extend_item()\r
- _this.fields[field_name] = new Locmare.ExtendForm({\r
- parent: _this, \r
+ extend_form_name = @item.boosters[boost_name].item_name()\r
+ extend_item = @item.boosters[boost_name].extend_item()\r
+ @fields[field_name] = new Locmare.ExtendForm({\r
+ parent: this, \r
form_name: extend_form_name, \r
+ use_name: @use_name,\r
item: extend_item, \r
- mounted: _this.mounted, \r
- operators: _this.operators, \r
field_name: field_name\r
})\r
else\r
- _this.fields[field_name] = new Locmare.FormModule.Field({\r
- form: _this, \r
+ @fields[field_name] = new Locmare.FormModule.Field({\r
+ form: this, \r
field_name: field_name, \r
field_manifest: field_manifest\r
})\r
@submits()[@submit]\r
\r
post: () ->\r
- _this = this\r
- _.each @fields, (field) ->\r
- _this.item.set(field.field_name, field.val())\r
- if @item.save()\r
- window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
- return false\r
- else\r
- alert('invalid')\r
+ _.each @fields, (field) =>\r
+ field.fold() if field.is_extend()\r
+ @item.set(field.field_name, field.val())\r
+ @item.unset('id') # isNew use flag that id attr set\r
+ @trigger('http_post', @item.create_url(), this)\r
+ return false\r
\r
put: () ->\r
- _this = this\r
- _.each @fields, (field) ->\r
- _this.item.set(field.field_name, field.val())\r
- @item.overwrite({operators: @operators})\r
- if @item.save()\r
- window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
- return false\r
+ _.each @fields, (field) =>\r
+ field.fold() if field.is_extend()\r
+ @item.set(field.field_name, field.val())\r
+ @trigger('http_post', @item.update_url(), this)\r
+ return false\r
+ \r
+ save: () ->\r
+ @listenTo(@item, 'save:success', @success)\r
+ @listenTo(@item, 'save:fail', @fail)\r
+ @item.save()\r
+ \r
+ success: (model, response) ->\r
+ if !Pettanr.cache.restore(model.cache_key())\r
+ # item is new\r
+ model.url = model.default_url()\r
+ Pettanr.cache.store(model)\r
else\r
- alert('invalid')\r
+ @item.fix()\r
+ @trigger('success', model, response)\r
+ \r
+ fail: (model, response) ->\r
+ @trigger('fail', response)\r
+ \r
+ quit: () ->\r
+ @item.release()\r
+ \r
+ save_data: (inspire = false) ->\r
+ @item.my_class().child_models()\r
+ attrs = {}\r
+ _.each @fields, (field) =>\r
+ attrs[field.field_name] = @item.get(field.field_name)\r
+ delete attrs['id'] if @item.isNew()\r
+ _.each @child_forms, (child_form, name) =>\r
+ mm = @item.my_class().my_manifest()\r
+ em = child_form.item.my_class().my_manifest()\r
+ if mm.associations.is_has_one(em)\r
+ d = child_form.save_data(inspire)\r
+ if inspire\r
+ delete d['id']\r
+ delete d[@item.item_name() + '_id']\r
+ attrs[name + '_attributes'] = d\r
+ else\r
+ attrs[name + '_attributes'] = []\r
+ _.each child_form, (form) =>\r
+ d = form.save_data(inspire)\r
+ if inspire\r
+ delete d['id']\r
+ delete d[@item.item_name() + '_id']\r
+ attrs[name + '_attributes'].push(d)\r
+ attrs\r
\r
class Locmare.ExtendForm extends Locmare.FormBase\r
tagName: 'div'\r
@parent = options.parent\r
@field_name = options.field_name\r
super(options)\r
+ @listenTo(@item, 'input', @input)\r
@field = new Locmare.FormModule.Field({\r
form: @parent, \r
field_name: @field_name, \r
\r
render: () ->\r
this.$el.html('')\r
- @div_fields = new Locmare.FormModule.Fields({\r
- fields: @fields\r
- })\r
- this.$el.append(@div_fields.render().el)\r
+ if !@is_hidden()\r
+ this.$el.append(@label.render().el) if not @label.hidden()\r
+ @div_fields = new Locmare.FormModule.Fields({\r
+ fields: @fields\r
+ })\r
+ this.$el.append(@div_fields.render().el)\r
this\r
\r
+ refresh: () ->\r
+ @field.refresh()\r
+ \r
+ input: (field) ->\r
+ a = {}\r
+ a[@field_name] = @val()\r
+ @parent.item.set(a, {silent: true})\r
+ @parent.item.trigger('input:' + @field_name + ':' + field)\r
+ @parent.item.trigger('input:' + @field_name)\r
+ @parent.item.trigger('input')\r
+ \r
+ fold: () ->\r
+ _.each @fields, (field) =>\r
+ @item.set(field.field_name, field.val())\r
+ \r
+ val: () ->\r
+ JSON.stringify(@item.attributes)\r
+ \r
+ is_hidden: () ->\r
+ _.isEmpty(@manifest.field_names)\r
+ \r
init_fields: () ->\r
- _this = this\r
- _.each _this.manifest.field_names, (field_name) ->\r
- field_manifest = _this.manifest.fields[field_name]\r
- _this.fields[field_name] = new Locmare.FormModule.ExtendField({\r
- form: _this, \r
+ _.each @manifest.field_names, (field_name) =>\r
+ field_manifest = @manifest.fields[field_name]\r
+ @fields[field_name] = new Locmare.FormModule.ExtendField({\r
+ form: this, \r
field_name: field_name, \r
field_manifest: field_manifest\r
})\r
# parent is field\r
@parent.form_field_name(@field_name) + '[' + extend_field_name + ']'\r
\r
+ is_extend: () ->\r
+ true\r
+ \r
class Locmare.FormModule\r
class Locmare.FormModule.Fields extends Backbone.View\r
tagName: 'div'\r
className: 'fields'\r
\r
initialize: (options) ->\r
+ @parent = options.parent\r
@fields = options.fields\r
\r
render: () ->\r
this.$el.html('')\r
- _this = this\r
- _.each @fields, (field) ->\r
- _this.$el.append(field.render().el)\r
- _this.$el.append(field.rb.render().el) if field.rb\r
+ _.each @fields, (field) =>\r
+ this.$el.append(field.render().el)\r
+ this.$el.append(field.rb.render().el) if field.rb\r
this\r
\r
class Locmare.FormModule.SubmitModule\r