# form_name_with_sub_form # item: editing item # mounted: true/false # submit: string / 'submit' # operators: class Locmare.FormBase extends Backbone.View tagName: 'form' initialize: (options) -> @form_name = options.form_name #_with_sub_form @item = options.item @mounted = options.mounted @submit = options.submit @operators = options.operators if /\./.test(@form_name) @sub_form_names = @form_name.split('.') @form_name = @sub_form_names.pop() @root_form_name = @sub_form_names.shift() else @sub_form_names = [] #@form_name = @form_name @root_form_name = @form_name @manifest = LocalManifest.manifest().forms[@form_name] @fields = {} @on('change:field', @change) change: (field) -> console.log(field.field_name) fold_extend_settings: (params) -> @item.my_class().fold_extend_settings params[@item.item_name()] sub_form_name: () -> r = _.map @sub_form_names, (name) -> '[' + name + '_attributes' + ']' r.join() form_field_name: (field_name) -> @root_form_name + @sub_form_name() + '[' + field_name + ']' image_dir: () -> '/images/' class Locmare.Form extends Locmare.FormBase @factory: (options) -> custom_form = Pettanr.Views[Pettanr.camelize(options.item.model_name())].Form if custom_form new custom_form(options) else new Locmare.Form(options) initialize: (options) -> super(options) @submit = options.submit @action = options.action @item.boosts 'post' @init_fields() render: () -> method_type = if @item.isNew() 'post' else 'put' @attr = { method: method_type, action: @action } this.$el.attr(@attr) this.$el.html('') @error_explanation = null @div_fields = new Locmare.FormModule.Fields({ parent: this, fields: @fields }) #this.$el.append(@error_explanation.render().el) if not @error_explanation this.$el.append(@div_fields.render().el) if @submit c = @submit_class() @div_submit = new c({form: this}) this.$el.append(@div_submit.render().el) @delegateEvents({'submit': method_type}) this init_fields: () -> _.each @manifest.field_names, (field_name) => field_manifest = @manifest.fields[field_name] boost_name = @item.my_class().find_boost_name(field_name) extend_model = if boost_name @item.boosters[boost_name].extend_model() else null if boost_name and extend_model # field is extend setting AND template has a extend model extend_form_name = @item.boosters[boost_name].item_name() extend_item = @item.boosters[boost_name].extend_item() @fields[field_name] = new Locmare.ExtendForm({ parent: this, form_name: extend_form_name, item: extend_item, mounted: @mounted, operators: @operators, field_name: field_name }) else @fields[field_name] = new Locmare.FormModule.Field({ form: this, field_name: field_name, field_manifest: field_manifest }) submits: () -> { default: Locmare.FormModule.SubmitModule.Default } submit_class: () -> @submits()[@submit] post: () -> _.each @fields, (field) => @item.set(field.field_name, field.val()) if @item.save() window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true) return false else alert('invalid') put: () -> _.each @fields, (field) => @item.set(field.field_name, field.val()) @item.overwrite({operators: @operators}) if @item.save() window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true) return false else alert('invalid') class Locmare.ExtendForm extends Locmare.FormBase tagName: 'div' className: 'fields' initialize: (options) -> @parent = options.parent @field_name = options.field_name super(options) @field = new Locmare.FormModule.Field({ form: @parent, field_name: @field_name, field_manifest: @parent.manifest.fields[@field_name] }) @label = @field.label @init_fields() render: () -> this.$el.html('') @div_fields = new Locmare.FormModule.Fields({ fields: @fields }) this.$el.append(@div_fields.render().el) this init_fields: () -> _.each @manifest.field_names, (field_name) => field_manifest = @manifest.fields[field_name] @fields[field_name] = new Locmare.FormModule.ExtendField({ form: this, field_name: field_name, field_manifest: field_manifest }) form_field_name: (extend_field_name) -> # parent is field @parent.form_field_name(@field_name) + '[' + extend_field_name + ']' class Locmare.FormModule class Locmare.FormModule.Fields extends Backbone.View tagName: 'div' className: 'fields' initialize: (options) -> @parent = options.parent @fields = options.fields render: () -> this.$el.html('') _.each @fields, (field) => this.$el.append(field.render().el) this.$el.append(field.rb.render().el) if field.rb this class Locmare.FormModule.SubmitModule class Locmare.FormModule.SubmitModule.Default extends Backbone.View tagName: 'div' className: 'actions' initialize: (options) -> @form = options.form render: () -> caption = I18n.t(@submit_name()) this.$el.html('') this submit_name: () -> if @form.item.isNew() @form.item.table_name() + '.submit.new' else @form.item.table_name() + '.submit.edit'