OSDN Git Service

fix:
authoryasushiito <yas@pen-chan.jp>
Sat, 2 May 2015 09:23:34 +0000 (18:23 +0900)
committeryasushiito <yas@pen-chan.jp>
Sat, 2 May 2015 09:23:34 +0000 (18:23 +0900)
29 files changed:
app/assets/javascripts/controllers/artists.js.coffee
app/assets/javascripts/controllers/authors.js.coffee
app/assets/javascripts/controllers/comic_stories.js.coffee
app/assets/javascripts/controllers/comics.js.coffee
app/assets/javascripts/controllers/licenses.js.coffee
app/assets/javascripts/controllers/original_pictures.js.coffee
app/assets/javascripts/controllers/panels.js.coffee
app/assets/javascripts/controllers/scroll_panels.js.coffee
app/assets/javascripts/controllers/scrolls.js.coffee
app/assets/javascripts/controllers/sheet_panels.js.coffee
app/assets/javascripts/controllers/sheets.js.coffee
app/assets/javascripts/controllers/speech_balloon_templates.js.coffee
app/assets/javascripts/controllers/stories.js.coffee
app/assets/javascripts/controllers/story_sheets.js.coffee
app/assets/javascripts/controllers/writing_formats.js.coffee
app/assets/javascripts/editor.js.coffee
app/assets/javascripts/editor/panel_editor.js.coffee
app/assets/javascripts/editor/panel_editor/dock.js.coffee
app/assets/javascripts/editor/panel_editor/element.js.coffee
app/assets/javascripts/editor/panel_editor/element/boards.js.coffee
app/assets/javascripts/locmare/form.js.coffee
app/assets/javascripts/locmare/list_group/lib/pager.js.coffee
app/assets/javascripts/locmare/profiler/association/has_many.js.coffee
app/assets/javascripts/peta/element_nestable_content.js.coffee
app/assets/javascripts/views/artists/show.js.coffee
app/assets/javascripts/views/ground_colors/symbol.js.coffee
app/assets/javascripts/views/panels/body.js.coffee
app/assets/javascripts/views/users/account.js.coffee
app/models/speech_balloon.rb

index 25b031c..96c8caf 100644 (file)
@@ -49,7 +49,7 @@ class Pettanr.ArtistsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 0773e36..1a961ed 100644 (file)
@@ -49,7 +49,7 @@ class Pettanr.AuthorsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 7e89cd5..5cc0c33 100644 (file)
@@ -66,7 +66,7 @@ class Pettanr.ComicStoriesController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 6f95cdc..140995e 100644 (file)
@@ -78,7 +78,7 @@ class Pettanr.ComicsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index fcb93a3..a76eff8 100644 (file)
@@ -59,7 +59,7 @@ class Pettanr.LicensesController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 23c8576..ec2c950 100644 (file)
@@ -50,7 +50,7 @@ class Pettanr.OriginalPicturesController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 86e5049..9158499 100644 (file)
@@ -85,7 +85,7 @@ class Pettanr.PanelsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index f39efac..4d1ca1e 100644 (file)
@@ -66,7 +66,7 @@ class Pettanr.ScrollPanelsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 2d68aa3..3dadc42 100644 (file)
@@ -75,7 +75,7 @@ class Pettanr.ScrollsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index de1ea60..2015fb0 100644 (file)
@@ -66,7 +66,7 @@ class Pettanr.SheetPanelsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 8c1e83b..cb1fc42 100644 (file)
@@ -81,7 +81,7 @@ class Pettanr.SheetsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index fafec5a..bc3170e 100644 (file)
@@ -59,7 +59,7 @@ class Pettanr.SpeechBalloonTemplatesController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 0f82e0a..bef042f 100644 (file)
@@ -83,7 +83,7 @@ class Pettanr.StoriesController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 79e21cd..489de17 100644 (file)
@@ -66,7 +66,7 @@ class Pettanr.StorySheetsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index 8c52bef..f45a395 100644 (file)
@@ -54,7 +54,7 @@ class Pettanr.WritingFormatsController extends Pettanr.AppController
   destroy: () ->\r
     @set_show(@render_destroy)\r
   \r
-  render_destroy: () ->\r
+  render_destroy: (@item) ->\r
     @listenTo(@item, 'destroy:success', @destroy_success)\r
     @listenTo(@item, 'destroy:fail', @destroy_fail)\r
     @item.destroy()\r
index b965be5..5ad022a 100644 (file)
@@ -13,6 +13,9 @@ class Editor.EditorModule.DockBase extends Backbone.View
     tab.body = body\r
     tab\r
   \r
+  remove_tab: (index) ->\r
+    @tabs.splice(index, 1)\r
+  \r
   root_item: () ->\r
     @parent.root_item()\r
   \r
@@ -246,6 +249,7 @@ class Editor.EditorModule.DockModule.TabModule.BoardLabel extends Editor.EditorM
     })\r
     this.$el.append(linked_elements_tab.render().el)\r
     @destroy_button = new Editor.EditorModule.DestroyButton()\r
+    @listenTo(@destroy_button, 'destroy', @destroy)\r
     this.$el.append(@destroy_button.render().el)\r
   \r
   render: () ->\r
@@ -255,6 +259,9 @@ class Editor.EditorModule.DockModule.TabModule.BoardLabel extends Editor.EditorM
     @face()\r
     this\r
   \r
+  destroy: () ->\r
+    @trigger('destroy', @element())\r
+  \r
 class Editor.EditorModule.DockModule.TabModule.BoardBody extends Editor.EditorModule.DockModule.TabModule.Body\r
   board: () ->\r
     @parent\r
@@ -283,8 +290,12 @@ class Editor.EditorModule.DestroyButton extends Backbone.View
       }, \r
       text: false\r
     }\r
+    @delegateEvents({'click': @click})\r
     this\r
   \r
   dom_id: () ->\r
     @dom_id() + '-destroy_button'\r
   \r
+  click: () ->\r
+    @trigger('destroy')\r
+  \r
index 1e148a6..ddf3885 100644 (file)
@@ -21,6 +21,7 @@ class Editor.PanelEditor extends Backbone.View
     @listenTo(@dock, 'save:fail', @post_fail)\r
     @listenTo(@dock, 'add:element', @add_element)\r
     @listenTo(@dock, 'add:credit', @add_credit)\r
+    @listenTo(@dock, 'destroy', @destroy)\r
   \r
   add_element: (element) ->\r
     @body.add_element(element)\r
@@ -28,6 +29,9 @@ class Editor.PanelEditor extends Backbone.View
   add_credit: (element) ->\r
     @credits.add_picture(element.picture())\r
   \r
+  destroy: (element, index) ->\r
+    @remove_element(element)\r
+  \r
   remove_element: (element) ->\r
     @body.remove_element(element)\r
   \r
index bb2b3d2..8549d8b 100644 (file)
@@ -45,6 +45,7 @@ class Editor.PanelEditor.Dock extends Editor.EditorModule.DockBase
     @listenTo(@root_bay.body, 'save:fail', @post_fail)\r
     @listenTo(@element_bay, 'add:credit', @add_credit)\r
     @listenTo(@element_bay, 'pick', @pick)\r
+    @listenTo(@element_bay, 'destroy', @destroy)\r
   \r
   render: () ->\r
     this.$el.html('')\r
@@ -103,6 +104,9 @@ class Editor.PanelEditor.Dock extends Editor.EditorModule.DockBase
     @scenario_bay.add_element(new_item)\r
     @trigger('add:element', new_item)\r
   \r
+  destroy: (element) ->\r
+    @trigger('destroy', element)\r
+  \r
   quit: () ->\r
     @root_bay.body.form.quit()\r
   \r
index 10c8314..8eb4dbf 100644 (file)
@@ -6,6 +6,7 @@ class Editor.EditorModule.DockModule.ElementBay extends Editor.EditorModule.Dock
       parent: this\r
     })\r
     @listenTo(@boards, 'sorted', @sorted)\r
+    @removed_elements = []\r
   \r
   add_element: (element) ->\r
     index = @tabs.length\r
@@ -13,26 +14,57 @@ class Editor.EditorModule.DockModule.ElementBay extends Editor.EditorModule.Dock
     tab = new Editor.EditorModule.DockModule.ElementBoard({\r
       parent: this, index: index, name: element.item_name(), element: element\r
     })\r
+    bl = new Editor.EditorModule.DockModule.TabModule.ElementBoardLabel({\r
+      parent: tab, \r
+      name: element.item_name()\r
+    })\r
     bb = new Editor.EditorModule.DockModule.TabModule.ElementBoardBody({parent: tab})\r
-    @add_tab(\r
-      tab, \r
-      new Editor.EditorModule.DockModule.TabModule.ElementBoardLabel({\r
-        parent: tab, \r
-        name: element.item_name()\r
-      }), \r
-      bb\r
-    )\r
+    @listenTo(bl, 'destroy', @destroy)\r
+    @add_tab(tab, bl, bb)\r
     @boards.add_element_tab(tab)\r
     @boards.$el.tabs('refresh')\r
     if element.constructor.has_picture()\r
       @trigger('add:credit', element)\r
   \r
+  remove_element: (element) ->\r
+    if !element.isNew()\r
+      element.set({_destroy: true}, {silent: true})\r
+      @removed_elements.push element\r
+    t = null\r
+    _.each @tabs, (tab) =>\r
+      if tab.element\r
+        if tab.element.cid == element.cid\r
+          t = tab\r
+          return\r
+    t.label.remove()\r
+    # t.body.form.remove_elements()\r
+    t.body.remove()\r
+    @remove_tab(t.index)\r
+    @unshift_z()\r
+  \r
   shift_z: () ->\r
     new_tab_z = @new_tab.label.z()\r
     _.each @tabs, (tab) ->\r
       z = tab.label.z()\r
       tab.label.$el.attr('data-z', z + 1) if z >= new_tab_z  # new tab too\r
   \r
+  unshift_z: () ->\r
+    @boards.labels.reorder()\r
+    new_tab_z = @new_tab.label.z()\r
+    index = 0\r
+    _.each @tabs, (tab) ->\r
+      z = tab.label.z()\r
+      tab.label.$el.attr('data-z', z + 1) if z >= new_tab_z  # new tab too\r
+      tab.index = index\r
+      index++\r
+    t = 0\r
+    _.each @tabs, (tab) =>\r
+      if tab.element\r
+        tab.element.set({\r
+          z: t + 1, t: t\r
+        }, {silent: true})\r
+        t++\r
+  \r
   add_new_tab: () ->\r
     @new_tab = new Editor.EditorModule.DockModule.NewElementBoard({\r
       parent: this, index: 0, name: 'new'\r
@@ -95,12 +127,20 @@ class Editor.EditorModule.DockModule.ElementBay extends Editor.EditorModule.Dock
       name = form.item.table_name() + '_attributes'\r
       attrs[name] ||= []\r
       attrs[name].push(form.save_data())\r
+    _.each @removed_elements, (element) ->\r
+      name = element.table_name() + '_attributes'\r
+      attrs[name] ||= []\r
+      attrs[name].push({id: element.get('id'), _destroy: true})\r
     attrs\r
   \r
   pick: (new_item) ->\r
     @add_element(new_item)\r
     @trigger('pick', new_item)\r
   \r
+  destroy: (element) ->\r
+    @remove_element(element)\r
+    @trigger('destroy', element)\r
+  \r
 class Editor.EditorModule.DockModule.TabModule.ElementBayLabel extends Editor.EditorModule.DockModule.TabModule.BayLabel\r
   \r
 class Editor.EditorModule.DockModule.TabModule.ElementBayBody extends Editor.EditorModule.DockModule.TabModule.BayBody\r
index 0d1d3a4..0cf6101 100644 (file)
@@ -47,10 +47,7 @@ class Editor.EditorModule.DockModule.ElementBay.Labels extends Backbone.View
           label.destroy_button.render()\r
     this.$el.sortable {\r
       update: (event, ui) ->\r
-        z = 0\r
-        $('li', $(@)).map ->\r
-          $(@).attr('data-z', z)\r
-          z++\r
+        _this.reorder()\r
         _this.trigger('sorted')\r
     }\r
     this\r
@@ -64,3 +61,9 @@ class Editor.EditorModule.DockModule.ElementBay.Labels extends Backbone.View
   bay: () ->\r
     @parent.parent\r
   \r
+  reorder: () ->\r
+    z = 0\r
+    $('li', this.$el).map ->\r
+      $(@).attr('data-z', z)\r
+      z++\r
+  \r
index 65a30e9..c294c1f 100644 (file)
@@ -126,6 +126,11 @@ class Locmare.Form extends Locmare.FormBase
       @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
     _.each @manifest.field_names, (field_name) =>\r
       field_manifest = @manifest.fields[field_name]\r
index f1010da..8d9d5cb 100644 (file)
@@ -3,7 +3,8 @@ class Locmare.ListGroupModule.LibModule.Pager
     pagers = {\r
       default: Locmare.ListGroupModule.LibModule.PagerModule.Default,\r
       offset: Locmare.ListGroupModule.LibModule.PagerModule.Offset,\r
-      unlimited: Locmare.ListGroupModule.LibModule.PagerModule.Unlimited\r
+      unlimited: Locmare.ListGroupModule.LibModule.PagerModule.Unlimited,\r
+      more: Locmare.ListGroupModule.LibModule.PagerModule.More\r
     }\r
     c = pagers[page_status.type]\r
     return null if not page_status.total_page\r
@@ -181,3 +182,30 @@ class Locmare.ListGroupModule.LibModule.PagerModule.LastPage extends Locmare.Lis
   content: () ->\r
     '>>'\r
   \r
+class Locmare.ListGroupModule.LibModule.PagerModule.More extends Backbone.View\r
+  tagName: 'div'\r
+  className: 'pagination'\r
+  \r
+  initialize: (options) ->\r
+    @params = options.params\r
+    \r
+    @controller = Manifest.manifest().controllers[@params['controller']]\r
+    @action = @controller.actions[@params['action']]\r
+    @action = @action.original if @action.original\r
+  \r
+  render: () ->\r
+    this.$el.html('')\r
+    linked_caption = new Tag.A({\r
+      attr: {href: '/' + @url()}, \r
+      content: 'More...'\r
+    })\r
+    @listenTo(linked_caption, 'click', @click)\r
+    this.$el.html(linked_caption.render().el)\r
+    this\r
+  \r
+  url: () ->\r
+    @action.url @params\r
+  \r
+  click: () ->\r
+    @trigger('http_get', @url())\r
+  \r
index 1805c60..64c4f36 100644 (file)
@@ -11,6 +11,9 @@ class Locmare.ProfilerModule.AssociationModule.HasMany extends Backbone.View
       action.path_name(), action.name, \r
       {id: @item().get('id'), page: 1, page_size: 3}\r
     )\r
+    @pager = new Locmare.ListGroupModule.LibModule.PagerModule.More({\r
+      params: {controller: action.path_name(), action: action.name, id: @item().get('id')}\r
+    })\r
   \r
   clear: () ->\r
     this.$el.html('')\r
index b28fdcd..2087526 100644 (file)
@@ -84,13 +84,20 @@ class Peta.ElementNestableContent extends Peta.Content
         elements.release()\r
   \r
   fix_elements: () ->\r
+    return \r
     _.each @attributes, (elements, name) =>\r
       if _.isArray(elements)\r
         # has many association\r
         model = @my_class().my_manifest().associations.has_many[name].model()\r
         _.each elements, (element) =>\r
-          element.fix()\r
+          if @has('_destroy')\r
+            element.release()  # destroy element by editor\r
+          else\r
+            element.fix()\r
       else if _.isObject(elements)\r
         # has one association\r
-        elements.fix()\r
+        if @has('_destroy')\r
+          element.release()\r
+        else\r
+          element.fix()\r
   \r
index f0f2b74..33f646b 100644 (file)
@@ -1,9 +1,55 @@
+class Pettanr.Views.Artist.ShowModule\r
+class Pettanr.Views.Artist.ShowModule.Header extends Pettanr.Views.Show.Header\r
+  \r
+  initialize: (options) ->\r
+    super(options)\r
+  \r
+class Pettanr.Views.Artist.ShowModule.Body extends Backbone.View\r
+  \r
+  initialize: (options) ->\r
+    super(options)\r
+    @item = options.item\r
+  \r
+  render: () ->\r
+    this.$el.html('')\r
+    resource_pictures_params = {controller: 'resource_pictures', action: 'by_artist', id: @item.get('id')}\r
+    resource_pictures_controller = Manifest.manifest().controllers[resource_pictures_params['controller']]\r
+    resource_pictures_action = resource_pictures_controller.actions[resource_pictures_params['action']]\r
+    @resource_pictures_url = resource_pictures_action.url(resource_pictures_params)\r
+    @resource_pictures_caption = new Tag.A({\r
+      attr: {href: '/' + @resource_pictures_url},\r
+      content: Pettanr.AppHelper.t_m('ResourcePicture')\r
+    })\r
+    @listenTo(@resource_pictures_caption, 'click', @click_resource_pictures_caption)\r
+    this.$el.append(@resource_pictures_caption.render().el)\r
+    this\r
+  \r
+  click_resource_pictures_caption: () ->\r
+    @trigger('http_get', @resource_pictures_url)\r
+  \r
 class Pettanr.Views.Artist.Show extends Backbone.View\r
   tagName: 'div'\r
   \r
   initialize: (options) ->\r
+    @item = options.item\r
+    @header = new Pettanr.Views.Artist.ShowModule.Header({\r
+      item: @item, \r
+      caption: @item.get('name'), \r
+      icon_url: @item.show_url(),\r
+      caption_url: @item.show_url(),\r
+      prof_url: @item.prof_url()\r
+    })\r
+    @body = new Pettanr.Views.Artist.ShowModule.Body({\r
+      item: @item, \r
+    })\r
+    @listenTo(@body, 'http_get', @http_get)\r
   \r
   render: () ->\r
     this.$el.html('')\r
+    this.$el.append(@header.render().el)\r
+    this.$el.append(@body.render().el)\r
     this\r
   \r
+  http_get: (url) ->\r
+    @trigger('http_get', url)\r
+  \r
index 24c30a8..42ccff4 100644 (file)
@@ -11,16 +11,12 @@ class Pettanr.Views.GroundColor.Symbol extends Backbone.View
   \r
   render: () ->\r
     this.$el.addClass(@class_name)\r
-    linked_caption = new Tag.A({\r
-      attr: {href: '/' + @item.show_url()}, \r
-      content: @bg_color()\r
-    })\r
-    @listenTo(linked_caption, 'click', @click)\r
-    this.$el.html(linked_caption.render().el)\r
+    this.$el.html(@bg_color())\r
     attr = {\r
       style: Pettanr.to_style(@style())\r
     }\r
     this.$el.attr(attr)\r
+    @delegateEvents({'click': @click})\r
     this\r
   \r
   fore_color: () ->\r
index 065490a..3de98bb 100644 (file)
@@ -43,6 +43,11 @@ class Pettanr.Views.Panel.Body extends Backbone.View
       view.render()\r
     view\r
   \r
+  remove_element: (element) ->\r
+    _.each @views, (view) =>\r
+      if view.element.cid == element.cid\r
+        view.remove()\r
+  \r
   element_class: (element) ->\r
     Pettanr.Views[element.singular()].Element\r
   \r
index 5acf90d..e6a2d2e 100644 (file)
@@ -4,7 +4,7 @@ class Pettanr.Views.User.Account extends Backbone.View
   \r
   initialize: (options) ->\r
     @author = Pettanr.cache.operators.author\r
-    @artis = Pettanr.cache.operators.artist\r
+    @artist = Pettanr.cache.operators.artist\r
   \r
   render: () ->\r
     this.$el.html('')\r
index 0289e59..5f7c63d 100644 (file)
@@ -5,8 +5,8 @@ class SpeechBalloon < Peta::Element
   belongs_to :speech_balloon_template
   belongs_to :panel
   
-  accepts_nested_attributes_for :balloon
-  accepts_nested_attributes_for :speech
+  accepts_nested_attributes_for :balloon, :allow_destroy => true
+  accepts_nested_attributes_for :speech, :allow_destroy => true
   
   validates :panel_id, :numericality => {:allow_blank => true}
   validates :speech_balloon_template_id, :presence => true, :numericality => true, :existence => {:both => false}