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