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 @@
-
+
+
+
+