allow re-ordering of favorites by drag-and-drop
This commit is contained in:
parent
841eb204eb
commit
1d7f01dccb
3 changed files with 56 additions and 19 deletions
|
@ -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:
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
<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"> <a href="removeFavorite.html"
|
<div dojoType="dojo.dnd.Source" withHandles="true" id="favorites_list">
|
||||||
|
<div class="dojoDndItem dojoDndHandle" style="padding: 0"
|
||||||
|
tal:repeat="item view/listFavorites">
|
||||||
|
<span style="float:right" class="delete-item"> <a
|
||||||
tal:attributes="href
|
tal:attributes="href
|
||||||
string:${view/virtualTargetUrl}/removeFavorite.html?id=${item/uid};
|
string:${view/virtualTargetUrl}/removeFavorite.html?id=${item/uid};
|
||||||
title string:Remove from favorites"
|
title string:Remove from favorites"
|
||||||
|
@ -10,7 +13,22 @@
|
||||||
<a tal:attributes="href item/url;
|
<a tal:attributes="href item/url;
|
||||||
title item/description"
|
title item/description"
|
||||||
tal:content="item/title">Some object</a>
|
tal:content="item/title">Some object</a>
|
||||||
|
<input type="hidden" name="favorite_uids:list"
|
||||||
|
tal:attributes="value item/trackUid" />
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input type="submit" style="display: none"
|
||||||
|
name="favorites_change_order" id="favorites_change_order"
|
||||||
|
value="Save Changes"
|
||||||
|
i18n:attributes="value" />
|
||||||
|
<script language="javascript">
|
||||||
|
dojo.subscribe('/dnd/drop', function(data) {
|
||||||
|
if (data.node.id == 'favorites_list') {
|
||||||
|
dojo.byId('favorites_change_order').style.display = ''}});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
<div id="addFavorite" class="action"
|
<div id="addFavorite" class="action"
|
||||||
tal:condition="targetUid">
|
tal:condition="targetUid">
|
||||||
<a i18n:translate=""
|
<a i18n:translate=""
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue