X-Git-Url: http://git.osdn.net/view?p=pettanr%2Fpettanr.git;a=blobdiff_plain;f=app%2Fassets%2Fjavascripts%2Flocmare%2Fform.js.coffee;h=4e55865ab24a942d55146c54ea6c7e2d2bf80b47;hp=11a73b9745b82019b50293efc9e193593d1c045d;hb=aa9eca25671c772ffec8f2f65aecc8a978a2f375;hpb=2078c3e72dc259899b9e98d77ad757c9fb6d4f0e diff --git a/app/assets/javascripts/locmare/form.js.coffee b/app/assets/javascripts/locmare/form.js.coffee index 11a73b97..4e55865a 100644 --- a/app/assets/javascripts/locmare/form.js.coffee +++ b/app/assets/javascripts/locmare/form.js.coffee @@ -1,17 +1,15 @@ # 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 + @use_name = options.use_name || 'default' @item = options.item - @mounted = options.mounted + @element_form = options.element_form @submit = options.submit - @operators = options.operators if /\./.test(@form_name) @sub_form_names = @form_name.split('.') @form_name = @sub_form_names.pop() @@ -20,7 +18,7 @@ class Locmare.FormBase extends Backbone.View @sub_form_names = [] #@form_name = @form_name @root_form_name = @form_name - @manifest = LocalManifest.manifest().forms[@form_name] + @manifest = LocalManifest.manifest().forms[@form_name].uses[@use_name] @fields = {} @on('change:field', @change) @@ -41,6 +39,9 @@ class Locmare.FormBase extends Backbone.View image_dir: () -> '/images/' + quit: () -> + null + class Locmare.Form extends Locmare.FormBase @factory: (options) -> @@ -53,21 +54,12 @@ class Locmare.Form extends Locmare.FormBase initialize: (options) -> super(options) @submit = options.submit - @action = options.action @child_forms = {} @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.attr(@form_attr()) this.$el.html('') @error_explanation = null @div_fields = new Locmare.FormModule.Fields({ @@ -75,32 +67,72 @@ class Locmare.Form extends Locmare.FormBase }) #this.$el.append(@error_explanation.render().el) if not @error_explanation this.$el.append(@div_fields.render().el) + @add_elements() if @element_form if @submit c = @submit_class() @div_submit = new c({form: this}) this.$el.append(@div_submit.render().el) - @delegateEvents({'submit': method_type}) + @delegateEvents({'submit': @method_type()}) this + form_attr: () -> + { + method: @method_type(), + action: @action_url() + } + + refresh: () -> + _.each @fields, (field) => + field.refresh() + _.each @child_forms, (child_form, name) => + child_form.refresh() + + method_type: () -> + if @item.isNew() + 'post' + else + 'put' + + action_url: () -> + return null if !@submit # element has not create actions + if @item.isNew() + @item.create_url() + else + @item.edit_url() + + add_elements: () -> + _.each @item.my_class().child_models(), (element_model) => + items = @item.element_items(element_model) + if @item.my_class().my_manifest().associations.is_has_one(element_model) + @add_element(items) + else + _.each items, (item) => + @add_element(item) + add_element: (element) -> form = Locmare.Form.factory({ form_name: element.item_name(), + use_name: @use_name, item: element, - mounted: @mounted, + element_form: @element_form, submit: null, - operators: @operators, - action: '/' + element.table_name() + '/' + Pettanr.to_s(element.get('id')) }) this.$el.append(form.render().el) mm = @item.my_class().my_manifest() em = element.my_class().my_manifest() + child_element_name = mm.associations.child_element_name(element.my_class()) if mm.associations.is_has_one(em) - @child_forms[element.item_name()] = form + @child_forms[child_element_name] = form else - @child_forms[element.table_name()] ||= [] - @child_forms[element.table_name()].push(form) + @child_forms[child_element_name] ||= [] + @child_forms[child_element_name].push(form) form + remove_elements: () -> + _.each @child_forms, (child_form, name) => + child_form.item.set({_destroy: true}, {silent: true}) + child_form.remove_elements() + init_fields: () -> _.each @manifest.field_names, (field_name) => field_manifest = @manifest.fields[field_name] @@ -115,9 +147,8 @@ class Locmare.Form extends Locmare.FormBase @fields[field_name] = new Locmare.ExtendForm({ parent: this, form_name: extend_form_name, + use_name: @use_name, item: extend_item, - mounted: @mounted, - operators: @operators, field_name: field_name }) else @@ -137,51 +168,62 @@ class Locmare.Form extends Locmare.FormBase post: () -> _.each @fields, (field) => + field.fold() if field.is_extend() @item.set(field.field_name, field.val()) - if @item.save() - # redirect_to show - @trigger('navigate', @item.show_url()) - return false - else - # render_form - alert('invalid') + @item.unset('id') # isNew use flag that id attr set + @trigger('http_post', @item.create_url(), this) + return false put: () -> _.each @fields, (field) => + field.fold() if field.is_extend() @item.set(field.field_name, field.val()) - @item.overwrite({operators: @operators}) - if @save() - @valid() - else - @invalid() + @trigger('http_post', @item.update_url(), this) + return false - save: (attrs = null, options = null) -> - if attrs - @item.save(attrs, options) + save: () -> + @listenTo(@item, 'save:success', @success) + @listenTo(@item, 'save:fail', @fail) + @item.save() + + success: (model, response) -> + if !Pettanr.cache.restore(model.cache_key()) + # item is new + model.url = model.default_url() + Pettanr.cache.store(model) else - @item.save() + @item.fix() + @trigger('success', model, response) - valid: () -> - window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true) - return false + fail: (model, response) -> + @trigger('fail', response) - invalid: () -> - alert('invalid') + quit: () -> + @item.release() - save_data: () -> + save_data: (inspire = false) -> @item.my_class().child_models() attrs = {} _.each @fields, (field) => attrs[field.field_name] = @item.get(field.field_name) + delete attrs['id'] if @item.isNew() _.each @child_forms, (child_form, name) => mm = @item.my_class().my_manifest() em = child_form.item.my_class().my_manifest() if mm.associations.is_has_one(em) - attrs[name + '_attributes'] = child_form.save_data() + d = child_form.save_data(inspire) + if inspire + delete d['id'] + delete d[@item.item_name() + '_id'] + attrs[name + '_attributes'] = d else attrs[name + '_attributes'] = [] _.each child_form, (form) => - attrs[name + '_attributes'].push(form.save_data()) + d = form.save_data(inspire) + if inspire + delete d['id'] + delete d[@item.item_name() + '_id'] + attrs[name + '_attributes'].push(d) attrs class Locmare.ExtendForm extends Locmare.FormBase @@ -192,6 +234,7 @@ class Locmare.ExtendForm extends Locmare.FormBase @parent = options.parent @field_name = options.field_name super(options) + @listenTo(@item, 'input', @input) @field = new Locmare.FormModule.Field({ form: @parent, field_name: @field_name, @@ -202,12 +245,35 @@ class Locmare.ExtendForm extends Locmare.FormBase render: () -> this.$el.html('') - @div_fields = new Locmare.FormModule.Fields({ - fields: @fields - }) - this.$el.append(@div_fields.render().el) + if !@is_hidden() + this.$el.append(@label.render().el) if not @label.hidden() + @div_fields = new Locmare.FormModule.Fields({ + fields: @fields + }) + this.$el.append(@div_fields.render().el) this + refresh: () -> + @field.refresh() + + input: (field) -> + a = {} + a[@field_name] = @val() + @parent.item.set(a, {silent: true}) + @parent.item.trigger('input:' + @field_name + ':' + field) + @parent.item.trigger('input:' + @field_name) + @parent.item.trigger('input') + + fold: () -> + _.each @fields, (field) => + @item.set(field.field_name, field.val()) + + val: () -> + JSON.stringify(@item.attributes) + + is_hidden: () -> + _.isEmpty(@manifest.field_names) + init_fields: () -> _.each @manifest.field_names, (field_name) => field_manifest = @manifest.fields[field_name] @@ -221,6 +287,9 @@ class Locmare.ExtendForm extends Locmare.FormBase # parent is field @parent.form_field_name(@field_name) + '[' + extend_field_name + ']' + is_extend: () -> + true + class Locmare.FormModule class Locmare.FormModule.Fields extends Backbone.View tagName: 'div'