diff options
Diffstat (limited to 'js/app')
33 files changed, 1360 insertions, 26 deletions
diff --git a/js/app/app.coffee b/js/app/app.coffee index 03a25c6c4..0c5763bd2 100644 --- a/js/app/app.coffee +++ b/js/app/app.coffee @@ -22,7 +22,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. # app main -angular.module('News', ['OC', 'ui']).config ($provide) -> +angular.module('News', ['ui']).config ['$provide', '$httpProvider', +($provide, $httpProvider) -> $provide.value 'Config', config = markReadTimeout: 500 scrollTimeout: 500 @@ -33,6 +34,9 @@ angular.module('News', ['OC', 'ui']).config ($provide) -> # before it starts autopaging autoPageFactor: 30 + # Always send the CSRF token by default + $httpProvider.defaults.headers.common['requesttoken'] = oc_requesttoken +] angular.module('News').run ['Persistence', 'Config', (Persistence, Config) -> diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee index ee8b9375f..43186e689 100644 --- a/js/app/controllers/feedcontroller.coffee +++ b/js/app/controllers/feedcontroller.coffee @@ -47,6 +47,14 @@ ActiveFeed, FeedType, $window) -> @_$scope.starredBusinessLayer = @_starredBusinessLayer @_$scope.unreadCountFormatter = @_unreadCountFormatter + @_$scope.edit = (feed) -> + feed.editing = true + feed.originalValue = feed.title + + @_$scope.cancel = (feed) -> + feed.editing = false + feed.title = feed.originalValue + @_$scope.getTotalUnreadCount = => # also update title based on unreadcount count = @_subscriptionsBusinessLayer.getUnreadCount(0) diff --git a/js/app/controllers/itemcontroller.coffee b/js/app/controllers/itemcontroller.coffee index ee2fa7e82..f381baede 100644 --- a/js/app/controllers/itemcontroller.coffee +++ b/js/app/controllers/itemcontroller.coffee @@ -37,16 +37,6 @@ Language, AutoPageLoading, Compact) -> @_$scope.itemBusinessLayer = @_itemBusinessLayer @_$scope.feedBusinessLayer = @_feedBusinessLayer - @_$scope.edit = (feedId) => - feed = @_feedModel.getById(feedId) - feed.editing = true - feed.originalValue = feed.title - - @_$scope.cancel = (feedId) => - feed = @_feedModel.getById(feedId) - feed.editing = false - feed.title = feed.originalValue - @_$scope.isLoading = => return @_feedLoading.isLoading() diff --git a/js/app/directives/bindunsafehtml.coffee b/js/app/directives/bindunsafehtml.coffee new file mode 100644 index 000000000..36240ad23 --- /dev/null +++ b/js/app/directives/bindunsafehtml.coffee @@ -0,0 +1,26 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + +angular.module('News').directive 'newsBindHtmlUnsafe', -> + return (scope, element, attr) -> + scope.$watch attr.newsBindHtmlUnsafe, (value) -> + element.html(scope.$eval(attr.newsBindHtmlUnsafe)) diff --git a/js/app/directives/clickfocus.coffee b/js/app/directives/clickfocus.coffee new file mode 100644 index 000000000..4a5323418 --- /dev/null +++ b/js/app/directives/clickfocus.coffee @@ -0,0 +1,44 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + +# Used to focus an element when you click on the element that this directive is +# bound to +# The selector attribute needs to defined, this element will be focused +# If the timeout attribute is defined, it will focus the element after +# after the passed miliseconds +# Examlpe: <div oc-click-focus="{selector: '#app-content', timeout: 3000}"> +angular.module('News').directive 'ocClickFocus', ['$timeout', ($timeout) -> + + return (scope, elm, attr) -> + options = scope.$eval(attr.ocClickFocus) + + if angular.isDefined(options) and angular.isDefined(options.selector) + elm.click -> + if angular.isDefined(options.timeout) + $timeout -> + $(options.selector).focus() + , options.timeout + else + $(options.selector).focus() + + +]
\ No newline at end of file diff --git a/js/app/directives/clickslidetoggle.coffee b/js/app/directives/clickslidetoggle.coffee new file mode 100644 index 000000000..e31c5e955 --- /dev/null +++ b/js/app/directives/clickslidetoggle.coffee @@ -0,0 +1,82 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + + + +# Used to slide up an area and can be customized by passing an expression. +# If selector is defined, a different area is slid up on click +# If hideOnFocusLost is defined, the slid up area will hide when the focus is +# If cssClass is defined this class will be applied to the element +# lost +angular.module('News').directive 'ocClickSlideToggle', +['$rootScope', ($rootScope) -> + + return (scope, elm, attr) -> + options = scope.$eval(attr.ocClickSlideToggle) + + # get selected slide area + if angular.isDefined(options) and angular.isDefined(options.selector) + slideArea = $(options.selector) + else + slideArea = elm + + # get css class for element + if angular.isDefined(options) and angular.isDefined(options.cssClass) + cssClass = options.cssClass + else + cssClass = false + + elm.click -> + if slideArea.is(':visible') and not slideArea.is(':animated') + slideArea.slideUp() + if cssClass != false + elm.removeClass('opened') + else + slideArea.slideDown() + if cssClass != false + elm.addClass('opened') + + # if focus lost is set use broadcast to be sure that the currently + # active element doesnt get slid up + if angular.isDefined(options) and + angular.isDefined(options.hideOnFocusLost) and + options.hideOnFocusLost + $(document.body).click -> + $rootScope.$broadcast 'ocLostFocus' + + $rootScope.$on 'ocLostFocus', (scope, params) -> + if params != slideArea + if slideArea.is(':visible') and not slideArea.is(':animated') + slideArea.slideUp() + + if cssClass != false + elm.removeClass('opened') + + slideArea.click (e) -> + $rootScope.$broadcast 'ocLostFocus', slideArea + e.stopPropagation() + + elm.click (e) -> + $rootScope.$broadcast 'ocLostFocus', slideArea + e.stopPropagation() + +]
\ No newline at end of file diff --git a/js/app/directives/draggable.coffee b/js/app/directives/draggable.coffee new file mode 100644 index 000000000..22fa041bf --- /dev/null +++ b/js/app/directives/draggable.coffee @@ -0,0 +1,32 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + +# Wrapper for jquery ui draggable +angular.module('News').directive 'ocDraggable', -> + + return (scope, elm, attr) -> + options = scope.$eval(attr.ocDraggable) + + if angular.isDefined(options) + elm.draggable(options) + else + elm.draggable() diff --git a/js/app/directives/forwardclick.coffee b/js/app/directives/forwardclick.coffee new file mode 100644 index 000000000..d4fdac10a --- /dev/null +++ b/js/app/directives/forwardclick.coffee @@ -0,0 +1,35 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + + +# Used to forward clicks to another element via jquery selector +# The expression which can be passed looks like this {selector:'#opml-upload'} +# The element where to which the click was fowarded must not be a child element +# otherwise this will end in endless recursion +angular.module('News').directive 'ocForwardClick', -> + + return (scope, elm, attr) -> + options = scope.$eval(attr.ocForwardClick) + + if angular.isDefined(options) and angular.isDefined(options.selector) + $(elm).click -> + $(options.selector).trigger('click') diff --git a/js/app/directives/itemshortcuts.coffee b/js/app/directives/itemshortcuts.coffee index 49dc75b37..8eec1bf0a 100644 --- a/js/app/directives/itemshortcuts.coffee +++ b/js/app/directives/itemshortcuts.coffee @@ -102,8 +102,7 @@ angular.module('News').directive 'itemShortcuts', ['$window', ($window) -> if not (focused.is('input') or focused.is('select') or focused.is('textarea') or - focused.is('checkbox') or - focused.is('button')) + focused.is('checkbox')) # activate shortcuts only if modifier keys are not pressed if not(e.shiftKey or e.altKey or e.ctrlKey or e.metaKey) diff --git a/js/app/directives/readfile.coffee b/js/app/directives/readfile.coffee new file mode 100644 index 000000000..fc5cc0c80 --- /dev/null +++ b/js/app/directives/readfile.coffee @@ -0,0 +1,44 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + +### +This directive can be bound on an input element with type file +When a file is input, the content will be passed to the given function as +$fileContent parameter +### +angular.module('News').directive 'ocReadFile', +['$rootScope', ($rootScope) -> + + return (scope, elm, attr) -> + elm.change -> + + file = elm[0].files[0] + reader = new FileReader() + + reader.onload = (e) -> + elm[0].value = null + scope.$fileContent = e.target.result + scope.$apply attr.ocReadFile + + reader.readAsText(file) + +]
\ No newline at end of file diff --git a/js/app/directives/tooltip.coffee b/js/app/directives/tooltip.coffee new file mode 100644 index 000000000..8241436e5 --- /dev/null +++ b/js/app/directives/tooltip.coffee @@ -0,0 +1,27 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + +# binds twitter tooltips to the element +angular.module('News').directive 'ocTooltip', -> + + return (scope, elm, attr) -> + elm.tooltip() diff --git a/js/app/services/businesslayer/feedbusinesslayer.coffee b/js/app/services/businesslayer/feedbusinesslayer.coffee index ed219b9c7..3b87c1d9e 100644 --- a/js/app/services/businesslayer/feedbusinesslayer.coffee +++ b/js/app/services/businesslayer/feedbusinesslayer.coffee @@ -169,13 +169,13 @@ FeedModel, NewLoading, _ExistsError, Utils, $rootScope, NewestItem)-> @_feedModel.add(feed) success = (response) -> - if response.status == 'error' - feed.error = response.msg - onFailure() - else - onSuccess(response.data) + onSuccess(response) - @_persistence.createFeed(url, parentId, success) + failure = (response) -> + feed.error = response.msg + onFailure() + + @_persistence.createFeed(url, parentId, success, failure) markErrorRead: (url) -> diff --git a/js/app/services/businesslayer/folderbusinesslayer.coffee b/js/app/services/businesslayer/folderbusinesslayer.coffee index 2be1c415a..ceb406b59 100644 --- a/js/app/services/businesslayer/folderbusinesslayer.coffee +++ b/js/app/services/businesslayer/folderbusinesslayer.coffee @@ -142,13 +142,13 @@ FeedModel, $rootScope) -> @_folderModel.add(folder) success = (response) -> - if response.status == 'error' - folder.error = response.msg - onFailure() - else - onSuccess(response.data) + onSuccess(response) + + failure = (response) -> + folder.error = response.msg + onFailure() - @_persistence.createFolder folderName, 0, success + @_persistence.createFolder folderName, 0, success, failure markErrorRead: (folderName) -> diff --git a/js/app/services/loading.coffee b/js/app/services/loading.coffee new file mode 100644 index 000000000..c68cc9f40 --- /dev/null +++ b/js/app/services/loading.coffee @@ -0,0 +1,50 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + + +# Simple class which can be used to show loading events when ajax events are +# fired +angular.module('News').factory '_Loading', -> + + class Loading + + constructor: -> + @_count = 0 + + + increase: -> + @_count += 1 + + + decrease: -> + @_count -= 1 + + + getCount: -> + return @_count + + + isLoading: -> + return @_count > 0 + + + return Loading
\ No newline at end of file diff --git a/js/app/services/model.coffee b/js/app/services/model.coffee new file mode 100644 index 000000000..238e5bcf0 --- /dev/null +++ b/js/app/services/model.coffee @@ -0,0 +1,128 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + + +# Model which offers basic crud for storing your data +angular.module('News').factory '_Model', -> + + class Model + + constructor: -> + @_data = [] + @_dataMap = {} + @_filterCache = {} + + + handle: (data) -> + ### + Redirects to add method + ### + for item in data + @add(item) + + + add: (data, clearCache=true) -> + ### + Adds a new entry or updates an entry if the id exists already + ### + if clearCache + @_invalidateCache() + if angular.isDefined(@_dataMap[data.id]) + @update(data, clearCache) + else + @_data.push(data) + @_dataMap[data.id] = data + + + update: (data, clearCache=true) -> + ### + Update an entry by searching for its id + ### + if clearCache + @_invalidateCache() + entry = @getById(data.id) + for key, value of data + if key == 'id' + continue + else + entry[key] = value + + + getById: (id) -> + ### + Return an entry by its id + ### + return @_dataMap[id] + + + getAll: -> + ### + Returns all stored entries + ### + return @_data + + + removeById: (id, clearCache=true) -> + ### + Remove an entry by id + ### + for entry, counter in @_data + if entry.id == id + @_data.splice(counter, 1) + data = @_dataMap[id] + delete @_dataMap[id] + if clearCache + @_invalidateCache() + return data + + + clear: -> + ### + Removes all cached elements + ### + @_data.length = 0 + @_dataMap = {} + @_invalidateCache() + + + _invalidateCache: -> + @_filterCache = {} + + + get: (query) -> + ### + Calls, caches and returns filtered results + ### + hash = query.hashCode() + if not angular.isDefined(@_filterCache[hash]) + @_filterCache[hash] = query.exec(@_data) + return @_filterCache[hash] + + + size: -> + ### + Return the number of all stored entries + ### + return @_data.length + + + return Model
\ No newline at end of file diff --git a/js/app/services/notification.coffee b/js/app/services/notification.coffee new file mode 100644 index 000000000..fefc9e306 --- /dev/null +++ b/js/app/services/notification.coffee @@ -0,0 +1,26 @@ +### + +ownCloud - News + +@author Bernhard Posselt +@copyright 2012 Bernhard Posselt dev@bernhard-posselt.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/>. + +### + + +# Inject notification into angular to make testing easier +angular.module('News').factory 'Notification', -> + return OC.Notification
\ No newline at end of file diff --git a/js/app/services/notimplementederror.coffee b/js/app/services/notimplementederror.coffee new file mode 100644 index 000000000..1c1b480ea --- /dev/null +++ b/js/app/services/notimplementederror.coffee @@ -0,0 +1,35 @@ +### + +ownC |