diff --git a/src/app/components/app-paginator/app-paginator.directive.js b/src/app/components/app-paginator/app-paginator.directive.js new file mode 100644 index 0000000..c679be3 --- /dev/null +++ b/src/app/components/app-paginator/app-paginator.directive.js @@ -0,0 +1,67 @@ +(function() { + 'use strict'; + + angular + .module('dialoga') + .directive('appPaginator', appPaginator); + + /** @ngInject */ + function appPaginator() { + + /** @ngInject */ + function AppPaginatorController($log) { + var vm = this; + + vm.$log = $log; + + vm.init(); + + $log.debug('AppPaginatorController'); + } + + AppPaginatorController.prototype.init = function () { + var vm = this; + + vm.page = vm.page || 1; + vm.perPage = vm.perPage || 20; + vm.total = vm.total || 0; + }; + + AppPaginatorController.prototype.showPage = function (pageIndex) { + var vm = this; + + if (pageIndex < 0) { + pageIndex = 0; + } + + if (pageIndex > (vm.arraypages.length-1)) { + pageIndex = vm.arraypages.length-1; + } + + if(vm.changePage){ + vm.changePage({pageIndex: (pageIndex + 1 )}); + }else{ + vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex); + } + vm.currentPageIndex = pageIndex; + }; + + var directive = { + restrict: 'E', + templateUrl: 'app/components/app-paginator/app-paginator.html', + scope: { + page: '=', + perPage: '=', + total: '=', + changePage: '&' + }, + controller: AppPaginatorController, + controllerAs: 'vm', + bindToController: true + }; + + + return directive; + } + +})(); diff --git a/src/app/components/app-paginator/app-paginator.html b/src/app/components/app-paginator/app-paginator.html new file mode 100644 index 0000000..e5e0337 --- /dev/null +++ b/src/app/components/app-paginator/app-paginator.html @@ -0,0 +1,17 @@ + diff --git a/src/app/components/dialoga-service/dialoga.service.js b/src/app/components/dialoga-service/dialoga.service.js index 95bc680..dee46c5 100644 --- a/src/app/components/dialoga-service/dialoga.service.js +++ b/src/app/components/dialoga-service/dialoga.service.js @@ -160,7 +160,7 @@ var result = CACHE.programs.filter(function filterProgramBySlug (program) { var category = program.categories[0]; - if(angular.equals(category.id, themeId)) { + if(category && angular.equals(category.id, themeId)) { return true; } return false; @@ -226,8 +226,8 @@ ArticleService.searchTopics({query: query}, cbSuccess, cbError); } - function searchProposals (query, cbSuccess, cbError) { - ArticleService.searchProposals({query: query}, cbSuccess, cbError); + function searchProposals (params, cbSuccess, cbError) { + ArticleService.searchProposals(params, cbSuccess, cbError); } function _pipeHandleYoutube (data) { diff --git a/src/app/components/proposal-list/proposal-list.directive.js b/src/app/components/proposal-list/proposal-list.directive.js index ceb84da..fd56af3 100644 --- a/src/app/components/proposal-list/proposal-list.directive.js +++ b/src/app/components/proposal-list/proposal-list.directive.js @@ -44,16 +44,13 @@ var vm = this; vm.currentPageIndex = 0; - vm.proposalsPerPage = vm.getProposalsPerPage(0); - - vm.proposalsLength = vm.proposals.length; - + vm.proposalsLength = vm.total || vm.proposals.length; if ((vm.proposalsLength % vm.perPage) === 0) { - vm.pages = vm.proposalsLength / vm.perPage; + vm.pages = vm.proposalsLength / vm.perPage; } else{ - vm.pages = (vm.proposalsLength / vm.perPage) + 1; + vm.pages = (vm.proposalsLength / vm.perPage) + 1; } // vm.arraypages = new Array(Math.ceil(vm.pages)); @@ -98,7 +95,11 @@ pageIndex = vm.arraypages.length-1; } - vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex); + if(vm.changePage){ + vm.changePage({pageIndex: (pageIndex + 1 )}); + }else{ + vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex); + } vm.currentPageIndex = pageIndex; }; @@ -132,7 +133,10 @@ templateUrl: 'app/components/proposal-list/proposal-list.html', scope: { proposals: '=', - perPage: '=' + page: '=', + perPage: '=', + total: '=', + changePage: '&' }, controller: ProposalListController, controllerAs: 'vm', diff --git a/src/app/components/util-service/utils.service.js b/src/app/components/util-service/utils.service.js index b82bf29..c646ad9 100644 --- a/src/app/components/util-service/utils.service.js +++ b/src/app/components/util-service/utils.service.js @@ -48,6 +48,7 @@ */ function handleSuccess (response) { $log.debug('[SUCCESS]', response); + response.data._obj = response; return response.data; } diff --git a/src/app/index.route.js b/src/app/index.route.js index 6f4093f..e85861c 100644 --- a/src/app/index.route.js +++ b/src/app/index.route.js @@ -106,12 +106,12 @@ .state('ranking', { url: '/ranking?tema&programa&filtro', reloadOnSearch: false, - ncyBreadcrumb: {label: 'Propostas'}, + ncyBreadcrumb: {label: 'Ranking'}, views: { 'main': { - templateUrl: 'app/pages/propostas/ranking.html', - controller: 'PropostasPageController', - controllerAs: 'pagePropostas' + templateUrl: 'app/pages/ranking/ranking.html', + controller: 'RankingPageController', + controllerAs: 'pageRanking' } } }) diff --git a/src/app/pages/propostas/propostas.controller.js b/src/app/pages/propostas/propostas.controller.js index c3dae9b..70da4fc 100644 --- a/src/app/pages/propostas/propostas.controller.js +++ b/src/app/pages/propostas/propostas.controller.js @@ -1,8 +1,3 @@ -/** - * Controlador das páginas: - * - Propostas - * - Ranking - */ (function() { 'use strict'; @@ -50,10 +45,7 @@ // Behaviour: // 1. Load themes - // 2. Select a Random Theme (T) - // 3. Load programs of T - // 4. Select a random program of T - // 5. Filter the list of proposals + // 1. Load Proposals per_page // END. // 1. Load themes @@ -63,30 +55,8 @@ vm.loadingThemes = false; vm.loading = false; - // 2. Select a Random Theme (T) - var selectedTheme = null; - if(vm.search.tema){ - - // vanilla filter - var results = vm.themes.filter(function(t){ - return t.slug === vm.search.tema; - }); - - if(results && results.length > 0){ - selectedTheme = results[0]; - vm.selectedTheme = selectedTheme; - } - } - - if(!selectedTheme){ - vm.selectedTheme = vm.themes[Math.floor(Math.random() * vm.themes.length)]; - } - - // 3. Load programs of T - // (AND 4) - var themeId = vm.selectedTheme.id; - vm.loadPrograms(themeId, function(){ - vm.loadProposals(); + vm.loadProposals(function (){ + vm.attachListeners(); }); }, function (error) { vm.error = error; @@ -96,44 +66,7 @@ }); }; - PropostasPageController.prototype.loadPrograms = function (themeId, cb) { - var vm = this; - - vm.DialogaService.getProgramsByThemeId(themeId, function (programs){ - - vm.filtredPrograms = programs; - - // 4. Select a random program of T - var selectedProgram = null; - if(vm.search.programa){ - - // vanilla filter - var results = vm.filtredPrograms.filter(function(p){ - return p.slug === vm.search.programa; - }); - - if(results && results.length > 0){ - selectedProgram = results[0]; - vm.selectedProgram = selectedProgram; - } - } - - if(!selectedProgram){ - vm.selectedProgram = vm.filtredPrograms[Math.floor(Math.random() * vm.filtredPrograms.length)]; - } - - if(cb){ - cb(); - } - }, function(error){ - vm.$log.error(error); - if(cb){ - cb(); - } - }); - }; - - PropostasPageController.prototype.loadProposals = function () { + PropostasPageController.prototype.loadProposals = function (cb) { var vm = this; // load Proposals @@ -144,7 +77,9 @@ vm.loadingProposals = false; vm.loading = false; - vm.attachListeners(); + if(cb){ + cb(); + } }, function (error) { vm.error = error; vm.$log.error(error); @@ -163,12 +98,7 @@ vm.$scope.$watch('pagePropostas.selectedTheme', function(newValue, oldValue) { vm.search.tema = newValue ? newValue.slug : null; vm.$location.search('tema', vm.search.tema); - - if(vm.selectedTheme && vm.selectedTheme.id){ - vm.loadPrograms(vm.selectedTheme.id, function(){ - vm.filtredProposals = vm.getFiltredProposals(); - }); - } + vm.filtredProposals = vm.getFiltredProposals(); }); vm.$scope.$on('change-selectedTopic', function (event, selectedTopic) { @@ -188,17 +118,6 @@ }); }; - PropostasPageController.prototype.showAllPrograms = function($event) { - var vm = this; - $event.stopPropagation(); - - vm.resetFilterValues(); - - vm._showAllFlag = true; - - vm.filtredPrograms = vm.getFiltredPrograms(); - }; - PropostasPageController.prototype.resetFilterValues = function() { var vm = this; diff --git a/src/app/pages/propostas/ranking.html b/src/app/pages/propostas/ranking.html deleted file mode 100644 index f2f3c53..0000000 --- a/src/app/pages/propostas/ranking.html +++ /dev/null @@ -1,68 +0,0 @@ -
-
-
-
-
-
-
- -
-
-
-
-
-

Ranking

-
-
-
-
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-

Total de Propostas: "{{pagePropostas.filtredProposals.length}} propostas"

-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
diff --git a/src/app/pages/ranking/ranking.controller.js b/src/app/pages/ranking/ranking.controller.js new file mode 100644 index 0000000..3fc4a68 --- /dev/null +++ b/src/app/pages/ranking/ranking.controller.js @@ -0,0 +1,240 @@ +(function() { + 'use strict'; + + angular + .module('dialoga') + .controller('RankingPageController', RankingPageController); + + /** @ngInject */ + function RankingPageController(DialogaService, $scope, $location, $filter, $log) { + var vm = this; + + vm.DialogaService = DialogaService; + vm.$scope = $scope; + vm.$location = $location; + vm.$filter = $filter; + vm.$log = $log; + + vm.init(); + vm.loadData(); + // vm.attachListeners(); // attach listeners after load data (SYNC) + + $log.debug('RankingPageController'); + } + + RankingPageController.prototype.init = function () { + var vm = this; + + vm.page = 1; + vm.per_page = 3; + vm.themes = null; + vm.selectedTheme = null; + vm.filtredPrograms = null; + vm.selectedProgram = null; + vm.proposals = null; + vm.filtredProposals = null; + vm.query = null; + vm.search = vm.$location.search(); + + vm.loading = null; + vm.error = null; + }; + + RankingPageController.prototype.loadData = function () { + var vm = this; + + vm.loading = true; + + // Behaviour: + // 1. Load themes + // 2. Select a Random Theme (T) + // 3. Load programs of T + // 4. Select a random program of T + // 5. Filter the list of proposals + // END. + + // 1. Load themes + vm.loadingThemes = true; + vm.DialogaService.getThemes(function(themes){ + vm.themes = themes; + vm.loadingThemes = false; + + // 2. Select a Random Theme (T) + var selectedTheme = null; + if(vm.search.tema){ + + // vanilla filter + var results = vm.themes.filter(function(t){ + return t.slug === vm.search.tema; + }); + + if(results && results.length > 0){ + selectedTheme = results[0]; + vm.selectedTheme = selectedTheme; + } + } + + if(!selectedTheme){ + vm.selectedTheme = vm.themes[Math.floor(Math.random() * vm.themes.length)]; + } + + // 3. Load programs of T + // (AND 4) + var themeId = vm.selectedTheme.id; + vm.loadPrograms(themeId, function(){ + vm.loadProposals(); + vm.loading = false; + }); + }, function (error) { + vm.error = error; + vm.$log.error(error); + vm.loadingThemes = false; + vm.loading = false; + }); + }; + + RankingPageController.prototype.loadPrograms = function (themeId, cb) { + var vm = this; + + vm.DialogaService.getProgramsByThemeId(themeId, function (programs){ + + vm.filtredPrograms = programs; + + // 4. Select a random program of T + var selectedProgram = null; + if(vm.search.programa){ + + // vanilla filter + var results = vm.filtredPrograms.filter(function(p){ + return p.slug === vm.search.programa; + }); + + if(results && results.length > 0){ + selectedProgram = results[0]; + vm.selectedProgram = selectedProgram; + } + } + + if(!selectedProgram){ + vm.selectedProgram = vm.filtredPrograms[Math.floor(Math.random() * vm.filtredPrograms.length)]; + } + + if(cb){ + cb(); + } + }, function(error){ + vm.$log.error(error); + if(cb){ + cb(); + } + }); + }; + + RankingPageController.prototype.loadProposals = function () { + var vm = this; + + // load Proposals + vm.loadingProposals = true; + vm.DialogaService.getProposals({}, function(data){ + vm.proposals = data.articles; + vm.filtredProposals = vm.proposals; + vm.loadingProposals = false; + + vm.attachListeners(); + }, function (error) { + vm.error = error; + vm.$log.error(error); + vm.loadingProposals = false; + }); + }; + + RankingPageController.prototype.attachListeners = function() { + var vm = this; + + vm.$scope.$on('change-selectedCategory', function (event, selectedCategory) { + vm.selectedTheme = selectedCategory; + }); + + vm.$scope.$watch('pageRanking.selectedTheme', function(newValue, oldValue) { + vm.search.tema = newValue ? newValue.slug : null; + vm.$location.search('tema', vm.search.tema); + + if(vm.selectedTheme && vm.selectedTheme.id){ + vm.loadPrograms(vm.selectedTheme.id, function(){ + vm.filterProposals(); + }); + } + }); + + vm.$scope.$on('change-selectedTopic', function (event, selectedTopic) { + vm.selectedProgram = selectedTopic; + }); + + vm.$scope.$watch('pageRanking.selectedProgram', function(newValue, oldValue) { + vm.search.programa = newValue ? newValue.slug : null; + vm.$location.search('programa', vm.search.programa); + vm.filterProposals(); + }); + + vm.$scope.$watch('pageRanking.query', function(newValue/*, oldValue*/) { + vm.search.filtro = newValue ? newValue : null; + vm.$location.search('filtro', vm.search.filtro); + vm.filterProposals(); + }); + }; + + RankingPageController.prototype.resetFilterValues = function() { + var vm = this; + + vm.query = null; + vm.selectedTheme = null; + }; + + RankingPageController.prototype.changePage = function(pageIndex) { + var vm = this; + + vm.filterProposals(pageIndex); + }; + + RankingPageController.prototype.filterProposals = function(_page, _per_page) { + var vm = this; + + if (vm.loadingProposals){ + vm.$log.debug('Content is not loaded yet.'); + return; + } + + var page = _page || vm.page; + var per_page = _per_page || vm.per_page; + var input = vm.proposals; + var output = input; + var query = vm.query; + var selectedTheme = vm.selectedTheme; + var selectedProgram = vm.selectedProgram; + + var filter = vm.$filter('filter'); + + if (selectedProgram) { + var params = { + page: page, + per_page: per_page, + parent_id: selectedProgram.id + }; + + if (query) {params.query = query; } + + vm.loadingProposals = true; + vm.DialogaService.searchProposals(params, function(data){ + vm.total_proposals = data._obj.headers('total'); + vm.filtredProposals = data.articles; + vm.loadingProposals = false; + }, function (error) { + vm.error = error; + vm.$log.error(error); + vm.loadingProposals = false; + }); + } else { + vm.filtredProposals = []; + } + }; +})(); diff --git a/src/app/pages/ranking/ranking.html b/src/app/pages/ranking/ranking.html new file mode 100644 index 0000000..7c6c388 --- /dev/null +++ b/src/app/pages/ranking/ranking.html @@ -0,0 +1,68 @@ +
+
+
+
+
+
+
+ +
+
+
+
+
+

Ranking

+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+

Total de Propostas: "{{pageRanking.total_proposals}} propostas"

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
diff --git a/src/assets/images/icons/tema-reducao-da-pobreza-small.png b/src/assets/images/icons/tema-reducao-da-pobreza-small.png index d4ef133..1273269 100644 Binary files a/src/assets/images/icons/tema-reducao-da-pobreza-small.png and b/src/assets/images/icons/tema-reducao-da-pobreza-small.png differ diff --git a/src/assets/images/icons/tema-reducao-da-pobreza.png b/src/assets/images/icons/tema-reducao-da-pobreza.png index 8c87c08..4eb6de1 100644 Binary files a/src/assets/images/icons/tema-reducao-da-pobreza.png and b/src/assets/images/icons/tema-reducao-da-pobreza.png differ -- libgit2 0.21.2