From ea9ebd4826fe9807af5bc17e786b3dc58f163970 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Thu, 11 Sep 2014 03:55:52 +0200 Subject: port to es5 and add es6 shims for object prototypes instead --- js/Gruntfile.js | 25 +- js/app/App.js | 2 +- js/app/Config.js | 18 +- js/app/Run.js | 54 +- js/bower.json | 2 +- js/build/app.js | 2746 +++++++++++---------- js/build/app.min.js | 2 +- js/controller/AppController.js | 3 +- js/controller/ContentController.js | 52 +- js/controller/NavigationController.js | 70 +- js/controller/SettingsController.js | 12 +- js/directive/AppNavigationEntryUtils.js | 16 +- js/directive/NewsAudio.js | 15 +- js/directive/NewsAutoFocus.js | 4 +- js/directive/NewsBindUnsafeHtml.js | 6 +- js/directive/NewsDraggable.js | 6 +- js/directive/NewsDroppable.js | 10 +- js/directive/NewsFocus.js | 10 +- js/directive/NewsReadFile.js | 12 +- js/directive/NewsScroll.js | 45 +- js/directive/NewsStopPropagation.js | 8 +- js/directive/NewsTimeout.js | 10 +- js/directive/NewsTitleUnreadCount.js | 10 +- js/directive/NewsTriggerClick.js | 6 +- js/filter/TrustUrl.js | 4 +- js/filter/UnreadCountFormatter.js | 4 +- js/gui/KeyboardShortcuts.js | 64 +- js/karma.conf.js | 19 +- js/package.json | 6 +- js/service/FeedResource.js | 305 +-- js/service/FolderResource.js | 133 +- js/service/ItemResource.js | 199 +- js/service/Loading.js | 4 +- js/service/Publisher.js | 31 +- js/service/Resource.js | 117 +- js/service/SettingsResource.js | 22 +- js/utility/Iterators.js | 70 - js/vendor/es6-shim/.bower.json | 41 + js/vendor/es6-shim/CHANGELOG.md | 163 ++ js/vendor/es6-shim/Gruntfile.js | 98 + js/vendor/es6-shim/README.md | 221 ++ js/vendor/es6-shim/bower.json | 29 + js/vendor/es6-shim/component.json | 23 + js/vendor/es6-shim/es6-sham.js | 106 + js/vendor/es6-shim/es6-sham.map | 1 + js/vendor/es6-shim/es6-sham.min.js | 2 + js/vendor/es6-shim/es6-shim.js | 1928 +++++++++++++++ js/vendor/es6-shim/es6-shim.map | 1 + js/vendor/es6-shim/es6-shim.min.js | 2 + js/vendor/es6-shim/package.json | 69 + js/vendor/es6-shim/test-sham/index.html | 22 + js/vendor/es6-shim/test-sham/set-prototype-of.js | 24 + js/vendor/es6-shim/testling.html | 35 + js/vendor/momentjs/.bower.json | 10 +- js/vendor/momentjs/CHANGELOG.md | 16 + js/vendor/momentjs/bower.json | 2 +- js/vendor/momentjs/locale/ar.js | 78 +- js/vendor/momentjs/locale/cs.js | 2 +- js/vendor/momentjs/min/locales.js | 80 +- js/vendor/momentjs/min/locales.min.js | 2 +- js/vendor/momentjs/min/moment-with-locales.js | 177 +- js/vendor/momentjs/min/moment-with-locales.min.js | 12 +- js/vendor/momentjs/min/moment.min.js | 5 +- js/vendor/momentjs/moment.js | 97 +- js/vendor/traceur-runtime/.bower.json | 21 - js/vendor/traceur-runtime/README.md | 35 - js/vendor/traceur-runtime/bower.json | 11 - js/vendor/traceur-runtime/traceur-runtime.js | 2412 ------------------ js/vendor/traceur-runtime/traceur-runtime.min.js | 2412 ------------------ js/vendor/traceur-runtime/traceur-runtime.min.map | 1 - 70 files changed, 5259 insertions(+), 7001 deletions(-) delete mode 100644 js/utility/Iterators.js create mode 100644 js/vendor/es6-shim/.bower.json create mode 100644 js/vendor/es6-shim/CHANGELOG.md create mode 100644 js/vendor/es6-shim/Gruntfile.js create mode 100644 js/vendor/es6-shim/README.md create mode 100644 js/vendor/es6-shim/bower.json create mode 100644 js/vendor/es6-shim/component.json create mode 100644 js/vendor/es6-shim/es6-sham.js create mode 100644 js/vendor/es6-shim/es6-sham.map create mode 100644 js/vendor/es6-shim/es6-sham.min.js create mode 100644 js/vendor/es6-shim/es6-shim.js create mode 100644 js/vendor/es6-shim/es6-shim.map create mode 100644 js/vendor/es6-shim/es6-shim.min.js create mode 100644 js/vendor/es6-shim/package.json create mode 100644 js/vendor/es6-shim/test-sham/index.html create mode 100644 js/vendor/es6-shim/test-sham/set-prototype-of.js create mode 100644 js/vendor/es6-shim/testling.html delete mode 100644 js/vendor/traceur-runtime/.bower.json delete mode 100644 js/vendor/traceur-runtime/README.md delete mode 100644 js/vendor/traceur-runtime/bower.json delete mode 100644 js/vendor/traceur-runtime/traceur-runtime.js delete mode 100644 js/vendor/traceur-runtime/traceur-runtime.min.js delete mode 100644 js/vendor/traceur-runtime/traceur-runtime.min.map diff --git a/js/Gruntfile.js b/js/Gruntfile.js index f2df36050..71f2fea30 100644 --- a/js/Gruntfile.js +++ b/js/Gruntfile.js @@ -20,9 +20,6 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-wrap'); grunt.loadNpmTasks('grunt-karma'); grunt.loadNpmTasks('grunt-ng-annotate'); - // buggy, wait until it uses traceur 0.0.60 - // grunt.loadNpmTasks('grunt-traceur'); - grunt.loadNpmTasks('grunt-shell'); grunt.loadNpmTasks('grunt-protractor-runner'); grunt.loadNpmTasks('grunt-protractor-webdriver'); @@ -65,26 +62,6 @@ module.exports = function (grunt) { } } }, - // in place because grunt-traceur is buggy, remove when traceur 0.0.60 - // is supported - shell: { - traceur: { - command: 'node_modules/traceur/traceur --block-binding true --out build/app.js --experimental --script build/app.js' - } - }, - /*traceur: { - app: { - files: [{ - src: ['<%= meta.production %>app.js'], - dest: '<%= meta.production %>test.js' - }] - }, - options: { - experimental: true, - modules: 'inline' - } - },*/ - wrap: { basic: { src: ['<%= meta.production %>app.js'], @@ -183,7 +160,7 @@ module.exports = function (grunt) { }); // make tasks available under simpler commands - grunt.registerTask('default', ['jshint', 'concat', 'wrap', 'shell:traceur', 'ngAnnotate', 'uglify']); + grunt.registerTask('default', ['jshint', 'concat', 'wrap', 'ngAnnotate', 'uglify']); grunt.registerTask('dev', ['watch:concat']); grunt.registerTask('test', ['karma:unit']); grunt.registerTask('php', ['watch:phpunit']); diff --git a/js/app/App.js b/js/app/App.js index 3dbc907da..947a68a2e 100644 --- a/js/app/App.js +++ b/js/app/App.js @@ -7,4 +7,4 @@ * @author Bernhard Posselt * @copyright Bernhard Posselt 2014 */ -let app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file +var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file diff --git a/js/app/Config.js b/js/app/Config.js index 986699090..b922e0aa1 100644 --- a/js/app/Config.js +++ b/js/app/Config.js @@ -10,7 +10,7 @@ app.config(function ($routeProvider, $provide, $httpProvider) { 'use strict'; - const feedType = { + var feedType = { FEED: 0, FOLDER: 1, STARRED: 2, @@ -25,9 +25,9 @@ app.config(function ($routeProvider, $provide, $httpProvider) { $provide.constant('FEED_TYPE', feedType); // make sure that the CSRF header is only sent to the ownCloud domain - $provide.factory('CSRFInterceptor', ($q, BASE_URL) => { + $provide.factory('CSRFInterceptor', function ($q, BASE_URL) { return { - request: (config) => { + request: function (config) { if (config.url.indexOf(BASE_URL) === 0) { config.headers.requesttoken = csrfToken; } @@ -39,7 +39,7 @@ app.config(function ($routeProvider, $provide, $httpProvider) { $httpProvider.interceptors.push('CSRFInterceptor'); // routing - const getResolve = (type) => { + var getResolve = function (type) { return { // request to items also returns feeds data: [ @@ -48,9 +48,9 @@ app.config(function ($routeProvider, $provide, $httpProvider) { '$q', 'BASE_URL', 'ITEM_BATCH_SIZE', - ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) => { + function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) { - const parameters = { + var parameters = { type: type, limit: ITEM_BATCH_SIZE }; @@ -59,13 +59,13 @@ app.config(function ($routeProvider, $provide, $httpProvider) { parameters.id = $route.current.params.id; } - let deferred = $q.defer(); + var deferred = $q.defer(); $http({ - url: `${BASE_URL}/items`, + url: BASE_URL + '/items', method: 'GET', params: parameters - }).success((data) => { + }).success(function (data) { deferred.resolve(data); }); diff --git a/js/app/Run.js b/js/app/Run.js index 9b068910c..33c75c2b4 100644 --- a/js/app/Run.js +++ b/js/app/Run.js @@ -7,9 +7,9 @@ * @author Bernhard Posselt * @copyright Bernhard Posselt 2014 */ -app.run(($rootScope, $location, $http, $q, $interval, Loading, ItemResource, - FeedResource, FolderResource, SettingsResource, Publisher, BASE_URL, - FEED_TYPE, REFRESH_RATE) => { +app.run(function ($rootScope, $location, $http, $q, $interval, Loading, + ItemResource, FeedResource, FolderResource, SettingsResource, + Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) { 'use strict'; // show Loading screen @@ -17,32 +17,32 @@ app.run(($rootScope, $location, $http, $q, $interval, Loading, ItemResource, // listen to keys in returned queries to automatically distribute the // incoming values to models - Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', - 'starred'); - Publisher.subscribe(FolderResource).toChannels('folders'); - Publisher.subscribe(FeedResource).toChannels('feeds'); - Publisher.subscribe(SettingsResource).toChannels('settings'); + Publisher.subscribe(ItemResource).toChannels(['items', 'newestItemId', + 'starred']); + Publisher.subscribe(FolderResource).toChannels(['folders']); + Publisher.subscribe(FeedResource).toChannels(['feeds']); + Publisher.subscribe(SettingsResource).toChannels(['settings']); // load feeds, settings and last read feed - let settingsDeferred = $q.defer(); - $http.get(`${BASE_URL}/settings`).success((data) => { + var settingsDeferred = $q.defer(); + $http.get(BASE_URL + '/settings').success(function (data) { Publisher.publishAll(data); settingsDeferred.resolve(); }); - let activeFeedDeferred = $q.defer(); - let path = $location.path(); - $http.get(`${BASE_URL}/feeds/active`).success((data) => { - let url; + var activeFeedDeferred = $q.defer(); + var path = $location.path(); + $http.get(BASE_URL + '/feeds/active').success(function (data) { + var url; switch (data.activeFeed.type) { case FEED_TYPE.FEED: - url = `/items/feeds/${data.activeFeed.id}`; + url = '/items/feeds/' + data.activeFeed.id; break; case FEED_TYPE.FOLDER: - url = `/items/folders/${data.activeFeed.id}`; + url = '/items/folders/' + data.activeFeed.id; break; case FEED_TYPE.STARRED: @@ -61,14 +61,14 @@ app.run(($rootScope, $location, $http, $q, $interval, Loading, ItemResource, activeFeedDeferred.resolve(); }); - let folderDeferred = $q.defer(); - $http.get(`${BASE_URL}/folders`).success((data) => { + var folderDeferred = $q.defer(); + $http.get(BASE_URL + '/folders').success(function (data) { Publisher.publishAll(data); folderDeferred.resolve(); }); - let feedDeferred = $q.defer(); - $http.get(`${BASE_URL}/feeds`).success((data) => { + var feedDeferred = $q.defer(); + $http.get(BASE_URL + '/feeds').success(function (data) { Publisher.publishAll(data); feedDeferred.resolve(); }); @@ -82,27 +82,27 @@ app.run(($rootScope, $location, $http, $q, $interval, Loading, ItemResource, folderDeferred.promise ] ) - .then(() => { + .then(function () { Loading.setLoading('global', false); }); // refresh feeds and folders - $interval(() => { - $http.get(`${BASE_URL}/feeds`); - $http.get(`${BASE_URL}/folders`); + $interval(function () { + $http.get(BASE_URL + '/feeds'); + $http.get(BASE_URL + '/folders'); }, REFRESH_RATE * 1000); - $rootScope.$on('$routeChangeStart', () => { + $rootScope.$on('$routeChangeStart', function () { Loading.setLoading('content', true); }); - $rootScope.$on('$routeChangeSuccess', () => { + $rootScope.$on('$routeChangeSuccess', function () { Loading.setLoading('content', false); }); // in case of wrong id etc show all items - $rootScope.$on('$routeChangeError', () => { + $rootScope.$on('$routeChangeError', function () { $location.path('/items'); }); diff --git a/js/bower.json b/js/bower.json index a069fe820..034b43979 100644 --- a/js/bower.json +++ b/js/bower.json @@ -31,6 +31,6 @@ "angular-animate": "~1.3.*", "jquery": "~2.*", "momentjs": "~2.8.*", - "traceur-runtime": "~0.0.61" + "es6-shim": "~0.18.0" } } diff --git a/js/build/app.js b/js/build/app.js index 3cfe28892..34dea4dec 100644 --- a/js/build/app.js +++ b/js/build/app.js @@ -1,1420 +1,1692 @@ -(function(window, document, angular, $, OC, csrfToken, undefined) { - 'use strict'; - var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); - app.config(["$routeProvider", "$provide", "$httpProvider", function($routeProvider, $provide, $httpProvider) { +(function(window, document, angular, $, OC, csrfToken, undefined){ + +'use strict'; + + +var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); +app.config(["$routeProvider", "$provide", "$httpProvider", function ($routeProvider, $provide, $httpProvider) { 'use strict'; + var feedType = { - FEED: 0, - FOLDER: 1, - STARRED: 2, - SUBSCRIPTIONS: 3, - SHARED: 4 - }; - $provide.constant('REFRESH_RATE', 60); - $provide.constant('ITEM_BATCH_SIZE', 50); + FEED: 0, + FOLDER: 1, + STARRED: 2, + SUBSCRIPTIONS: 3, + SHARED: 4 + }; + + // constants + $provide.constant('REFRESH_RATE', 60); // seconds + $provide.constant('ITEM_BATCH_SIZE', 50); // how many items to autopage by $provide.constant('BASE_URL', OC.generateUrl('/apps/news')); $provide.constant('FEED_TYPE', feedType); - $provide.factory('CSRFInterceptor', (["$q", "BASE_URL", function($q, BASE_URL) { - return {request: (function(config) { - if (config.url.indexOf(BASE_URL) === 0) { - config.headers.requesttoken = csrfToken; - } - return config || $q.when(config); - })}; - }])); + + // make sure that the CSRF header is only sent to the ownCloud domain + $provide.factory('CSRFInterceptor', ["$q", "BASE_URL", function ($q, BASE_URL) { + return { + request: function (config) { + if (config.url.indexOf(BASE_URL) === 0) { + config.headers.requesttoken = csrfToken; + } + + return config || $q.when(config); + } + }; + }]); $httpProvider.interceptors.push('CSRFInterceptor'); - var getResolve = (function(type) { - return {data: ['$http', '$route', '$q', 'BASE_URL', 'ITEM_BATCH_SIZE', (function($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) { - var parameters = { - type: type, - limit: ITEM_BATCH_SIZE - }; - if ($route.current.params.id !== undefined) { - parameters.id = $route.current.params.id; - } - var deferred = $q.defer(); - $http({ - url: (BASE_URL + "/items"), - method: 'GET', - params: parameters - }).success((function(data) { - deferred.resolve(data); - })); - return deferred.promise; - })]}; - }); - $routeProvider.when('/items', { - controller: 'ContentController as Content', - templateUrl: 'content.html', - resolve: getResolve(feedType.SUBSCRIPTIONS), - type: feedType.SUBSCRIPTIONS - }).when('/items/starred', { - controller: 'ContentController as Content', - templateUrl: 'content.html', - resolve: getResolve(feedType.STARRED), - type: feedType.STARRED - }).when('/items/feeds/:id', { - controller: 'ContentController as Content', - templateUrl: 'content.html', - resolve: getResolve(feedType.FEED), - type: feedType.FEED - }).when('/items/folders/:id', { - controller: 'ContentController as Content', - templateUrl: 'content.html', - resolve: getResolve(feedType.FOLDER), - type: feedType.FOLDER - }); - }]); - app.run((["$rootScope", "$location", "$http", "$q", "$interval", "Loading", "ItemResource", "FeedResource", "FolderResource", "SettingsResource", "Publisher", "BASE_URL", "FEED_TYPE", "REFRESH_RATE", function($rootScope, $location, $http, $q, $interval, Loading, ItemResource, FeedResource, FolderResource, SettingsResource, Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) { + + // routing + var getResolve = function (type) { + return { + // request to items also returns feeds + data: [ + '$http', + '$route', + '$q', + 'BASE_URL', + 'ITEM_BATCH_SIZE', + function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) { + + var parameters = { + type: type, + limit: ITEM_BATCH_SIZE + }; + + if ($route.current.params.id !== undefined) { + parameters.id = $route.current.params.id; + } + + var deferred = $q.defer(); + + $http({ + url: BASE_URL + '/items', + method: 'GET', + params: parameters + }).success(function (data) { + deferred.resolve(data); + }); + + return deferred.promise; + } + ] + }; + }; + + $routeProvider + .when('/items', { + controller: 'ContentController as Content', + templateUrl: 'content.html', + resolve: getResolve(feedType.SUBSCRIPTIONS), + type: feedType.SUBSCRIPTIONS + }) + .when('/items/starred', { + controller: 'ContentController as Content', + templateUrl: 'content.html', + resolve: getResolve(feedType.STARRED), + type: feedType.STARRED + }) + .when('/items/feeds/:id', { + controller: 'ContentController as Content', + templateUrl: 'content.html', + resolve: getResolve(feedType.FEED), + type: feedType.FEED + }) + .when('/items/folders/:id', { + controller: 'ContentController as Content', + templateUrl: 'content.html', + resolve: getResolve(feedType.FOLDER), + type: feedType.FOLDER + }); + +}]); + + +app.run(["$rootScope", "$location", "$http", "$q", "$interval", "Loading", "ItemResource", "FeedResource", "FolderResource", "SettingsResource", "Publisher", "BASE_URL", "FEED_TYPE", "REFRESH_RATE", function ($rootScope, $location, $http, $q, $interval, Loading, + ItemResource, FeedResource, FolderResource, SettingsResource, + Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) { 'use strict'; + + // show Loading screen Loading.setLoading('global', true); - Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred'); - Publisher.subscribe(FolderResource).toChannels('folders'); - Publisher.subscribe(FeedResource).toChannels('feeds'); - Publisher.subscribe(SettingsResource).toChannels('settings'); + + // listen to keys in returned queries to automatically distribute the + // incoming values to models + Publisher.subscribe(ItemResource).toChannels(['items', 'newestItemId', + 'starred']); + Publisher.subscribe(FolderResource).toChannels(['folders']); + Publisher.subscribe(FeedResource).toChannels(['feeds']); + Publisher.subscribe(SettingsResource).toChannels(['settings']); + + // load feeds, settings and last read feed var settingsDeferred = $q.defer(); - $http.get((BASE_URL + "/settings")).success((function(data) { - Publisher.publishAll(data); - settingsDeferred.resolve(); - })); + $http.get(BASE_URL + '/settings').success(function (data) { + Publisher.publishAll(data); + settingsDeferred.resolve(); + }); + var activeFeedDeferred = $q.defer(); var path = $location.path(); - $http.get((BASE_URL + "/feeds/active")).success((function(data) { - var url; - switch (data.activeFeed.type) { + $http.get(BASE_URL + '/feeds/active').success(function (data) { + var url; + + switch (data.activeFeed.type) { + case FEED_TYPE.FEED: - url = ("/items/feeds/" + data.activeFeed.id); - break; + url = '/items/feeds/' + data.activeFeed.id; + break; + case FEED_TYPE.FOLDER: - url = ("/items/folders/" + data.activeFeed.id); - break; + url = '/items/folders/' + data.activeFeed.id; + break; + case FEED_TYPE.STARRED: - url = '/items/starred'; - break; + url = '/items/starred'; + break; + default: - url = '/items'; - } - if (!/^\/items(\/(starred|feeds\/\d+|folders\/\d+))?\/?$/.test(path)) { - $location.path(url); - } - activeFeedDeferred.resolve(); - })); + url = '/items'; + } + + // only redirect if url is empty or faulty + if (!/^\/items(\/(starred|feeds\/\d+|folders\/\d+))?\/?$/.test(path)) { + $location.path(url); + } + + activeFeedDeferred.resolve(); + }); + var folderDeferred = $q.defer(); - $http.get((BASE_URL + "/folders")).success((function(data) { - Publisher.publishAll(data); - folderDeferred.resolve(); - })); + $http.get(BASE_URL + '/folders').success(function (data) { + Publisher.publishAll(data); + folderDeferred.resolve(); + }); + var feedDeferred = $q.defer(); - $http.get((BASE_URL + "/feeds")).success((function(data) { - Publisher.publishAll(data); - feedDeferred.resolve(); - })); - $q.all([settingsDeferred.promise, activeFeedDeferred.promise, feedDeferred.promise, folderDeferred.promise]).then((function() { - Loading.setLoading('global', false); - })); - $interval((function() { - $http.get((BASE_URL + "/feeds")); - $http.get((BASE_URL + "/folders")); - }), REFRESH_RATE * 1000); - $rootScope.$on('$routeChangeStart', (function() { - Loading.setLoading('content', true); - })); - $rootScope.$on('$routeChangeSuccess', (function() { - Loading.setLoading('content', false); - })); - $rootScope.$on('$routeChangeError', (function() { - $location.path('/items'); - })); - }])); - app.controller('AppController', ["Loading", "FeedResource", "FolderResource", function(Loading, FeedResource, FolderResource) { + $http.get(BASE_URL + '/feeds').success(function (data) { + Publisher.publishAll(data); + feedDeferred.resolve(); + }); + + // disable loading if all initial requests finished + $q.all( + [ + settingsDeferred.promise, + activeFeedDeferred.promise, + feedDeferred.promise, + folderDeferred.promise + ] + ) + .then(function () { + Loading.setLoading('global', false); + }); + + // refresh feeds and folders + $interval(function () { + $http.get(BASE_URL + '/feeds'); + $http.get(BASE_URL + '/folders'); + }, REFRESH_RATE * 1000); + + + $rootScope.$on('$routeChangeStart', function () { + Loading.setLoading('content', true); + }); + + $rootScope.$on('$routeChangeSuccess', function () { + Loading.setLoading('content', false); + }); + + // in case of wrong id etc show all items + $rootScope.$on('$routeChangeError', function () { + $location.path('/items'); + }); + +}]); +app.controller('AppController', +["Loading", "FeedResource", "FolderResource", function (Loading, FeedResource, FolderResource) { 'use strict'; + this.loading = Loading; - this.isFirstRun = (function() { - return FeedResource.size() === 0 && FolderResource.size() === 0; - }); - }]); - app.controller('ContentController', ["Publisher", "FeedResource", "ItemResource", "SettingsResource", "data", "$route", "$routeParams", function(Publisher, FeedResource, ItemResource, SettingsResource, data, $route, $routeParams) { + + this.isFirstRun = function () { + return FeedResource.size() === 0 && FolderResource.size() === 0; + }; + +}]); +app.controller('ContentController', +["Publisher", "FeedResource", "ItemResource", "SettingsResource", "data", "$route", "$routeParams", function (Publisher, FeedResource, ItemResource, SettingsResource, data, + $route, $routeParams) { 'use strict'; - var $__0 = this; + + // dont cache items across multiple route changes ItemResource.clear(); + + // distribute data to models based on key Publisher.publishAll(data); + + this.isAutoPagingEnabled = true; - this.getItems = (function() { - return ItemResource.getAll(); - }); - this.toggleStar = (function(itemId) { - ItemResource.toggleStar(itemId); - }); - this.toggleItem = (function(item) { - if ($__0.isCompactView()) { - item.show = !item.show; - } - }); - this.markRead = (function(itemId) { - var item = ItemResource.get(itemId); - if (!item.keepUnread) { - ItemResource.markItemRead(itemId); - FeedResource.markItemOfFeedRead(item.feedId); - } - }); - this.getFeed = (function(feedId) { - return FeedResource.getById(feedId); - }); - this.toggleKeepUnread = (function(itemId) { - var item = ItemResource.get(itemId); - if (!item.unread) { - FeedResource.markItemOfFeedUnread(item.feedId); - ItemResource.markItemRead(itemId, false); - } - item.keepUnread = !item.keepUnread; - }); - this.orderBy = (function() { - if (SettingsResource.get('oldestFirst')) { - return 'id'; - } else { - return '-id'; - } - }); - this.isCompactView = (function() { - return SettingsResource.get('compact'); - }); - this.autoPagingEnabled = (function() { - return $__0.isAutoPagingEnabled; - }); - this.markReadEnabled = (function() { - return !SettingsResource.get('preventReadOnScroll'); - }); - this.scrollRead = (function(itemIds) { - var itemId$__9; - var item$__10; - var ids = []; - var feedIds = []; - for (var $__3 = itemIds[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - itemId$__9 = $__4.value; - { - item$__10 = ItemResource.get(itemId$__9); - if (!item$__10.keepUnread) { - ids.push(itemId$__9); - feedIds.push(item$__10.feedId); - } + + this.getItems = function () { + return ItemResource.getAll(); + }; + + this.toggleStar = function (itemId) { + ItemResource.toggleStar(itemId); + }; + + this.toggleItem = function (item) { + // TODO: unittest + if (this.isCompactView()) { + item.show = !item.show; } - } - FeedResource.markItemsOfFeedsRead(feedIds); - ItemResource.markItemsRead(ids); - }); - this.autoPage = (function() { - $__0.isAutoPagingEnabled = false; - var type = $route.current.$$route.type; - var id = $routeParams.id; - ItemResource.autoPage(type, id).success((function(data) { - Publisher.publishAll(data); - if (data.items.length > 0) { - $__0.isAutoPagingEnabled = true; + }; + + this.markRead = function (itemId) { + var item = ItemResource.get(itemId); + + if (!item.keepUnread) { + ItemResource.markItemRead(itemId); + FeedResource.markItemOfFeedRead(item.feedId); } - })).error((function() { - $__0.isAutoPagingEnabled = true; - })); - }); - this.getRelativeDate = (function(timestamp) { - var languageCode$__11; - var date$__12; - if (timestamp !== undefined && timestamp !== '') { - languageCode$__11 = SettingsResource.get('language'); - date$__12 = moment.unix(timestamp).locale(languageCode$__11).fromNow() + ''; - return date$__12; - } else { - return ''; - } - }); - }]); - app.controller('NavigationController', ["$route", "FEED_TYPE", "FeedResource", "FolderResource", "ItemResource", "SettingsResource", function($route, FEED_TYPE, FeedResource, FolderResource, ItemResource, SettingsResource) { + }; + + this.getFeed = function (feedId) { + return FeedResource.getById(feedId); + }; + + this.toggleKeepUnread = function (itemId) { + var item = ItemResource.get(itemId); + if (!item.unread) { + FeedResource.markItemOfFeedUnread(item.feedId); + ItemResource.markItemRead(itemId, false); + } + + item.keepUnread = !item.keepUnread; + }; + + this.orderBy = function () { + if (SettingsResource.get('oldestFirst')) { + return 'id'; + } else { + return '-id'; + } + }; + + this.isCompactView = function () { + return SettingsResource.get('compact'); + }; + + this.autoPagingEnabled = function () { + return this.isAutoPagingEnabled; + }; + + this.markReadEnabled = function () { + return !SettingsResource.get('preventReadOnScroll'); + }; + + this.scrollRead = function (itemIds) { + var ids = []; + var feedIds = []; + + itemIds.forEach(function (itemId) { + var item = ItemResource.get(itemId); + if (!item.keepUnread) { + ids.push(itemId); + feedIds.push(item.feedId); + } + }); + + FeedResource.markItemsOfFeedsRead(feedIds); + ItemResource.markItemsRead(ids); + }; + + this.autoPage = function () { + this.isAutoPagingEnabled = false; + + var type = $route.current.$$route.type; + var id = $routeParams.id; + + ItemResource.autoPage(type, id).success(function (data) { + Publisher.publishAll(data); + + if (data.items.length > 0) { + this.isAutoPagingEnabled = true; + } + }).error(function () { + this.isAutoPagingEnabled = true; + }); + }; + + this.getRelativeDate = function (timestamp) { + if (timestamp !== undefined && timestamp !== '') { + var languageCode = SettingsResource.get('language'); + var date = + moment.unix(timestamp).locale(languageCode).fromNow() + ''; + return date; + } else { + return ''; + } + }; + +}]); +app.controller('NavigationController', +["$route", "FEED_TYPE", "FeedResource", "FolderResource", "ItemResource", "SettingsResource", function ($route, FEED_TYPE, FeedResource, FolderResource, ItemResource, + SettingsResource) { 'use strict'; - var $__0 = this; + this.feedError = ''; this.folderError = ''; - this.getFeeds = (function() { - return FeedResource.getAll(); - }); - this.getFolders = (function() { - return FolderResource.getAll(); - }); - this.markFolderRead = (function(folderId) { - var feed$__13; - FeedResource.markFolderRead(folderId); - for (var $__3 = FeedResource.getByFolderId(folderId)[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - feed$__13 = $__4.value; - { - ItemResource.markFeedRead(feed$__13.id); - } - } - }); - this.markFeedRead = (function(feedId) { - ItemResource.markFeedRead(feedId); - FeedResource.markFeedRead(feedId); - }); - this.markRead = (function() { - ItemResource.markRead(); - FeedResource.markRead(); - }); - this.isShowAll = (function() { - return SettingsResource.get('showAll'); - }); - this.getFeedsOfFolder = (function(folderId) { - return FeedResource.getByFolderId(folderId); - }); - this.getUnreadCount = (function() { - return FeedResource.getUnreadCount(); - }); - this.getFeedUnreadCount = (function(feedId) { - return FeedResource.getById(feedId).unreadCount; - }); - this.getFolderUnreadCount = (function(folderId) { - return FeedResource.getFolderUnreadCount(folderId); - }); - this.getStarredCount = (function() { - return ItemResource.getStarredCount(); - }); - this.toggleFolder = (function(folderName) { - FolderResource.toggleOpen(folderName); - }); - this.hasFeeds = (function(folderId) { - return FeedResource.getFolderUnreadCount(folderId) !== undefined; - }); - this.subFeedActive = (function(folderId) { - var feed$__14; - var type = $route.current.$$route.type; - if (type === FEED_TYPE.FEED) { - feed$__14 = FeedResource.getById($route.current.params.id); - if (feed$__14.folderId === folderId) { - return true; + + this.getFeeds = function () { + return FeedResource.getAll(); + }; + + this.getFolders = function () { + return FolderResource.getAll(); + }; + + this.markFolderRead = function (folderId) { + FeedResource.markFolderRead(folderId); + + FeedResource.getByFolderId(folderId).forEach(function (feed) { + ItemResource.markFeedRead(feed.id); + }); + }; + + this.markFeedRead = function (feedId) { + ItemResource.markFeedRead(feedId); + FeedResource.markFeedRead(feedId); + }; + + this.markRead = function () { + ItemResource.markRead(); + FeedResource.markRead(); + }; + + this.isShowAll = function () { + return SettingsResource.get('showAll'); + }; + + this.getFeedsOfFolder = function (folderId) { + return FeedResource.getByFolderId(folderId); + }; + + this.getUnreadCount = function () { + return FeedResource.getUnreadCount(); + }; + + this.getFeedUnreadCount = function (feedId) { + return FeedResource.getById(feedId).unreadCount; + }; + + this.getFolderUnreadCount= function (folderId) { + return FeedResource.getFolderUnreadCount(folderId); + }; + + this.getStarredCount = function () { + return ItemResource.getStarredCount(); + }; + + this.toggleFolder = function (folderName) { + FolderResource.toggleOpen(folderName); + }; + + this.hasFeeds = function (folderId) { + return FeedResource.getFolderUnreadCount(folderId) !== undefined; + }; + + this.subFeedActive = function (folderId) { + var type = $route.current.$$route.type; + + if (type === FEED_TYPE.FEED) { + var feed = FeedResource.getById($route.current.params.id); + + if (feed.folderId === folderId) { + return true; + } } - } - return false; - }); - this.isSubscriptionsActive = (function() { - return $route.current && $route.current.$$route.type === FEED_TYPE.SUBSCRIPTIONS; - }); - this.isStarredActive = (function() { - return $route.current && $route.current.$$route.type === FEED_TYPE.STARRED; - }); - this.isFolderActive = (function(folderId) { - var currentId = parseInt($route.current.params.id, 10); - return $route.current && $route.current.$$route.type === FEED_TYPE.FOLDER && currentId === folderId; - }); - this.isFeedActive = (function(feedId) { - var currentId = parseInt($route.current.params.id, 10); - return $route.current && $route.current.$$route.type === FEED_TYPE.FEED && currentId === feedId; - }); - this.folderNameExists = (function(folderName) { - return FolderResource.get(folderName) !== undefined; - }); - this.isAddingFolder = (function() { - return true; - }); - this.createFolder = (function(folder) { - console.log(folder.name); - folder.name = ''; - }); - this.createFeed = (function(feed) { - $__0.newFolder = false; - console.log(feed.url + feed.folder); - feed.url = ''; - }); - this.renameFeed = (function(feed) { - feed.editing = false; - }); - this.renameFolder = (function() { - console.log('TBD'); - }); - this.deleteFeed = (function(feed) { - feed.deleted = true; - }); - this.undeleteFeed = (function(feed) { - feed.deleted = false; - }); - this.removeFeed = (function(feed) { - console.log('remove ' + feed); - }); - this.deleteFolder = (function(folderName) { - console.log(folderName); - }); - this.moveFeed = (function(feedId, folderId) { - console.log(feedId + folderId); - }); - }]); - app.controller('SettingsController', ["$route", "SettingsResource", "FeedResource", function($route, SettingsResource, FeedResource) { + + return false; + }; + + this.isSubscriptionsActive = function () { + return $route.current && + $route.current.$$route.type === FEED_TYPE.SUBSCRIPTIONS; + }; + + this.isStarredActive = function () { + return $route.current && + $route.current.$$route.type === FEED_TYPE.STARRED; + }; + + this.isFolderActive = function (folderId) { + var currentId = parseInt($route.current.params.id, 10); + return $route.current && + $route.current.$$route.type === FEED_TYPE.FOLDER && + currentId === folderId; + }; + + this.isFeedActive = function (feedId) { + var currentId = parseInt($route.current.params.id, 10); + return $route.current && + $route.current.$$route.type === FEED_TYPE.FEED && + currentId === feedId; + }; + + this.folderNameExists = function (folderName) { + return FolderResource.get(folderName) !== undefined; + }; + + // TBD + this.isAddingFolder = function () { + return true; + }; + + this.createFolder = function (folder) { + console.log(folder.name); + folder.name = ''; + }; + + this.createFeed = function (feed) { + this.newFolder = false; + console.log(feed.url + feed.folder); + feed.url = ''; + }; + + this.renameFeed = function (feed) { + feed.editing = false; + // todo remote stuff + }; + + this.renameFolder = function () { + console.log('TBD'); + }; + + this.deleteFeed = function (feed) { + feed.deleted = true; + // todo remote stuff + }; + + this.undeleteFeed = function (feed) { + feed.deleted = false; + // todo remote stuff + }; + + this.removeFeed = function (feed) { + console.log('remove ' + feed); + }; + + this.deleteFolder = function (folderName) { + console.log(folderName); + }; + + this.moveFeed = function (feedId, folderId) { + console.log(feedId + folderId); + }; + +}]); +app.controller('SettingsController', +["$route", "SettingsResource", "FeedResource", function ($route, SettingsResource, FeedResource) { 'use strict'; - var $__0 = this; + this.importing = false; this.opmlImportError = false; this.articleImportError = false; - var set = (function(key, value) { - SettingsResource.set(key, value); - if (['showAll', 'oldestFirst'].indexOf(key) >= 0) { - $route.reload(); - } - }); - this.toggleSetting = (function(key) { - set(key, !$__0.getSetting(key)); - }); - this.getSetting = (function(key) { - return SettingsResource.get(key); - }); - this.feedSize = (function() { - return FeedResource.size(); - }); - this.importOpml = (function(content) { - console.log(content); - }); - this.importArticles = (function(content) { - console.log(content); - }); - }]); - app.filter('trustUrl', (["$sce", function($sce) { + + var set = function (key, value) { + SettingsResource.set(key, value); + + if (['showAll', 'oldestFirst'].indexOf(key) >= 0) { + $route.reload(); + } + }; + + + this.toggleSetting = function (key) { + set(key, !this.getSetting(key)); + }; + + + this.getSetting = function (key) { + return SettingsResource.get(key); + }; + + + this.feedSize = function () { + return FeedResource.size(); + }; + + + // TBD + this.importOpml = function (content) { + console.log(content); + }; + + + this.importArticles = function (content) { + console.log(content); + }; + +}]); +app.filter('trustUrl', ["$sce", function ($sce) { 'use strict'; - return (function(url) { - return $sce.trustAsResourceUrl(url); - }); - }])); - app.filter('unreadCountFormatter', (function() { + + return function (url) { + return $sce.trustAsResourceUrl(url); + }; +}]); +app.filter('unreadCountFormatter', function () { 'use strict'; - return (function(unreadCount) { - if (unreadCount > 999) { - return '999+'; - } - return unreadCount; - }); - })); - app.factory('FeedResource', (["Resource", "$http", "BASE_URL", function(Resource, $http, BASE_URL) { + + return function (unreadCount) { + if (unreadCount > 999) { + return '999+'; + } + return unreadCount; + }; +}); +app.factory('FeedResource', ["Resource", "$http", "BASE_URL", function (Resource, $http, BASE_URL) { 'use strict'; - var FeedResource = function FeedResource($http, BASE_URL) { - $traceurRuntime.superCall(this, $FeedResource.prototype, "constructor", [$http, BASE_URL, 'url']); - this.ids = {}; - this.unreadCount = 0; - this.folderUnreadCount = {}; - this.folderIds = {}; - this.deleted = null; - }; - var $FeedResource = FeedResource; - ($traceurRuntime.createClass)(FeedResource, { - receive: function(data) { - $traceurRuntime.superCall(this, $FeedResource.prototype, "receive", [data]); + + var FeedResource = function ($http, BASE_URL) { + Resource.call(this, $http, BASE_URL, 'url'); + this.ids = {}; + this.unreadCount = 0; + this.folderUnreadCount = {}; + this.folderIds = {}; + this.deleted = null; + }; + + FeedResource.prototype = Object.create(Resource.prototype); + + FeedResource.prototype.receive = function (data) { + Resource.prototype.receive.call(this, data); this.updateUnreadCache(); this.updateFolderCache(); - }, - updateUnreadCache: function() { - var $__57, - $__58, - $__59, - $__60, - $__61; - var value$__15; + }; + + + FeedResource.prototype.updateUnreadCache = function () { this.unreadCount = 0; this.folderUnreadCount = {}; - for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - value$__15 = $__4.value; - { - if (value$__15.unreadCount) { - this.unreadCount += value$__15.unreadCount; + + var self = this; + this.values.forEach(function (feed) { + if (feed.unreadCount) { + self.unreadCount += feed.unreadCount; } - if (value$__15.folderId !== undefined) { - $traceurRuntime.setProperty(this.folderUnreadCount, value$__15.folderId, this.folderUnreadCount[$traceurRuntime.toProperty(value$__15.folderId)] || 0); - ($__57 = this.folderUnreadCount, $__58 = value$__15.folderId, $__59 = value$__15.unreadCount, $__60 = $__57[$traceurRuntime.toProperty($__58)], $__61 = $__60 + $__59, $traceurRuntime.setProperty($__57, $__58, $__61), $__61); + if (feed.folderId !== undefined) { + self.folderUnreadCount[feed.folderId] = + self.folderUnreadCount[feed.folderId] || 0; + self.folderUnreadCount[feed.folderId] += feed.unreadCount; } - } - } - }, - updateFolderCache: function() { - var feed$__16; + }); + }; + + + FeedResource.prototype.updateFolderCache = function () { this.folderIds = {}; - for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - feed$__16 = $__4.value; - { - $traceurRuntime.setProperty(this.folderIds, feed$__16.folderId, this.folderIds[$traceurRuntime.toProperty(feed$__16.folderId)] || []); - this.folderIds[$traceurRuntime.toProperty(feed$__16.folderId)].push(feed$__16); - } - } - }, - add: function(value) { - $traceurRuntime.superCall(this, $FeedResource.prototype, "add", [value]); + + var self = this; + this.values.forEach(function (feed) { + self.folderIds[feed.folderId] = + self.folderIds[feed.folderId] || []; + self.folderIds[feed.folderId].push(feed); + }); + }; + + + FeedResource.prototype.add = function (value) { + Resource.prototype.add.call(this, value); if (value.id !== undefined) { - $traceurRuntime.setProperty(this.ids, value.id, this.hashMap[$traceurRuntime.toProperty(value.url)]); + this.ids[value.id] = this.hashMap[value.url]; } - }, - delete: function(url) { + }; + + + FeedResource.prototype.delete = function (url) { var feed = this.get(url); this.deleted = feed; - delete this.ids[$traceurRuntime.toProperty(feed.id)]; - $traceurRuntime.superCall(this, $FeedResource.prototype, "delete", [url]); + delete this.ids[feed.id]; + + Resource.prototype.delete.call(this, url); + this.updateUnreadCache(); this.updateFolderCache(); - return this.http.delete((this.BASE_URL + "/feeds/" + feed.id)); - }, - markRead: function() { - var feed$__17; - for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - feed$__17 = $__4.value; - { - feed$__17.unreadCount = 0; - } - } + + return this.http.delete(this.BASE_URL + '/feeds/' + feed.id); + }; + + + FeedResource.prototype.markRead = function () { + this.values.forEach(function (feed) { + feed.unreadCount = 0; + }); + this.unreadCount = 0; this.folderUnreadCount = {}; - }, - markFeedRead: function(feedId) { - this.ids[$traceurRuntime.toProperty(feedId)].unreadCount = 0; + }; + + + FeedResource.prototype.markFeedRead = function (feedId) { + this.ids[feedId].unreadCount = 0; this.updateUnreadCache(); - }, - markFolderRead: function(folderId) { - var feed$__18; - for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - feed$__18 = $__4.value; - { - if (feed$__18.folderId === folderId) { - feed$__18.unreadCount = 0; + }; + + + FeedResource.prototype.markFolderRead = function (folderId) { + this.values.forEach(function (feed) { + if (feed.folderId === folderId) { + feed.unreadCount = 0; } - } - } + }); + this.updateUnreadCache(); - }, - markItemOfFeedRead: function(feedId) { - this.ids[$traceurRuntime.toProperty(feedId)].unreadCount -= 1; + }; + + + FeedResource.prototype.markItemOfFeedRead = function (feedId) { + this.ids[feedId].unreadCount -= 1; this.updateUnreadCache(); - }, - markItemsOfFeedsRead: function(feedIds) { - var feedId$__19; - for (var $__3 = feedIds[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - feedId$__19 = $__4.value; - { - this.ids[$traceurRuntime.toProperty(feedId$__19)].unreadCount -= 1; - } - } + }; + + + FeedResource.prototype.markItemsOfFeedsRead = function (feedIds) { + var self = this; + feedIds.forEach(function (feedId) { + self.ids[feedId].unreadCount -= 1; + }); + this.updateUnreadCache(); - }, - markItemOfFeedUnread: function(feedId) { - this.ids[$traceurRuntime.toProperty(feedId)].unreadCount += 1; + }; + + + FeedResource.prototype.markItemOfFeedUnread = function (feedId) { + this.ids[feedId].unreadCount += 1; this.updateUnreadCache(); - }, - getUnreadCount: function() { + }; + + + FeedResource.prototype.getUnreadCount = function () { return this.unreadCount; - }, - getFolderUnreadCount: function(folderId) { - return this.folderUnreadCount[$traceurRuntime.toProperty(folderId)]; - }, - getByFolderId: function(folderId) { - return this.folderIds[$traceurRuntime.toProperty(folderId)] || []; - }, - getById: function(feedId) { - return this.ids[$traceurRuntime.toProperty(feedId)]; - }, - rename: function(url, name) { + }; + + + FeedResource.prototype.getFolderUnreadCount = function (folderId) { + return this.folderUnreadCount[folderId]; + }; + + + FeedResource.prototype.getByFolderId = function (folderId) { + return this.folderIds[folderId] || []; + }; + + + FeedResource.prototype.getById = function (feedId) { + return this.ids[feedId]; + }; + + + FeedResource.prototype.rename = function (url, name) { var feed = this.get(url); feed.title = name; + return this.http({ - method: 'POST', - url: (this.BASE_URL + "/feeds/" + feed.id + "/rename"), - data: {feedTitle: name} + method: 'POST', + url: this.BASE_URL + '/feeds/' + feed.id + '/rename', + data: { + feedTitle: name + } }); - }, - move: function(url, folderId) { + }; + + + FeedResource.prototype.move = function (url, folderId) { var feed = this.get(url); feed.folderId = folderId; + this.updateFolderCache(); + return this.http({ - method: 'POST', - url: (this.BASE_URL + "/feeds/" + feed.id + "/move"), - data: {parentFolderId: folderId} + method: 'POST', + url: this.BASE_URL + '/feeds/' + feed.id + '/move', + data: { + parentFolderId: folderId + } }); - }, - create: function(url, folderId) { - var title = arguments[2] !== (void 0) ? arguments[2] : null; + + }; + + + FeedResource.prototype.create = function (url, folderId, title) { if (title) { - title = title.toUpperCase(); + title = title.toUpperCase(); } + var feed = { - url: url, - folderId: folderId, - title: title, - faviconLink: '../css/loading.gif' + url: url, + folderId: folderId, + title: title, + faviconLink: '../css/loading.gif' }; + if (!this.get(url)) { - this.add(feed); + this.add(feed); } + this.updateFolderCache(); + console.log(feed); - }, - undoDelete: function() { + + /*return this.http({ + method: 'POST', + url: this.BASE_URL + '/feeds', + data: { + url: url, + parentFolderId: folderId, + title: title + } + });*/ + }; + + + FeedResource.prototype.undoDelete = function () { if (this.deleted) { - this.add(this.deleted); - return this.http.post((this.BASE_URL + "/feeds/" + this.deleted.id + "/restore")); + this.add(this.deleted); + + return this.http.post( + this.BASE_URL + '/feeds/${this.deleted.id}/restore' + ); } + this.updateFolderCache(); this.updateUnreadCache(); - } - }, {}, Resource); + }; + + return new FeedResource($http, BASE_URL); - }])); - app.factory('FolderResource', (["Resource", "$http", "BASE_URL", function(Resource, $http, BASE_URL) { +}]); +app.factory('FolderResource', ["Resource", "$http", "BASE_URL", function (Resource, $http, BASE_URL) { 'use strict'; - var FolderResource = function FolderResource($http, BASE_URL) { - $traceurRuntime.superCall(this, $FolderResource.prototype, "constructor", [$http, BASE_URL, 'name']); - this.deleted = null; + + var FolderResource = function ($http, BASE_URL) { + Resource.call(this, $http, BASE_URL, 'name'); + this.deleted = null; }; - var $FolderResource = FolderResource; - ($traceurRuntime.createClass)(FolderResource, { - delete: function(folderName) { + + FolderResource.prototype = Object.create(Resource.prototype); + + FolderResource.prototype.delete = function (folderName) { var folder = this.get(folderName); this.deleted = folder; - $traceurRuntime.superCall(this, $FolderResource.prototype, "delete", [folderName]); - return this.http.delete((this.BASE_URL + "/folders/" + folder.id)); - }, - toggleOpen: function(folderName) { + + Resource.prototype.delete.call(this, folderName); + + return this.http.delete(this.BASE_URL + '/folders/' + folder.id); + }; + + + FolderResource.prototype.toggleOpen = function (folderName) { var folder = this.get(folderName); folder.opened = !folder.opened; + return this.http({ - url: (this.BASE_URL + "/folders/" + folder.id + "/open"), - method: 'POST', - data: { - folderId: folder.id, - open: folder.opened - } + url: this.BASE_URL + '/folders/' + folder.id + '/open', + method: 'POST', + data: { + folderId: folder.id, + open: folder.opened + } }); - }, - rename: function(folderName, toFolderName) { + }; + + + FolderResource.prototype.rename = function (folderName, toFolderName) { toFolderName = toFolderName.toUpperCase(); var folder = this.get(folderName); + + // still do http request if folder exists but dont change the name + // to have one point of failure if (!this.get(toFolderName)) { - folder.name = toFolderName; - delete this.hashMap[$traceurRuntime.toProperty(folderName)]; - $traceurRuntime.setProperty(this.hashMap, toFolderName, folder); + folder.name = toFolderName; + + delete this.hashMap[folderName]; + this.hashMap[toFolderName] = folder; } + return this.http({ - url: (this.BASE_URL + "/folders/" + folder.id + "/rename"), - method: 'POST', - data: {folderName: toFolderName} + url: this.BASE_URL + '/folders/' + folder.id + '/rename', + method: 'POST', + data: { + folderName: toFolderName + } }); - }, - create: function(folderName) { - var folder$__20; + }; + + + FolderResource.prototype.create = function (folderName) { folderName = folderName.toUpperCase(); + + // still do http request if folder exists but dont change the name + // to have one point of failure if (!this.get(folderName)) { - folder$__20 = {name: folderName}; - this.add(folder$__20); + var folder = { + name: folderName + }; + + this.add(folder); } + return this.http({ - url: (this.BASE_URL + "/folders"), - method: 'POST', - data: {folderName: folderName} + url: this.BASE_URL + '/folders', + method: 'POST', + data: { + folderName: folderName + } }); - }, - undoDelete: function() { + }; + + + FolderResource.prototype.undoDelete = function () { if (this.deleted) { - this.add(this.deleted); - return this.http.post((this.BASE_URL + "/folders/" + this.deleted.id + "/restore")); + this.add(this.deleted); + + return this.http.post( + this.BASE_URL + '/folders/' + this.deleted.id + '/restore' + ); } - } - }, {}, Resource); + }; + + return new FolderResource($http, BASE_URL); - }])); - app.factory('ItemResource', (["Resource", "$http", "BASE_URL", "ITEM_BATCH_SIZE", function(Resource, $http, BASE_URL, ITEM_BATCH_SIZE) { +}]); +app.factory('ItemResource', ["Resource", "$http", "BASE_URL", "ITEM_BATCH_SIZE", function (Resource, $http, BASE_URL, + ITEM_BATCH_SIZE) { 'use strict'; - var ItemResource = function ItemResource($http, BASE_URL, ITEM_BATCH_SIZE) { - $traceurRuntime.superCall(this, $ItemResource.prototype, "constructor", [$http, BASE_URL]); - this.starredCount = 0; - this.batchSize = ITEM_BATCH_SIZE; - }; - var $ItemResource = ItemResource; - ($traceurRuntime.createClass)(ItemResource, { - receive: function(value, channel) { + + + var ItemResource = function ($http, BASE_URL, ITEM_BATCH_SIZE) { + Resource.call(this, $http, BASE_URL); + this.starredCount = 0; + this.batchSize = ITEM_BATCH_SIZE; + }; + + ItemResource.prototype = Object.create(Resource.prototype); + + + ItemResource.prototype.receive = function (value, channel) { switch (channel) { - case 'newestItemId': + + case 'newestItemId': this.newestItemId = value; break; - case 'starred': + + case 'starred': this.starredCount = value; break; - default: - $traceurRuntime.superCall(this, $ItemResource.prototype, "receive", [value, channel]); + + default: + Resource.prototype.receive.call(this, value, channel); } - }, - getNewestItemId: function() { + }; + + + ItemResource.prototype.getNewestItemId = function () { return this.newestItemId; - }, - getStarredCount: function() { + }; + + + ItemResource.prototype.getStarredCount = function () { return this.starredCount; - }, - star: function(itemId) { - var isStarred = arguments[1] !== (void 0) ? arguments[1] : true; + }; + + + ItemResource.prototype.star = function (itemId, isStarred) { + if (isStarred === undefined) { + isStarred = true; + } + var it = this.get(itemId); - var url = (this.BASE_URL + "/items/" + it.feedId + "/" + it.guidHash + "/star"); + var url = this.BASE_URL + + '/items/' + it.feedId + '/' + it.guidHash + '/star'; + it.starred = isStarred; + if (isStarred) { - this.starredCount += 1; + this.starredCount += 1; } else { - this.starredCount -= 1; + this.starredCount -= 1; } + return this.http({ - url: url, - method: 'POST', - data: {isStarred: isStarred} + url: url, + method: 'POST', + data: { + isStarred: isStarred + } }); - }, - toggleStar: function(itemId) { + }; + + + ItemResource.prototype.toggleStar = function (itemId) { if (this.get(itemId).starred) { - this.star(itemId, false); + this.star(itemId, false); } else { - this.star(itemId, true); + this.star(itemId, true); + } + }; + + + ItemResource.prototype.markItemRead = function (itemId, isRead) { + if (isRead === undefined) { + isRead = true; } - }, - markItemRead: function(itemId) { - var isRead = arguments[1] !== (void 0) ? arguments[1] : true; + this.get(itemId).unread = !isRead; return this.http({ - url: (this.BASE_URL + "/items/" + itemId + "/read"), - method: 'POST', - data: {isRead: isRead} + url: this.BASE_URL + '/items/' + itemId + '/read', + method: 'POST', + data: { + isRead: isRead + } }); - }, - markItemsRead: function(itemIds) { - var itemId$__21; - for (var $__3 = itemIds[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - itemId$__21 = $__4.value; - { - this.get(itemId$__21).unread = false; - } - } + }; + + + ItemResource.prototype.markItemsRead = function (itemIds) { + var self = this; + + itemIds.forEach(function(itemId) { + self.get(itemId).unread = false; + }); + return this.http({ - url: (this.BASE_URL + "/items/read/multiple"), - method: 'POST', - data: {itemIds: itemIds} + url: this.BASE_URL + '/items/read/multiple', + method: 'POST', + data: { + itemIds: itemIds + } }); - }, - markFeedRead: function(feedId) { - var item$__22; - var read = arguments[1] !== (void 0) ? arguments[1] : true; - for (var $__3 = this.values.filter((function(i) { - return i.feedId === feedId; - }))[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - item$__22 = $__4.value; - { - item$__22.unread = !read; - } - } - return this.http.post((this.BASE_URL + "/feeds/" + feedId + "/read")); - }, - markRead: function() { - var item$__23; - for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), - $__4; !($__4 = $__3.next()).done; ) { - item$__23 = $__4.value; - {