From 7e94f3d2e9811224e13fccca5e8e41890df584ac Mon Sep 17 00:00:00 2001 From: Leonardo Merlin Date: Tue, 15 Sep 2015 13:42:08 -0300 Subject: [PATCH] Add filter to ranking page --- src/app/components/article-service/article.service.js | 12 ++++-------- src/app/components/category-list/category-list.directive.js | 17 +++++++++++++---- src/app/components/dialoga-service/dialoga.service.js | 24 ++++++++++++++++++++++++ src/app/components/topics-select/topics-select.directive.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/app/components/topics-select/topics-select.html | 9 +++++++++ src/app/pages/propostas/propostas.controller.js | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- src/app/pages/propostas/propostas.scss | 4 ++++ src/app/pages/propostas/ranking.html | 5 ++++- 8 files changed, 263 insertions(+), 42 deletions(-) create mode 100644 src/app/components/topics-select/topics-select.directive.js create mode 100644 src/app/components/topics-select/topics-select.html diff --git a/src/app/components/article-service/article.service.js b/src/app/components/article-service/article.service.js index 2130389..302ce68 100644 --- a/src/app/components/article-service/article.service.js +++ b/src/app/components/article-service/article.service.js @@ -100,21 +100,17 @@ // var url = service.apiArticles + API.articleId.home; - // var paramsExtended = angular.extend({ - // // 'fields[]': ['id', 'title', 'slug', 'abstract', 'categories', 'setting', 'children', 'children_count'], - // 'content_type':'ProposalsDiscussionPlugin::Proposal' - // }, params); - // UtilService.get(url, {params: paramsExtended}).then(function(data){ // cbSuccess(data); // }).catch(function(error){ // cbError(error); // }); - // - searchProposals({ + var paramsExtended = angular.extend({ query: '' - }, cbSuccess, cbError); + }, params); + + searchProposals(paramsExtended, cbSuccess, cbError); } function getProposalById (proposalId, params, cbSuccess, cbError) { diff --git a/src/app/components/category-list/category-list.directive.js b/src/app/components/category-list/category-list.directive.js index c35ab8a..4622663 100644 --- a/src/app/components/category-list/category-list.directive.js +++ b/src/app/components/category-list/category-list.directive.js @@ -30,6 +30,12 @@ if(!vm.isCollapsed){ vm.isCollapsed = false; } + + if(angular.isUndefined(vm.canUnselect) || vm.canUnselect === null){ + vm.canUnselect = true; + } else { + vm.canUnselect = !(vm.canUnselect == 'false'); + } }; CategoryListController.prototype.selectCategory = function(category, $event) { @@ -38,11 +44,13 @@ // prevent glitch $event.stopPropagation(); + if(!category && !vm.canUnselect){ + vm.$log.info('Unselect is disabled.'); + return; + } + if (category !== vm.selectedCategory) { - // selected new filter vm.selectedCategory = category; - } else { - vm.selectedCategory = null; } // send event to all controllers @@ -65,7 +73,8 @@ templateUrl: 'app/components/category-list/category-list.html', scope: { categories: '=', - selectedCategory: '=' + selectedCategory: '=', + canUnselect: '@' }, controller: CategoryListController, controllerAs: 'vm', diff --git a/src/app/components/dialoga-service/dialoga.service.js b/src/app/components/dialoga-service/dialoga.service.js index 8196c34..95bc680 100644 --- a/src/app/components/dialoga-service/dialoga.service.js +++ b/src/app/components/dialoga-service/dialoga.service.js @@ -19,6 +19,7 @@ extendedService.getThemeBySlug = getThemeBySlug; extendedService.getPrograms = getPrograms; extendedService.getProgramBySlug = getProgramBySlug; + extendedService.getProgramsByThemeId = getProgramsByThemeId; extendedService.getProgramsRandom = getProgramsRandom; extendedService.getEvents = getEvents; // override extendedService.getQuestions = getQuestions; @@ -89,6 +90,7 @@ },cbError); } } + function getThemeBySlug (slug, cbSuccess, cbError) { if( !!CACHE.themes ){ _getThemeBySlug(CACHE.themes); @@ -146,6 +148,28 @@ } } + function getProgramsByThemeId (themeId, cbSuccess, cbError) { + + if( !CACHE.programs ){ + getPrograms(_getProgramsByThemeId, cbError); + } else { + _getProgramsByThemeId(); + } + + function _getProgramsByThemeId(){ + var result = CACHE.programs.filter(function filterProgramBySlug (program) { + var category = program.categories[0]; + + if(angular.equals(category.id, themeId)) { + return true; + } + return false; + }); + + cbSuccess(result); + } + } + // Ex.: /api/v1/dialoga_plugin/random_topics/103358 // TODO: get endpoint for production // TODO: put at cache? diff --git a/src/app/components/topics-select/topics-select.directive.js b/src/app/components/topics-select/topics-select.directive.js new file mode 100644 index 0000000..7000ac8 --- /dev/null +++ b/src/app/components/topics-select/topics-select.directive.js @@ -0,0 +1,61 @@ +(function() { + 'use strict'; + + angular + .module('dialoga') + .directive('topicsSelect', topicsSelect); + + /** @ngInject */ + function topicsSelect() { + + /** @ngInject */ + function TopicsSelectController($rootScope, $log) { + $log.debug('TopicsSelectController'); + + // alias + var vm = this; + + // dependencies + vm.$rootScope = $rootScope; + vm.$log = $log; + + // initialization + vm.init(); + } + + TopicsSelectController.prototype.init = function() { + var vm = this; + + // vm.topics = null; + // vm.selectedTopic = null; + vm.topicFilter = vm.selectedTopic; + }; + + TopicsSelectController.prototype.selectTopic = function() { + var vm = this; + + if (vm.topicFilter === null) { + vm.$log.debug('Default topic selected.'); + return; + } + + // send event to all controllers + vm.$rootScope.$broadcast('change-selectedTopic', vm.topicFilter); + }; + + var directive = { + restrict: 'E', + templateUrl: 'app/components/topics-select/topics-select.html', + scope: { + topics: '=', + selectedTopic: '=' + }, + controller: TopicsSelectController, + controllerAs: 'vm', + bindToController: true + }; + + return directive; + } + +})(); diff --git a/src/app/components/topics-select/topics-select.html b/src/app/components/topics-select/topics-select.html new file mode 100644 index 0000000..ae804dd --- /dev/null +++ b/src/app/components/topics-select/topics-select.html @@ -0,0 +1,9 @@ +
+ +
diff --git a/src/app/pages/propostas/propostas.controller.js b/src/app/pages/propostas/propostas.controller.js index c98a8c0..c8a3288 100644 --- a/src/app/pages/propostas/propostas.controller.js +++ b/src/app/pages/propostas/propostas.controller.js @@ -22,7 +22,7 @@ vm.init(); vm.loadData(); - vm.attachListeners(); + // vm.attachListeners(); // attach listeners after load data (SYNC) $log.debug('PropostasPageController'); } @@ -32,6 +32,8 @@ vm.themes = null; vm.selectedTheme = null; + vm.filtredPrograms = null; + vm.selectedProgram = null; vm.proposals = null; vm.filtredProposals = null; vm.query = null; @@ -46,30 +48,108 @@ vm.loading = true; - // load Proposals - vm.loadingProposals = true; - vm.DialogaService.getProposals({}, function(data){ - vm.proposals = data.articles; - vm.filtredProposals = vm.proposals; - vm.loadingProposals = false; + // 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; 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(); + }); }, function (error) { vm.error = error; vm.$log.error(error); - vm.loadingProposals = false; + vm.loadingThemes = false; vm.loading = false; }); + }; - // load themes - vm.loadingThemes = true; - vm.DialogaService.getThemes(function(themes){ - vm.themes = themes; - vm.loadingThemes = false; + PropostasPageController.prototype.loadPrograms = function (themeId, cb) { + var vm = this; + + vm.DialogaService.getProgramsByThemeId(themeId, function (programs){ + vm.$log.debug('programs', 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 () { + 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.loading = false; + + vm.attachListeners(); }, function (error) { vm.error = error; vm.$log.error(error); - vm.loadingThemes = false; + vm.loadingProposals = false; vm.loading = false; }); }; @@ -81,12 +161,23 @@ vm.selectedTheme = selectedCategory; }); - vm.$scope.$watch('pagePropostas.selectedTheme', function(newValue/*, oldValue*/) { + vm.$scope.$watch('pagePropostas.selectedTheme', function(newValue, oldValue) { vm.search.tema = newValue ? newValue.slug : null; vm.$location.search('tema', vm.search.tema); vm.filtredProposals = vm.getFiltredProposals(); }); + vm.$scope.$on('change-selectedTopic', function (event, selectedTopic) { + vm.selectedProgram = selectedTopic; + vm.$log.debug('change-selectedTopic', selectedTopic); + }); + + vm.$scope.$watch('pagePropostas.selectedProgram', function(newValue, oldValue) { + vm.search.programa = newValue ? newValue.slug : null; + vm.$location.search('programa', vm.search.programa); + vm.filtredProposals = vm.getFiltredProposals(); + }); + vm.$scope.$watch('pagePropostas.query', function(newValue/*, oldValue*/) { vm.search.filtro = newValue ? newValue : null; vm.$location.search('filtro', vm.search.filtro); @@ -94,22 +185,22 @@ }); }; - PropostasPageController.prototype.filter = function() { - var vm = this; + // PropostasPageController.prototype.filter = function() { + // var vm = this; - if (vm.search && vm.search.tema) { - var slug = vm.search.tema; - vm.$log.debug('filter by theme', slug); + // if (vm.search && vm.search.tema) { + // var slug = vm.search.tema; + // vm.$log.debug('filter by theme', slug); - vm.DialogaService.getThemeBySlug(slug, function(theme){ - vm.selectedTheme = theme; - vm.$log.debug('getThemeBySlug.slug', slug); - vm.$log.debug('getThemeBySlug.selectedTheme', theme); - }, function(error){ - vm.$log.error('Error when try to "getThemeBySlug"', error); - }); - } - }; + // vm.DialogaService.getThemeBySlug(slug, function(theme){ + // vm.selectedTheme = theme; + // vm.$log.debug('getThemeBySlug.slug', slug); + // vm.$log.debug('getThemeBySlug.selectedTheme', theme); + // }, function(error){ + // vm.$log.error('Error when try to "getThemeBySlug"', error); + // }); + // } + // }; PropostasPageController.prototype.showAllPrograms = function($event) { var vm = this; @@ -141,6 +232,7 @@ var output = input; var query = vm.query; var selectedTheme = vm.selectedTheme; + var selectedProgram = vm.selectedProgram; var filter = vm.$filter('filter'); @@ -148,6 +240,10 @@ output = _filterByCategory(output, selectedTheme); } + if (selectedProgram) { + output = _filterByProgram(output, selectedProgram); + } + if (query) { output = filter(output, query, false); } @@ -178,4 +274,23 @@ return out; } + function _filterByProgram (input, program) { + input = input || []; + + if (!program) { + // no filter + return input; + } + + var out = []; + for (var i = 0; i < input.length; i++) { + var proposal = input[i]; + if (proposal.parent.id === program.id) { + out.push(proposal); + } + } + + return out; + } + })(); diff --git a/src/app/pages/propostas/propostas.scss b/src/app/pages/propostas/propostas.scss index 3afbb28..200015f 100644 --- a/src/app/pages/propostas/propostas.scss +++ b/src/app/pages/propostas/propostas.scss @@ -2,4 +2,8 @@ .proposal-box--middle { background-color: #fff; } + + .topics-select--wrapper { + margin: 20px 0; + } } diff --git a/src/app/pages/propostas/ranking.html b/src/app/pages/propostas/ranking.html index a299197..4722817 100644 --- a/src/app/pages/propostas/ranking.html +++ b/src/app/pages/propostas/ranking.html @@ -38,7 +38,10 @@
- + +
+
+