engine/app/assets/javascripts/locomotive/views/shared/fields/has_many_view.js.coffee

121 lines
3.1 KiB
CoffeeScript
Raw Normal View History

Locomotive.Views.Shared ||= {}
Locomotive.Views.Shared.Fields ||= {}
class Locomotive.Views.Shared.Fields.HasManyView extends Backbone.View
tagName: 'div'
className: 'list'
events:
2012-02-02 15:53:26 +00:00
'click p.actions a.add': 'open_new_entry_view'
'click ul span.actions a.edit': 'edit_entry'
'click ul span.actions a.remove': 'remove_entry'
template: ->
ich["#{@options.name}_list"]
entry_template: ->
ich["#{@options.name}_entry"]
initialize: ->
_.bindAll(@, 'refresh_position_entries')
@collection = @model.get(@options.name)
2012-02-02 15:53:26 +00:00
@build_target_entry_view()
render: ->
$(@el).html(@template()())
@insert_entries()
@make_entries_sortable()
return @
insert_entries: ->
if @collection.length > 0
@collection.each (entry) => @insert_entry(entry)
else
@$('.empty').show()
insert_entry: (entry) ->
2012-02-02 15:53:26 +00:00
unless @collection.get(entry.get('_id'))?
@collection.add(entry)
@$('.empty').hide()
entry_html = $(@entry_template()(label: entry.get('_label')))
2012-02-02 15:53:26 +00:00
entry_html.data('data-entry-id', entry.id)
@$('> ul').append(entry_html)
make_entries_sortable: ->
@sortable_list = @$('> ul').sortable
handle: '.handle'
items: 'li'
axis: 'y'
update: @refresh_position_entries
refresh_position_entries: ->
@$('> ul > li').each (index, entry_html) =>
2012-02-02 15:53:26 +00:00
id = $(entry_html).data('data-entry-id')
entry = @collection.get(id)
entry.set_attribute "position_in_#{@options.inverse_of}", index
2012-02-02 15:53:26 +00:00
build_target_entry_view: ->
@target_entry_view = new Locomotive.Views.ContentEntries.PopupFormView
el: $("##{@options.name}-template-entry")
parent_view: @
model: @options.new_entry.clone() # by default, it does not matter
@target_entry_view.render()
edit_entry: (event) ->
event.stopPropagation() & event.preventDefault()
entry = @get_entry_from_element($(event.target))
@target_entry_view.reset(entry)
@target_entry_view.open()
update_entry: (entry) ->
entry_html = $(_.detect @$('> ul > li'), (_entry_html) -> $(_entry_html).data('data-entry-id') == entry.id)
new_entry_html = $(@entry_template()(label: entry.get('_label')))
new_entry_html.data('data-entry-id', entry.id)
entry_html.replaceWith(new_entry_html)
insert_or_update_entry: (entry) ->
if @collection.get(entry.id)?
@update_entry(entry)
else
@insert_entry(entry)
remove_entry: (event) ->
event.stopPropagation() & event.preventDefault()
if confirm($(event.target).attr('data-confirm'))
2012-02-02 15:53:26 +00:00
entry = @get_entry_from_element($(event.target))
entry.set _destroy: true
2012-02-02 15:53:26 +00:00
$(event.target).closest('li').remove()
@$('.empty').show() if @$('> ul > li').size() == 0
@refresh_position_entries()
2012-02-02 15:53:26 +00:00
open_new_entry_view: (event) ->
event.stopPropagation() & event.preventDefault()
@target_entry_view.reset(@options.new_entry.clone())
@target_entry_view.open()
get_entry_from_element: (element) =>
entry_html = $(element).closest('li')
id = $(entry_html).data('data-entry-id')
@collection.get(id)