OSDN Git Service

fix play leaf
authoryasushiito <yas@pen-chan.jp>
Thu, 29 May 2014 23:16:35 +0000 (08:16 +0900)
committeryasushiito <yas@pen-chan.jp>
Thu, 29 May 2014 23:16:35 +0000 (08:16 +0900)
31 files changed:
app/assets/javascripts/manifest/work/controllers.js.coffee.erb
app/assets/javascripts/manifest/work/list_groups.js.coffee.erb
app/controllers/application_controller.rb
app/controllers/comics_controller.rb
app/controllers/scrolls_controller.rb
app/controllers/stories_controller.rb
app/models/comic.rb
app/models/folder.rb
app/models/scroll.rb
app/models/story.rb
app/views/stories/play.html.erb
app/views/stories/show.html.erb
app/views/story_sheets/_order.html.erb
lib/local_manifest/list_group/list/base.rb
lib/local_manifest/list_group/list/order.rb [new file with mode: 0644]
lib/local_manifest/list_group/list/order/auto.rb [new file with mode: 0644]
lib/local_manifest/list_group/list/order/base.rb [new file with mode: 0644]
lib/local_manifest/list_group/list/order/method.rb [new file with mode: 0644]
lib/locmare/filer/body/file_body/file_item/icon/icon.rb
lib/locmare/list_group/list/base.rb
lib/locmare/list_group/list/play.rb
lib/manifest/controller/action.rb
lib/manifest/controller/action/create.rb [new file with mode: 0644]
lib/manifest/controller/action/destroy.rb [new file with mode: 0644]
lib/manifest/controller/action/update.rb [new file with mode: 0644]
lib/peta/binder.rb
lib/peta/item.rb
lib/peta/leaf.rb
public/images/prof.gif [new file with mode: 0644]
public/local_manifest.json
public/manifest.json

index f8b16d6..efc4450 100644 (file)
       edit: {\r
         type: 'edit',\r
       },\r
+      create: {\r
+        type: 'create',\r
+      },\r
+      update: {\r
+        type: 'update',\r
+      },\r
+      destroy: {\r
+        type: 'destroy',\r
+      },\r
     },\r
   },\r
   scroll_panels: {\r
       edit: {\r
         type: 'edit',\r
       },\r
+      create: {\r
+        type: 'create',\r
+      },\r
+      update: {\r
+        type: 'update',\r
+      },\r
+      destroy: {\r
+        type: 'destroy',\r
+      },\r
     },\r
   },\r
   comic_stories: {\r
       play: {\r
         type: 'list',\r
         args: {\r
+          item_name: 'story_sheet',\r
           list_name: 'play',\r
         },\r
       },\r
       edit: {\r
         type: 'edit',\r
       },\r
+      create: {\r
+        type: 'create',\r
+      },\r
+      update: {\r
+        type: 'update',\r
+      },\r
+      destroy: {\r
+        type: 'destroy',\r
+      },\r
     },\r
   },\r
   story_sheets: {\r
index 422aa3f..8a0945d 100644 (file)
@@ -40,6 +40,9 @@
           filter_item_name: 'scroll',\r
           filter_model_name: 'scroll_panel',\r
           filter_key: 'scroll_id',\r
+          order: {\r
+            type: 'method',\r
+          }\r
         },\r
       },\r
       by_scroll: {\r
@@ -91,6 +94,9 @@
           filter_item_name: 'comic',\r
           filter_model_name: 'comic_story',\r
           filter_key: 'comic_id',\r
+          order: {\r
+            type: 'method',\r
+          }\r
         },\r
       },\r
       by_comic: {\r
       private: {\r
         type: 'private',\r
       },\r
+      play: {\r
+        type: 'play',\r
+        args: {\r
+          filter_item_name: 'story',\r
+          filter_model_name: 'story_sheet',\r
+          filter_key: 'story_id',\r
+          order: {\r
+            type: 'method',\r
+          }\r
+        },\r
+      },\r
       by_story: {\r
         type: 'filter',\r
       },\r
index 0016b3d..73cb83d 100644 (file)
@@ -202,6 +202,86 @@ class ApplicationController < ActionController::Base
     render_form
   end
   
+  def created_html_format format
+    format.html {
+      flash[:notice] = I18n.t('flash.notice.created', :model => @my_model_class.model_name.human)
+      redirect_to @item
+    }
+  end
+  
+  def created_json_format format
+    format.json {
+      render json: @item.to_json(@my_model_class.show_json_opt), status: :created, location: @item
+    }
+  end
+  
+  def not_created_html_format format
+    format.html {
+      flash[:notice] = I18n.t('flash.notice.not_created', :model => @my_model_class.model_name.human)
+      render_form
+    }
+  end
+  
+  def not_created_json_format format
+    format.json {
+      render json: @item.errors, status: :unprocessable_entity
+    }
+  end
+  
+  def render_create
+    if @item.save
+      respond_to do |format|
+        created_html_format format
+        created_json_format format
+      end
+    else
+      respond_to do |format|
+        not_created_html_format format
+        not_created_json_format format
+      end
+    end
+  end
+  
+  def updated_html_format format
+    format.html {
+      flash[:notice] = I18n.t('flash.notice.updated', :model => @my_model_class.model_name.human)
+      redirect_to @item
+    }
+  end
+  
+  def updated_json_format format
+    format.json {
+      head :ok
+    }
+  end
+  
+  def not_update_html_format format
+    format.html {
+      flash[:notice] = I18n.t('flash.notice.not_updated', :model => @my_model_class.model_name.human)
+      render_form
+    }
+  end
+  
+  def not_updated_json_format format
+    format.json {
+      render json: @item.errors, status: :unprocessable_entity
+    }
+  end
+  
+  def render_update
+    if @item.save
+      respond_to do |format|
+        updated_html_format format
+        updated_json_format format
+      end
+    else
+      respond_to do |format|
+        not_updated_html_format format
+        not_updated_json_format format
+      end
+    end
+  end
+  
   def list_count
     set_list
     j = {:count => @list.count(@operators, {:id => params[:id]})}
index 587cc10..669ac36 100644 (file)
@@ -72,52 +72,34 @@ class ComicsController < ApplicationController
   end
   
   def create
-    @comic = Comic.new
-    @comic.supply_default 
-    @comic.attributes = params[:comic]
-    @comic.overwrite @operators
-
-    respond_to do |format|
-      if @comic.save
-        flash[:notice] = I18n.t('flash.notice.created', :model => Comic.model_name.human)
-        format.html { redirect_to @comic }
-        format.json { render json: @comic.to_json(Comic.show_json_opt), status: :created, location: @comic }
-      else
-        flash[:notice] = I18n.t('flash.notice.not_created', :model => Comic.model_name.human)
-        format.html { render action: "new" }
-        format.json { render json: @comic.errors, status: :unprocessable_entity }
-      end
-    end
+    set_model
+    @comic = @item
+    @item = @my_model_class.new
+    @item.supply_default 
+    @item.attributes = params[@my_model_class.item_name]
+    @item.overwrite @operators
+    render_create
   end
-
+  
   def update
-    @comic = Comic.edit(params[:id], @operators)
-    @comic.attributes = params[:comic]
-    @comic.overwrite @operators
-    respond_to do |format|
-      if @comic.save
-        flash[:notice] = I18n.t('flash.notice.updated', :model => Comic.model_name.human)
-        format.html { redirect_to @comic }
-        format.json { head :ok }
-      else
-        flash[:notice] = I18n.t('flash.notice.not_updated', :model => Comic.model_name.human)
-        format.html { render action: "edit" }
-        format.json { render json: @comic.errors, status: :unprocessable_entity }
-      end
-    end
+    set_edit
+    @comic = @item
+    @item.attributes = params[@my_model_class.item_name]
+    @item.overwrite @operators
+    render_update
   end
-
+  
   def destroy
-    @comic = Comic.edit(params[:id], @operators)
+    @item = Comic.edit(params[:id], @operators)
     respond_to do |format|
-      if @comic.destroy_with_story
+      if @item.destroy_with_leafs
         flash[:notice] = I18n.t('flash.notice.destroyed', :model => Comic.model_name.human)
         format.html { redirect_to '/home/comics' }
         format.json { head :ok }
       else
         flash[:notice] = I18n.t('flash.notice.not_destroyed', :model => Comic.model_name.human)
-        format.html { redirect_to @comic }
-        format.json { render json: @comic.errors, status: :unprocessable_entity }
+        format.html { redirect_to @item }
+        format.json { render json: @item.errors, status: :unprocessable_entity }
       end
     end
   end
index ee73c31..9e72bb0 100644 (file)
@@ -85,46 +85,27 @@ class ScrollsController < ApplicationController
   end
   
   def create
-    @item = Scroll.new
+    set_model
+    @scroll = @item
+    @item = @my_model_class.new
     @item.supply_default 
-    @item.attributes = params[:scroll]
+    @item.attributes = params[@my_model_class.item_name]
     @item.overwrite @operators
-
-    if @item.save
-      respond_to do |format|
-        flash[:notice] = I18n.t('flash.notice.created', :model => Scroll.model_name.human)
-        format.html { redirect_to @item }
-        format.json { render json: @item.to_json(Scroll.show_json_opt), status: :created, location: @item }
-      end
-    else
-      flash[:notice] = I18n.t('flash.notice.not_created', :model => Scroll.model_name.human)
-      render_new
-        format.html { render action: "new" }
-        format.json { render json: @item.errors, status: :unprocessable_entity }
-    end
+    render_create
   end
-
+  
   def update
-    @item = Scroll.edit(params[:id], @operators)
-    @item.attributes = params[:scroll]
+    set_edit
+    @scroll = @item
+    @item.attributes = params[@my_model_class.item_name]
     @item.overwrite @operators
-    respond_to do |format|
-      if @item.save
-        flash[:notice] = I18n.t('flash.notice.updated', :model => Scroll.model_name.human)
-        format.html { redirect_to @item }
-        format.json { head :ok }
-      else
-        flash[:notice] = I18n.t('flash.notice.not_updated', :model => Scroll.model_name.human)
-        format.html { render action: "edit" }
-        format.json { render json: @item.errors, status: :unprocessable_entity }
-      end
-    end
+    render_update
   end
-
+  
   def destroy
     @item = Scroll.edit(params[:id], @operators)
     respond_to do |format|
-      if @item.destroy_with_scroll_panel
+      if @item.destroy_with_leafs
         flash[:notice] = I18n.t('flash.notice.destroyed', :model => Scroll.model_name.human)
         format.html { redirect_to '/home/scrolls' }
         format.json { head :ok }
index 5977fe4..bbbbc6d 100644 (file)
@@ -32,10 +32,10 @@ class StoriesController < ApplicationController
   
   def show_html_format format
     format.html {
+      play_list = Locmare::ListGroup.list 'story_sheet', 'play'
+      @play_count = play_list.count(@operators, {:id => @item.id, :my_play => @item.own?(@operators)})
       if @operators.author
         @new_comic_items = assist_items('comic', 'private')
-        @new_sheet_items = assist_items('sheet', 'private')
-        #@new_sheet_filer = assist_filer 'sheet', @new_sheet_items
       end
     }
   end
@@ -50,28 +50,28 @@ class StoriesController < ApplicationController
   end
   
   def play
-    @item = Story.show(params[:id], @operators)
-    @page = StorySheet.page params[:page]
-    @sheet = StorySheet.play_sheet(@item, @operators, @page)
+    @item = self.class.model.show(params[:id], @operators)
+    @story = @item
+    set_play
+    @options = {:id => params[:id], :offset => params[:offset], :count => 1}
+    list_result = @list.open(@operators, @options)
+    @items = list_result.items
+    @count = @list.count(@operators, @options)
+    @pager = Kaminari.paginate_array(Array.new(@count, nil)).page(params[:offset]).per(1)
+    @sort_items = @list.items(@operators, 
+      {:id => params[:id], :my_play => @item.own?(@operators)},
+      0, -1
+    )
     respond_to do |format|
       format.html {
-        @paginate = StorySheet.play_paginate(@item, @page)
+        #@count = @action.list.count @item
+        #@prev_offset = @action.list.prev_offset @item
+        #@next_offset = @action.list.next_offset @item
         if @operators.author
           @new_sheet_items = assist_items('sheet', 'private')
-          #@new_sheet_filer = assist_filer 'sheet', @new_sheet_items
         end
       }
-      format.json {
-        if @sheet
-          @story_sheets = SheetPanel.play_list @sheet, @author
-          render text: SheetPanel.list_as_json_text(@story_sheets, @author)
-        else
-          render text: ''
-        end
-      }
-      format.jsonp {
-        render :json => "callback(" + @story_sheets.to_json_list + ");"
-      }
+      format.json { render json: @items.to_json(self.class.model.list_json_opt) }
     end
   end
   
@@ -100,58 +100,34 @@ class StoriesController < ApplicationController
   end
   
   def create
-    @story = Story.new
-    @story.supply_default 
-    jsn = nil
-    if params[:json]
-      jsn = JSON.parse_no_except(params[:json])
-    end
-    @prm = params[:story] || jsn
-    
-    respond_to do |format|
-      if @story.store @prm, @operators
-        flash[:notice] = I18n.t('flash.notice.created', :model => Story.model_name.human)
-        format.html { redirect_to @story }
-        format.json { render json: @story.to_json(Story.show_json_opt), status: :created, location: @story }
-      else
-        flash[:notice] = I18n.t('flash.notice.not_created', :model => Story.model_name.human)
-        format.html { render action: "new" }
-        format.json { render json: @story.errors, status: :unprocessable_entity }
-      end
-    end
+    set_model
+    @story = @item
+    @item = @my_model_class.new
+    @item.supply_default 
+    @item.attributes = params[@my_model_class.item_name]
+    @item.overwrite @operators
+    render_create
   end
   
   def update
-    @story = Story.edit(params[:id], @operators)
-    jsn = nil
-    if params[:json]
-      jsn = JSON.parse(params[:json])
-    end
-    @prm = params[:story] || jsn
-    respond_to do |format|
-      if @story.store @prm, @operators
-        flash[:notice] = I18n.t('flash.notice.updated', :model => Story.model_name.human)
-        format.html { redirect_to @story }
-        format.json { head :ok }
-      else
-        flash[:notice] = I18n.t('flash.notice.not_updated', :model => Story.model_name.human)
-        format.html { render action: "edit" }
-        format.json { render json: @story.errors, status: :unprocessable_entity }
-      end
-    end
+    set_edit
+    @story = @item
+    @item.attributes = params[@my_model_class.item_name]
+    @item.overwrite @operators
+    render_update
   end
   
   def destroy
-    @story = Story.edit(params[:id], @operators)
+    @item = Story.edit(params[:id], @operators)
     respond_to do |format|
-      if @story.destroy_with_story_panel
+      if @item.destroy_with_leafs
         flash[:notice] = I18n.t('flash.notice.destroyed', :model => Story.model_name.human)
         format.html { redirect_to '/home/stories' }
         format.json { head :ok }
       else
         flash[:notice] = I18n.t('flash.notice.not_destroyed', :model => Story.model_name.human)
-        format.html { redirect_to @story }
-        format.json { render json: @story.errors, status: :unprocessable_entity }
+        format.html { redirect_to @item }
+        format.json { render json: @item.errors, status: :unprocessable_entity }
       end
     end
   end
index 86c28e5..9821ae2 100644 (file)
@@ -1,5 +1,5 @@
 #コミック
-class Comic < Peta::Content
+class Comic < Peta::Binder
   load_manifest
   has_many :comic_stories
   belongs_to :author
@@ -64,18 +64,6 @@ class Comic < Peta::Content
     }
   end
   
-  def destroy_with_story
-    res = false
-    Comic.transaction do
-      self.stories.each do |story|
-        raise ActiveRecord::Rollback unless story.destroy_and_shorten
-      end
-      raise ActiveRecord::Rollback unless self.destroy
-      res = true
-    end
-    res
-  end
-  
   def scenario
     panels.map {|panel|
       panel.scenario
index b90eb91..8db7f1d 100644 (file)
@@ -131,23 +131,23 @@ class Folder < Peta::SystemResource
     mydocparts_ground_picture = self.add_remote mydocparts, 'ground_pictures'
     mydocparts_ground_color = self.add_remote mydocparts, 'ground_colors'
     # child of /my documents/index
-    mydocidx_scroll = self.add_remote mydocidx, 'scrolls'
-    mydocidx_scroll_panel = self.add_remote mydocidx, 'scroll_panels'
-    mydocidx_comic = self.add_remote mydocidx, 'comics'
-    mydocidx_comic_story = self.add_remote mydocidx, 'comic_stories'
-    mydocidx_story = self.add_remote mydocidx, 'stories'
-    mydocidx_story_sheet = self.add_remote mydocidx, 'story_sheets'
-    mydocidx_sheet = self.add_remote mydocidx, 'sheets'
-    mydocidx_sheet_panel = self.add_remote mydocidx, 'sheet_panels'
-    mydocidx_panel = self.add_remote mydocidx, 'panels'
-    mydocidx_panel_picture = self.add_remote mydocidx, 'panel_pictures'
-    mydocidx_speech_balloon = self.add_remote mydocidx, 'speech_balloons'
-    mydocidx_balloon = self.add_remote mydocidx, 'balloons'
-    mydocidx_speech = self.add_remote mydocidx, 'speeches'
-    mydocidx_ground_picture = self.add_remote mydocidx, 'ground_pictures'
-    mydocidx_ground_color = self.add_remote mydocidx, 'ground_colors'
+    mydocidx_scroll = self.add_remote mydocidx, 'scrolls', 'home', 'scrolls'
+    mydocidx_scroll_panel = self.add_remote mydocidx, 'scroll_panels', 'home', 'scroll_panels'
+    mydocidx_comic = self.add_remote mydocidx, 'comics', 'home', 'comics'
+    mydocidx_comic_story = self.add_remote mydocidx, 'comic_stories', 'home', 'comic_stories'
+    mydocidx_story = self.add_remote mydocidx, 'stories', 'home', 'stories'
+    mydocidx_story_sheet = self.add_remote mydocidx, 'story_sheets', 'home', 'story_sheets'
+    mydocidx_sheet = self.add_remote mydocidx, 'sheets', 'home', 'sheets'
+    mydocidx_sheet_panel = self.add_remote mydocidx, 'sheet_panels', 'home', 'sheet_panels'
+    mydocidx_panel = self.add_remote mydocidx, 'panels', 'home', 'panels'
+    mydocidx_panel_picture = self.add_remote mydocidx, 'panel_pictures', 'home', 'panel_pictures'
+    mydocidx_speech_balloon = self.add_remote mydocidx, 'speech_balloons', 'home', 'speech_balloons'
+    mydocidx_balloon = self.add_remote mydocidx, 'balloons', 'home', 'balloons'
+    mydocidx_speech = self.add_remote mydocidx, 'speeches', 'home', 'speeches'
+    mydocidx_ground_picture = self.add_remote mydocidx, 'ground_pictures', 'home', ''
+    mydocidx_ground_color = self.add_remote mydocidx, 'ground_colors', 'home', 'ground_colors'
     mydocpic_original_picture = self.add_remote mydocpic, 'original_pictures'
-    mydocidx_resource_picture = self.add_remote mydocidx, 'resource_pictures'
+    mydocidx_resource_picture = self.add_remote mydocidx, 'resource_pictures', 'home', 'resource_pictures'
     # child of /my documents/create
     mydocedt_scroll = self.add_remote mydocedt, 'new scroll', 'scrolls', 'new'
     mydocedt_panel = self.add_remote mydocedt, 'new panel', 'panels', 'new'
index 2fd03f8..2d2a57b 100644 (file)
@@ -56,22 +56,6 @@ class Scroll < Peta::Binder
     {:include => {:scroll_panels => {:include => {:panel => {}}}, :author => {}}}
   end
   
-  def self.visible_count
-    Scroll.count 'visible > 0'
-  end
-  
-  def destroy_with_scroll_panel
-    res = false
-    Scroll.transaction do
-      self.scroll_panels.each do |scroll_panel|
-        raise ActiveRecord::Rollback unless scroll_panel.destroy
-      end
-      raise ActiveRecord::Rollback unless self.destroy
-      res = true
-    end
-    res
-  end
-  
   def scenario
     panels.map {|panel|
       panel.scenario
index 1410b11..6284c56 100644 (file)
@@ -3,6 +3,9 @@ class Story < Peta::Binder
   load_manifest
   has_many :comic_stories
   has_many :story_sheets
+  has_many :sheets, :through => :story_sheets
+  has_many :play_story_sheets, :class_name => 'StorySheet', :order => 't'
+  has_many :play_sheets, :source => 'Sheet', :through => :play_story_sheets
   belongs_to :author
   
   validates :title, :presence => true, :length => {:maximum => 100}
@@ -38,10 +41,6 @@ class Story < Peta::Binder
     'stories.visible > 0'
   end
   
-  def self.list_order
-    'stories.updated_at desc'
-  end
-  
   def self.list_opt
     {:comic_stories => {:comic => {}}, :author => {} }
   end
@@ -58,114 +57,4 @@ class Story < Peta::Binder
     {:include => {:comic_stories => {:include => {:comic => {}}}, :author => {}}}
   end
   
-  def self.visible_count
-    Story.count 'visible > 0'
-  end
-  
-  def destroy_with_story_sheet
-    res = false
-    Story.transaction do
-      self.story_sheets.each do |story_sheet|
-        raise ActiveRecord::Rollback unless story_sheet.destroy
-      end
-      raise ActiveRecord::Rollback unless self.destroy
-      res = true
-    end
-    res
-  end
-  
-  def parts_element
-    self.leafs_items
-  end
-  
-  def zorderd_elements
-    res = []
-    self.parts_element.each do |e|
-      res[e.z-1] = e
-    end
-    res
-  end
-  
-  def story_elements
-    res = []
-    self.parts_element.each do |e|
-      res[e.t] = e
-    end
-    res
-  end
-  
-  def self.collect_element_value elements, name
-    elements.map {|e|
-      if e['_destroy'] or e[:_destroy]
-        nil
-      else
-        e[name]
-      end
-    }
-  end
-  
-  def self.validate_serial ary, offset = 0
-    i = offset
-    ary.compact.sort.each do |n|
-      break false unless n == i
-      i += 1
-    end
-    ary.compact.size == i - offset
-  end
-  
-  def self.validate_element_serial elements, name, offset = 0
-    self.validate_serial(self.collect_element_value(elements, name), offset)
-  end
-  
-  def self.validate_elements_serial c
-    c.map {|conf|
-      self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
-    }.compact.empty?
-  end
-  
-  def validate_serial_list
-    [
-      {:elements => self.leafs_items, :name => :t, :offset => 0}, 
-      {:elements => self.leafs_items, :name => :z, :offset => 1}
-    ]
-  end
-  def validate_child
-#    r1 = Panel.validate_elements_id validate_id_list
-    self.class.validate_elements_serial validate_serial_list
-  end
-  
-  def store attr, operators
-    if attr == false
-      self.errors.add :base, I18n.t('errors.invalid_json')
-      return false
-    end
-    self.attributes = attr
-    self.overwrite operators
-    res = false
-    Story.transaction do
-      self.story_elements.each do |elm|
-        elm.new_story = self
-        elm.boost operators
-      end
-      res = self.save
-      unless validate_child
-        res = false
-        self.errors.add :base, I18n.t('errors.invalid_t')
-        raise ActiveRecord::Rollback
-      end
-    end
-    res
-  end
-  
-  def destroy_and_shorten
-    res = false
-    Story.transaction do
-      Story.update_all('t = t - 1', ['comic_id = ? and (t > ?)', self.comic_id, self.t])
-      raise ActiveRecord::Rollback unless self.destroy_with_story_sheet
-      res = true
-    end
-    res
-  end
-  
-  
 end
index 2bc0ea8..935391c 100644 (file)
@@ -1,20 +1,35 @@
 <% @page_caption = @item.title %>
-<p id="notice"><%= notice %></p>
+<h1>
+  <%= link_to icon_tag('Story'), story_path(@item) %>
+  <%= link_to h(@item.title), play_story_path(@item) %>
+  <%= link_to icon_tag('Prof'), story_path(@item, :format => :prof) %>
+</h1>
 
-<% if @sheet -%>
-  <%= paginate(@paginate) %>
-  <% @sheet_panels = SheetPanel.play_list(@sheet, @operators) -%>
-  <%= render 'sheets/standard', :sheet_panels => @sheet_panels, :sheet => @sheet, :operators => @operators %>
-  <%= paginate(@paginate) %>
-
-  <%= render 'story_sheets/play_footer', :story => @item, :sheet => @sheet, :operators => @operators %>
-
-<% else %>
+<% if @items.empty? -%>
   <h2><%= t('stories.play.empty') %></h2>
+<% else %>
+  <%= paginate(@pager, :param_name => :offset) %>
+  <% @items.each do |story_sheet| %>
+    <% if story_sheet.sheet and story_sheet.sheet.visible?(@operators) -%>
+      <%= render 'sheets/standard', :sheet => story_sheet.sheet, :operators => @operators %>
+    <% end %>
+  <% end %>
+  <%= paginate(@pager, :param_name => :offset) %>
 <% end %>
-<%# render 'stories/play_footer', :story => @item, :operators => @operators %>
 
 <% if @item.own? @operators -%>
+  <p id="notice"><%= notice %></p>
+  
+  <% @sort_items.each do |story_sheet| %>
+    <% if story_sheet.sheet -%>
+      <div>
+        <%= link_to sheet_icon(:object => story_sheet.sheet, :size => 25), sheet_path(story_sheet.sheet) %>
+        <%= link_to h(truncate(story_sheet.sheet.caption, :length => 40)), play_sheet_path(story_sheet.sheet) %>
+        (<%= story_sheet.sheet.sheet_panels.size -%>)
+        <%= render 'story_sheets/order', :story_sheet => story_sheet, :operators => @operators %>
+      </div>
+    <% end %>
+  <% end %>
   <h3><%= t('story_sheets.append.new_sheets') -%></h3>
   <table>
     <% @new_sheet_items.each do |sheet| %>
index 28f5e3a..b96749e 100644 (file)
@@ -1,40 +1,38 @@
-<h1><%= t('.title') %></h1>
-<p id="notice"><%= notice %></p>
+<h1>
+  <%= link_to icon_tag('Story'), story_path(@item) %>
+  <%= link_to h(@item.title), play_story_path(@item) %>
+  <%= link_to icon_tag('Prof'), story_path(@item, :format => :prof) %>
+</h1>
 
 <div>
-  <%= link_to @item.title, story_path(@item) %>
-  <%= link_to_if @item, h(@item.title), play_story_path(@item) %>
-</div>
-
-<p>
   <b><%= t_m 'Story.description' -%>:</b>
   <%= h(@item.description) %>
-</p>
-
-<p>
-  <b><%= t_m 'Story.visible' -%>:</b>
-  <%= t_selected_item('story_visible_items', @item.visible) %>
-</p>
-
-<p>
-  <b><%= t_m 'Story.created_at' -%>:</b>
-  <%= l @item.created_at %>
-</p>
-
-<p>
-  <b><%= t_m 'Story.updated_at' -%>:</b>
-  <%= l @item.updated_at %>
-</p>
-<% @item.story_sheets.each do |story_sheet| %>
-  <% if story_sheet.sheet and story_sheet.sheet.visible?(@operators) -%>
-    <div>
-      <%= link_to sheet_icon(:object => story_sheet.sheet, :size => 25), sheet_path(story_sheet.sheet) %>
-      <%= link_to h(truncate(story_sheet.sheet.caption, :length => 40)), play_sheet_path(story_sheet.sheet) %>
-      (<%= story_sheet.sheet.sheet_panels.size -%>)
-    </div>
-  <% end %>
-<% end %>
+</div>
+
+<div>
+  <p>
+    <b><%= t_m 'Story.created_at' -%>:</b>
+    <%= l @item.created_at %>
+  </p>
+
+  <p>
+    <b><%= t_m 'Story.updated_at' -%>:</b>
+    <%= l @item.updated_at %>
+  </p>
+
+  <p>
+    <b>pages:</b>
+    <%= @play_count %>
+  </p>
+</div>
+
 <% if @item.own? @operators -%>
+  <p id="notice"><%= notice %></p>
+  <p>
+    <b><%= t_m 'Story.visible' -%>:</b>
+    <%= t_selected_item('story_visible_items', @item.visible) %>
+  </p>
+
   <%= link_to t('link.edit'), edit_story_path(@item) %>
   <%= link_to t('link.destroy'), story_path(@item), :method => :delete %>
 
     <% end %>
   </table>
 
-  <h3><%= t('story_sheets.append.new_sheets') -%></h3>
-  <table>
-    <% @new_sheet_items.each do |sheet| %>
-      <%= render 'story_sheets/append_sheet', :story => @item, :sheet => sheet, :operators => @operators %>
-    <% end %>
-  </table>
 <% end %>
index ace4b13..086bc56 100644 (file)
@@ -1,14 +1,14 @@
-<%= form_for(sheet_panel) do |f| %>
+<%= form_for(story_sheet) do |f| %>
   <table class="no-border">
     <tr>
       <td>
         No.
         <%= f.number_field :t, :size => 3 %>
-        <%= f.hidden_field :panel_id %>
+        <%= f.hidden_field :story_id %>
         <%= f.hidden_field :sheet_id %>
       </td>
       <td>
-        <%= f.submit t 'sheet_panels.move' %>
+        <%= f.submit t 'story_sheets.move' %>
       </td>
     </tr>
   </table>
index 4e8aa24..7192102 100644 (file)
@@ -1,23 +1,25 @@
 ManifestBase.require_modules "local_manifest/list_group/list/", 
-  %w|where includes|
+  %w|where includes order|
 
 module LocalManifest
   module ListGroupModule
     module ListModule
       class Base < ManifestBase::TypeNameArgs
         attr :model_manifest, :model_list_manifest, :model, 
-          :where, :includes
+          :where, :includes, :order
         
         def set_default
           super
           @args['where'] ||= {}
           @args['includes'] ||= {}
+          @args['order'] ||= {}
         end
         
         def init
           super
           @where = ManifestBase.load_type_args self, @args, 'where', WhereFactory
           @includes = ManifestBase.load_type_args self, @args, 'includes', IncludeFactory
+          @order = ManifestBase.load_type_args self, @args, 'order', OrderFactory
           
           @model_manifest = ::Manifest.manifest.models[self.item_name]
           @model_list_manifest = @model_manifest.list
diff --git a/lib/local_manifest/list_group/list/order.rb b/lib/local_manifest/list_group/list/order.rb
new file mode 100644 (file)
index 0000000..b006bdb
--- /dev/null
@@ -0,0 +1,23 @@
+ManifestBase.require_modules "local_manifest/list_group/list/order/", 
+  %w|base method auto|
+
+module LocalManifest
+  module ListGroupModule
+    module ListModule
+      class OrderFactory < ManifestBase::Factory
+        include OrderModule
+        
+        def self.types
+          {
+            'method' => OrderMethod, 'auto' => OrderAuto
+          }
+        end
+        
+        def self.default_type
+          'auto'
+        end
+        
+      end
+    end
+  end
+end
diff --git a/lib/local_manifest/list_group/list/order/auto.rb b/lib/local_manifest/list_group/list/order/auto.rb
new file mode 100644 (file)
index 0000000..6edd54b
--- /dev/null
@@ -0,0 +1,22 @@
+module LocalManifest
+  module ListGroupModule
+    module ListModule
+      module OrderModule
+        class OrderAuto < Base
+          def set_default
+            super
+          end
+          
+          def init
+            super
+          end
+          
+          def order
+            'list_order'
+          end
+          
+        end
+      end
+    end
+  end
+end
diff --git a/lib/local_manifest/list_group/list/order/base.rb b/lib/local_manifest/list_group/list/order/base.rb
new file mode 100644 (file)
index 0000000..2145594
--- /dev/null
@@ -0,0 +1,32 @@
+module LocalManifest
+  module ListGroupModule
+    module ListModule
+      module OrderModule
+        class Base < ManifestBase::TypeArgs
+          
+          def set_default
+            super
+          end
+          
+          def init
+            super
+          end
+          
+          def item_name
+            @parent.item_name
+          end
+          
+          def list_name
+            @parent.list_name
+          end
+          
+          def model
+            @parent.model
+          end
+          
+        end
+        
+      end
+    end
+  end
+end
diff --git a/lib/local_manifest/list_group/list/order/method.rb b/lib/local_manifest/list_group/list/order/method.rb
new file mode 100644 (file)
index 0000000..1dba6b4
--- /dev/null
@@ -0,0 +1,27 @@
+module LocalManifest
+  module ListGroupModule
+    module ListModule
+      module OrderModule
+        class OrderMethod < Base
+          attr :method_name
+          
+          def set_default
+            super
+            @args['method_name'] ||= @parent.name + '_list_order'
+          end
+          
+          def init
+            super
+            @method_name = @args['method_name']
+          end
+          
+          def order
+            @method_name
+          end
+          
+        end
+        
+      end
+    end
+  end
+end
index 87eeb35..e1efb8e 100644 (file)
@@ -62,7 +62,7 @@ module Locmare
               end
               
               def icon_file_name
-                '/images/prof.png'
+                '/images/prof.gif'
               end
               
               def icon_size
index 61ed328..55d8a50 100644 (file)
@@ -45,6 +45,7 @@ module Locmare
         @list_manifest = @list_group_manifest.lists[@list_name]
         @where = @list_manifest.where
         @includes = @list_manifest.includes
+        @order = @list_manifest.order
         @model_manifest = ::Manifest.manifest.models[@item_name]
         @model_list_manifest = @model_manifest.list
         @model = ::Manifest.item_name_to_model @item_name
@@ -96,7 +97,7 @@ module Locmare
       end
       
       def order
-        @model.list_order
+        @model.__send__ @order.order
       end
       
       def items operators, options, offset, page_size
index 0ff7846..3912b03 100644 (file)
@@ -1,9 +1,6 @@
 module Locmare
   module ListGroupModule
     class PlayList < FilterList
-      def order
-        @table_name + '.t'
-      end
       
       def offset cnt, prm = nil
         offset = prm.to_i
@@ -21,6 +18,29 @@ module Locmare
         count
       end
       
+      def where_condition filter_item_id, my_play = false
+        base_where = if my_play
+          ''
+        else
+          w = self.base_where_condition
+          w += ' and ' unless w.blank?
+          w
+        end
+        [base_where + @table_name + '.' + @filter_key + ' = ?', filter_item_id] 
+      end
+      
+      def items operators, options, offset, limit
+        filter_item_id = options[:id]
+        my_play = options[:my_play]
+        @model.where(self.where_condition(filter_item_id, my_play)).includes(self.include_hash).order(self.order).offset(offset).limit(limit)
+      end
+      
+      def count operators, options
+        filter_item_id = options[:id]
+        my_play = options[:my_play]
+        @model.where(self.where_condition(filter_item_id, my_play)).includes(self.include_hash).count
+      end
+      
       def open operators, options
         count = self.count operators, options
         offset = self.offset count, options[:offset]
index e3c53ca..33acd58 100644 (file)
@@ -1,5 +1,5 @@
 ManifestBase.require_modules "manifest/controller/action/", 
-  %w|base list show count new edit|
+  %w|base list show count new edit create update destroy|
 
 module Manifest
   module ControllerModule
@@ -9,7 +9,8 @@ module Manifest
       def self.types
         {
           'list' => ActionList, 'show' => ActionShow, 'count' => ActionCount, 
-          'new' => ActionNew, 'edit' => ActionEdit
+          'new' => ActionNew, 'edit' => ActionEdit, 
+          'create' => ActionCreate, 'update' => ActionUpdate, 'destroy' => ActionDestroy
         }
       end
       
diff --git a/lib/manifest/controller/action/create.rb b/lib/manifest/controller/action/create.rb
new file mode 100644 (file)
index 0000000..6f79644
--- /dev/null
@@ -0,0 +1,18 @@
+module Manifest
+  module ControllerModule
+    module ActionModule
+      class ActionCreate < Base
+        
+        def set_default
+          super
+        end
+        
+        def init
+          super
+        end
+        
+      end
+      
+    end
+  end
+end
diff --git a/lib/manifest/controller/action/destroy.rb b/lib/manifest/controller/action/destroy.rb
new file mode 100644 (file)
index 0000000..45d18ba
--- /dev/null
@@ -0,0 +1,18 @@
+module Manifest
+  module ControllerModule
+    module ActionModule
+      class ActionDestroy < Base
+        
+        def set_default
+          super
+        end
+        
+        def init
+          super
+        end
+        
+      end
+      
+    end
+  end
+end
diff --git a/lib/manifest/controller/action/update.rb b/lib/manifest/controller/action/update.rb
new file mode 100644 (file)
index 0000000..902a1dd
--- /dev/null
@@ -0,0 +1,18 @@
+module Manifest
+  module ControllerModule
+    module ActionModule
+      class ActionUpdate < Base
+        
+        def set_default
+          super
+        end
+        
+        def init
+          super
+        end
+        
+      end
+      
+    end
+  end
+end
index 43323c0..76872da 100644 (file)
@@ -29,6 +29,59 @@ module Peta
       end
     end
     
+    def self.collect_element_value elements, name
+      elements.map {|e|
+        if e['_destroy'] or e[:_destroy]
+          nil
+        else
+          e[name]
+        end
+      }
+    end
+    
+    def self.validate_serial ary, offset = 0
+      i = offset
+      ary.compact.sort.each do |n|
+        break false unless n == i
+        i += 1
+      end
+      ary.compact.size == i - offset
+    end
+    
+    def self.validate_element_serial elements, name, offset = 0
+      self.validate_serial(self.collect_element_value(elements, name), offset)
+    end
+    
+    def self.validate_elements_serial c
+      c.map {|conf|
+        self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
+      }.compact.empty?
+    end
+    
+    def validate_serial_list
+      [
+        {:elements => self.leafs_items, :name => :t, :offset => 0}, 
+        {:elements => self.leafs_items, :name => :z, :offset => 1}
+      ]
+    end
+    
+    def validate_child
+  #    r1 = Panel.validate_elements_id validate_id_list
+      self.class.validate_elements_serial validate_serial_list
+    end
+    
+    def destroy_with_leafs
+      res = false
+      self.class.transaction do
+        self.leafs_items.each do |leaf|
+          raise ActiveRecord::Rollback unless leaf.destroy_and_shorten
+        end
+        raise ActiveRecord::Rollback unless self.destroy
+        res = true
+      end
+      res
+    end
+    
   end
 end
 
index e379a1c..1d33143 100644 (file)
@@ -104,7 +104,7 @@ module Peta
     end
     
     def self.list_order
-      ''
+      self.table_name + '.updated_at desc'
     end
     
     def self.list_opt
index 16afd72..57e8d00 100644 (file)
@@ -45,6 +45,10 @@ module Peta
       ['scroll_panels.scroll_id = ?', cid]
     end
     
+    def self.play_list_order
+      'story_sheets.t'
+    end
+    
     def self.play_list scroll, author, offset = 0, limit = ScrollPanel.default_panel_size
       ScrollPanel.where(self.play_list_where(scroll.id)).includes(ScrollPanel.list_opt).order('scroll_panels.t').offset(offset).limit(limit)
     end
diff --git a/public/images/prof.gif b/public/images/prof.gif
new file mode 100644 (file)
index 0000000..2f68023
Binary files /dev/null and b/public/images/prof.gif differ
index daf04e7..deeca8d 100644 (file)
           "args": {\r
             "filter_item_name": "scroll",\r
             "filter_model_name": "scroll_panel",\r
-            "filter_key": "scroll_id"\r
+            "filter_key": "scroll_id",\r
+            "order": {\r
+              "type": "method"\r
+            }\r
           }\r
         },\r
         "by_scroll": {\r
           "args": {\r
             "filter_item_name": "comic",\r
             "filter_model_name": "comic_story",\r
-            "filter_key": "comic_id"\r
+            "filter_key": "comic_id",\r
+            "order": {\r
+              "type": "method"\r
+            }\r
           }\r
         },\r
         "by_comic": {\r
         "private": {\r
           "type": "private"\r
         },\r
+        "play": {\r
+          "type": "play",\r
+          "args": {\r
+            "filter_item_name": "story",\r
+            "filter_model_name": "story_sheet",\r
+            "filter_key": "story_id",\r
+            "order": {\r
+              "type": "method"\r
+            }\r
+          }\r
+        },\r
         "by_story": {\r
           "type": "filter"\r
         },\r
index 0f3a5ab..6e179e2 100644 (file)
         },\r
         "edit": {\r
           "type": "edit"\r
+        },\r
+        "create": {\r
+          "type": "create"\r
+        },\r
+        "update": {\r
+          "type": "update"\r
+        },\r
+        "destroy": {\r
+          "type": "destroy"\r
         }\r
       }\r
     },\r
         },\r
         "edit": {\r
           "type": "edit"\r
+        },\r
+        "create": {\r
+          "type": "create"\r
+        },\r
+        "update": {\r
+          "type": "update"\r
+        },\r
+        "destroy": {\r
+          "type": "destroy"\r
         }\r
       }\r
     },\r
         "play": {\r
           "type": "list",\r
           "args": {\r
+            "item_name": "story_sheet",\r
             "list_name": "play"\r
           }\r
         },\r
         },\r
         "edit": {\r
           "type": "edit"\r
+        },\r
+        "create": {\r
+          "type": "create"\r
+        },\r
+        "update": {\r
+          "type": "update"\r
+        },\r
+        "destroy": {\r
+          "type": "destroy"\r
         }\r
       }\r
     },\r