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
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
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
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]})}
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
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 }
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
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
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
#コミック
-class Comic < Peta::Content
+class Comic < Peta::Binder
load_manifest
has_many :comic_stories
belongs_to :author
}
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
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'
{: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
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}
'stories.visible > 0'
end
- def self.list_order
- 'stories.updated_at desc'
- end
-
def self.list_opt
{:comic_stories => {:comic => {}}, :author => {} }
end
{: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
<% @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| %>
-<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 %>
-<%= 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>
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
end
def icon_file_name
- '/images/prof.png'
+ '/images/prof.gif'
end
def icon_size
@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
end
def order
- @model.list_order
+ @model.__send__ @order.order
end
def items operators, options, offset, page_size
module Locmare
module ListGroupModule
class PlayList < FilterList
- def order
- @table_name + '.t'
- end
def offset cnt, prm = nil
offset = prm.to_i
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]
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
def self.types
{
'list' => ActionList, 'show' => ActionShow, 'count' => ActionCount,
- 'new' => ActionNew, 'edit' => ActionEdit
+ 'new' => ActionNew, 'edit' => ActionEdit,
+ 'create' => ActionCreate, 'update' => ActionUpdate, 'destroy' => ActionDestroy
}
end
--- /dev/null
+module Manifest
+ module ControllerModule
+ module ActionModule
+ class ActionCreate < Base
+
+ def set_default
+ super
+ end
+
+ def init
+ super
+ end
+
+ end
+
+ end
+ end
+end
--- /dev/null
+module Manifest
+ module ControllerModule
+ module ActionModule
+ class ActionDestroy < Base
+
+ def set_default
+ super
+ end
+
+ def init
+ super
+ end
+
+ end
+
+ end
+ end
+end
--- /dev/null
+module Manifest
+ module ControllerModule
+ module ActionModule
+ class ActionUpdate < Base
+
+ def set_default
+ super
+ end
+
+ def init
+ super
+ end
+
+ end
+
+ end
+ end
+end
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
end
def self.list_order
- ''
+ self.table_name + '.updated_at desc'
end
def self.list_opt
['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
"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
},\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