(function() {
'use strict';
angular
.module('dialoga')
.controller('ProgramaPageController', ProgramaPageController);
/** @ngInject */
function ProgramaPageController(DialogaService, PATH, VOTE_OPTIONS, PROPOSAL_STATUS, $state, $location, $scope, $rootScope, $element, $sce, $log) {
var vm = this;
vm.DialogaService = DialogaService;
vm.PATH = PATH;
vm.VOTE_OPTIONS = VOTE_OPTIONS;
vm.PROPOSAL_STATUS = PROPOSAL_STATUS;
vm.$state = $state;
vm.$location = $location;
vm.$scope = $scope;
vm.$rootScope = $rootScope;
vm.$element = $element;
vm.$sce = $sce;
vm.$log = $log;
vm.init();
vm.loadData();
vm.attachListeners();
vm.$rootScope.focusMainContent();
vm.$log.debug('ProgramaPageController');
}
ProgramaPageController.prototype.init = function() {
var vm = this;
vm.article = null;
vm.category = null;
vm.loading = null;
vm.loadingTopProposals = null;
vm.loadingProposalBox = null;
vm.sendProposalRedirectURI = null;
vm.showDetailAboutArchived = false;
// vm.voteProposalRedirectURI = null;
vm.search = vm.$location.search();
vm.error = false;
};
ProgramaPageController.prototype.loadData = function() {
var vm = this;
vm.loading = true;
vm.proposalStatus = null;
// Get program by slug
var slug = vm.$state.params.slug;
if (!slug) {
vm.$log.warn('slug not defined.');
vm.$log.info('Rollback to home page.');
vm.$state.go('inicio', {}, {location: 'replace'});
return;
}
vm.DialogaService.getProgramBySlug(slug, function(article) {
vm.article = article;
vm.category = vm.article.categories[0];
vm.sendProposalRedirectURI = 'state=programa&task=send-proposal&slug=' + slug;
// vm.voteProposalRedirectURI = 'state=programa&task=vote-proposal&slug=' + slug;
// update the breadcrumb
vm.$rootScope.contentTitle = vm.article.title;
// set the banner image with full image path
if (!vm.banner && vm.article.image) {
vm.banner = {
src: vm.PATH.image + vm.article.image.url,
alt: 'Imagem de destaque do conteúdo'
};
}
if (vm.article.body && !vm.article.bodyTrusted) {
vm.article.bodyTrusted = vm.$sce.trustAsHtml(vm.article.body);
}
vm.loadingTopProposals = true;
vm.DialogaService.getProposalsByTopicIdRanked(vm.article.id, {
'limit': 5
}, function(data) {
vm.total_proposals = parseInt(vm.article.children_count);
// vm.total_proposals = parseInt(vm.article.amount_of_children); // DEPRECATED?!
if (data.articles) {
vm.proposals = data.articles;
} else {
vm.proposals = data.proposals;
}
vm.proposalsTopFive = vm.proposals.slice(0, 5);
vm.proposalsTopRated = vm.proposals.slice(0, 3);
vm.loadingTopProposals = false;
if (vm.article.archived) {
// show 'respostas e compromissos',
// ONLY IF the proposal is below or equal 3th position.
if (vm.search.proposal_id) {
var found = false;
var proposal_id = parseInt(vm.search.proposal_id);
for (var i = vm.proposalsTopRated.length - 1; i >= 0; i--) {
var proposal = vm.proposalsTopRated[i];
if(proposal.id === proposal_id){
found = true;
break;
}
}
if (!found){
vm.$log.debug('Proposal is not one of top 3.');
return;
}
// set focus at proposal, ASYNC
vm.$rootScope.findElAsyncAndFocus('.sub-section-' + proposal_id);
// TODO: load and show proposal response
}
}
// HACK: get image from body 'proposal'
// remove tags html
for (var j = vm.proposalsTopRated.length - 1; j >= 0; j--) {
var proposalTopRated = vm.proposalsTopRated[j];
if (proposalTopRated && proposalTopRated.body && proposalTopRated.body.length > 0) {
proposalTopRated.body = String(proposalTopRated.body).replace(/<[^>]+>/gm, '');
}else{
proposalTopRated.body = vm.banner.src;
}
}
}, function(error) {
vm.$log.error(error);
vm.loadingTopProposals = false;
});
// load content of 'proposal-box'
if (!vm.article.archived) {
if (vm.search.proposal_id) {
// load the proposal and set focus on proposal-box
vm.loadProposalById(vm.search.proposal_id);
}else {
// load a random proposal at proposal-box
vm.loadRandomProposal();
}
}
vm.loading = false;
}, function(error) {
vm.$log.error(error);
vm.error = error;
vm.loading = false;
});
};
ProgramaPageController.prototype.attachListeners = function() {
var vm = this;
vm.$scope.$on('proposal-carousel:showProposalsList', function() {
vm.showProposalsList();
});
vm.$scope.$on('cadastro-proposa:startSendProposal', function(event, proposal) {
vm.proposalStatus = vm.PROPOSAL_STATUS.SENDING;
var category_id = vm.article.categories[0].id;
vm.DialogaService.createProposal(proposal, vm.article.id, category_id, function(response) {
vm.$log.debug('response', response);
// vm.message =
// vm.proposalStatus = vm.PROPOSAL_STATUS.SENT | vm.PROPOSAL_STATUS.SUCCESS;
vm.proposalStatus = vm.PROPOSAL_STATUS.SUCCESS;
}, function(error) {
vm.$log.error(error);
vm.error = error;
if (vm.error.code === 400) {
// Bad Request
vm.error.message = '';
vm.error.message += 'Não foi possível enviar a proposta.
';
vm.error.message += 'Este problema já foi registrado em nossos servidores.
';
vm.error.message += 'Por favor, tente novamente mais tarde.';
}
// vm.proposalStatus = vm.PROPOSAL_STATUS.SENT | vm.PROPOSAL_STATUS.ERROR;
vm.proposalStatus = vm.PROPOSAL_STATUS.ERROR;
});
});
};
ProgramaPageController.prototype.loadProposalById = function(proposal_id) {
var vm = this;
vm.loadingProposalBox = true;
vm.DialogaService.getProposalById(proposal_id, {
'limit': '1'
}, vm._handleSuccessOnGetProposal.bind(vm), vm._handleErrorOnGetProposal.bind(vm));
};
ProgramaPageController.prototype.loadRandomProposal = function() {
var vm = this;
vm.loadingProposalBox = true;
vm.DialogaService.getProposalsByTopicId(vm.article.id, {
'order': 'random()',
'limit': '1',
't': Date.now() // add a timestamp to get a non-cached resource
}, vm._handleSuccessOnGetProposal.bind(vm), vm._handleErrorOnGetProposal.bind(vm));
};
ProgramaPageController.prototype._handleSuccessOnGetProposal = function(data) {
var vm = this;
if (data && data.articles) {
var MAX = data.articles.length;
vm.randomProposal = data.articles[Math.floor(Math.random() * MAX)];
vm.loadingProposalBox = false;
vm.$scope.$broadcast('proposal-box:proposal-loaded', { success: true});
}
// scroll to focused proposal
if (vm.search.proposal_id) {
vm.$rootScope.findElAsyncAndFocus('.focused-proposal');
}
};
ProgramaPageController.prototype._handleErrorOnGetProposal = function(error) {
var vm = this;
vm.$log.error(error);
vm.$scope.$broadcast('proposal-box:proposal-loaded', { error: true});
};
ProgramaPageController.prototype.voteSkip = function() {
var vm = this;
vm.loadRandomProposal();
};
ProgramaPageController.prototype.vote = function(proposal_id, value) {
var vm = this;
if (vm.article.archived) {
vm.$log.info('Article archived. Abort.');
return;
}
if (value === vm.VOTE_OPTIONS.SKIP) {
vm.voteSkip();
return;
}
vm.DialogaService.voteProposal(proposal_id, {
value: value
}).then(function(response) {
vm.$log.debug('voteProposal response', response);
response.success = true;
vm.$scope.$broadcast('proposal-box:vote-response', response);
}, function(response) {
vm.$log.debug('voteProposal error', response);
response.error = true;
vm.$scope.$broadcast('proposal-box:vote-response', response);
}).finally(function(response) {
vm.$log.debug('voteProposal finally', response);
});
};
ProgramaPageController.prototype.showProposalsList = function() {
var vm = this;
vm.findAndShow('#section-proposal-list');
};
ProgramaPageController.prototype.hideProposalsList = function() {
var vm = this;
vm.findAndHide('#section-proposal-list');
};
ProgramaPageController.prototype.showProposalForm = function() {
var vm = this;
if (vm.article.archived) {
vm.$log.info('Article archived. Abort.');
return;
}
vm.findAndShow('#section-proposal-form');
};
ProgramaPageController.prototype.hideProposalForm = function() {
var vm = this;
vm.findAndHide('#section-proposal-form');
};
ProgramaPageController.prototype.findAndShow = function(rule) {
var vm = this;
var el = vm.$element.find(rule);
el.slideDown();
angular.element('html,body').animate({scrollTop: el.offset().top}, 'fast');
};
ProgramaPageController.prototype.findAndHide = function(rule) {
var vm = this;
vm.$element.find(rule).slideUp();
};
ProgramaPageController.prototype.sendAnotherProposal = function() {
var vm = this;
vm.proposalStatus = null;
};
ProgramaPageController.prototype.toggleContentVisibility = function() {
var vm = this;
var $sectionContent = angular.element('.section-content');
if (!$sectionContent || $sectionContent.length === 0) {
vm.$log.warn('".section-content" not found.');
return;
}
if ($sectionContent.is(':visible')) {
$sectionContent.slideUp();
}else {
$sectionContent.slideDown();
angular.element('html,body').animate({scrollTop: $sectionContent.offset().top}, 'fast');
}
};
ProgramaPageController.prototype.toggleResponseVisibility = function(proposal) {
var vm = this;
if(!proposal){
vm.$log.error('Error - proposal is:', proposal);
return;
}
if(proposal.response){
// show response
toggle();
}else{
// load response
proposal.response = {
loading: true,
error: false,
content: null
};
vm.DialogaService.getResponseByProposalId(proposal.proposal_id)
.then(function(data){
proposal.response.content = data.articles[0].body;
toggle();
}).catch(function(){
proposal.response.error = false;
}).finally(function(){
proposal.response.loading = false;
});
}
function toggle () {
var $el = angular.element('.gov-response-' + proposal.id);
if ($el.is(':visible')) {
$el.slideUp();
}else {
$el.slideDown(100, function(){
angular.element('html,body').animate({scrollTop: $el.offset().top}, 'fast');
});
}
}
};
})();