OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / app / assets / javascripts / locmare / form.js.coffee
index 9a32fbd..33bc7c2 100644 (file)
@@ -8,6 +8,7 @@ class Locmare.FormBase extends Backbone.View
   \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
     @submit = options.submit\r
@@ -20,8 +21,12 @@ class Locmare.FormBase extends Backbone.View
       @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
@@ -39,10 +44,18 @@ class Locmare.FormBase extends Backbone.View
   \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
@@ -59,7 +72,7 @@ class Locmare.Form extends Locmare.FormBase
     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
@@ -70,6 +83,32 @@ class Locmare.Form extends Locmare.FormBase
       @delegateEvents({'submit': method_type})\r
     this\r
   \r
+  refresh: () ->\r
+    _.each @fields, (field) =>\r
+      field.refresh()\r
+    _.each @child_forms, (child_form, name) =>\r
+      child_form.refresh()\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
+      mounted: @mounted, \r
+      submit: null, \r
+      operators: @operators,\r
+      action: '/' + element.table_name() + '/' + Pettanr.to_s(element.get('id'))\r
+    })\r
+    this.$el.append(form.render().el)\r
+    mm = @item.my_class().my_manifest()\r
+    em = element.my_class().my_manifest()\r
+    if mm.associations.is_has_one(em)\r
+      @child_forms[element.item_name()] = form\r
+    else\r
+      @child_forms[element.table_name()] ||= []\r
+      @child_forms[element.table_name()].push(form)\r
+    form\r
+  \r
   init_fields: () ->\r
     _.each @manifest.field_names, (field_name) =>\r
       field_manifest = @manifest.fields[field_name]\r
@@ -84,6 +123,7 @@ class Locmare.Form extends Locmare.FormBase
         @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: @mounted, \r
           operators: @operators, \r
@@ -107,21 +147,52 @@ class Locmare.Form extends Locmare.FormBase
   post: () ->\r
     _.each @fields, (field) =>\r
       @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
+    @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
     _.each @fields, (field) =>\r
       @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
+    @trigger('http_post', @item.update_url(), this)\r
+    return false\r
+  \r
+  save: (attrs = null, options = null) ->\r
+    @listenTo(@item, 'save:success', @success)\r
+    @listenTo(@item, 'save:fail', @fail)\r
+    if attrs\r
+      @item.save(attrs, options)\r
     else\r
-      alert('invalid')\r
+      @item.save()\r
+  \r
+  success: (model, response) ->\r
+    @trigger('success', model, response)\r
+  \r
+  fail: (model, response) ->\r
+    @trigger('fail', response)\r
+  \r
+  valid: () ->\r
+    window.router.navigate('/' + @item.table_name() + '/' + Pettanr.to_s(@item.get('id')), true)\r
+    return false\r
+  \r
+  invalid: () ->\r
+    alert('invalid')\r
+  \r
+  save_data: () ->\r
+    @item.my_class().child_models()\r
+    attrs = {}\r
+    _.each @fields, (field) =>\r
+      attrs[field.field_name] = @item.get(field.field_name)\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
+        attrs[name + '_attributes'] = child_form.save_data()\r
+      else\r
+        attrs[name + '_attributes'] = []\r
+        _.each child_form, (form) =>\r
+          attrs[name + '_attributes'].push(form.save_data())\r
+    attrs\r
   \r
 class Locmare.ExtendForm extends Locmare.FormBase\r
   tagName: 'div'\r
@@ -147,6 +218,9 @@ class Locmare.ExtendForm extends Locmare.FormBase
     this.$el.append(@div_fields.render().el)\r
     this\r
   \r
+  refresh: () ->\r
+    @field.refresh()\r
+  \r
   init_fields: () ->\r
     _.each @manifest.field_names, (field_name) =>\r
       field_manifest = @manifest.fields[field_name]\r
@@ -166,6 +240,7 @@ class Locmare.FormModule.Fields extends Backbone.View
   className: 'fields'\r
   \r
   initialize: (options) ->\r
+    @parent = options.parent\r
     @fields = options.fields\r
   \r
   render: () ->\r