2012-02-01 01:01:42 +00:00
|
|
|
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'
|
2012-02-01 01:01:42 +00:00
|
|
|
'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()
|
2012-02-01 01:01:42 +00:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2012-02-01 01:01:42 +00:00
|
|
|
@$('.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)
|
2012-02-01 01:01:42 +00:00
|
|
|
@$('> 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)
|
2012-02-01 01:01:42 +00:00
|
|
|
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)
|
|
|
|
|
2012-02-27 11:48:06 +00:00
|
|
|
@collection.get(entry.id).set(entry.attributes) # sync
|
|
|
|
|
2012-02-02 15:53:26 +00:00
|
|
|
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)
|
|
|
|
|
2012-02-01 01:01:42 +00:00
|
|
|
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))
|
2012-02-01 01:01:42 +00:00
|
|
|
entry.set _destroy: true
|
|
|
|
|
2012-02-02 15:53:26 +00:00
|
|
|
$(event.target).closest('li').remove()
|
2012-02-01 12:09:35 +00:00
|
|
|
@$('.empty').show() if @$('> ul > li').size() == 0
|
2012-02-01 01:01:42 +00:00
|
|
|
@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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|