OSDN Git Service

fix: show's destroy button
[pettanr/pettanr.git] / app / assets / javascripts / locmare / form.js.coffee
index bd2c9e5..4e55865 100644 (file)
@@ -1,17 +1,15 @@
 # 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
@@ -20,8 +18,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
@@ -37,62 +39,121 @@ class Locmare.FormBase extends Backbone.View
   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].item_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
@@ -106,25 +167,64 @@ class Locmare.Form extends Locmare.FormBase
     @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
@@ -134,6 +234,7 @@ class Locmare.ExtendForm extends Locmare.FormBase
     @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
@@ -144,18 +245,40 @@ class Locmare.ExtendForm extends Locmare.FormBase
   \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
@@ -164,20 +287,23 @@ class Locmare.ExtendForm extends Locmare.FormBase
     # 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