\r
show_html: () -> \r
@item.fetch({cache: true}).done =>\r
- @redraw_title(@params, @item.get('title'))\r
+ @redraw_title(@params, @item.get('name'))\r
view = new Pettanr.Views.Artist.Show({\r
el: "#pettanr",\r
item: @item,\r
show_html: () -> \r
@redraw_title(@params)\r
@item.fetch({cache: true}).done =>\r
- @redraw_title(@params, @item.get('caption'))\r
+ @redraw_title(@params, @item.eget('caption'))\r
view = new Pettanr.Views.GroundPicture.Show({\r
el: "#pettanr",\r
item: @item,\r
this\r
\r
render: () ->\r
+ if Pettanr.is_blank(@caption())\r
+ empty = new Pettanr.Views.Common.EmptyCaption()\r
+ this.$el.html(empty.render().el)\r
+ else\r
+ this.$el.html(@caption())\r
this\r
\r
filer: () ->\r
super(options)\r
@render()\r
\r
- render: () ->\r
- if Pettanr.is_blank(@face())\r
- this.$el.html('empty')\r
- else\r
- this.$el.html(@face())\r
- this\r
- \r
face: () ->\r
- @item.get(@my_manifest.column_name)\r
+ @item.escape(@my_manifest.column_name)\r
+ \r
+ caption: () ->\r
+ @face()\r
\r
if @item[@method_name()]\r
@item[@method_name()]()\r
\r
- render: () ->\r
- this.$el.html(@item.caption_text)\r
- this\r
- \r
method_name: () ->\r
@my_manifest.method_name\r
\r
+ caption: () ->\r
+ @item.caption_text\r
+ \r
_.extend(@attr, @options())\r
this.$el.attr(@attr)\r
@select_values((members) =>\r
- _.each members, (member) =>\r
+ values = if @model_attribute_manifest().source.translate()\r
+ Pettanr.AppHelper.t_select_items(members)\r
+ else\r
+ members\r
+ _.each values, (member) =>\r
selected = if @is_selected(member)\r
' selected'\r
else\r
cb(members)\r
)\r
else\r
- s = Manifest.manifest().system_resources.select_items[@select_item_name()]\r
- members = Pettanr.AppHelper.t_select_items(s)\r
+ members = Manifest.manifest().system_resources.select_items[@select_item_name()]\r
cb(members)\r
\r
this\r
\r
value: () ->\r
- @column.item().get(@column.column_name)\r
+ @column.item().escape(@column.column_name)\r
\r
class Locmare.ProfilerModule.ColumnModule.DateValue extends Backbone.View\r
tagName: 'span'\r
this\r
\r
value: () ->\r
- JSON.stringify(JSON.parse(@column.item().get(@column.column_name)), 2)\r
+ JSON.stringify(JSON.parse(@column.item().escape(@column.column_name)), 2)\r
\r
class Locmare.ProfilerModule.ColumnModule.ExtendValue extends Backbone.View\r
tagName: 'div'\r
this\r
\r
value: () ->\r
- @extend_item().get(@extend_column.extend_column_name)\r
+ @extend_item().escape(@extend_column.extend_column_name)\r
\r
extend_item: () ->\r
@column.extend_item()\r
init: () ->\r
super()\r
\r
+ translate: () ->\r
+ @has_translation > 0\r
+ \r
item_name: () ->\r
@parent.item_name()\r
\r
set_default: () ->\r
super()\r
ManifestBase.alert_undefined_message 'select_item_name', @module_message if not @args['select_item_name']\r
+ @args['has_translation'] ||= 1\r
\r
init: () ->\r
super()\r
+ @has_translation = @args['has_translation']\r
@select_item_name = @args['select_item_name']\r
\r
\r
set_default: () ->\r
super()\r
+ @args['has_translation'] ||= 0\r
@args['resource_item_name'] ||= (@parent.name.replace('_id', ''))\r
@args['resource_action_name'] ||= 'index'\r
@args['select_item_name'] ||= @item_name() + '_' + @parent.name.replace('_id', '') + '_items'\r
\r
init: () ->\r
super()\r
+ @has_translation = @args['has_translation']\r
@resource_item_name = @args['resource_item_name']\r
@resource_action_name = @args['resource_action_name']\r
@select_item_name = @args['select_item_name']\r
I18n.t('comic_stories.show.t', {t: @disp_t()})\r
\r
title: () ->\r
- @disp_t_by_text() + ':' + @story().get('title')\r
+ @disp_t_by_text() + ':' + @story().escape('title')\r
\r
initialize: () ->\r
if @id\r
@get('name').replace(/\/$/, '').split('/').pop()\r
\r
filer_caption: () ->\r
- @caption_text = @caption()\r
+ @caption_text = _.escape(@caption())\r
@trigger('ready:caption')\r
\r
is_remote: () ->\r
new Pettanr.Image.SymbolPicture({\r
attr: {\r
src: picture.r_url(), \r
- alt: @get('caption')\r
+ alt: @escape('caption')\r
},\r
picture: picture\r
})\r
caption_with_group: () ->\r
i = @license_group()\r
i.fetch({cache: true}).done =>\r
- @caption_text = i.get('caption') + '/' + @get('caption')\r
+ @caption_text = i.escape('caption') + '/' + @escape('caption')\r
@trigger('ready:caption')\r
\r
initialize: () ->\r
picture: this\r
})\r
\r
- symbol_option: (cb) ->\r
+ symbol_option: () ->\r
@fetch({cache: true}).done =>\r
@symbol_picture = @tmb_opt_img_tag()\r
@trigger('ready:symbol')\r
\r
+ filer_caption: () ->\r
+ history = @history()\r
+ history.fetch({cache: true}).done =>\r
+ @caption_text = if _.isEmpty(history.models)\r
+ 'unpublished'\r
+ else\r
+ head = _.first(history.models)\r
+ Pettanr.to_s(head.get('revision'))\r
+ @trigger('ready:caption')\r
+ \r
revision: () ->\r
new Pettanr.OriginalPicture.Head({original_picture: this})\r
\r
url: '/original_pictures/'\r
\r
initialize: (options) ->\r
+ @original_picture = options.original_picture\r
@model = Pettanr.Picture\r
- @url = @url + options.id + '/history'\r
+ @url = @url + @original_picture.get('id') + '/history'\r
\r
class Pettanr.OriginalPicture.Head extends Backbone.View\r
tagName: 'span'\r
res\r
\r
filename: (picture) ->\r
- picture.filename() + '?subdir=' + @flip()\r
+ q = if _.isEmpty(@flip())\r
+ ''\r
+ else\r
+ '?subdir=' + @flip()\r
+ picture.filename() + q\r
\r
r_url: (picture) ->\r
'/pictures/' + @filename(picture)\r
new Pettanr.Image.SymbolPicture({\r
attr: {\r
src: picture.r_url(), \r
- alt: @get('caption')\r
+ alt: @escape('caption')\r
},\r
picture: picture\r
})\r
\r
scenario: () ->\r
@boosts('read')\r
- @render(@get('content'))\r
+ @render(@escape('content'))\r
\r
\r
initialize: () ->\r
@symbol_picture = sp.tmb_opt_img_tag()\r
@trigger('ready:symbol')\r
\r
+ filer_caption: () ->\r
+ @fetch({cache: true}).done =>\r
+ @caption_text = @escape('caption')\r
+ @trigger('ready:caption')\r
+ \r
plain_scenario: () ->\r
@get('caption')\r
\r
\r
redraw_title: (params, str = null) ->\r
t = str || I18n.t(params['controller'] + '.' + params['action'] + '.title')\r
- site_caption = Manifest.manifest().magic_numbers.profile.users.caption\r
+ site_caption = _.escape(Manifest.manifest().magic_numbers.profile.users.caption)\r
$(document).attr('title', t + ' - ' + site_caption)\r
\r
#>> https://gist.github.com/davidjbeveridge/3813724\r
load: () ->\r
@speech_balloon = @item.speech_balloon()\r
@speech_balloon.fetch({cache: true}).done =>\r
- @panel = @speech_balloon.panel()\r
- @panel.fetch({cache: true}).done =>\r
- @panel_icon = new Pettanr.Views.Common.Icon({item: @panel, half: true})\r
- @trigger('ready')\r
+ panel = @speech_balloon.panel()\r
+ panel.fetch({cache: true}).done =>\r
+ @panel_icon = new Pettanr.Views.Common.Icon({item: panel, half: true})\r
+ author = panel.author()\r
+ author.fetch({cache: true}).done =>\r
+ @author_icon_with_caption = author.icon_with_caption_view(true, 'name', 12)\r
+ @trigger('ready')\r
\r
render: () ->\r
this.$el.html('')\r
this.$el.append(@panel_icon.render().el)\r
+ this.$el.append(@author_icon_with_caption.render().el)\r
this\r
\r
}\r
super(opt)\r
\r
+class Pettanr.Views.Common.EmptyCaption extends Backbone.View\r
+ tagName: 'div'\r
+ className: 'empty'\r
+ \r
+ render: () ->\r
+ this.$el.html('empty')\r
+ this\r
+ \r
class Pettanr.Views.Common.Icon extends Backbone.View\r
tagName: 'span'\r
\r
@linked_name = new Tag.A({\r
attr: {href: '/' + @url}, \r
handler_name: @url,\r
- content: @name\r
+ content: _.escape(@name)\r
})\r
\r
render: () ->\r
symbol = new Pettanr.Views.GroundColor.Symbol({item: @element, class_name: 'elements-tab-face-icon'})\r
this.$el.append(symbol.render().el)\r
name = Pettanr.truncate(@element.get('caption'), 15)\r
- caption = new Tag.Span({class_name: 'elements-tab-face-caption', content: name})\r
+ caption = new Tag.Span({\r
+ class_name: 'elements-tab-face-caption', \r
+ content: _.escape(name)\r
+ })\r
this.$el.append(caption.render().el)\r
fe = new Tag.Div({class_name: 'elements-tab-face-end'})\r
this.$el.append(fe.render().el)\r
panel = @item.panel()\r
panel.fetch({cache: true}).done =>\r
@panel_icon = new Pettanr.Views.Common.Icon({item: panel, half: true})\r
- @trigger('ready')\r
+ author = panel.author()\r
+ author.fetch({cache: true}).done =>\r
+ @author_icon_with_caption = author.icon_with_caption_view(true, 'name', 12)\r
+ @trigger('ready')\r
\r
render: () ->\r
this.$el.html('')\r
this.$el.append(@panel_icon.render().el)\r
+ this.$el.append(@author_icon_with_caption.render().el)\r
this\r
\r
symbol = new Pettanr.Views.GroundPicture.ElementSymbol({element: @element})\r
this.$el.append(symbol.render().el)\r
name = Pettanr.truncate(@element.get('caption'), 15)\r
- caption = new Tag.Span({class_name: 'elements-tab-face-caption', content: name})\r
+ caption = new Tag.Span({\r
+ class_name: 'elements-tab-face-caption', \r
+ content: _.escape(name)\r
+ })\r
this.$el.append(caption.render().el)\r
fe = new Tag.Div({class_name: 'elements-tab-face-end'})\r
this.$el.append(fe.render().el)\r
class Pettanr.Views.License.Summary extends Pettanr.Views.Common.Summary\r
\r
initialize: (options) ->\r
+ super(options)\r
@item = options.item\r
@load()\r
\r
this.$el.html('')\r
symbol = new Pettanr.Views.PanelPicture.ElementSymbol({element: @element})\r
this.$el.append(symbol.render().el)\r
- name = Pettanr.truncate(@element.get('caption'), 15)\r
- caption = new Tag.Span({class_name: 'elements-tab-face-caption', content: name})\r
+ if name = @element.get('caption')\r
+ content = _.escape(Pettanr.truncate(@element.get('caption'), 15))\r
+ else\r
+ empty = new Pettanr.Views.Common.EmptyCaption()\r
+ content = empty.render().el\r
+ caption = new Tag.Span({\r
+ class_name: 'elements-tab-face-caption', \r
+ content: content\r
+ })\r
this.$el.append(caption.render().el)\r
fe = new Tag.Div({class_name: 'elements-tab-face-end'})\r
this.$el.append(fe.render().el)\r
attr: {href: '/' + @caption_url},\r
handler_name: @caption_url,\r
class_name: 'caption',\r
- content: @title\r
+ content: _.escape(@title)\r
})\r
@prof = new Pettanr.Image.SymbolImg({attr: {src: '/images/prof.gif'}, half: true})\r
@prof_button = new Tag.A({\r
@item = options.item\r
@author = @item.author()\r
@author.fetch({cache: true}).done =>\r
- name = @author.get('name')\r
+ name = @author.escape('name')\r
author_url = Pettanr.url(@author.table_name(), 'show', {id: @author.get('id')})\r
@linked_author = new Tag.A({\r
attr: {href: '/' + author_url}, \r
this.$el.append(symbol.render().el)\r
speech = @element.get('speech')\r
name = Pettanr.truncate(speech.get('content'), 15)\r
- caption = new Tag.Span({class_name: 'elements-tab-face-caption', content: name})\r
+ caption = new Tag.Span({\r
+ class_name: 'elements-tab-face-caption', \r
+ content: _.escape(name)\r
+ })\r
this.$el.append(caption.render().el)\r
rb = new Tag.RowBreak()\r
this.$el.append(rb.render().el)\r
class Pettanr.Views.SpeechBalloon.Summary extends Pettanr.Views.Common.Summary\r
\r
initialize: (options) ->\r
+ super(options)\r
@item = options.item\r
@load()\r
\r
panel = @item.panel()\r
panel.fetch({cache: true}).done =>\r
@panel_icon = new Pettanr.Views.Common.Icon({item: panel, half: true})\r
- @trigger('ready')\r
+ author = panel.author()\r
+ author.fetch({cache: true}).done =>\r
+ @author_icon_with_caption = author.icon_with_caption_view(true, 'name', 12)\r
+ @trigger('ready')\r
\r
render: () ->\r
this.$el.html('')\r
this.$el.append(@panel_icon.render().el)\r
+ this.$el.append(@author_icon_with_caption.render().el)\r
this\r
\r
panel = @speech_balloon.panel()\r
panel.fetch({cache: true}).done =>\r
@panel_icon = new Pettanr.Views.Common.Icon({item: panel, half: true})\r
- @trigger('ready')\r
+ author = panel.author()\r
+ author.fetch({cache: true}).done =>\r
+ @author_icon_with_caption = author.icon_with_caption_view(true, 'name', 12)\r
+ @trigger('ready')\r
\r
render: () ->\r
this.$el.html('')\r
this.$el.append(@panel_icon.render().el)\r
+ this.$el.append(@author_icon_with_caption.render().el)\r
this\r
\r
if ar = @operators.artist\r
artist = ar.icon_with_caption_view()\r
this.$el.append(artist.render().el)\r
- sign_out = new Tag.A({attr: {href: '/'}, class_name: 'sign_out', content: 'sign out'})\r
+ sign_out = new Tag.A({\r
+ attr: {href: '/'}, \r
+ class_name: 'sign_out', \r
+ content: 'sign out'\r
+ })\r
this.$el.append(sign_out.render().el)\r
@delegateEvents({'click .sign_out': 'sign_out'})\r
this\r
type: 'list',\r
args: {\r
alias: 'comic_stories.by_comic',\r
+ max_page_size: -1,\r
order: 't',\r
direction: 1\r
},\r
type: 'list',\r
args: {\r
alias: 'story_sheets.by_story',\r
+ max_page_size: -1,\r
order: 't',\r
direction: 1\r
},\r
face: {\r
type: 'method',\r
args: {\r
- method_name: 'plain_scenario',\r
+ method_name: 'filer_caption',\r
},\r
},\r
link: {\r
face: {\r
type: 'method',\r
args: {\r
- method_name: 'revision',\r
+ method_name: 'filer_caption',\r
},\r
},\r
link: {\r
text-align: left;
}
+div.empty {
+ color: #aaaaaa;
+}
+
input.error {
border-width: 3px;
border-style: solid;
end
def create
- @my_model_class = self.class.model
+ set_model
@item = @my_model_class.new
@item.supply_default
@item.attributes = params[@item.item_name]
@binder = @my_model_class.binder_model.edit(@item.binder_id, @operators) if @item.binder_id
@panel = @my_model_class.destination_model.show(@item.destination_id, @operators) if @item.destination_id
- leaf_render_create play_scroll_path(@binder)
+ leaf_render_create play_comic_path(@binder)
end
def update
# swapable hidden panel
#@panel = @my_model_class.destination_model.show(@item.destination_id, @operators) if @item.destination_id
- leaf_render_update ot, play_scroll_path(@binder)
+ leaf_render_update ot, play_comic_path(@binder)
end
def destroy
def show_html_format format
format.html {
- play_list = Locmare::ListGroup.list(
+ @play_list = Locmare::ListGroup.list(
'comic_stories', 'by_comic', @operators,
- {:id => @item.id, :my_play => @item.own?(@operators)}
+ {:id => @item.id, :page_size => -1} # set no limit options
)
- @play_count = play_list.count(@operators)
}
end
def play
set_play
+ @list.options.merge!({'page_size' => -1}) # no limit no pager
+ @list.reset
play_list
- # no limit
- # no pager
respond_to do |format|
format.html {
if @item.own? @operators
def show_html_format format
format.html {
- play_list = Locmare::ListGroup.list(
+ @play_list = Locmare::ListGroup.list(
'scroll_panels', 'by_scroll', @operators,
- {:id => @item.id, :my_play => @item.own?(@operators)}
+ {:id => @item.id, :page_size => -1} # set no limit options}
)
- @play_count = play_list.count(@operators)
}
end
def show_html_format format
format.html {
- play_list = Locmare::ListGroup.list(
+ @play_list = Locmare::ListGroup.list(
'story_sheets', 'by_story', @operators,
- {:id => @item.id, :my_play => @item.own?(@operators)}
+ {:id => @item.id, :page_size => -1} # set no limit options
)
- @play_count = play_list.count(@operators)
}
end
end
def play
+ set_play
+ @list.options.merge!({'per_page' => 1}) # show one sheet
+ @list.reset
play_list
- # no limit
- # no pager
respond_to do |format|
format.html {
+ @pager = @list.page_status.pager
if @item.own? @operators
@new_sheet_items = assist_items('home', 'sheets')
end
@binder = @my_model_class.binder_model.edit(@item.binder_id, @operators) if @item.binder_id
@panel = @my_model_class.destination_model.show(@item.destination_id, @operators) if @item.destination_id
- leaf_render_create play_scroll_path(@binder)
+ leaf_render_create play_story_path(@binder)
end
def update
# swapable hidden panel
#@panel = @my_model_class.destination_model.show(@item.destination_id, @operators) if @item.destination_id
- leaf_render_update ot, play_scroll_path(@binder)
+ leaf_render_update ot, play_story_path(@binder)
end
def destroy
name.gsub(/\/$/, '').split('/').last
end
+ def filer_caption
+ self.caption
+ end
+
def remote_name
'/' + self.controller_name.to_s + '/' + self.action_name.to_s
end
self.tmb_opt_img_tag
end
+ def filer_caption
+ self.revision
+ end
+
def revision
head = self.history.first
head ? head.revision : 'unpublished'
end
def filename
- self.picture.filename + '?subdir=' + self.flip
+ q = self.flip.empty? ? '' : '?subdir=' + self.flip
+ self.picture.filename + q
end
def url
self.speech_balloon_template.symbol_option
end
+ def filer_caption
+ self.plain_scenario
+ end
+
def self.public_list_where list
'panels.publish > 0'
end
<%= l @item.updated_at %>
</p>
<p>
- <b>pages:</b>
- <%= @play_count %>
+ <b>stories:</b>
+ <%= @play_list.total %>
</p>
</div>
<%= l @item.updated_at %>
</p>
<p>
- <b>pages:</b>
- <%= @play_count %>
+ <b>panels:</b>
+ <%= @play_list.total %>
</p>
</div>
<% if @items.empty? -%>
<h2><%= t('stories.play.empty') %></h2>
<% else %>
- <%= paginate(@pager) %>
+ <%= render @pager.template_name, :pager => @pager %>
<% @items.each do |story_sheet| %>
<% if story_sheet.sheet and story_sheet.sheet.visible?(@operators) -%>
<%= render 'sheets/standard', :sheet => story_sheet.sheet, :operators => @operators %>
sheet is hidden or deleted
<% end %>
<% end %>
- <%= paginate(@pager) %>
+ <%= render @pager.template_name, :pager => @pager %>
<% end %>
<% if @item.own? @operators -%>
<%= l @item.updated_at %>
</p>
<p>
- <b>pages:</b>
- <%= @play_count %>
+ <b>sheets:</b>
+ <%= @play_list.total %>
</p>
</div>
<%= select_tag tag.form_field_name,
- options_for_select(tag.source_by_filter? ? tag.items : t_select_items(tag.items), :selected => tag.value.to_s),
+ options_for_select((tag.translate? ? t_select_items(tag.items) : tag.items), :selected => tag.value.to_s),
tag.options
%>
-(<%= t_selected_item(column.select_item_name, column.value) %>)
+(<%= column.translate? ? t_selected_item(column.select_item_name, column.value) : column.value %>)
self.model_attribute_manifest.source.select_item_name
end
+ def translate?
+ self.model_attribute_manifest.source.translate?
+ end
+
def items
if self.source_by_filter?
resource_item_name = self.model_attribute_manifest.source.resource_item_name
resource_controller_name,
resource_action_name,
self.form.operators,
- {:id => filter_id}
+ {:id => filter_id, 'page_size' => -1} # no limit
)
- list.items(nil,
- 0, -1 # no limit
- ).map {|i| [i.caption, i.id] }
+ list.items.map {|i| [i.caption, i.id] }
else
::Manifest.manifest.system_resources.select_items[self.select_item_name]
end
def init
end
+ def reset
+ @page_status = nil
+ @item = nil
+ @total = nil
+ end
+
def page_status
@page_status ||= LibModule::PageStatus.load(self, self.total, @options)
end
self.model_attribute_manifest.source
end
+ def translate?
+ self.model_attribute_source_manifest.translate?
+ end
+
def template_file_name
"source"
end
module AttributeModule
module SourceModule
class Base < ManifestBase::TypeArgs
+ attr :has_translation
def set_default
super
@parent.item_name
end
+ def translate?
+ @has_translation > 0
+ end
+
end
end
def set_default
super
ManifestBase.alert_undefined_message 'select_item_name', self.module_message unless @args['select_item_name']
+ @args['has_translation'] ||= 1
end
def init
super
@select_item_name = @args['select_item_name']
+ @has_translation = @args['has_translation']
end
end
def set_default
super
+ @args['has_translation'] ||= 0
@args['resource_item_name'] ||= (@parent.name.gsub('_id', ''))
@args['resource_action_name'] ||= 'index'
@args['select_item_name'] ||= self.item_name + '_' + @parent.name.gsub('_id', '') + '_items'
def init
super
+ @has_translation = @args['has_translation']
@resource_item_name = @args['resource_item_name']
@resource_action_name = @args['resource_action_name']
@select_item_name = @args['select_item_name']
}\r
},\r
"play": {\r
- "type": "public"\r
+ "type": "play",\r
+ "args": {\r
+ "filter_item_name": "comic",\r
+ "wheres": [\r
+ "index",\r
+ "play"\r
+ ]\r
+ }\r
}\r
}\r
},\r
"type": "filter"\r
},\r
"play": {\r
- "type": "public"\r
+ "type": "play",\r
+ "args": {\r
+ "filter_item_name": "story",\r
+ "wheres": [\r
+ "index",\r
+ "play"\r
+ ]\r
+ }\r
}\r
}\r
},\r
"face": {\r
"type": "method",\r
"args": {\r
- "method_name": "plain_scenario"\r
+ "method_name": "filer_caption"\r
}\r
},\r
"link": {\r
"face": {\r
"type": "method",\r
"args": {\r
- "method_name": "revision"\r
+ "method_name": "filer_caption"\r
}\r
},\r
"link": {\r
"type": "list",\r
"args": {\r
"alias": "comic_stories.by_comic",\r
+ "max_page_size": -1,\r
"order": "t",\r
"direction": 1\r
}\r
"type": "list",\r
"args": {\r
"alias": "story_sheets.by_story",\r
+ "max_page_size": -1,\r
"order": "t",\r
"direction": 1\r
}\r