allow re-ordering of favorites by drag-and-drop

This commit is contained in:
Helmut Merz 2016-03-24 16:24:45 +01:00
parent 841eb204eb
commit 1d7f01dccb
3 changed files with 56 additions and 19 deletions

View file

@ -58,14 +58,21 @@ class FavoriteView(NodeView):
def listFavorites(self): def listFavorites(self):
if self.favorites is None: if self.favorites is None:
return return
for uid in self.favorites.list(self.person): self.registerDojoDnd()
form = self.request.form
if 'favorites_change_order' in form:
uids = form.get('favorite_uids')
if uids:
self.favorites.reorder(uids)
for trackUid, uid in self.favorites.listWithTracks(self.person):
obj = util.getObjectForUid(uid) obj = util.getObjectForUid(uid)
if obj is not None: if obj is not None:
yield dict(url=self.getUrlForTarget(obj), yield dict(url=self.getUrlForTarget(obj),
uid=uid, uid=uid,
title=obj.title, title=obj.title,
description=obj.description, description=obj.description,
object=obj) object=obj,
trackUid=trackUid)
def add(self): def add(self):
if self.favorites is None: if self.favorites is None:

View file

@ -1,24 +1,42 @@
<metal:actions define-macro="favorites_portlet" <metal:actions define-macro="favorites_portlet"
tal:define="view nocall:context/@@favorites_view; tal:define="view nocall:context/@@favorites_view;
targetUid view/targetUid"> targetUid view/targetUid">
<div tal:repeat="item view/listFavorites"> <form method="post">
<span style="float:right" class="delete-item">&nbsp;<a href="removeFavorite.html" <div dojoType="dojo.dnd.Source" withHandles="true" id="favorites_list">
tal:attributes="href <div class="dojoDndItem dojoDndHandle" style="padding: 0"
string:${view/virtualTargetUrl}/removeFavorite.html?id=${item/uid}; tal:repeat="item view/listFavorites">
title string:Remove from favorites" <span style="float:right" class="delete-item">&nbsp;<a
i18n:attributes="title">X</a>&nbsp;</span> tal:attributes="href
<a tal:attributes="href item/url; string:${view/virtualTargetUrl}/removeFavorite.html?id=${item/uid};
title item/description" title string:Remove from favorites"
tal:content="item/title">Some object</a> i18n:attributes="title">X</a>&nbsp;</span>
<a tal:attributes="href item/url;
title item/description"
tal:content="item/title">Some object</a>
<input type="hidden" name="favorite_uids:list"
tal:attributes="value item/trackUid" />
</div>
</div> </div>
<div id="addFavorite" class="action" <div>
tal:condition="targetUid"> <input type="submit" style="display: none"
<a i18n:translate="" name="favorites_change_order" id="favorites_change_order"
tal:attributes="href value="Save Changes"
string:${view/virtualTargetUrl}/addFavorite.html?id=$targetUid; i18n:attributes="value" />
title string:Add current object to favorites" <script language="javascript">
i18n:attributes="title">Add to Favorites</a> dojo.subscribe('/dnd/drop', function(data) {
if (data.node.id == 'favorites_list') {
dojo.byId('favorites_change_order').style.display = ''}});
</script>
</div> </div>
</form>
<div id="addFavorite" class="action"
tal:condition="targetUid">
<a i18n:translate=""
tal:attributes="href
string:${view/virtualTargetUrl}/addFavorite.html?id=$targetUid;
title string:Add current object to favorites"
i18n:attributes="title">Add to Favorites</a>
</div>
</metal:actions> </metal:actions>

View file

@ -41,12 +41,16 @@ class Favorites(object):
for item in self.listTracks(person, sortKey, type): for item in self.listTracks(person, sortKey, type):
yield item.taskId yield item.taskId
def listWithTracks(self, person, sortKey=None, type='favorite'):
for item in self.listTracks(person, sortKey, type):
yield util.getUidForObject(item), item.taskId
def listTracks(self, person, sortKey=None, type='favorite'): def listTracks(self, person, sortKey=None, type='favorite'):
if person is None: if person is None:
return return
personUid = util.getUidForObject(person) personUid = util.getUidForObject(person)
if sortKey is None: if sortKey is None:
sortKey = lambda x: -x.timeStamp sortKey = lambda x: (x.data.get('order', 0), -x.timeStamp)
for item in sorted(self.context.query(userName=personUid), key=sortKey): for item in sorted(self.context.query(userName=personUid), key=sortKey):
if type is not None: if type is not None:
if item.type != type: if item.type != type:
@ -77,6 +81,14 @@ class Favorites(object):
self.context.removeTrack(track) self.context.removeTrack(track)
return changed return changed
def reorder(self, uids):
for idx, uid in enumerate(uids):
track = util.getObjectForUid(uid)
if track is not None:
data = track.data
data['order'] = idx
track.data = data
class Favorite(Track): class Favorite(Track):