diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2012-08-31 19:14:57 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2012-09-01 00:31:39 +0200 |
commit | 9df1c658c1db523d42e77fe2ab938aeddbde8695 (patch) | |
tree | 624baa038b195b3620258691c7ef544fee3d7555 /js | |
parent | 401371d2137f96100324ff9ab4ac9a8388df02d5 (diff) |
prevent loading when drag and dropping feeds
Diffstat (limited to 'js')
-rw-r--r-- | js/items.js | 185 | ||||
-rw-r--r-- | js/menu.js | 60 | ||||
-rw-r--r-- | js/news.js | 88 |
3 files changed, 173 insertions, 160 deletions
diff --git a/js/items.js b/js/items.js index 7946e796a..87242de13 100644 --- a/js/items.js +++ b/js/items.js @@ -18,11 +18,106 @@ var t = t || function(app, string){ return string; }; // mock translation for lo (function(){ + /** + * Creates a new item instance and tells it to put the items into + * the selected div + * @param cssSelector the selector of the div which holds the ul for the feeds + */ var Items = function(cssSelector){ this._$articleList = $(cssSelector); this._$articleList.scrollTop(0); + // this array is used to store ids to prevent sending too + // many posts when scrolling. the structure is: feed_id: boolean + this._processing = {}; } + /** + * Loads the feeds into the righ view + * @param type the type (MenuNodeType) + * @param id the id + * @param onSuccessCallback a callback that is executed when the loading succeeded + */ + Items.prototype.load = function(type, id, onSuccessCallback) { + var self = this; + var data = { + feedId: id, + feedType: type + }; + + this._$articleList.addClass('loading'); + this._$articleList.children('ul').hide(); + + $.post(OC.filePath('news', 'ajax', 'loadfeed.php'), data, function(jsonData) { + if(jsonData.status == 'success'){ + // FIXME: caching? split whole html into single articles + self._$articleList.empty().html(jsonData.data.feedItems) + self._bindItemEventListeners(); + self._$articleList.scrollTop(0); + onSuccessCallback(); + } else { + OC.dialogs.alert(t('news', 'Error while loading the feed'), t('news', 'Error')); + this._$articleList.children('ul').show(); + } + self._$articleList.removeClass('loading'); + }); + }; + + + // FIXME + /** + * Binds a listener on the feed item list to detect scrolling and mark previous + * items as read + */ + Items.prototype._bindItemEventListeners = function() { + // single hover on item should mark it as read too + $('#feed_items h1.item_title a').click(function(){ + var $item = $(this).parent().parent('.feed_item'); + var itemId = $item.data('id'); + var handler = new News.ItemStatusHandler(itemId); + handler.setRead(true); + }); + + // single hover on item should mark it as read too + $('#feed_items .body').click(function(){ + var $item = $(this).parent('.feed_item'); + var itemId = $item.data('id'); + var handler = new News.ItemStatusHandler(itemId); + handler.setRead(true); + }); + + // mark or unmark as important + $('#feed_items li.star').click(function(){ + var $item = $(this).parent().parent().parent('.feed_item'); + var itemId = $item.data('id'); + var handler = new News.ItemStatusHandler(itemId); + handler.toggleImportant(); + }); + + // toggle logic for the keep unread handler + $('#feed_items .keep_unread').click(function(){ + var $item = $(this).parent().parent().parent('.feed_item'); + var itemId = $item.data('id'); + var handler = new News.ItemStatusHandler(itemId); + handler.toggleKeepUnread(); + }); + $('#feed_items .keep_unread input[type=checkbox]').click(function(){ + var $item = $(this).parent().parent().parent().parent('.feed_item'); + var itemId = $item.data('id'); + var handler = new News.ItemStatusHandler(itemId); + handler.toggleKeepUnread(); + }); + + // bind the mark all as read button + $('#mark_all_as_read').unbind(); + $('#mark_all_as_read').click(function(){ + var feedId = News.Feed.activeFeedId; + News.Feed.setAllItemsRead(feedId); + }); + + $("time.timeago").timeago(); + }; + + Items.prototype.length = function(type, id) { return 0; }; @@ -38,81 +133,29 @@ var t = t || function(app, string){ return string; }; // mock translation for lo // TODO: integrate This -/** - * Binds a listener on the feed item list to detect scrolling and mark previous - * items as read - */ -function bindItemEventListeners(){ - - // single hover on item should mark it as read too - $('#feed_items h1.item_title a').click(function(){ - var $item = $(this).parent().parent('.feed_item'); - var itemId = $item.data('id'); - var handler = new News.ItemStatusHandler(itemId); - handler.setRead(true); - }); - // single hover on item should mark it as read too - $('#feed_items .body').click(function(){ - var $item = $(this).parent('.feed_item'); - var itemId = $item.data('id'); - var handler = new News.ItemStatusHandler(itemId); - handler.setRead(true); - }); - - // mark or unmark as important - $('#feed_items li.star').click(function(){ - var $item = $(this).parent().parent().parent('.feed_item'); - var itemId = $item.data('id'); - var handler = new News.ItemStatusHandler(itemId); - handler.toggleImportant(); - }); - // toggle logic for the keep unread handler - $('#feed_items .keep_unread').click(function(){ - var $item = $(this).parent().parent().parent('.feed_item'); - var itemId = $item.data('id'); - var handler = new News.ItemStatusHandler(itemId); - handler.toggleKeepUnread(); - }); - $('#feed_items .keep_unread input[type=checkbox]').click(function(){ - var $item = $(this).parent().parent().parent().parent('.feed_item'); - var itemId = $item.data('id'); - var handler = new News.ItemStatusHandler(itemId); - handler.toggleKeepUnread(); - }); - // bind the mark all as read button - $('#mark_all_as_read').unbind(); - $('#mark_all_as_read').click(function(){ - var feedId = News.Feed.activeFeedId; - News.Feed.setAllItemsRead(feedId); - }); - $("time.timeago").timeago(); - -} - - -/** - * Marks an item as read which is called by the timeout - * @param item the dom item - */ -function markItemAsRead(scrollArea, item){ - var itemId = parseInt($(item).data('id')); - var itemOffset = $(item).position().top; - var boxHeight = $(scrollArea).height(); - var scrollHeight = $(scrollArea).prop('scrollHeight'); - var scrolled = $(scrollArea).scrollTop() + boxHeight; - if(itemOffset < 0 || scrolled >= scrollHeight){ - if(News.Feed.processing[itemId] === undefined || News.Feed.processing[itemId] === false){ - // mark item as processing to prevent unecessary post requests - News.Feed.processing[itemId] = true; - var handler = new News.ItemStatusHandler(itemId); - handler.setRead(true); - } - } -} + /** + * Marks an item as read which is called by the timeout + * @param item the dom item + */ + function markItemAsRead(scrollArea, item){ + var itemId = parseInt($(item).data('id')); + var itemOffset = $(item).position().top; + var boxHeight = $(scrollArea).height(); + var scrollHeight = $(scrollArea).prop('scrollHeight'); + var scrolled = $(scrollArea).scrollTop() + boxHeight; + if(itemOffset < 0 || scrolled >= scrollHeight){ + if(News.Feed.processing[itemId] === undefined || News.Feed.processing[itemId] === false){ + // mark item as processing to prevent unecessary post requests + News.Feed.processing[itemId] = true; + var handler = new News.ItemStatusHandler(itemId); + handler.setRead(true); + } + } + } /** * This handler handles changes in the ui when the itemstatus changes diff --git a/js/menu.js b/js/menu.js index ba66c0f76..a306ff9fd 100644 --- a/js/menu.js +++ b/js/menu.js @@ -368,7 +368,12 @@ var News = News || {}; this._getAndRemoveUnreadCount($listItem)); $listItem.children('.title').click(function(){ - self._load(MenuNodeType.Feed, id); + // prevent loading when dragging + if($(this).hasClass('noclick')){ + $(this).removeClass('noclick'); + } else { + self._load(MenuNodeType.Feed, id); + } return false; }); @@ -385,6 +390,9 @@ var News = News || {}; stack: '> li', zIndex: 1000, axis: 'y', + start: function(event, ui){ + $(this).children('.title').addClass('noclick'); + } }); }; @@ -424,8 +432,11 @@ var News = News || {}; * @param id the id */ Menu.prototype._load = function(type, id){ - this._setActiveFeed(type, id); - this._items.load(type, id); + var self = this; + this._items.load(type, id, function(){ + self._setActiveFeed(type, id); + self.triggerHideRead(); + }); }; /** @@ -434,7 +445,44 @@ var News = News || {}; * @param id the id */ Menu.prototype._delete = function(type, id){ - // TODO: + var self = this; + var confirmMessage; + var url; + var data; + + switch(type){ + case MenuNodeType.Feed: + confirmMessage = t('news', 'Are you sure you want to delete this feed?'); + url = 'deletefeed.php'; + data = { + feedid: id + }; + break; + + case MenuNodeType.Folder: + confirmMessage = t('news', 'Are you sure you want to delete this folder and all its feeds?'); + url = 'deletefolder.php'; + data = { + folderid: id + }; + break; + } + + OC.dialogs.confirm(confirmMessage, t('news', 'Warning'), function(answer) { + if(answer == true) { + $.post(OC.filePath('news', 'ajax', url), data,function(jsonData){ + if(jsonData.status == 'success'){ + self.removeNode(type, id); + // if we move the current feed or folder, reload page + if(type === self._activeFeedType && id === self._activeFeedId){ + window.location.reload(); + } + } else{ + OC.dialogs.alert(jsondata.data.message, t('news', 'Error')); + } + }); + } + }); }; /** @@ -740,6 +788,10 @@ var News = News || {}; self._resetOpenFolders(); self._moveFeedToFolder(feedId, folderId); + + event.stopImmediatePropagation(); + event.stopPropagation(); + return false; } }); }; diff --git a/js/news.js b/js/news.js index 2c6a20e6a..57c70a066 100644 --- a/js/news.js +++ b/js/news.js @@ -1,4 +1,4 @@ -News={ +News = { DropDownMenu: { fade:function(menu){ $(menu).toggle(); @@ -78,25 +78,6 @@ News={ $(button).prop('value', t('news','Add folder')); }); }, - 'delete':function(folderid) { - $('.feeds_delete').tipsy('hide'); - OC.dialogs.confirm(t('news', 'Are you sure you want to delete this folder and all its feeds?'), t('news', 'Warning'), function(answer) { - if(answer == true) { - var rightcontent = $('div.rightcontent'); - var shownfeedid = rightcontent.attr('data-id'); - $.post(OC.filePath('news', 'ajax', 'deletefolder.php'),{'folderid':folderid, 'shownfeedid':shownfeedid},function(jsondata){ - if(jsondata.status == 'success'){ - $('.collapsable_container[data-id="' + jsondata.data.folderid + '"]').remove(); - transformCollapsableTrigger(); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('news', 'Error')); - } - }); - } - }); - return false; - } }, Feed: { id:'', @@ -160,75 +141,12 @@ News={ } }); }, - 'delete':function(feedid) { - $('.feeds_delete').tipsy('hide'); - OC.dialogs.confirm(t('news', 'Are you sure you want to delete this feed?'), t('news', 'Warning'), function(answer) { - if(answer == true) { - $.post(OC.filePath('news', 'ajax', 'deletefeed.php'),{'feedid':feedid},function(jsondata){ - if(jsondata.status == 'success'){ - $('li.feed[data-id="'+jsondata.data.feedid+'"]').remove(); - - var rightcontent = $('div.rightcontent'); - if(rightcontent.attr('data-id') == feedid) { - rightcontent.find('div#feedadded').remove(); - rightcontent.find('ul.accordion').before(jsondata.data.part_items); - transformCollapsableTrigger(); - // if the deleted feed is the current feed, reload the page - // window.location.reload(); - } - } - else{ - OC.dialogs.alert(jsondata.data.message, t('news', 'Error')); - } - }); - } - }); - return false; - }, load:function(feedId) { - var $feedItems = $('#feed_items'); - $feedItems.empty(); - $feedItems.addClass('loading'); - $.post(OC.filePath('news', 'ajax', 'loadfeed.php'), { 'feedId' : feedId }, function(jsonData) { - if(jsonData.status == 'success'){ - // set active id - var $rightContent = $(".rightcontent"); - $rightContent.attr('data-id', feedId); - News.Feed.activeFeedId = parseInt(feedId); - // load in new items - $feedItems.html(jsonData.data.feedItems); - // scroll to the top position - $feedItems.scrollTop(0); - // set title - var $feedTitle = $(".feed_controls .feed_title h1"); - $feedTitle.html(jsonData.data.feedTitle); - $feedTitle.attr('title', jsonData.data.feedTitle); - // update unread count - $feedHandler = new News.FeedStatusHandler(feedId); - $feedHandler.setUnreadCount(jsonData.data.unreadItemCount); - // select new feed - $('li#selected_feed').attr('id', ''); - if(feedId < 0){ - $('li[data-id="' + feedId + '"]').attr('id', 'selected_feed'); - } else { - $('li.feed[data-id="' + feedId + '"]').attr('id', 'selected_feed'); - } - // refresh callbacks - transformCollapsableTrigger(); - bindItemEventListeners(); - } - else { - OC.dialogs.alert(t('news', 'Error while loading the feed'), t('news', 'Error')); - } - $feedItems.removeClass('loading'); - }); + }, - // this array is used to store ids to prevent sending too - // many posts when scrolling. the structure is: feed_id: boolean - processing:{}, - activeFeedId: -1000, + }, |