summaryrefslogtreecommitdiffstats
path: root/js/app
diff options
context:
space:
mode:
authorBernhard Posselt <nukeawhale@gmail.com>2013-05-10 15:19:30 +0200
committerBernhard Posselt <nukeawhale@gmail.com>2013-05-10 15:19:30 +0200
commit3843f75b494bd8f612dc7b940a1d9b331d70f581 (patch)
treeb7342ddf4820b3d060bbbae5b5aa64235bc492a1 /js/app
parent347000cc2d5597c1971942ebdbe97461c9fa5802 (diff)
undo queue fixes (unittests not adjusted yet: todo fix folderbusinesslayer and feedbusinesslayer specs)
Diffstat (limited to 'js/app')
-rw-r--r--js/app/app.coffee1
-rw-r--r--js/app/directives/undonotification.coffee32
-rw-r--r--js/app/services/businesslayer/feedbusinesslayer.coffee22
-rw-r--r--js/app/services/businesslayer/folderbusinesslayer.coffee27
-rw-r--r--js/app/services/persistence.coffee21
-rw-r--r--js/app/services/undoqueue.coffee87
6 files changed, 67 insertions, 123 deletions
diff --git a/js/app/app.coffee b/js/app/app.coffee
index a6e0511f4..32a77a9e3 100644
--- a/js/app/app.coffee
+++ b/js/app/app.coffee
@@ -28,6 +28,7 @@ angular.module('News', ['OC', 'ui']).config ($provide) ->
scrollTimeout: 500
feedUpdateInterval: 1000*60*3 # miliseconds
itemBatchSize: 20
+ undoTimeout: 1000*10 # miliseconds
# the autoPageFactor defines how many articles must be left
# before it starts autopaging
autoPageFactor: 10
diff --git a/js/app/directives/undonotification.coffee b/js/app/directives/undonotification.coffee
index 5e30af169..acf3f886d 100644
--- a/js/app/directives/undonotification.coffee
+++ b/js/app/directives/undonotification.coffee
@@ -20,23 +20,22 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
-angular.module('News').directive 'undoNotification', ['$rootScope',
-($rootScope) ->
+angular.module('News').directive 'undoNotification',
+['$rootScope', '$timeout', 'Config',
+($rootScope, $timeout, Config) ->
return (scope, elm, attr) ->
-
- elm.click ->
- $(@).fadeOut()
-
- scope.$on 'notUndone', ->
- $(elm).fadeOut()
-
undo = ->
caption = ''
+ timeout = null
+
+ $(elm).click ->
+ timout = null
+ $(@).fadeOut()
- link = $(elm).find('a')
- link.click ->
+ $(elm).find('a').click ->
undo()
+ timout = null
$rootScope.$apply()
elm.fadeOut()
@@ -44,9 +43,18 @@ angular.module('News').directive 'undoNotification', ['$rootScope',
return caption
scope.$on 'undoMessage', (scope, data) ->
+ # cancel previous timeouts
+ if timeout
+ $timeout.cancel(timeout.promise)
+
+ # fade out if not reset with a new
+ timeout = $timeout =>
+ $(elm).fadeOut()
+ , Config.undoTimeout
+
undo = data.undoCallback
caption = data.caption
- elm.fadeIn().css("display","inline")
+ $(elm).fadeIn().css("display","inline")
] \ No newline at end of file
diff --git a/js/app/services/businesslayer/feedbusinesslayer.coffee b/js/app/services/businesslayer/feedbusinesslayer.coffee
index 8dc1c126a..2219ce2cd 100644
--- a/js/app/services/businesslayer/feedbusinesslayer.coffee
+++ b/js/app/services/businesslayer/feedbusinesslayer.coffee
@@ -24,15 +24,15 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
angular.module('News').factory 'FeedBusinessLayer',
['_BusinessLayer', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType',
'ItemModel', 'FeedModel', 'NewLoading', '_ExistsError', 'Utils', '$rootScope',
-'UndoQueue', 'NewestItem',
+'NewestItem',
(_BusinessLayer, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel,
-FeedModel, NewLoading, _ExistsError, Utils, $rootScope, UndoQueue, NewestItem)->
+FeedModel, NewLoading, _ExistsError, Utils, $rootScope, NewestItem)->
class FeedBusinessLayer extends _BusinessLayer
constructor: (@_showAll, @_feedModel, persistence, activeFeed, feedType,
itemModel, @_newLoading, @_utils, @_$rootScope,
- @_undoQueue, @_newestItem) ->
+ @_newestItem) ->
super(activeFeed, persistence, itemModel, feedType.Feed)
@_feedType = feedType
@@ -55,13 +55,15 @@ FeedModel, NewLoading, _ExistsError, Utils, $rootScope, UndoQueue, NewestItem)->
delete: (feedId) ->
feed = @_feedModel.removeById(feedId)
- callback = =>
- @_persistence.deleteFeed(feedId)
-
- undoCallback = =>
- @_feedModel.add(feed)
- @_undoQueue.add(feed.title, callback, 10*1000, undoCallback)
+ data =
+ undoCallback: =>
+ @_persistence.restoreFeed feedId, =>
+ @_persistence.getAllFeeds()
+ caption: feed.title
+
+ @_$rootScope.$broadcast 'undoMessage', data
+ @_persistence.deleteFeed(feedId)
markRead: (feedId) ->
@@ -192,6 +194,6 @@ FeedModel, NewLoading, _ExistsError, Utils, $rootScope, UndoQueue, NewestItem)->
return new FeedBusinessLayer(ShowAll, FeedModel, Persistence, ActiveFeed,
FeedType, ItemModel, NewLoading, Utils,
- $rootScope, UndoQueue, NewestItem)
+ $rootScope, NewestItem)
] \ No newline at end of file
diff --git a/js/app/services/businesslayer/folderbusinesslayer.coffee b/js/app/services/businesslayer/folderbusinesslayer.coffee
index 3d1fbb7c7..94bc974e6 100644
--- a/js/app/services/businesslayer/folderbusinesslayer.coffee
+++ b/js/app/services/businesslayer/folderbusinesslayer.coffee
@@ -24,16 +24,16 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
angular.module('News').factory 'FolderBusinessLayer',
['_BusinessLayer', 'FolderModel', 'FeedBusinessLayer', 'Persistence',
'FeedType', 'ActiveFeed', 'ItemModel', 'ShowAll', '_ExistsError', 'OPMLParser',
-'UndoQueue', 'NewestItem', 'FeedModel',
+'NewestItem', 'FeedModel', '$rootScope',
(_BusinessLayer, FolderModel, FeedBusinessLayer, Persistence, FeedType,
-ActiveFeed, ItemModel, ShowAll, _ExistsError, OPMLParser, UndoQueue,
-NewestItem, FeedModel) ->
+ActiveFeed, ItemModel, ShowAll, _ExistsError, OPMLParser, NewestItem,
+FeedModel, $rootScope) ->
class FolderBusinessLayer extends _BusinessLayer
constructor: (@_folderModel, @_feedBusinessLayer, @_showAll, activeFeed,
persistence, @_feedType, itemModel, @_opmlParser,
- @_undoQueue, @_newestItem, @_feedModel) ->
+ @_newestItem, @_feedModel, @_$rootScope) ->
super(activeFeed, persistence, itemModel, @_feedType.Folder)
@@ -48,16 +48,17 @@ NewestItem, FeedModel) ->
feeds.push(@_feedModel.removeById(feed.id))
folder = @_folderModel.removeById(folderId)
-
- callback = =>
- @_persistence.deleteFolder(folderId)
- undoCallback = =>
- @_folderModel.add(folder)
- for feed in feeds
- @_feedModel.add(feed)
+ data =
+ undoCallback: =>
+ @_persistence.restoreFolder folderId, =>
+ @_persistence.getAllFeeds()
+ @_persistence.getAllFolders()
+ caption: folder.name
+
+ @_$rootScope.$broadcast 'undoMessage', data
+ @_persistence.deleteFolder(folderId)
- @_undoQueue.add(folder.name, callback, 10*1000, undoCallback)
hasFeeds: (folderId) ->
@@ -183,6 +184,6 @@ NewestItem, FeedModel) ->
return new FolderBusinessLayer(FolderModel, FeedBusinessLayer, ShowAll,
ActiveFeed, Persistence, FeedType, ItemModel,
- OPMLParser, UndoQueue, NewestItem, FeedModel)
+ OPMLParser, NewestItem, FeedModel, $rootScope)
] \ No newline at end of file
diff --git a/js/app/services/persistence.coffee b/js/app/services/persistence.coffee
index a5905e745..98549b98f 100644
--- a/js/app/services/persistence.coffee
+++ b/js/app/services/persistence.coffee
@@ -200,6 +200,16 @@ $rootScope) ->
@_request.post 'news_feeds_delete', params
+ restoreFeed: (feedId, onSuccess=null) ->
+ onSuccess or= ->
+ params =
+ onSuccess: onSuccess
+ routeParams:
+ feedId: feedId
+
+ @_request.post 'news_feeds_restore', params
+
+
moveFeed: (feedId, folderId) ->
###
moves a feed to a new folder
@@ -319,10 +329,19 @@ $rootScope) ->
routeParams:
folderId: folderId
-
@_request.post 'news_folders_delete', params
+ restoreFolder: (folderId, onSuccess=null) ->
+ onSuccess or= ->
+ params =
+ onSuccess: onSuccess
+ routeParams:
+ folderId: folderId
+
+ @_request.post 'news_folders_restore', params
+
+
renameFolder: (folderId, folderName) ->
###
Save if a folder was collapsed
diff --git a/js/app/services/undoqueue.coffee b/js/app/services/undoqueue.coffee
deleted file mode 100644
index 631013d13..000000000
--- a/js/app/services/undoqueue.coffee
+++ /dev/null
@@ -1,87 +0,0 @@
-###
-
-ownCloud - App Framework
-
-@author Bernhard Posselt
-@copyright 2012 Bernhard Posselt nukeawhale@gmail.com
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-License as published by the Free Software Foundation; either
-version 3 of the License, or any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-
-You should have received a copy of the GNU Affero General Public
-License along with this library. If not, see <http://www.gnu.org/licenses/>.
-
-###
-
-# A class which follows the command pattern
-# Can be used for actions that need need to be able to undo like folder deletion
-angular.module('News').factory 'UndoQueue',
-['$timeout', '$rootScope',
-($timeout, $rootScope) ->
-
- class UndoQueue
-
- constructor: (@_$timeout, @_$rootScope) ->
- @_queue = []
-
-
- add: (@_caption, @_callback, @_timeout=0, @_undoCallback=null) ->
- ###
- @_caption the caption which indentifies the item
- @_callback function the callback which should be executed when it was
- not undone, this will usually be a request to the server to finally
- delete something
- @_timeout int the timeout after the callback should be executed
- defaults to 0
- @_undoCallback function the function which should be executed when
- an command has been canceled. Usually this will add back a deleted
- object back to the interface, defaults to an empty function
- ###
- @executeAll()
-
- command =
- _undoCallback: @_undoCallback or= ->
- _callback: @_callback
- execute: =>
- command._callback()
- undo: =>
- command._undoCallback()
- @_$timeout.cancel(command.promise)
- @_queue = []
- promise: @_$timeout =>
- command.execute()
- @_queue = []
- @_$rootScope.$broadcast('notUndone')
- , @_timeout
-
- data =
- undoCallback: command.undo
- caption: @_caption
-
- @_$rootScope.$broadcast 'undoMessage', data
-
- @_queue.push(command)
-
-
- executeAll: ->
- ###
- Executes the callback before the timeout has run out
- This is useful to execute all remaining commands if a new command is
- added
- ###
- for command in @_queue
- @_$timeout.cancel(command.promise)
- command.execute()
- @_queue = []
-
-
- return new UndoQueue($timeout, $rootScope)
-
-] \ No newline at end of file