Commit c446582a9b78cf15939308e4b2ba8455da6c8510

Authored by Leonardo Merlin
1 parent 9acab0bf

Add 'create proposal'

src/app/components/article-service/article.service.js
... ... @@ -6,12 +6,13 @@
6 6 .factory('ArticleService', ArticleService);
7 7  
8 8 /** @ngInject */
9   - function ArticleService($http, $q, $rootScope, API, UtilService, Slug, $log) {
  9 + function ArticleService($http, $q, $rootScope, API, UtilService, Slug, GUID, $log) {
10 10 $log.debug('ArticleService');
11 11  
12 12 var service = {
13 13 apiArticles: $rootScope.basePath + '/api/v1/articles/',
14 14 apiCommunities: $rootScope.basePath + '/api/v1/communities/',
  15 + apiProposals: $rootScope.basePath + '/api/v1/proposals_discussion_plugin/',
15 16 getArticleById: getArticleById,
16 17 getArticleBySlug: getArticleBySlug,
17 18 getCategories: getCategories,
... ... @@ -21,6 +22,7 @@
21 22 getProposals: getProposals,
22 23 getProposalById: getProposalById,
23 24 getProposalsByTopicId: getProposalsByTopicId,
  25 + createProposal: createProposal,
24 26 getEvents: getEvents,
25 27 subscribeToEvent: subscribeToEvent,
26 28 searchTopics: searchTopics,
... ... @@ -148,6 +150,28 @@
148 150 getProposalById(topicId + '/children', params, cbSuccess, cbError);
149 151 }
150 152  
  153 + function createProposal (proposal, targetId, cbSuccess, cbError){
  154 +
  155 + if(!$rootScope.currentUser){
  156 + cbError({message: 'Usuário não logado.'});
  157 + }else{
  158 + // /api/v1/proposals_discussion_plugin/' + targetId + '/propose
  159 + var url = service.apiProposals + targetId + '/propose';
  160 +
  161 + var encodedParams = [];
  162 + encodedParams.push('private_token=' + $rootScope.currentUser.private_token);
  163 + encodedParams.push('fields=id');
  164 + encodedParams.push('article[name]=article_' + GUID.generate());
  165 + encodedParams = encodedParams.join('&');
  166 +
  167 + UtilService.post(url, encodedParams).then(function(response){
  168 + cbSuccess(response);
  169 + }).catch(function(error){
  170 + cbError(error);
  171 + });
  172 + }
  173 + }
  174 +
151 175 function getEvents (community_id, params, cbSuccess, cbError) {
152 176 // Ex.: /api/v1/communities/19195/articles?categories_ids[]=' + cat_id + '&content_type=Event';
153 177 // Ex.: /api/v1/communities/' + community_id + '/articles?categories_ids[]=' + cat_id + '&content_type=Event';
... ... @@ -183,16 +207,17 @@
183 207  
184 208 if(!$rootScope.currentUser){
185 209 cbError({message: 'Usuário não logado.'});
186   - }
187 210  
188   - var url = service.apiArticles + event_id + '/follow';
189   - var encodedParams = 'private_token=' + $rootScope.currentUser.private_token;
  211 + }else{
  212 + var url = service.apiArticles + event_id + '/follow';
  213 + var encodedParams = 'private_token=' + $rootScope.currentUser.private_token;
190 214  
191   - UtilService.post(url, encodedParams).then(function(response){
192   - cbSuccess(response);
193   - }).catch(function(error){
194   - cbError(error);
195   - });
  215 + UtilService.post(url, encodedParams).then(function(response){
  216 + cbSuccess(response);
  217 + }).catch(function(error){
  218 + cbError(error);
  219 + });
  220 + }
196 221 }
197 222  
198 223 function searchTopics (params, cbSuccess, cbError) {
... ...
src/app/components/cadastro-proposta/cadastro-proposta.directive.js
... ... @@ -28,13 +28,20 @@
28 28 // requeue to wait until DOM be created
29 29 vm.$timeout(function(){
30 30 attachPopover.call(vm);
31   - }, 100);
  31 + }, 200);
  32 + };
  33 +
  34 + CadastroPropostaController.prototype.sendProposal = function (proposal) {
  35 + var vm = this;
  36 +
  37 + // notify parents - handled by parents
  38 + vm.$scope.$emit('cadastro-proposa:startSendProposal', proposal);
32 39 };
33 40  
34 41 function attachPopover(){
35 42 var vm = this;
36 43  
37   - vm.popover = angular.element(vm.$element.find('.link-popover'));
  44 + vm.popover = angular.element(vm.$element.find('.btn-question'));
38 45 vm.popover.popover({
39 46 html: true,
40 47 placement: 'bottom',
... ... @@ -47,7 +54,9 @@
47 54 var directive = {
48 55 restrict: 'E',
49 56 templateUrl: 'app/components/cadastro-proposta/cadastro-proposta.html',
50   - scope: {},
  57 + scope: {
  58 + program: '='
  59 + },
51 60 controller: CadastroPropostaController,
52 61 controllerAs: 'vm',
53 62 bindToController: true
... ...
src/app/components/cadastro-proposta/cadastro-proposta.html
... ... @@ -11,23 +11,29 @@
11 11 <div class="col-sm-8">
12 12 <p>Você está fazendo uma proposta para o programa:</p>
13 13 <div class="bloco-programa">
14   - <span class="texto-programa">Nome do progama</span>
  14 + <span class="texto-programa">{{::vm.program.title}}</span>
15 15 </div>
16 16 </div>
17 17 </div>
18   - <form role="form" name="formPropostas" ng-submit="pageSignin.login(pageSignin.credentials)" novalidate>
  18 + <form role="form" name="formPropostas" ng-submit="vm.sendProposal(proposta)" novalidate>
19 19 <div class="form-group">
20 20 <div class="row linha-proposta">
21 21 <div class="col-sm-8">
22   - <span>Descrição da proposta*</span>
  22 + <label for="proposta-textarea">Descrição da proposta*</label>
23 23 <a tabindex="0" class="btn btn-link btn-question" role="button" data-toggle="popover" data-trigger="focus">?</a>
24   - <textarea id="proposta" name="proposta" class="texto-proposta form-control"
  24 + <textarea id="proposta-textarea" name="proposta" class="texto-proposta form-control"
25 25 ng-class="{ 'has-error' : formPropostas.proposta.$invalid && formPropostas.proposta.$touched }"
26 26 ng-model="proposta"
27 27 required ng-maxlength="200" ></textarea>
28   - <validation-messages field="formPropostas.proposta" maxlength="'Ops, esse campo não pode ser maior que 200 caracteres.'"/>
29   - <span class="pull-left">*Dados obrigatórios</span>
30   - <span class="pull-right">Máx. 200 caracteres</span>
  28 + <validation-messages field="formPropostas.proposta" maxlength="'Ops, esse campo não pode ser maior que 200 caracteres.'"></validation-messages>
  29 + <div class="row">
  30 + <div class="col-xs-6">
  31 + <span>*Dados obrigatórios</span>
  32 + </div>
  33 + <div class="col-xs-6 text-right">
  34 + <span>Máx. 200 caracteres</span>
  35 + </div>
  36 + </div>
31 37 </div>
32 38 </div>
33 39 </div>
... ...
src/app/components/proposal-carousel/proposal-carousel.directive.js
... ... @@ -56,11 +56,11 @@
56 56 }
57 57 };
58 58  
59   - ProposalCarouselController.prototype.showProposals = function () {
  59 + ProposalCarouselController.prototype.showProposalsList = function () {
60 60 var vm = this;
61 61  
62 62 // notify parents - handled by parents
63   - vm.$scope.$emit('proposal-carousel:showProposals');
  63 + vm.$scope.$emit('proposal-carousel:showProposalsList');
64 64 };
65 65  
66 66 var directive = {
... ...
src/app/components/proposal-carousel/proposal-carousel.html
... ... @@ -23,7 +23,7 @@
23 23 </div>
24 24 </div>
25 25 </div>
26   - <div class="proposal-carousel-bottom color-theme-common-bg" ng-click="vm.showProposals()">
  26 + <div class="proposal-carousel-bottom color-theme-common-bg" ng-click="vm.showProposalsList()">
27 27 <div>Veja as propostas mais vortadas</div>
28 28 <div class="proposal-carousel-bottom-icon">
29 29 <span class="glyphicon glyphicon-chevron-down pull-right color-theme-common-fg"></span>
... ...
src/app/pages/programas/programa.controller.js
... ... @@ -118,29 +118,58 @@
118 118 ProgramaPageController.prototype.attachListeners = function() {
119 119 var vm = this;
120 120  
121   - vm.$scope.$on('proposal-carousel:showProposals', function() {
122   - if(!vm._proposal_list){
123   - vm._proposal_list = vm.$element.find('.proposal-ranking-section');
124   - }
  121 + vm.$scope.$on('proposal-carousel:showProposalsList', function() {
  122 + vm.showProposalsList();
  123 + });
125 124  
126   - vm._proposal_list.slideDown();
127   - angular.element('body').animate({scrollTop: vm._proposal_list.offset().top}, 'fast');
  125 + vm.$scope.$on('cadastro-proposa:startSendProposal', function(event, proposal) {
  126 + // vm.$log.debug('proposal', proposal);
  127 + vm.creatingProposal = true;
  128 + vm.DialogaService.createProposal(proposal, vm.article.id, function (response){
  129 + vm.$log.debug('response', response);
  130 + vm.creatingProposal = false;
  131 + }, function (error) {
  132 + vm.$log.error(error);
  133 + vm.creatingProposal = false;
  134 + });
128 135 });
129 136 };
130 137  
131   - ProgramaPageController.prototype.hideProposals = function() {
  138 + ProgramaPageController.prototype.showProposalsList = function() {
132 139 var vm = this;
  140 + vm.findAndShow('#section-proposal-list');
  141 + };
133 142  
134   - if(!vm._proposal_list){
135   - vm._proposal_list = vm.$element.find('.proposal-ranking-section');
136   - }
  143 + ProgramaPageController.prototype.hideProposalsList = function() {
  144 + var vm = this;
  145 + vm.findAndHide('#section-proposal-list');
  146 + };
137 147  
138   - vm._proposal_list.slideUp();
  148 + ProgramaPageController.prototype.showProposalForm = function() {
  149 + var vm = this;
  150 + vm.findAndShow('#section-proposal-form');
139 151 };
140 152  
141   - ProgramaPageController.prototype.makeProposal = function() {
  153 + ProgramaPageController.prototype.hideProposalForm = function() {
  154 + var vm = this;
  155 + vm.findAndHide('#section-proposal-form');
  156 + };
  157 +
  158 + ProgramaPageController.prototype.findAndShow = function(rule) {
  159 + var vm = this;
  160 + var el = vm.$element.find(rule);
  161 + el.slideDown();
  162 + angular.element('body').animate({scrollTop: el.offset().top}, 'fast');
  163 + }
  164 +
  165 + ProgramaPageController.prototype.findAndHide = function(rule) {
  166 + var vm = this;
  167 + vm.$element.find(rule).slideUp();
  168 + }
  169 +
  170 + ProgramaPageController.prototype.sendProposal = function() {
142 171 var vm = this;
143 172  
144   - vm.$log.warn('Not implemented yet: "makeProposal"');
  173 + vm.$log.warn('Not implemented yet: "sendProposal"');
145 174 };
146 175 })();
... ...
src/app/pages/programas/programa.html
... ... @@ -6,7 +6,7 @@
6 6 </div>
7 7 </div>
8 8  
9   -<div class="page--conheca-o-programa">
  9 +<div class="page--program">
10 10 <section>
11 11 <div class="container">
12 12 <div class="row">
... ... @@ -47,7 +47,7 @@
47 47 <div class="row">
48 48 <div class="col-sm-6">
49 49 <div class="button--themed">
50   - <button type="button" class="btn btn-block" ng-click="pagePrograma.makeProposal()">Faça uma proposta</button>
  50 + <button type="button" class="btn btn-block" ng-click="pagePrograma.showProposalForm()">Faça uma proposta</button>
51 51 </div>
52 52 </div>
53 53 </div>
... ... @@ -70,7 +70,7 @@
70 70 <p>
71 71 Este programa ainda não possui nenhuma proposta.
72 72 <div class="button--themed">
73   - <button type="button" class="btn btn-block" ng-click="pagePrograma.makeProposal()">Faça uma proposta</button>
  73 + <button type="button" class="btn btn-block" ng-click="pagePrograma.showProposalForm()">Faça uma proposta</button>
74 74 </div>
75 75 </p>
76 76 </div>
... ... @@ -81,20 +81,33 @@
81 81 </div>
82 82 </section>
83 83  
84   - <section class="proposal-ranking-section" style="display:none;" ng-if="pagePrograma.proposals && pagePrograma.proposals.length > 0">
  84 + <section id="section-proposal-list" class="proposal-extended-section" style="display:none;" ng-if="pagePrograma.proposals && pagePrograma.proposals.length > 0">
85 85 <div class="container">
86   - <div class="proposal-ranking-section-header">
  86 + <div class="proposal-extended-section-header">
87 87 <h3 class="color-theme-fg">Resultados de propostas mais votadas</h3>
88   - <button class="btn btn-close" ng-click="pagePrograma.hideProposals()">
  88 + <button type="button" aria-label="Close" class="btn btn-close" ng-click="pagePrograma.hideProposalsList()">
89 89 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
90 90 </button>
91 91 </div>
92   - <div class="proposal-ranking-section-table">
  92 + <div class="proposal-extended-section-content">
93 93 <proposal-list proposals="pagePrograma.proposals"></proposal-list>
94 94 </div>
95 95 </div>
96 96 </section>
97 97  
  98 + <section id="section-proposal-form" class="proposal-extended-section" style="display:none;">
  99 + <div class="container">
  100 + <div class="proposal-extended-section-header">
  101 + <button type="button" aria-label="Close" class="btn btn-close" ng-click="pagePrograma.hideProposalForm()">
  102 + <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
  103 + </button>
  104 + </div>
  105 + <div class="proposal-extended-section-content">
  106 + <cadastro-proposta program="pagePrograma.article"></cadastro-proposta>
  107 + </div>
  108 + </div>
  109 + </section>
  110 +
98 111 <section class="section-content">
99 112 <article class="program-content" ng-if="pagePrograma.article">
100 113 <div ng-bind-html="pagePrograma.article.body"></div>
... ...
src/app/pages/programas/programas.scss
... ... @@ -71,17 +71,23 @@
71 71 }
72 72 }
73 73  
74   -.proposal-ranking-section {
75   - background-color: #f1f1f1;
76   - margin: 30px 0;
77   -
78   - .proposal-ranking-section-header{
79   - position: relative;
80   - }
  74 +.page--program {
81 75  
82 76 .btn-close {
83 77 position: absolute;
84 78 right: 0;
85 79 top: 0;
  80 + z-index: 99;
  81 + }
  82 +
  83 + .proposal-extended-section {
  84 + background-color: #f1f1f1;
  85 + margin: 20px 0;
  86 + padding: 20px 0;
  87 + }
  88 +
  89 + .proposal-extended-section-header {
  90 + position: relative;
86 91 }
87 92 }
  93 +
... ...