OSDN Git Service

fix form
authoryasushiito <yas@pen-chan.jp>
Tue, 11 Feb 2014 23:44:10 +0000 (08:44 +0900)
committeryasushiito <yas@pen-chan.jp>
Tue, 11 Feb 2014 23:44:10 +0000 (08:44 +0900)
75 files changed:
app/assets/javascripts/manifest/work/controllers.js.coffee.erb
app/assets/javascripts/manifest/work/forms.js.coffee.erb
app/controllers/application_controller.rb
app/controllers/scrolls_controller.rb
app/models/artist.rb
app/models/author.rb
app/models/balloon.rb
app/models/comic.rb
app/models/ground_color.rb
app/models/ground_picture.rb
app/models/license.rb
app/models/license_group.rb
app/models/original_picture.rb
app/models/panel.rb
app/models/panel_picture.rb
app/models/picture.rb
app/models/resource_picture.rb
app/models/scroll.rb
app/models/scroll_panel.rb
app/models/sheet.rb
app/models/sheet_panel.rb
app/models/speech.rb
app/models/speech_balloon.rb
app/models/speech_balloon_template.rb
app/models/story.rb
app/models/story_sheet.rb
app/models/system_picture.rb
app/models/writing_format.rb
app/views/scrolls/new.html.erb
app/views/templates/r/form/_fields.html.erb [new file with mode: 0644]
app/views/templates/r/form/_form.html.erb
app/views/templates/r/form/field/_element.html.erb [moved from app/views/templates/r/form/_field.html.erb with 81% similarity]
app/views/templates/r/form/form.html.erb [new file with mode: 0644]
app/views/templates/r/form/label/_default.html.erb
app/views/templates/r/form/label_row_break/_break.html.erb [new file with mode: 0644]
app/views/templates/r/form/label_row_break/_no_break.html.erb [new file with mode: 0644]
app/views/templates/r/form/row_break/_break.html.erb [new file with mode: 0644]
app/views/templates/r/form/row_break/_no_break.html.erb [new file with mode: 0644]
app/views/templates/r/form/tag/_text.html.erb [new file with mode: 0644]
config/environment.rb
config/environments/development.rb
lib/content.rb [deleted file]
lib/element.rb [deleted file]
lib/element_part.rb [deleted file]
lib/item.rb [deleted file]
lib/manifest/controller/action.rb
lib/manifest/controller/action/new.rb [new file with mode: 0644]
lib/manifest/form.rb
lib/manifest/form/field/field.rb
lib/manifest/form/field/helper.rb
lib/manifest/form/field/helper/helper.rb
lib/manifest/form/field/label/label.rb
lib/manifest/form/field/tag/base.rb
lib/manifest/local/view/filer/body/file_body/file_item/none.rb [deleted file]
lib/manifest/local/view/filer/body/file_body/file_item/show.rb [deleted file]
lib/manifest/local/view/form.rb
lib/manifest/local/view/form/field.rb
lib/manifest/local/view/form/field/label.rb
lib/manifest/local/view/form/field/label/label.rb
lib/manifest/local/view/form/field/tag.rb
lib/manifest/local/view/form/field/tag/base.rb
lib/manifest/local/view/form/field/tag/hidden.rb
lib/manifest/local/view/form/field/tag/number.rb
lib/manifest/local/view/form/field/tag/select.rb
lib/manifest/local/view/form/field/tag/text.rb
lib/manifest/local/view/form/field/tag/text_area.rb
lib/manifest/model.rb
lib/owner.rb [deleted file]
lib/peta.rb [new file with mode: 0644]
lib/peta/content.rb [new file with mode: 0644]
lib/peta/element.rb [new file with mode: 0644]
lib/peta/element_part.rb [new file with mode: 0644]
lib/peta/item.rb [new file with mode: 0644]
lib/peta/owner.rb [new file with mode: 0644]
public/manifest.json

index 013fe6c..3eaf78c 100644 (file)
@@ -36,6 +36,9 @@
       count_by_panel: {\r
         type: 'count',\r
       },\r
+      new: {\r
+        type: 'new',\r
+      },\r
     },\r
   },\r
   scroll_panels: {\r
index 435ba73..52793ee 100644 (file)
 ]\r
 @forms = {\r
   base: {\r
+    scroll: {\r
+      fields: {\r
+        title: {\r
+          args: {\r
+            column: 'title',\r
+            label: {\r
+            },\r
+            tag: {\r
+              type: 'text',\r
+            },\r
+            row_break: true,\r
+          },\r
+        },\r
+        description: {\r
+          args: {\r
+            column: 'description',\r
+            label: {\r
+            },\r
+            tag: {\r
+              type: 'text_area',\r
+              args: {\r
+                options: {\r
+                  size: 5, \r
+                },\r
+              },\r
+            },\r
+          },\r
+        },\r
+        visible: {\r
+          args: {\r
+            column: 'visible',\r
+            label: {\r
+            },\r
+            tag: {\r
+              type: 'select',\r
+            },\r
+            row_break: true,\r
+          },\r
+        },\r
+        id: {\r
+          args: {\r
+            column: 'id',\r
+            label: {\r
+              type: 'none',\r
+            },\r
+            tag: {\r
+              type: 'hidden',\r
+            },\r
+          },\r
+        },\r
+        author_id: {\r
+          args: {\r
+            column: 'author_id',\r
+            label: {\r
+              type: 'none',\r
+            },\r
+            tag: {\r
+              type: 'hidden',\r
+            },\r
+          },\r
+        },\r
+      },\r
+      field_names: [\r
+        'title',\r
+        'description',\r
+        'visible',\r
+        'id',\r
+        'author_id',\r
+      ]\r
+    },\r
     panel: {\r
       fields: {\r
         caption: {\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               }, \r
             },\r
             row_break: true, \r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             row_break: true,\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             helpers: {\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               }, \r
             },\r
             helpers: {\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             helpers: {\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             row_break: true,\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             row_break: true,\r
             tag: {\r
               type: 'text',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'text_area',\r
               args: {\r
-                size: '45x5', \r
+                options: {\r
+                  size: '45x5', \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
             row_break: true,\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               },\r
             },\r
           },\r
             tag: {\r
               type: 'number',\r
               args: {\r
-                size: 5, \r
+                options: {\r
+                  size: 5, \r
+                },\r
               }\r
             },\r
             row_break: true,\r
index 48481d6..fed89b0 100644 (file)
@@ -108,13 +108,18 @@ class ApplicationController < ActionController::Base
     Manifest.manifest.profiler_managers[self.model.item_name]
   end
   
+  def set_model
+    @my_controller = Manifest.manifest.controllers[params[:controller].to_s]
+    @my_action = @my_controller.actions[params[:action].to_s]
+    @my_model = Manifest.manifest.models[@my_action.item_name]
+    @my_model_class = @my_model.classify
+  end
+  
   def set_list
-    my_controller = Manifest.manifest.controllers[params[:controller].to_s]
-    my_action = my_controller.actions[params[:action].to_s]
-    my_model = Manifest.manifest.models[my_action.item_name]
-    my_model_list = my_model.lists[my_action.list_name]
-    my_list = Manifest.manifest.lists[my_action.item_name]
-    @list = my_list[my_action.list_name]
+    set_model
+    @my_model_list = @my_model.lists[@my_action.list_name]
+    @my_list = Manifest.manifest.lists[@my_action.item_name]
+    @list = @my_list[@my_action.list_name]
   end
   
   def filer_list
@@ -134,6 +139,22 @@ class ApplicationController < ActionController::Base
     end
   end
   
+  def form_new
+    set_model
+    @item = @my_model_class.new
+    @item.supply_default
+    respond_to do |format|
+      format.html { 
+        @form = Manifest::View::Form.new @item.item_name, @item, true, @operators
+        render @form.template_name, :locals => {
+          :form => @form
+        }
+      }
+      format.js
+      format.json { render json: @item.to_json(@my_model_class.show_json_opt) }
+    end
+  end
+  
   def list_count
     set_list
     j = {:count => @list.count(@operators, {:id => params[:id]})}
index 8e271c5..33bb1f6 100644 (file)
@@ -73,13 +73,7 @@ class ScrollsController < ApplicationController
   end
   
   def new
-    @scroll = Scroll.new
-    @scroll.supply_default
-    respond_to do |format|
-      format.html
-      format.js
-      format.json { render json: @scroll.to_json(Scroll.show_json_opt) }
-    end
+    form_new
   end
 
   def edit
index 3806133..04a6edf 100644 (file)
@@ -1,4 +1,4 @@
-class Artist < Pettanr::Owner
+class Artist < Peta::Owner
   belongs_to :user
   has_many :original_pictures
   has_many :pictures
index 2ea5368..e571bc3 100644 (file)
@@ -1,4 +1,4 @@
-class Author < Pettanr::Owner
+class Author < Peta::Owner
   belongs_to :user
   has_many :scrolls
   has_many :comics
index 7f50e80..ad9bbe4 100644 (file)
@@ -1,5 +1,5 @@
-class Balloon < Pettanr::Content
-  include ElementPart
+class Balloon < Peta::Content
+  include Peta::ElementPart
   belongs_to :speech_balloon
   belongs_to :system_picture
   
index 40bfeb8..9664ded 100644 (file)
@@ -1,5 +1,5 @@
 #コミック
-class Comic < Pettanr::Content
+class Comic < Peta::Content
   has_many :stories, :order => 't'
   belongs_to :author
   
index ea59cc4..85f0dc2 100644 (file)
@@ -1,5 +1,5 @@
-class GroundColor < Pettanr::Content
-  include Element
+class GroundColor < Peta::Content
+  include Peta::Element
   include ElementInspire
   belongs_to :panel
   belongs_to :color
index 0959c61..f356aa2 100644 (file)
@@ -1,5 +1,5 @@
-class GroundPicture < Pettanr::Content
-  include Element
+class GroundPicture < Peta::Content
+  include Peta::Element
   include ElementInspire
   belongs_to :panel
   belongs_to :picture
index ffb4b3b..fc264af 100644 (file)
@@ -1,5 +1,5 @@
 #
-class License < Pettanr::Item
+class License < Peta::Item
   belongs_to :license_group
   belongs_to :system_picture
   has_many :resource_pictures
index 42402ed..34c66ab 100644 (file)
@@ -1,5 +1,5 @@
 #ライセンスグループ
-class LicenseGroup < Pettanr::Item
+class LicenseGroup < Peta::Item
   has_many :licenses
   
   validates :name, :presence => true, :length => {:maximum => 50}, :uniqueness => true
index f29212c..3215627 100644 (file)
@@ -1,4 +1,4 @@
-class OriginalPicture < Pettanr::Content
+class OriginalPicture < Peta::Content
   belongs_to :artist
   belongs_to :original_picture_license_group
   has_one :resource_picture
index 137b2c0..28029ed 100644 (file)
@@ -1,5 +1,5 @@
 #コマ
-class Panel < Pettanr::Content
+class Panel < Peta::Content
   belongs_to :author
   has_many :scroll_panels
   has_many :sheet_panels
index e74806c..0e05933 100644 (file)
@@ -1,5 +1,5 @@
-class PanelPicture < Pettanr::Content
-  include Element
+class PanelPicture < Peta::Content
+  include Peta::Element
   include ElementInspire
   belongs_to :panel
   belongs_to :picture
index 89b95fb..255d932 100644 (file)
@@ -1,5 +1,5 @@
 #実素材
-class Picture < Pettanr::Content
+class Picture < Peta::Content
   belongs_to :original_picture
   belongs_to :license
   belongs_to :artist
index 34c3a40..fe6812d 100644 (file)
@@ -1,5 +1,5 @@
 #素材
-class ResourcePicture < Pettanr::Content
+class ResourcePicture < Peta::Content
   belongs_to :artist
   belongs_to :license
   belongs_to :picture
index 395a84f..ab8e658 100644 (file)
@@ -1,4 +1,4 @@
-class Scroll < Pettanr::Content
+class Scroll < Peta::Content
   has_many :scroll_panels
   belongs_to :author
   
@@ -52,6 +52,11 @@ class Scroll < Pettanr::Content
     {:include => {:scroll_panels => {:include => {:panel => {}}}, :author => {}}}
   end
   
+  def tag_attributes column = nil, opt = {}
+    {
+    }
+  end
+  
   def self.visible_count
     Scroll.count 'visible > 0'
   end
index 9ff9fc2..78e1cb6 100644 (file)
@@ -1,4 +1,4 @@
-class ScrollPanel < Pettanr::Content
+class ScrollPanel < Peta::Content
   belongs_to :author
   belongs_to :panel
   belongs_to :scroll
index 3161dab..269dd21 100644 (file)
@@ -1,4 +1,4 @@
-class Sheet < Pettanr::Content
+class Sheet < Peta::Content
   has_many :sheet_panels
   has_many :story_sheets
   belongs_to :author
index b3abfe6..66373fa 100644 (file)
@@ -1,4 +1,4 @@
-class SheetPanel < Pettanr::Content
+class SheetPanel < Peta::Content
   belongs_to :author
   belongs_to :panel
   belongs_to :sheet
index 82e99c4..c6d0cf8 100644 (file)
@@ -1,5 +1,5 @@
-class Speech < Pettanr::Content
-  include ElementPart
+class Speech < Peta::Content
+  include Peta::ElementPart
   belongs_to :speech_balloon
   belongs_to :writing_format
   
index a46b02d..dde1ed1 100644 (file)
@@ -1,5 +1,5 @@
-class SpeechBalloon < Pettanr::Content
-  include Element
+class SpeechBalloon < Peta::Content
+  include Peta::Element
   include ElementInspire
   has_one :balloon, :dependent => :destroy
   has_one :speech, :dependent => :destroy
index e04ef29..65d4908 100644 (file)
@@ -1,5 +1,5 @@
 #フキダシテンプレート
-class SpeechBalloonTemplate < Pettanr::Item
+class SpeechBalloonTemplate < Peta::Item
   has_many :speech_balloons
   belongs_to :system_picture
   
index 899ff12..a3894f2 100644 (file)
@@ -1,5 +1,5 @@
 #ストーリー
-class Story < Pettanr::Content
+class Story < Peta::Content
   has_many :story_sheets
   belongs_to :comic
   
index 65be87a..f6e877c 100644 (file)
@@ -1,4 +1,4 @@
-class StorySheet < Pettanr::Content
+class StorySheet < Peta::Content
   belongs_to :author
   belongs_to :story
   belongs_to :sheet
index b89e595..19226a5 100644 (file)
@@ -1,4 +1,4 @@
-class SystemPicture < Pettanr::Item
+class SystemPicture < Peta::Item
   has_many :balloons
   has_many :speech_balloon_templates
   has_many :licenses
index 5dc12c1..97965f6 100644 (file)
@@ -1,4 +1,4 @@
-class WritingFormat < Pettanr::Item
+class WritingFormat < Peta::Item
   has_many :speeches
   belongs_to :system_picture
   
index 2b0b2ef..e69de29 100644 (file)
@@ -1,5 +0,0 @@
-<h1><%= t('.title') %></h1>
-
-<%= render 'form' %>
-
-<%= link_to t('link.back'), scrolls_path %>
diff --git a/app/views/templates/r/form/_fields.html.erb b/app/views/templates/r/form/_fields.html.erb
new file mode 100644 (file)
index 0000000..15b510e
--- /dev/null
@@ -0,0 +1,5 @@
+<div class="fields">
+  <% form.each_field do |field_name, field| %>
+    <%= render field.template_name, :field => field %>
+  <% end %>
+</div>
index fb8ca18..6a97d60 100644 (file)
@@ -1,6 +1,3 @@
-<%= form_for(form.element, :html => form.element.tag_attributes('form', 'data-form-name' => form.name)) do |f| %>
-  <% form.each_field do |field| %>
-    <%= render field.template_name, :field => field %>
-    <%= render field.row_break.template_name, :row_break => field.row_break %>
-  <% end %>
+<%= form_for(form.item, :html => form.item.tag_attributes('form', 'data-form-name' => form.form_name)) do |f| %>
+  <%= render form.fields_template_name, :form => form %>
 <% end %>
@@ -5,3 +5,4 @@
     <%= render helper.template_name, :helper => helper %>
   <% end %>
 </div>
+<%= render field.row_break_template_name, :field => field %>
diff --git a/app/views/templates/r/form/form.html.erb b/app/views/templates/r/form/form.html.erb
new file mode 100644 (file)
index 0000000..4757c00
--- /dev/null
@@ -0,0 +1 @@
+<%= render form.template_name, :form => form %>
index 04d7b26..4732c28 100644 (file)
@@ -1,6 +1,4 @@
 <label>
-<%= field.label self %>
-<% if field.label_break? %>
-  <br>
-<% end %>
+  <%= t label.label_name %>
+  <%= render label.label_row_break_template_name, :label => label %>
 </label>
diff --git a/app/views/templates/r/form/label_row_break/_break.html.erb b/app/views/templates/r/form/label_row_break/_break.html.erb
new file mode 100644 (file)
index 0000000..b6ac048
--- /dev/null
@@ -0,0 +1 @@
+<br>\r
diff --git a/app/views/templates/r/form/label_row_break/_no_break.html.erb b/app/views/templates/r/form/label_row_break/_no_break.html.erb
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/app/views/templates/r/form/row_break/_break.html.erb b/app/views/templates/r/form/row_break/_break.html.erb
new file mode 100644 (file)
index 0000000..b6ac048
--- /dev/null
@@ -0,0 +1 @@
+<br>\r
diff --git a/app/views/templates/r/form/row_break/_no_break.html.erb b/app/views/templates/r/form/row_break/_no_break.html.erb
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/app/views/templates/r/form/tag/_text.html.erb b/app/views/templates/r/form/tag/_text.html.erb
new file mode 100644 (file)
index 0000000..7622d7e
--- /dev/null
@@ -0,0 +1 @@
+<%= text_field_tag tag.form_field_name, tag.value, tag.field_tag_attributes %>
index eade980..3797f80 100644 (file)
@@ -10,11 +10,7 @@ require 'ar_helper'
 require 'operator'
 require 'import_result'
 require 'common'
-require 'item'
-require 'owner'
-require 'content'
-require 'element'
-require 'element_part'
+require 'peta'
 # Initialize the rails application
 Pettanr::Application.initialize!
 require_dependency 'manifest'
index ce877c6..4b6668d 100644 (file)
@@ -3,6 +3,7 @@ Pettanr::Application.configure do
   ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor' 
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Manifest' 
+  ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Peta' 
   # Settings specified here will take precedence over those in config/application.rb
 
   # In the development environment your application's code is reloaded on
diff --git a/lib/content.rb b/lib/content.rb
deleted file mode 100644 (file)
index 45e0aaf..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-class Pettanr::Content < Pettanr::Item
-  self.abstract_class = true
-  # ClassMethods
-  
-  def self.owner_model
-    nil
-  end
-  
-  def self.owner_type
-    :author
-  end
-  
-  def self.content?
-    true
-  end
-  
-  def self.operator operators
-    case self.owner_type
-    when :author
-      operators.author
-    when :artist
-      operators.artist
-    else
-      nil
-    end
-  end
-  
-  def self.owner_column
-    self.owner_type.to_s + '_id'
-  end
-  
-  def self.edit content_id, operators
-    content = self.find content_id, self.show_opt
-    raise ActiveRecord::Forbidden unless content.own?(operators)
-    content
-  end
-  
-  #InstanceMethods
-  
-  def owner_model
-    self.class.owner_model ? self.__send__(self.class.owner_model.item_name) : self
-  end
-  
-  def visible? operators
-    super
-    return true if owner_model.own?(operators)
-    true
-  end
-  
-  def own? operators
-    operator = self.class.operator operators
-    return false unless operator
-    owner_model.attributes[self.class.owner_column] == operator.id
-  end
-  
-end
-
diff --git a/lib/element.rb b/lib/element.rb
deleted file mode 100644 (file)
index 3cfa688..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-module Element
-  def self.included(base)
-    base.extend(ClassMethods)
-    base.__send__ :include, InstanceMethods
-  end
-  
-  module ClassMethods
-    def colum_structures
-      raise
-    end
-    
-    def list_opt_for_panel
-      {}
-    end
-    
-    def show_opt_for_panel
-      {}
-    end
-    
-    def json_opt_for_panel
-      {}
-    end
-    
-    def path_name with_engine = false
-      self.to_s.tableize
-    end
-    
-  end
-  
-  module InstanceMethods
-    private
-    
-    public
-    
-    def has_picture?
-      false
-    end
-    
-    def has_part?
-      false
-    end
-    
-    def parts
-      @parts ||= []
-    end
-    
-    def has_helper? column_name
-      self.class.colum_structures[column_name] and self.class.colum_structures[column_name][:helper]
-    end
-    
-    def element_name
-      self.class.to_s.underscore
-    end
-    
-    def extend_column
-      nil
-    end
-    
-    def extend_element_name
-      self.extend_column ? self.attributes[extend_column] : self.element_name
-    end
-    
-    def find_configurations hash, key
-       if hash[key].is_a? String
-         self.find_configurations hash, hash[key]
-       else
-         return hash[key]
-       end
-    end
-    
-    def element_index
-      @element_index ||= self.t
-    end
-    
-    def parent
-      @parent ||= self.panel
-    end
-    
-    def parent= content
-      @parent = content
-    end
-    
-    def new_index
-      @new_index
-    end
-    
-    def new_index= v
-      @new_index = v
-    end
-    
-    def new_panel
-      @new_panel
-    end
-    
-    def new_panel= v
-      @new_panel = v
-    end
-    
-    def get_panel
-      self.panel || @new_panel
-    end
-    
-    def tag_id c = nil
-      'panel' + self.tag_panel_id + self.tag_element_type + self.tag_element_id + c.to_s
-    end
-    
-    def field_tag_id f
-      self.tag_id + f.to_s
-    end
-    
-    def tag_panel_id
-      self.get_panel.new_record? ? '0' : self.get_panel.id.to_s
-    end
-    
-    def tag_element_id
-      self.new_record? ? '0' : self.id.to_s
-    end
-    
-    def tag_element_type
-      raise
-    end
-    
-    def tag_new_index
-      self.new_index.to_s
-    end
-    
-    def path_name with_engine = false
-      self.class.path_name(with_engine)
-    end
-    
-    def form_template with_engine = false
-      self.path_name(with_engine) + '/form'
-    end
-    
-    def scenario_template with_engine = false
-      self.path_name(with_engine) + '/scenario'
-    end
-    
-    def element_face_template with_engine = false
-      self.path_name(with_engine) + '/element_face'
-    end
-    
-    def form_helper_template(colum_name)
-      self.class.colum_structures[colum_name][:helper]
-    end
-    
-    def tag_attributes column = nil, opt = {}
-      {
-        :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
-        :element_id => self.tag_element_id, :element_type => self.tag_element_type
-      }.merge(opt)
-    end
-    
-    def field_tag_attributes column, no_attr, opt = {}
-      self.tag_attributes(column).merge(
-        {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
-      ).merge(opt)
-    end
-    
-    #render element by body
-    def any_tag_attributes name = nil, opt = {}
-      r = self.tag_attributes(name)
-      r.merge!(
-        {:new_index => self.tag_new_index}
-      ) if self.new_index
-      r.merge(opt)
-    end
-    
-    def select_tag_attributes(selected, column, no_attr)
-      [
-        :last, :first, 
-        {:html => {:selected => selected}}, 
-        self.field_tag_attributes(column, no_attr)
-      ]
-    end
-    
-    def tag_attr column = nil, opt = {}
-      self.tag_attributes(column, opt).to_attr
-    end
-    
-    def field_tag_attr column, no_attr, opt = {}
-      self.field_tag_attributes(column, no_attr, opt).to_attr
-    end
-    
-    def any_tag_attr name = nil, opt = {}
-      self.any_tag_attributes(name, opt).to_attr
-    end
-    
-  end
-end
-
diff --git a/lib/element_part.rb b/lib/element_part.rb
deleted file mode 100644 (file)
index 0a1a69f..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-module ElementPart
-  def self.included(base)
-    base.extend(ClassMethods)
-    base.__send__ :include, InstanceMethods
-  end
-  
-  module ClassMethods
-    def colum_structures
-      raise
-    end
-    
-    def list_opt_for_panel
-      {}
-    end
-    
-    def show_opt_for_panel
-      {}
-    end
-    
-    def json_opt_for_panel
-      {}
-    end
-    
-    def path_name with_engine = false
-      self.to_s.tableize
-    end
-    
-  end
-  
-  module InstanceMethods
-    private
-    
-    public
-    
-    def has_picture?
-      false
-    end
-    
-    def has_helper? column_name
-      self.class.colum_structures[column_name] and self.class.colum_structures[column_name][:helper]
-    end
-    
-    def new_parent
-      @new_parent
-    end
-    
-    def new_parent= v
-      @new_parent = v
-    end
-    
-    def get_parent
-      raise
-    end
-    
-    def get_panel_id
-      if self.get_parent == nil or self.get_parent.panel == nil or self.get_parent.panel.new_record?
-        0
-      else
-        self.get_parent.panel.id
-      end
-    end
-    
-    def tag_id c = nil
-      'panel' + self.tag_panel_id + self.tag_element_type + self.tag_element_id + self.tag_element_part_type + self.tag_element_part_id + c.to_s
-    end
-    
-    def field_tag_id f
-      self.tag_id + f.to_s
-    end
-    
-    def tag_panel_id
-      self.get_panel_id.to_s
-    end
-    
-    def tag_element_id
-      r = if self.get_parent == nil or self.get_parent.new_record?
-        0
-      else
-        self.get_parent.id
-      end
-      r.to_s
-    end
-    
-    def tag_element_type
-      self.get_parent.tag_element_type
-    end
-    
-    def tag_element_part_id
-      self.new_record? ? '0' : self.id.to_s
-    end
-    
-    def tag_element_part_type
-      'speech'
-    end
-    
-    def tag_new_index
-      if self.get_parent == nil
-        nil
-      else
-        self.get_parent.tag_new_index
-      end
-    end
-    
-    def form_helper_template(colum_name)
-      self.class.colum_structures[colum_name][:helper]
-    end
-    
-    def tag_attributes column = nil, opt = {}
-      {
-        :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
-        :element_id => self.tag_element_id, :element_type => self.tag_element_type,
-        :element_part_id => self.tag_element_part_id, :element_part_type => self.tag_element_part_type
-      }.merge(opt)
-    end
-    
-    def field_tag_attributes column, no_attr, opt = {}
-      self.tag_attributes(column).merge(
-        {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
-      ).merge(opt)
-    end
-    
-    #render element by body
-    def any_tag_attributes name = nil, opt = {}
-      r = self.tag_attributes(name)
-      r.merge!(
-        {:new_index => self.tag_new_index}
-      ) if self.new_index
-      r.merge(opt)
-    end
-    
-    def select_tag_attributes(selected, column, no_attr)
-      [
-        :last, :first, 
-        {:html => {:selected => selected}}, 
-        self.field_tag_attributes(column, no_attr)
-      ]
-    end
-    
-    def tag_attr column = nil, opt = {}
-      self.tag_attributes(column, opt).to_attr
-    end
-    
-    def field_tag_attr column, no_attr, opt = {}
-      self.field_tag_attributes(column, no_attr, opt).to_attr
-    end
-    
-    def any_tag_attr name = nil, opt = {}
-      self.any_tag_attributes(name, opt).to_attr
-    end
-    
-  end
-end
-
diff --git a/lib/item.rb b/lib/item.rb
deleted file mode 100644 (file)
index d4b77c7..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-class Pettanr::Item < ActiveRecord::Base
-  self.abstract_class = true
-  # ClassMethods
-  # class_name
-  # table_name
-  
-  before_validation :valid_encode
-  
-  def self.singular
-    self.to_s
-  end
-  
-  def self.plural
-    self.singular.pluralize
-  end
-  
-  def self.item_name
-    self.singular.underscore
-  end
-  
-  def self.item?
-    true
-  end
-  
-  def self.content?
-    false
-  end
-  
-  def self.path_name with_engine = false
-    self.plural.underscore
-  end
-  
-  def self.valid_encode_columns
-    []
-  end
-  
-  def self.visible_count_options
-    nil
-  end
-  
-  def self.list_where
-    ''
-  end
-  
-  def self.list_order
-    ''
-  end
-  
-  def self.list_opt
-    {}
-  end
-  
-  def self.list_json_opt
-    {}
-  end
-  
-  def self.show item_id, operators
-    opt = {}
-    opt.merge!(self.show_opt)
-    item = self.find(item_id, opt)
-    raise ActiveRecord::Forbidden unless item.visible?(operators)
-    item
-  end
-  
-  def self.show_opt
-    {}
-  end
-  
-  def self.show_json_opt
-    {}
-  end
-  
-  def self.visible_count
-    self.count self.visible_count_options
-  end
-  
-  def self.visible_count_options
-    []
-  end
-  
-  #InstanceMethods
-  
-  def item_name
-    self.class.item_name
-  end
-  
-  def model_name
-    self.item_name
-  end
-  
-  def extend_column
-    nil
-  end
-  
-  def extend_item_name
-    self.extend_column ? self.attributes[self.extend_column] : self.item_name
-  end
-  
-  def form_name
-    self.extend_item_name
-  end
-  
-  def valid_encode
-    self.class.valid_encode_columns.each do |a|
-      next if attributes[a] == nil
-      raise Pettanr::BadRequest unless attributes[a].valid_encoding?
-    end
-  end
-  
-  def supply_default
-  end
-  
-  def overwrite 
-  end
-  
-  def visible? operators
-    if Manifest.manifest.magic_numbers['run_mode'] == 0
-      return false unless operators.guest?
-    else
-      return false unless operators.resource_reader?
-    end
-    true
-  end
-  
-  def dom_id_item 
-    self.new_record? ? '0' : self.id.to_s
-  end
-  
-  def tag_item_id c = nil
-    self.item_name + self.item_id + c.to_s
-  end
-  
-  def dom_id_item_field field_name
-    self.tag_item_id + field_name.to_s
-  end
-  
-  def path_name with_engine = false
-    self.class.path_name(with_engine)
-  end
-  
-  def form_template with_engine = false
-    self.path_name(with_engine) + '/form'
-  end
-  
-  def tag_item_attributes column = nil, opt = {}
-    {
-      :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
-      :element_id => self.tag_element_id, :element_type => self.tag_element_type
-    }.merge(opt)
-  end
-  
-  def field_tag_attributes column, no_attr, opt = {}
-    self.tag_attributes(column).merge(
-      {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
-    ).merge(opt)
-  end
-  
-  #render element by body
-  def any_tag_attributes name = nil, opt = {}
-    r = self.tag_attributes(name)
-    r.merge!(
-      {:new_index => self.tag_new_index}
-    ) if self.new_index
-    r.merge(opt)
-  end
-  
-  def select_tag_attributes(selected, column, no_attr)
-    [
-      :last, :first, 
-      {:html => {:selected => selected}}, 
-      self.field_tag_attributes(column, no_attr)
-    ]
-  end
-  
-  def tag_attr column = nil, opt = {}
-    self.tag_attributes(column, opt).to_attr
-  end
-  
-  def field_tag_attr column, no_attr, opt = {}
-    self.field_tag_attributes(column, no_attr, opt).to_attr
-  end
-  
-  def any_tag_attr name = nil, opt = {}
-    self.any_tag_attributes(name, opt).to_attr
-  end
-  
-end
index 9814ee4..9fcdf3c 100644 (file)
@@ -2,12 +2,13 @@ require_dependency "manifest/controller/action/base"
 require_dependency "manifest/controller/action/list"
 require_dependency "manifest/controller/action/show"
 require_dependency "manifest/controller/action/count"
+require_dependency "manifest/controller/action/new"
 module Manifest
   module ControllerModule
     class ActionFactory
       include ActionModule
       @@types = {
-        'list' => ActionList, 'show' => ActionShow, 'count' => ActionCount
+        'list' => ActionList, 'show' => ActionShow, 'count' => ActionCount, 'new' => ActionNew
       }
       def self.factory controller, action_name, my_manifest
         my_manifest['type'] ||= 'list'
diff --git a/lib/manifest/controller/action/new.rb b/lib/manifest/controller/action/new.rb
new file mode 100644 (file)
index 0000000..17bffd5
--- /dev/null
@@ -0,0 +1,18 @@
+module Manifest
+  module ControllerModule
+    module ActionModule
+      class ActionNew < Base
+        
+        def set_default
+          super
+        end
+        
+        def init
+          super
+        end
+        
+      end
+      
+    end
+  end
+end
index f3e24ad..48d40d0 100644 (file)
@@ -45,6 +45,12 @@ module Manifest
       @field_names = @form_manifest['field_names']
     end
     
+    def each_field
+      @field_names.each do |field_name|
+        yield field_name, @fields[field_name]
+      end
+    end
+    
   end
   
   class ExtendForm < Form
index 6101bc3..10d682d 100644 (file)
@@ -6,7 +6,7 @@ module Manifest
     class Field
       include FieldModule
       attr :form, :field_name, :field_manifest, :type, 
-        :model_name, :column_name, :label, :tag, :helper, :row_break
+        :model_name, :column_name, :label, :tag, :helpers, :row_break
       
       def initialize form, field_name, field_manifest
         @form = form
@@ -28,7 +28,7 @@ module Manifest
         end
         @field_manifest['args']['label'] ||= {}
         @field_manifest['args']['tag'] ||= {}
-        @field_manifest['args']['helper'] ||= {}
+        @field_manifest['args']['helpers'] ||= {}
         @field_manifest['args']['row_break'] ||= true
       end
       
@@ -39,7 +39,10 @@ module Manifest
         @column_name = @args['column_name']
         @label = LabelFactory.factory(self, @args['label'])
         @tag = TagFactory.factory(self, @args['tag'])
-        @helper = HelperFactory.factory(self, @args['helper'])
+        @helpers = {}
+        @args['helpers'].each {|helper_name, helper_manifest|
+          @helpers[helper_name] = HelperFactory.factory(self, helper_name, helper_manifest)
+        }
         @row_break = @args['row_break']
       end
       
@@ -60,7 +63,7 @@ module Manifest
       attr :part
       
       def set_default
-      super
+        super
         @field_manifest['model_name'] ||= ''
         @field_manifest['column_name'] ||= ''
         @field_manifest['part'] ||= ''
index d7255d9..09b78b2 100644 (file)
@@ -5,14 +5,14 @@ module Manifest
       class HelperFactory
         include HelperModule
         @@types = {
-          'default' => Default, 'none' => None
+          'size' => Size, 'tail_angle' => TailAngle, 'color' => Color, 'popup' => Popup
         }
-        def self.factory field, my_manifest
+        def self.factory field, helper_name, my_manifest
           type = my_manifest['type'] || 'none'
-          raise "undefined type for forms > #{field.form_name} > fields > #{field.field_name} > helper\n" unless type
+          raise "undefined type for forms > #{field.form_name} > fields > #{field.field_name} > helpers > #{helper_name}\n" unless type
           my_class = @@types[type]
-          raise "undefined class for forms > #{field.form_name} > fields > #{field.field_name} > helper > #{type}\n" unless my_class
-          my_class.new(field, my_manifest)
+          raise "undefined class for forms > #{field.form_name} > fields > #{field.field_name} > helpers > #{helper_name} > #{type}\n" unless my_class
+          my_class.new(field, helper_name, my_manifest)
         end
         
       end
index a9bcc3a..700eaee 100644 (file)
@@ -5,8 +5,9 @@ module Manifest
         class Base
           attr :field, :helper_manifest, :type
           
-          def initialize field, helper_manifest
+          def initialize field, helper_name, helper_manifest
             @field = field
+            @helper_name = helper_name
             @helper_manifest = helper_manifest
             self.set_default
             self.init
@@ -31,10 +32,16 @@ module Manifest
           
         end
         
-        class Default < Base
+        class Size < Base
         end
         
-        class None < Base
+        class TailAngle < Base
+        end
+        
+        class Color < Base
+        end
+        
+        class Popup < Base
         end
         
       end
index 0d5b594..f94a353 100644 (file)
@@ -3,7 +3,8 @@ module Manifest
     module FieldModule
       module LabelModule
         class Base
-          attr :field, :label_manifest, :type
+          attr :field, :label_manifest, :type,
+            :row_break
           
           def initialize field, label_manifest
             @field = field
@@ -14,11 +15,13 @@ module Manifest
           
           def set_default
             @label_manifest['args'] ||= {}
+            @label_manifest['args']['row_break'] ||= false
           end
           
           def init
             @type = @label_manifest['type']
             @args = @label_manifest['args']
+            @row_break = @args['row_break']
           end
           
           def form_name
@@ -29,6 +32,14 @@ module Manifest
             @field.field_name
           end
           
+          def model_name
+            @field.field_manifest.model_name
+          end
+          
+          def column_name
+            @field.field_manifest.column_name
+          end
+          
         end
         
         class Default < Base
index 02eabfa..c457315 100644 (file)
@@ -4,7 +4,7 @@ module Manifest
       module TagModule
         class Base
           attr :field, :tag_manifest, :type, 
-            :size
+            :options
           
           def initialize field, tag_manifest
             @field = field
@@ -15,12 +15,13 @@ module Manifest
           
           def set_default
             @tag_manifest['args'] ||= {}
+            @tag_manifest['args']['options'] ||= {}
           end
           
           def init
             @type = @tag_manifest['type']
             @args = @tag_manifest['args']
-            @size = @args['size']
+            @options = @args['options']
           end
           
           def form_name
diff --git a/lib/manifest/local/view/filer/body/file_body/file_item/none.rb b/lib/manifest/local/view/filer/body/file_body/file_item/none.rb
deleted file mode 100644 (file)
index 7e222e4..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-module Manifest
-  module View
-    module FilerModule
-      module BodyModule
-        module FileBodyModule
-          module FileItemModule
-            class None
-              attr :file_body
-              def initialize file_body
-                @file_body = file_body
-              end
-              
-              def filer
-                @file_body.filer
-              end
-              
-              def manifest
-                self.filer.manifest
-              end
-              
-              def item_name
-                self.filer.item_name
-              end
-              
-              def model
-                self.filer.model
-              end
-              
-              def items
-                self.filer.items
-              end
-              
-              def template_dir
-                self.filer.template_dir + 'item_column/'
-              end
-              
-              def template_file_name
-                "none"
-              end
-              
-              def template_name
-                self.template_dir + self.template_file_name
-              end
-              
-            end
-          end
-        end
-      end
-    end
-  end
-end
diff --git a/lib/manifest/local/view/filer/body/file_body/file_item/show.rb b/lib/manifest/local/view/filer/body/file_body/file_item/show.rb
deleted file mode 100644 (file)
index ebce086..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-module Manifest
-  module View
-    module FilerModule
-      module BodyModule
-        module FileBodyModule
-          module FileItemModule
-            class Show
-              attr :file_body, :column_name, :renderer
-              def initialize file_body, column_name, renderer
-                @file_body = file_body
-                @column_name = column_name
-                @renderer = renderer
-              end
-              
-              def filer
-                @file_body.filer
-              end
-              
-              def manifest
-                self.filer.manifest
-              end
-              
-              def item_name
-                self.filer.item_name
-              end
-              
-              def model
-                self.filer.model
-              end
-              
-              def items
-                self.filer.items
-              end
-              
-              def template_dir
-                self.filer.template_dir + 'item_column/'
-              end
-              
-              def template_file_name
-                "show"
-              end
-              
-              def template_name
-                self.template_dir + self.template_file_name
-              end
-              
-            end
-          end
-        end
-      end
-    end
-  end
-end
index 721180d..b42ec5c 100644 (file)
@@ -1,41 +1,43 @@
 require_dependency "manifest/local/view/form/field"
 module Manifest
-  module ViewModule
-    module FormModule
-      class FormView
-        attr :filer_manifest, :item_name, :manifest, :filer_conf, 
-          :fields, :label, :helper, :row_break
-        def initialize form_manager, item, operators, mounted
-          @form_manifest = form_manifest
-          @fields = @items.map {|item| 
-            FieldView.new self, @filer_manifest
-          }
+  module View
+    class Form
+      include FormModule
+      attr :form_name, :item, :mounted, :operators, :template_dir, 
+        :fields
+      def initialize form_name, item, mounted, operators
+        @form_name = form_name
+        @item = item
+        @mounted = mounted
+        @operators = operators
+        @manifest = Manifest.manifest.forms[@form_name]
+        @template_dir = 'templates/r/form/'
+        @fields = {}
+        @manifest.each_field do |field_name, field_manifest| 
+          @fields[field_name] = Field.new self, field_name, field_manifest
         end
-        
-        def render view
+      end
+      
+      def each_field
+        @manifest.each_field do |field_name, field_manifest| 
+          yield field_name, @fields[field_name]
         end
-        
       end
-    end
-    
-    class Form
-      include FormModule
-      def self.manager forms
-        form_views = {}
-        forms.each {|form_name, form_manifest|
-          form_views[form_name] = self.new(form_name, form_manifest)
-        }
-        form_views
+      
+      def template_file_name
+        "form"
       end
       
-      attr :form_name, :form_manifest
-      def initialize form_name, form_manifest
-        @form_name = form_name
-        @form_manifest = form_manifest
+      def template_name
+        self.template_dir + self.template_file_name
+      end
+      
+      def fields_template_name
+        self.template_dir + 'fields'
       end
       
-      def open element, operators, mounted
-        FormView.new @form_manifest, item, operators, mounted
+      def image_dir
+        '/images/'
       end
       
     end
index aa3a5c4..3ed9408 100644 (file)
@@ -1,18 +1,64 @@
+require_dependency "manifest/local/view/form/field/label"
+require_dependency "manifest/local/view/form/field/tag"
+require_dependency "manifest/local/view/form/field/helper"
 module Manifest
-  module ViewModule
+  module View
     module FormModule
-      class FieldView
-        attr :filer_manifest, :item_name, :manifest, :filer_conf, 
-          :label, :tag, :helpers, :row_break
-        def initialize form_manager, item, operators, mounted
-          @form_manifest = form_manifest
-          @label = LabelView
-          @tag = TagView
-          @helpers = HelperView
-          @row_break = View
-        end
-        
-        def render view
+      class Field
+        include FieldModule
+        attr :form, :field_name, :field_manifest, 
+          :label, :tag, :helpers, :options
+        def initialize form, field_name, field_manifest
+          @form = form
+          @field_name = field_name
+          @field_manifest = field_manifest
+          @label = LabelFactory.factory self, @field_manifest.label.label_manifest
+          @tag = TagFactory.factory self, @field_manifest.tag.tag_manifest
+          @helpers = {}
+          @field_manifest.helpers.each {|helper_name, helper_manifest|
+            @helpers[helper_name] = HelperFactory.factory self, helper_manifest.helper_manifest
+          }
+          @options = {'data-model' => @field_manifest.model_name}
+        end
+        
+        def item
+          @form.item
+        end
+        
+        def value
+          self.item.attributes[@field_manifest.column_name]
+        end
+        
+        def form_name
+          @form.form_name
+        end
+        
+        def template_dir
+          @form.template_dir + 'field/'
+        end
+        
+        def template_file_name
+          @field_manifest.type
+        end
+        
+        def template_name
+          self.template_dir + self.template_file_name
+        end
+        
+        def row_break_template_dir
+          @form.template_dir + 'row_break/'
+        end
+        
+        def row_break_template_file_name
+          if @field_manifest.row_break
+            'break'
+          else
+            'no_break'
+          end
+        end
+        
+        def row_break_template_name
+          self.row_break_template_dir + self.row_break_template_file_name
         end
         
       end
index e69de29..040b4c7 100644 (file)
@@ -0,0 +1,24 @@
+require_dependency "manifest/local/view/form/field/label/label"\r
+module Manifest\r
+  module View\r
+    module FormModule\r
+      module FieldModule\r
+        class LabelFactory\r
+          include LabelModule\r
+          @@types = {\r
+            'default' => Default, 'none' => None\r
+          }\r
+          def self.factory field, my_manifest\r
+            my_manifest['type'] ||= 'default'\r
+            type = my_manifest['type']\r
+            my_class = @@types[type]\r
+            raise "undefined class for local view forms > #{field.form_name} > fields > #{field.field_name} > label > #{type}\n" unless my_class\r
+            my_class.new(field, my_manifest)\r
+          end\r
+          \r
+        end\r
+        \r
+      end\r
+    end\r
+  end\r
+end\r
index 1e7381a..2793352 100644 (file)
@@ -1,41 +1,93 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module LabelModule
-        class Base
-          attr :field, :label_manifest
-          
-          def initialize field, label_manifest
-            @field = field
-            @label_manifest = label_manifest
-            self.set_default
-            self.init
-          end
-          
-          def set_default
-            @label_manifest['args'] ||= {}
+  module View
+    module FormModule
+      module FieldModule
+        module LabelModule
+          class Base
+            attr :field, :label_manifest
+            
+            def initialize field, label_manifest
+              @field = field
+              @label_manifest = label_manifest
+            end
+            
+            def form
+              @field.form
+            end
+            
+            def manifest
+              self.form.manifest
+            end
+            
+            def form_name
+              self.form.form_name
+            end
+            
+            def model
+              self.form.model
+            end
+            
+            def item
+              self.form.item
+            end
+            
+            def model_name
+              @label_manifest.model_name
+            end
+            
+            def column_name
+              @label_manifest.column_name
+            end
+            
+            def template_dir
+              self.form.template_dir + 'label/'
+            end
+            
+            def template_file_name
+              raise "undefined template_file_name\n"
+            end
+            
+            def template_name
+              self.template_dir + self.template_file_name
+            end
+            
+            def label_row_break_template_dir
+              self.form.template_dir + 'label_row_break/'
+            end
+            
+            def label_row_break_template_file_name
+              if @label_manifest.row_break
+                'break'
+              else
+                'no_break'
+              end
+            end
+            
+            def label_row_break_template_name
+              self.label_row_break_template_dir + self.label_row_break_template_file_name
+            end
+            
           end
           
-          def init
-            @args = @label_manifest['args']
+          class Default < Base
+            def template_file_name
+              'default'
+            end
+            
+            def label_name
+              'activerecord.attributes.' + self.model_name + '.' +  self.column_name
+            end
+            
           end
           
-          def form_name
-            @field.form_name
+          class None < Base
+            def template_file_name
+              'none'
+            end
+            
           end
           
-          def field_name
-            @field.field_name
-          end
-          
-        end
-        
-        class Default < Base
-        end
-        
-        class None < Base
         end
-        
       end
     end
   end
index e69de29..aa40488 100644 (file)
@@ -0,0 +1,30 @@
+require_dependency "manifest/local/view/form/field/tag/base"\r
+require_dependency "manifest/local/view/form/field/tag/text"\r
+require_dependency "manifest/local/view/form/field/tag/number"\r
+require_dependency "manifest/local/view/form/field/tag/text_area"\r
+require_dependency "manifest/local/view/form/field/tag/select"\r
+require_dependency "manifest/local/view/form/field/tag/hidden"\r
+module Manifest\r
+  module View\r
+    module FormModule\r
+      module FieldModule\r
+        class TagFactory\r
+          include TagModule\r
+          @@types = {\r
+            'text' => TextTag, 'number' => NumberTag, 'text_area' => TextAreaTag, \r
+            'select' => SelectTag, 'hidden' => HiddenTag\r
+          }\r
+          def self.factory field, my_manifest\r
+            my_manifest['type'] ||= 'text'\r
+            type = my_manifest['type']\r
+            my_class = @@types[type]\r
+            raise "undefined class for local view forms > #{field.form_name} > fields > #{field.field_name} > tag > #{type}\n" unless my_class\r
+            my_class.new(field, my_manifest)\r
+          end\r
+          \r
+        end\r
+        \r
+      end\r
+    end\r
+  end\r
+end\r
index ad0f006..fd434e2 100644 (file)
@@ -1,52 +1,71 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class Base
-          attr :field, :tag_manifest, 
-            :size
-          
-          def initialize field, tag_manifest
-            @field = field
-            @tag_manifest = tag_manifest
-            self.set_default
-            self.init
-          end
-          
-          def set_default
-            @tag_manifest['args'] ||= {}
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class Base
+            attr :field, :tag_manifest
+            
+            def initialize field, tag_manifest
+              @field = field
+              @tag_manifest = tag_manifest
+            end
+            
+            def form_field_name
+          if self.part?
+            @form.model_name + '[' + self.model_name + '_attributes][' + self.column + ']'
+          else
+            @form.model_name + '[' + self.column + ']'
           end
-          
-          def init
-            @args = @tag_manifest['args']
-            @size = @args['size']
+            end
+            
+            def options
+              @field.options.merge @tag_manifest.options
+            end
+            
+            def form
+              @field.form
+            end
+            
+            def manifest
+              self.form.manifest
+            end
+            
+            def form_name
+              self.form.form_name
+            end
+            
+            def model
+              self.form.model
+            end
+            
+            def item
+              self.form.item
+            end
+            
+            def model_name
+              @label_manifest.model_name
+            end
+            
+            def column_name
+              @label_manifest.column_name
+            end
+            
+            def template_dir
+              self.form.template_dir + 'tag/'
+            end
+            
+            def template_file_name
+              raise "undefined template_file_name\n"
+            end
+            
+            def template_name
+              self.template_dir + self.template_file_name
+            end
+            
           end
           
-          def form_name
-            @field.form_name
-          end
-          
-          def field_name
-            @field.field_name
-          end
-          
-        end
-        
-        class TextTag < Base
-        end
-        
-        class NumberTag < Base
-        end
-        
-        class TextAreaTag < Base
-        end
-        
-        class SelectTag < Base
-        end
-        
-        class HiddenTag < Base
         end
-        
       end
     end
   end
index 087c594..6482dda 100644 (file)
@@ -1,10 +1,12 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class HiddenTag < Base
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class HiddenTag < Base
+          end
+          
         end
-        
       end
     end
   end
index 1dac3d4..c787330 100644 (file)
@@ -1,10 +1,12 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class NumberTag < Base
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class NumberTag < Base
+          end
+          
         end
-        
       end
     end
   end
index 0a20eec..477df6a 100644 (file)
@@ -1,10 +1,12 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class SelectTag < Base
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class SelectTag < Base
+          end
+          
         end
-        
       end
     end
   end
index 24188fb..f6d8678 100644 (file)
@@ -1,10 +1,12 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class TextTag < Base
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class TextTag < Base
+          end
+          
         end
-        
       end
     end
   end
index 0dae212..ee5a833 100644 (file)
@@ -1,10 +1,12 @@
 module Manifest
-  module FormModule
-    module FieldModule
-      module TagModule
-        class TextAreaTag < Base
+  module View
+    module FormModule
+      module FieldModule
+        module TagModule
+          class TextAreaTag < Base
+          end
+          
         end
-        
       end
     end
   end
index 087f791..c2eb4c5 100644 (file)
@@ -44,6 +44,10 @@ module Manifest
       }
     end
     
+    def classify
+      ::Manifest.item_name_to_model @model_name
+    end
+    
   end
 end
 
diff --git a/lib/owner.rb b/lib/owner.rb
deleted file mode 100644 (file)
index 0d232d5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-class Pettanr::Owner < Pettanr::Item
-  self.abstract_class = true
-  # ClassMethods
-  
-  def self.edit owner_id, operators
-    owner = self.find owner_id, self.show_opt
-    raise ActiveRecord::Forbidden unless owner.own?(operators)
-    owner
-  end
-  
-  #InstanceMethods
-  
-  def overwrite operators
-    self.user_id = operators.user.id
-  end
-  
-  def own? operators
-    return false unless operators.user
-    self.user_id == operators.user.id
-  end
-  
-end
-
diff --git a/lib/peta.rb b/lib/peta.rb
new file mode 100644 (file)
index 0000000..2884294
--- /dev/null
@@ -0,0 +1,7 @@
+module Peta
+end
+require_dependency 'peta/item'
+require_dependency 'peta/owner'
+require_dependency 'peta/content'
+require_dependency 'peta/element'
+require_dependency 'peta/element_part'
diff --git a/lib/peta/content.rb b/lib/peta/content.rb
new file mode 100644 (file)
index 0000000..6b59afc
--- /dev/null
@@ -0,0 +1,59 @@
+module Peta
+  class Content < Item
+    self.abstract_class = true
+    # ClassMethods
+    
+    def self.owner_model
+      nil
+    end
+    
+    def self.owner_type
+      :author
+    end
+    
+    def self.content?
+      true
+    end
+    
+    def self.operator operators
+      case self.owner_type
+      when :author
+        operators.author
+      when :artist
+        operators.artist
+      else
+        nil
+      end
+    end
+    
+    def self.owner_column
+      self.owner_type.to_s + '_id'
+    end
+    
+    def self.edit content_id, operators
+      content = self.find content_id, self.show_opt
+      raise ActiveRecord::Forbidden unless content.own?(operators)
+      content
+    end
+    
+    #InstanceMethods
+    
+    def owner_model
+      self.class.owner_model ? self.__send__(self.class.owner_model.item_name) : self
+    end
+    
+    def visible? operators
+      super
+      return true if owner_model.own?(operators)
+      true
+    end
+    
+    def own? operators
+      operator = self.class.operator operators
+      return false unless operator
+      owner_model.attributes[self.class.owner_column] == operator.id
+    end
+    
+  end
+end
+
diff --git a/lib/peta/element.rb b/lib/peta/element.rb
new file mode 100644 (file)
index 0000000..8346bff
--- /dev/null
@@ -0,0 +1,193 @@
+module Peta
+  module Element
+    def self.included(base)
+      base.extend(ClassMethods)
+      base.__send__ :include, InstanceMethods
+    end
+    
+    module ClassMethods
+      def colum_structures
+        raise
+      end
+      
+      def list_opt_for_panel
+        {}
+      end
+      
+      def show_opt_for_panel
+        {}
+      end
+      
+      def json_opt_for_panel
+        {}
+      end
+      
+      def path_name with_engine = false
+        self.to_s.tableize
+      end
+      
+    end
+    
+    module InstanceMethods
+      private
+      
+      public
+      
+      def has_picture?
+        false
+      end
+      
+      def has_part?
+        false
+      end
+      
+      def parts
+        @parts ||= []
+      end
+      
+      def has_helper? column_name
+        self.class.colum_structures[column_name] and self.class.colum_structures[column_name][:helper]
+      end
+      
+      def element_name
+        self.class.to_s.underscore
+      end
+      
+      def extend_column
+        nil
+      end
+      
+      def extend_element_name
+        self.extend_column ? self.attributes[extend_column] : self.element_name
+      end
+      
+      def find_configurations hash, key
+         if hash[key].is_a? String
+           self.find_configurations hash, hash[key]
+         else
+           return hash[key]
+         end
+      end
+      
+      def element_index
+        @element_index ||= self.t
+      end
+      
+      def parent
+        @parent ||= self.panel
+      end
+      
+      def parent= content
+        @parent = content
+      end
+      
+      def new_index
+        @new_index
+      end
+      
+      def new_index= v
+        @new_index = v
+      end
+      
+      def new_panel
+        @new_panel
+      end
+      
+      def new_panel= v
+        @new_panel = v
+      end
+      
+      def get_panel
+        self.panel || @new_panel
+      end
+      
+      def tag_id c = nil
+        'panel' + self.tag_panel_id + self.tag_element_type + self.tag_element_id + c.to_s
+      end
+      
+      def field_tag_id f
+        self.tag_id + f.to_s
+      end
+      
+      def tag_panel_id
+        self.get_panel.new_record? ? '0' : self.get_panel.id.to_s
+      end
+      
+      def tag_element_id
+        self.new_record? ? '0' : self.id.to_s
+      end
+      
+      def tag_element_type
+        raise
+      end
+      
+      def tag_new_index
+        self.new_index.to_s
+      end
+      
+      def path_name with_engine = false
+        self.class.path_name(with_engine)
+      end
+      
+      def form_template with_engine = false
+        self.path_name(with_engine) + '/form'
+      end
+      
+      def scenario_template with_engine = false
+        self.path_name(with_engine) + '/scenario'
+      end
+      
+      def element_face_template with_engine = false
+        self.path_name(with_engine) + '/element_face'
+      end
+      
+      def form_helper_template(colum_name)
+        self.class.colum_structures[colum_name][:helper]
+      end
+      
+      def tag_attributes column = nil, opt = {}
+        {
+          :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
+          :element_id => self.tag_element_id, :element_type => self.tag_element_type
+        }.merge(opt)
+      end
+      
+      def field_tag_attributes column, no_attr, opt = {}
+        self.tag_attributes(column).merge(
+          {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
+        ).merge(opt)
+      end
+      
+      #render element by body
+      def any_tag_attributes name = nil, opt = {}
+        r = self.tag_attributes(name)
+        r.merge!(
+          {:new_index => self.tag_new_index}
+        ) if self.new_index
+        r.merge(opt)
+      end
+      
+      def select_tag_attributes(selected, column, no_attr)
+        [
+          :last, :first, 
+          {:html => {:selected => selected}}, 
+          self.field_tag_attributes(column, no_attr)
+        ]
+      end
+      
+      def tag_attr column = nil, opt = {}
+        self.tag_attributes(column, opt).to_attr
+      end
+      
+      def field_tag_attr column, no_attr, opt = {}
+        self.field_tag_attributes(column, no_attr, opt).to_attr
+      end
+      
+      def any_tag_attr name = nil, opt = {}
+        self.any_tag_attributes(name, opt).to_attr
+      end
+      
+    end
+  end
+end
+
diff --git a/lib/peta/element_part.rb b/lib/peta/element_part.rb
new file mode 100644 (file)
index 0000000..26ef2bc
--- /dev/null
@@ -0,0 +1,155 @@
+module Peta
+  module ElementPart
+    def self.included(base)
+      base.extend(ClassMethods)
+      base.__send__ :include, InstanceMethods
+    end
+    
+    module ClassMethods
+      def colum_structures
+        raise
+      end
+      
+      def list_opt_for_panel
+        {}
+      end
+      
+      def show_opt_for_panel
+        {}
+      end
+      
+      def json_opt_for_panel
+        {}
+      end
+      
+      def path_name with_engine = false
+        self.to_s.tableize
+      end
+      
+    end
+    
+    module InstanceMethods
+      private
+      
+      public
+      
+      def has_picture?
+        false
+      end
+      
+      def has_helper? column_name
+        self.class.colum_structures[column_name] and self.class.colum_structures[column_name][:helper]
+      end
+      
+      def new_parent
+        @new_parent
+      end
+      
+      def new_parent= v
+        @new_parent = v
+      end
+      
+      def get_parent
+        raise
+      end
+      
+      def get_panel_id
+        if self.get_parent == nil or self.get_parent.panel == nil or self.get_parent.panel.new_record?
+          0
+        else
+          self.get_parent.panel.id
+        end
+      end
+      
+      def tag_id c = nil
+        'panel' + self.tag_panel_id + self.tag_element_type + self.tag_element_id + self.tag_element_part_type + self.tag_element_part_id + c.to_s
+      end
+      
+      def field_tag_id f
+        self.tag_id + f.to_s
+      end
+      
+      def tag_panel_id
+        self.get_panel_id.to_s
+      end
+      
+      def tag_element_id
+        r = if self.get_parent == nil or self.get_parent.new_record?
+          0
+        else
+          self.get_parent.id
+        end
+        r.to_s
+      end
+      
+      def tag_element_type
+        self.get_parent.tag_element_type
+      end
+      
+      def tag_element_part_id
+        self.new_record? ? '0' : self.id.to_s
+      end
+      
+      def tag_element_part_type
+        'speech'
+      end
+      
+      def tag_new_index
+        if self.get_parent == nil
+          nil
+        else
+          self.get_parent.tag_new_index
+        end
+      end
+      
+      def form_helper_template(colum_name)
+        self.class.colum_structures[colum_name][:helper]
+      end
+      
+      def tag_attributes column = nil, opt = {}
+        {
+          :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
+          :element_id => self.tag_element_id, :element_type => self.tag_element_type,
+          :element_part_id => self.tag_element_part_id, :element_part_type => self.tag_element_part_type
+        }.merge(opt)
+      end
+      
+      def field_tag_attributes column, no_attr, opt = {}
+        self.tag_attributes(column).merge(
+          {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
+        ).merge(opt)
+      end
+      
+      #render element by body
+      def any_tag_attributes name = nil, opt = {}
+        r = self.tag_attributes(name)
+        r.merge!(
+          {:new_index => self.tag_new_index}
+        ) if self.new_index
+        r.merge(opt)
+      end
+      
+      def select_tag_attributes(selected, column, no_attr)
+        [
+          :last, :first, 
+          {:html => {:selected => selected}}, 
+          self.field_tag_attributes(column, no_attr)
+        ]
+      end
+      
+      def tag_attr column = nil, opt = {}
+        self.tag_attributes(column, opt).to_attr
+      end
+      
+      def field_tag_attr column, no_attr, opt = {}
+        self.field_tag_attributes(column, no_attr, opt).to_attr
+      end
+      
+      def any_tag_attr name = nil, opt = {}
+        self.any_tag_attributes(name, opt).to_attr
+      end
+      
+    end
+  end
+end
+
diff --git a/lib/peta/item.rb b/lib/peta/item.rb
new file mode 100644 (file)
index 0000000..265ec67
--- /dev/null
@@ -0,0 +1,189 @@
+module Peta
+  class Item < ActiveRecord::Base
+    self.abstract_class = true
+    # ClassMethods
+    # class_name
+    # table_name
+    
+    before_validation :valid_encode
+    
+    def self.singular
+      self.to_s
+    end
+    
+    def self.plural
+      self.singular.pluralize
+    end
+    
+    def self.item_name
+      self.singular.underscore
+    end
+    
+    def self.item?
+      true
+    end
+    
+    def self.content?
+      false
+    end
+    
+    def self.path_name with_engine = false
+      self.plural.underscore
+    end
+    
+    def self.valid_encode_columns
+      []
+    end
+    
+    def self.visible_count_options
+      nil
+    end
+    
+    def self.list_where
+      ''
+    end
+    
+    def self.list_order
+      ''
+    end
+    
+    def self.list_opt
+      {}
+    end
+    
+    def self.list_json_opt
+      {}
+    end
+    
+    def self.show item_id, operators
+      opt = {}
+      opt.merge!(self.show_opt)
+      item = self.find(item_id, opt)
+      raise ActiveRecord::Forbidden unless item.visible?(operators)
+      item
+    end
+    
+    def self.show_opt
+      {}
+    end
+    
+    def self.show_json_opt
+      {}
+    end
+    
+    def self.visible_count
+      self.count self.visible_count_options
+    end
+    
+    def self.visible_count_options
+      []
+    end
+    
+    #InstanceMethods
+    
+    def item_name
+      self.class.item_name
+    end
+    
+    def model_name
+      self.item_name
+    end
+    
+    def extend_column
+      nil
+    end
+    
+    def extend_item_name
+      self.extend_column ? self.attributes[self.extend_column] : self.item_name
+    end
+    
+    def form_name
+      self.extend_item_name
+    end
+    
+    def valid_encode
+      self.class.valid_encode_columns.each do |a|
+        next if attributes[a] == nil
+        raise Pettanr::BadRequest unless attributes[a].valid_encoding?
+      end
+    end
+    
+    def supply_default
+    end
+    
+    def overwrite 
+    end
+    
+    def visible? operators
+      if Manifest.manifest.magic_numbers['run_mode'] == 0
+        return false unless operators.guest?
+      else
+        return false unless operators.resource_reader?
+      end
+      true
+    end
+    
+    def dom_id_item 
+      self.new_record? ? '0' : self.id.to_s
+    end
+    
+    def tag_item_id c = nil
+      self.item_name + self.item_id + c.to_s
+    end
+    
+    def dom_id_item_field field_name
+      self.tag_item_id + field_name.to_s
+    end
+    
+    def path_name with_engine = false
+      self.class.path_name(with_engine)
+    end
+    
+    def form_template with_engine = false
+      self.path_name(with_engine) + '/form'
+    end
+    
+    def tag_item_attributes column = nil, opt = {}
+      {
+        :id => self.field_tag_id(column), :panel_id => self.tag_panel_id, 
+        :element_id => self.tag_element_id, :element_type => self.tag_element_type
+      }.merge(opt)
+    end
+    
+    def field_tag_attributes column, no_attr, opt = {}
+      self.tag_attributes(column).merge(
+        {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
+      ).merge(opt)
+    end
+    
+    #render element by body
+    def any_tag_attributes name = nil, opt = {}
+      r = self.tag_attributes(name)
+      r.merge!(
+        {:new_index => self.tag_new_index}
+      ) if self.new_index
+      r.merge(opt)
+    end
+    
+    def select_tag_attributes(selected, column, no_attr)
+      [
+        :last, :first, 
+        {:html => {:selected => selected}}, 
+        self.field_tag_attributes(column, no_attr)
+      ]
+    end
+    
+    def tag_attr column = nil, opt = {}
+      self.tag_attributes(column, opt).to_attr
+    end
+    
+    def field_tag_attr column, no_attr, opt = {}
+      self.field_tag_attributes(column, no_attr, opt).to_attr
+    end
+    
+    def any_tag_attr name = nil, opt = {}
+      self.any_tag_attributes(name, opt).to_attr
+    end
+    
+  end
+end
diff --git a/lib/peta/owner.rb b/lib/peta/owner.rb
new file mode 100644 (file)
index 0000000..72c3cd6
--- /dev/null
@@ -0,0 +1,25 @@
+module Peta
+  class Owner < Item
+    self.abstract_class = true
+    # ClassMethods
+    
+    def self.edit owner_id, operators
+      owner = self.find owner_id, self.show_opt
+      raise ActiveRecord::Forbidden unless owner.own?(operators)
+      owner
+    end
+    
+    #InstanceMethods
+    
+    def overwrite operators
+      self.user_id = operators.user.id
+    end
+    
+    def own? operators
+      return false unless operators.user
+      self.user_id == operators.user.id
+    end
+    
+  end
+end
+
index 1cafc04..dc6a6a5 100644 (file)
@@ -35,6 +35,9 @@
         },\r
         "count_by_panel": {\r
           "type": "count"\r
+        },\r
+        "new": {\r
+          "type": "new"\r
         }\r
       }\r
     },\r
           }\r
         },\r
         "by_panel": {\r
-          "type": "through_filter"\r
+          "type": "through_filter",\r
+          "args": {\r
+            "filter_item_name": "panel",\r
+            "through": "scroll_panels",\r
+            "filter_key": "panel_id"\r
+          }\r
         },\r
         "play": {\r
-          "type": "play"\r
+          "type": "play",\r
+          "args": {\r
+            "filter_item_name": "scroll",\r
+            "filter_model_name": "scroll_panel",\r
+            "filter_key": "scroll_id"\r
+          }\r
         }\r
       }\r
     },\r
       "scroll": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_author": {\r
-          "where": "author",\r
-          "includes": "author_id"\r
-        },\r
-        "by_panel": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "through": "scroll_panels",\r
-            "filter_key": "panel_id"\r
-          }\r
-        },\r
-        "play": {\r
-          "type": "play",\r
-          "args": {\r
-            "model": "scroll_panel",\r
-            "filter_key": "scroll_id"\r
-          }\r
-        }\r
+        "by_author": {},\r
+        "by_panel": {},\r
+        "play": {}\r
       },\r
       "scroll_panel": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_scroll": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "scroll",\r
-            "filter_key": "scroll_id"\r
-          }\r
-        },\r
-        "by_panel": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "filter_key": "panel_id"\r
-          }\r
-        }\r
+        "by_scroll": {},\r
+        "by_panel": {}\r
       },\r
       "comic": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_author": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "author",\r
-            "filter_key": "author_id"\r
-          }\r
-        }\r
+        "by_author": {}\r
       },\r
       "story": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_comic": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "comic",\r
-            "filter_key": "comic_id"\r
-          }\r
-        },\r
-        "by_sheet": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "sheet",\r
-            "through": "story_sheets",\r
-            "filter_key": "sheet_id"\r
-          }\r
-        },\r
+        "by_comic": {},\r
+        "by_sheet": {},\r
         "by_author": {\r
           "type": "element_filter",\r
           "args": {\r
         }\r
       },\r
       "story_sheet": {\r
-        "public_list": {\r
-          "type": "public"\r
-        },\r
-        "private_list": {\r
-          "type": "private"\r
-        },\r
-        "by_story": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "story",\r
-            "filter_key": "story_id"\r
-          }\r
-        },\r
-        "by_sheet": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "sheet",\r
-            "filter_key": "sheet_id"\r
-          }\r
-        }\r
+        "public_list": {},\r
+        "private_list": {},\r
+        "by_story": {},\r
+        "by_sheet": {}\r
       },\r
       "sheet": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_story": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "story",\r
-            "through": "story_sheets",\r
-            "filter_key": "story_id"\r
-          }\r
-        },\r
-        "by_panel": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "through": "sheet_panels",\r
-            "filter_key": "panel_id"\r
-          }\r
-        },\r
-        "by_author": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "author",\r
-            "filter_key": "author_id"\r
-          }\r
-        },\r
+        "by_story": {},\r
+        "by_panel": {},\r
+        "by_author": {},\r
         "play": {\r
           "type": "play",\r
           "args": {\r
       "sheet_panel": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_sheet": {\r
-          "type": "filter",\r
-          "args": {\r
-            "association_name": "sheet_panels",\r
-            "from": "sheet",\r
-            "filter_key": "sheet_id"\r
-          }\r
-        },\r
-        "by_panel": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "filter_key": "panel_id"\r
-          }\r
-        }\r
+        "by_sheet": {},\r
+        "by_panel": {}\r
       },\r
       "panel": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_scroll": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "scroll",\r
-            "through": "scroll_panels",\r
-            "filter_key": "scroll_id"\r
-          }\r
-        },\r
-        "by_sheet": {\r
-          "type": "through_filter",\r
-          "args": {\r
-            "from": "sheet",\r
-            "through": "sheet_panels",\r
-            "filter_key": "sheet_id"\r
-          }\r
-        },\r
-        "by_author": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "author",\r
-            "filter_key": "author_id"\r
-          }\r
-        },\r
+        "by_scroll": {},\r
+        "by_sheet": {},\r
+        "by_author": {},\r
         "by_speech_balloon_template": {\r
           "type": "through_filter",\r
           "args": {\r
       "panel_picture": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_panel": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "filter_key": "panel_id"\r
-          }\r
-        },\r
+        "by_panel": {},\r
         "by_author": {\r
           "where": "by_author_where",\r
           "includes": "by_author_includes"\r
       "speech_balloon": {\r
         "public_list": {},\r
         "private_list": {},\r
-        "by_panel": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "panel",\r
-            "filter_key": "panel_id"\r
-          }\r
-        },\r
+        "by_panel": {},\r
         "by_speech_balloon_template": {\r
           "type": "filter",\r
           "args": {\r
             "filter_key": "speech_balloon_template_id"\r
           }\r
         },\r
-        "by_author": {\r
-          "type": "element_filter",\r
-          "args": {\r
-            "from": "author",\r
-            "filter_key": "author_id"\r
-          }\r
-        }\r
+        "by_author": {}\r
       },\r
       "speech": {\r
         "public_list": {},\r
       },\r
       "ground_picture": {\r
         "public_list": {},\r
-        "private_list": {\r
-          "type": "private"\r
-        },\r
+        "private_list": {},\r
         "by_panel": {\r
           "type": "filter",\r
           "args": {\r
             "filter_key": "license_id"\r
           }\r
         },\r
-        "by_artist": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "artist",\r
-            "filter_key": "artist_id"\r
-          }\r
-        }\r
+        "by_artist": {}\r
       },\r
       "speech_balloon_template": {\r
         "public_list": {},\r
         "select_items": {\r
           "type": "system_resource"\r
         },\r
-        "by_system_picture": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "system_picture",\r
-            "filter_key": "system_picture_id"\r
-          }\r
-        }\r
+        "by_system_picture": {}\r
       },\r
       "license_group": {\r
         "public_list": {},\r
       },\r
       "license": {\r
         "public_list": {},\r
-        "by_license_group": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "license_group",\r
-            "filter_key": "license_group_id"\r
-          }\r
-        },\r
-        "by_system_picture": {\r
-          "type": "filter",\r
-          "args": {\r
-            "from": "system_picture",\r
-            "filter_key": "system_picture_id"\r
-          }\r
-        }\r
+        "by_license_group": {},\r
+        "by_system_picture": {}\r
       },\r
       "author": {\r
         "public_list": {}\r
     ],\r
     "forms": {\r
       "base": {\r
+        "scroll": {\r
+          "fields": {\r
+            "title": {\r
+              "args": {\r
+                "column": "title",\r
+                "label": {},\r
+                "tag": {\r
+                  "type": "text"\r
+                },\r
+                "row_break": true\r
+              }\r
+            },\r
+            "description": {\r
+              "args": {\r
+                "column": "description",\r
+                "label": {},\r
+                "tag": {\r
+                  "type": "text_area",\r
+                  "args": {\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
+                  }\r
+                }\r
+              }\r
+            },\r
+            "visible": {\r
+              "args": {\r
+                "column": "visible",\r
+                "label": {},\r
+                "tag": {\r
+                  "type": "select"\r
+                },\r
+                "row_break": true\r
+              }\r
+            },\r
+            "id": {\r
+              "args": {\r
+                "column": "id",\r
+                "label": {\r
+                  "type": "none"\r
+                },\r
+                "tag": {\r
+                  "type": "hidden"\r
+                }\r
+              }\r
+            },\r
+            "author_id": {\r
+              "args": {\r
+                "column": "author_id",\r
+                "label": {\r
+                  "type": "none"\r
+                },\r
+                "tag": {\r
+                  "type": "hidden"\r
+                }\r
+              }\r
+            }\r
+          },\r
+          "field_names": [\r
+            "title",\r
+            "description",\r
+            "visible",\r
+            "id",\r
+            "author_id"\r
+          ]\r
+        },\r
         "panel": {\r
           "fields": {\r
             "caption": {\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "helpers": {\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "helpers": {\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "helpers": {\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r
                 "tag": {\r
                   "type": "text",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "text_area",\r
                   "args": {\r
-                    "size": "45x5"\r
+                    "options": {\r
+                      "size": "45x5"\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 }\r
               }\r
                 "tag": {\r
                   "type": "number",\r
                   "args": {\r
-                    "size": 5\r
+                    "options": {\r
+                      "size": 5\r
+                    }\r
                   }\r
                 },\r
                 "row_break": true\r