Commit c58d138690277f243ead741e9d2c106b41248c92
1 parent
d13b205c
Exists in
master
and in
2 other branches
Refactoring filters and pagination
Showing
5 changed files
with
57 additions
and
79 deletions
Show diff stats
ConfJuvApp/www/html/_proposal_list.html
@@ -32,15 +32,15 @@ | @@ -32,15 +32,15 @@ | ||
32 | <h2>Como você vai mudar o Brasil?</h2> | 32 | <h2>Como você vai mudar o Brasil?</h2> |
33 | 33 | ||
34 | <td-cards> | 34 | <td-cards> |
35 | - <p id="loading-cards" ng-show="!forceReload"> | ||
36 | - </p> | ||
37 | - <div id='force-reload' ng-show="forceReload"> | 35 | + <p id="loading-cards" ng-show="loading">Carregando propostas...</p> |
36 | + <div id="force-reload" ng-show="(emptyTopicsCount == topics.length) && !loading"> | ||
38 | <p>Você já visualizou todas as propostas.</p> | 37 | <p>Você já visualizou todas as propostas.</p> |
39 | - <p>Deseja <a ng-click="loadTopics()">Carregar novamente</a>? </p> | 38 | + <p>Deseja <a ng-click="reloadTopics()">Carregar novamente</a>?</p> |
40 | </div> | 39 | </div> |
40 | + | ||
41 | <td-card ng-repeat="proposal in cards" on-destroy="cardDestroyed($index)" | 41 | <td-card ng-repeat="proposal in cards" on-destroy="cardDestroyed($index)" |
42 | on-swipe-left="" on-swipe-right="" on-partial-swipe="cardPartialSwipe(amt)"> | 42 | on-swipe-left="" on-swipe-right="" on-partial-swipe="cardPartialSwipe(amt)"> |
43 | - <div class="card animate-show" ng-show="proposal.topic.selected"> | 43 | + <div class="card animate-show"> |
44 | <h3> | 44 | <h3> |
45 | <a ng-click="openProposal(proposal)">{{proposal.title | limitTo:100}}</a> | 45 | <a ng-click="openProposal(proposal)">{{proposal.title | limitTo:100}}</a> |
46 | <br /> | 46 | <br /> |
@@ -58,6 +58,6 @@ | @@ -58,6 +58,6 @@ | ||
58 | </td-cards> | 58 | </td-cards> |
59 | 59 | ||
60 | <div class="cards-footer"> | 60 | <div class="cards-footer"> |
61 | - <a ng-click="nextCard()" class="button flat">Próxima</a> | 61 | + <a ng-click="nextCard()" ng-show="cards.length > 0" class="button flat">Próxima</a> |
62 | </div> | 62 | </div> |
63 | </div> | 63 | </div> |
ConfJuvApp/www/html/_right_sidebar.html
@@ -4,14 +4,12 @@ | @@ -4,14 +4,12 @@ | ||
4 | <span>Filtros</span> | 4 | <span>Filtros</span> |
5 | <button menu-toggle="right" class="button button-icon icon ion-close-circled" hide-when="large"></button> | 5 | <button menu-toggle="right" class="button button-icon icon ion-close-circled" hide-when="large"></button> |
6 | </h2> | 6 | </h2> |
7 | - <h3>Filtrar propostas por tema</h2> | 7 | + <h3>Mostrar apenas propostas do eixo:</h2> |
8 | + <ion-radio class="radio-balanced" ng-value="'all'" ng-model="topicFilter.value" ng-click="$parent.reloadProposals()">Todos</ion-radio> | ||
8 | <label ng-repeat="topic in topics"> | 9 | <label ng-repeat="topic in topics"> |
9 | - <ion-checkbox | ||
10 | - class="checkbox-balanced" | ||
11 | - name="selectedTopics[]" | ||
12 | - value="{{topic.title}}" | ||
13 | - ng-model="topic.selected" | ||
14 | - >{{topic.title}}</ion-checkbox> | 10 | + <ion-radio class="radio-balanced" ng-value="topic.id" ng-model="topicFilter.value" ng-click="$parent.reloadProposals()"> |
11 | + {{topic.title}} | ||
12 | + </ion-radio> | ||
15 | </label> | 13 | </label> |
16 | </ion-content> | 14 | </ion-content> |
17 | </div> | 15 | </div> |
ConfJuvApp/www/index.html
@@ -32,13 +32,13 @@ | @@ -32,13 +32,13 @@ | ||
32 | <ng-include src="'html/_header.html?2'"></ng-include> | 32 | <ng-include src="'html/_header.html?2'"></ng-include> |
33 | <ion-pane> | 33 | <ion-pane> |
34 | <ion-content id="proposals-container" no-scroll=""> | 34 | <ion-content id="proposals-container" no-scroll=""> |
35 | - <ng-include src="'html/_proposal_list.html?4'"></ng-include> | 35 | + <ng-include src="'html/_proposal_list.html?8'"></ng-include> |
36 | </ion-content> | 36 | </ion-content> |
37 | </ion-pane> | 37 | </ion-pane> |
38 | </ion-side-menu-content> | 38 | </ion-side-menu-content> |
39 | 39 | ||
40 | - <ion-side-menu side="right" is-enabled="true" expose-aside-when="large" ng-show="proposalList.length > 0"> | ||
41 | - <ng-include src="'html/_right_sidebar.html'"></ng-include> | 40 | + <ion-side-menu side="right" is-enabled="true" expose-aside-when="large"> |
41 | + <ng-include src="'html/_right_sidebar.html?8'"></ng-include> | ||
42 | </ion-side-menu> | 42 | </ion-side-menu> |
43 | </ion-side-menus> | 43 | </ion-side-menus> |
44 | 44 |
ConfJuvApp/www/js/config.js.example
@@ -3,6 +3,5 @@ var ConfJuvAppConfig = { | @@ -3,6 +3,5 @@ var ConfJuvAppConfig = { | ||
3 | noosferoApiPublicHost: 'http://app.juventude.gov.br', | 3 | noosferoApiPublicHost: 'http://app.juventude.gov.br', |
4 | noosferoApiVersion: 'v1', | 4 | noosferoApiVersion: 'v1', |
5 | noosferoDiscussion: 99895, | 5 | noosferoDiscussion: 99895, |
6 | - noosferoStatutePath: 'articles/participatorio/0010/2309/Resolucao-01-2015-etapa-digital.pdf', | ||
7 | - proposalsPerPageAndTopic: 1 | 6 | + noosferoStatutePath: 'articles/participatorio/0010/2309/Resolucao-01-2015-etapa-digital.pdf' |
8 | }; | 7 | }; |
ConfJuvApp/www/js/controllers.js
@@ -330,35 +330,30 @@ angular.module('confjuvapp.controllers', []) | @@ -330,35 +330,30 @@ angular.module('confjuvapp.controllers', []) | ||
330 | ******************************************************************************/ | 330 | ******************************************************************************/ |
331 | 331 | ||
332 | $scope.topics = []; | 332 | $scope.topics = []; |
333 | - $scope.proposalList = []; | ||
334 | - $scope.proposalsByTopic = {}; | ||
335 | $scope.cards = []; | 333 | $scope.cards = []; |
336 | - $scope.forceReload = false; | 334 | + $scope.emptyTopicsCount = 0; |
335 | + $scope.topicFilter = { value: 'all' }; | ||
337 | 336 | ||
338 | - // Selected topics | 337 | + $scope.reloadTopics = function() { |
338 | + $scope.emptyTopicsCount = 0; | ||
339 | 339 | ||
340 | - $scope.selection = []; | ||
341 | - | ||
342 | - // Helper method to get selected topics | 340 | + if ($scope.filterTopic != 'all') { |
341 | + $scope.emptyTopicsCount = $scope.topics.length - 1; | ||
342 | + } | ||
343 | 343 | ||
344 | - $scope.selectedTopics = function selectedTopics() { | ||
345 | - return filterFilter($scope.topics, { selected: true }); | 344 | + $scope.topics = []; |
345 | + $scope.loadTopics($scope.token); | ||
346 | }; | 346 | }; |
347 | 347 | ||
348 | - // Watch topics for changes | ||
349 | - | ||
350 | - $scope.$watch('topics|filter:{selected:true}', function (nv) { | ||
351 | - $scope.selection = nv.map(function (topic) { | ||
352 | - return topic.title; | ||
353 | - }); | ||
354 | - }, true); | 348 | + $scope.reloadProposals = function() { |
349 | + $scope.cards = []; | ||
350 | + $scope.reloadTopics(); | ||
351 | + }; | ||
355 | 352 | ||
356 | // Load topics | 353 | // Load topics |
357 | 354 | ||
358 | $scope.loadTopics = function(token) { | 355 | $scope.loadTopics = function(token) { |
359 | - $scope.forceReload = false; | ||
360 | $scope.loading = true; | 356 | $scope.loading = true; |
361 | - // var path = '?private_token=' + token + '&fields=title,image,body,abstract&content_type=ProposalsDiscussionPlugin::Proposal'; | ||
362 | var params = '?private_token=' + token + '&fields=title,id&content_type=ProposalsDiscussionPlugin::Topic'; | 357 | var params = '?private_token=' + token + '&fields=title,id&content_type=ProposalsDiscussionPlugin::Topic'; |
363 | var path = 'articles/' + ConfJuvAppConfig.noosferoDiscussion + '/children' + params; | 358 | var path = 'articles/' + ConfJuvAppConfig.noosferoDiscussion + '/children' + params; |
364 | 359 | ||
@@ -367,19 +362,11 @@ angular.module('confjuvapp.controllers', []) | @@ -367,19 +362,11 @@ angular.module('confjuvapp.controllers', []) | ||
367 | $scope.loading = false; | 362 | $scope.loading = false; |
368 | var topics = resp.data.articles; | 363 | var topics = resp.data.articles; |
369 | for (var i = 0; i < topics.length; i++) { | 364 | for (var i = 0; i < topics.length; i++) { |
370 | - var topic_id = topics[i].id; | ||
371 | - var topic = null; | ||
372 | - for (var j = 0; j < $scope.topics.length; j++) { | ||
373 | - if (topic_id == $scope.topics[j].id) { | ||
374 | - topic = $scope.topics[j]; | ||
375 | - } | ||
376 | - } | ||
377 | - if (topic == null) { | ||
378 | - topic = topics[i]; | ||
379 | - topic.selected = true; | ||
380 | - $scope.topics.push(topic); | ||
381 | - } | ||
382 | - $scope.proposalsByTopic[topic.id] = []; | 365 | + var topic = topics[i]; |
366 | + topic = topics[i]; | ||
367 | + topic.lastProposalId = null; | ||
368 | + topic.empty = false; | ||
369 | + $scope.topics.push(topic); | ||
383 | $scope.loadProposals(token, topic); | 370 | $scope.loadProposals(token, topic); |
384 | } | 371 | } |
385 | $scope.loading = false; | 372 | $scope.loading = false; |
@@ -392,25 +379,36 @@ angular.module('confjuvapp.controllers', []) | @@ -392,25 +379,36 @@ angular.module('confjuvapp.controllers', []) | ||
392 | // Load proposals | 379 | // Load proposals |
393 | 380 | ||
394 | $scope.loadProposals = function(token, topic) { | 381 | $scope.loadProposals = function(token, topic) { |
382 | + if ($scope.topicFilter.value != 'all' && topic.id != $scope.topicFilter.value) { | ||
383 | + return; | ||
384 | + } | ||
385 | + | ||
395 | $scope.loading = true; | 386 | $scope.loading = true; |
396 | - last_proposal = $scope.proposalsByTopic[topic.id][$scope.proposalsByTopic[topic.id].length -1]; | ||
397 | - last_proposal = last_proposal == undefined ? null : last_proposal.id; | ||
398 | 387 | ||
399 | - var params = '?private_token=' + token + '&fields=title,image,body,abstract,id,tag_list,categories,created_by&content_type=ProposalsDiscussionPlugin::Proposal&limit=' + ConfJuvAppConfig.proposalsPerPageAndTopic + '&oldest=younger_than&reference_id=' + last_proposal; | 388 | + var perPage = 1; |
389 | + if ($scope.topicFilter.value != 'all') { | ||
390 | + perPage = 11; | ||
391 | + } | ||
392 | + | ||
393 | + var params = '?private_token=' + token + '&fields=title,image,body,abstract,id,tag_list,categories,created_by&content_type=ProposalsDiscussionPlugin::Proposal&limit=' + perPage + '&oldest=younger_than&reference_id=' + topic.lastProposalId; | ||
400 | 394 | ||
401 | var path = 'articles/' + topic.id + '/children' + params; | 395 | var path = 'articles/' + topic.id + '/children' + params; |
402 | 396 | ||
403 | $http.get(ConfJuvAppUtils.pathTo(path)) | 397 | $http.get(ConfJuvAppUtils.pathTo(path)) |
404 | .then(function(resp) { | 398 | .then(function(resp) { |
405 | var proposals = resp.data.articles; | 399 | var proposals = resp.data.articles; |
406 | - $scope.proposalsByTopic[topic.id] = []; | 400 | + |
407 | for (var i = 0; i < proposals.length; i++) { | 401 | for (var i = 0; i < proposals.length; i++) { |
408 | var proposal = proposals[i]; | 402 | var proposal = proposals[i]; |
409 | proposal.topic = topic; | 403 | proposal.topic = topic; |
410 | - $scope.proposalList.push(proposal); | ||
411 | - $scope.proposalsByTopic[topic.id].push(proposal); | ||
412 | $scope.cards.push(proposal); | 404 | $scope.cards.push(proposal); |
413 | } | 405 | } |
406 | + | ||
407 | + if (proposals.length == 0 && !topic.empty) { | ||
408 | + topic.empty = true; | ||
409 | + $scope.emptyTopicsCount++; | ||
410 | + } | ||
411 | + | ||
414 | $scope.loading = false; | 412 | $scope.loading = false; |
415 | }, function(err) { | 413 | }, function(err) { |
416 | $ionicPopup.alert({ title: 'Propostas', template: 'Não foi possível carregar as propostas do tópico ' + topic.title }); | 414 | $ionicPopup.alert({ title: 'Propostas', template: 'Não foi possível carregar as propostas do tópico ' + topic.title }); |
@@ -421,21 +419,17 @@ angular.module('confjuvapp.controllers', []) | @@ -421,21 +419,17 @@ angular.module('confjuvapp.controllers', []) | ||
421 | // Cards | 419 | // Cards |
422 | 420 | ||
423 | $scope.cardDestroyed = function(index) { | 421 | $scope.cardDestroyed = function(index) { |
422 | + var thisProposal = $scope.cards[index]; | ||
423 | + var topic = thisProposal.topic; | ||
424 | + if (topic.lastProposalId == null || topic.lastProposalId > thisProposal.id) { | ||
425 | + topic.lastProposalId = thisProposal.id; | ||
426 | + } | ||
424 | $scope.cards.splice(index, 1); | 427 | $scope.cards.splice(index, 1); |
425 | if ($scope.cards.length === 0) { | 428 | if ($scope.cards.length === 0) { |
426 | for (var i = 0; i < $scope.topics.length; i++) { | 429 | for (var i = 0; i < $scope.topics.length; i++) { |
427 | var topic = $scope.topics[i]; | 430 | var topic = $scope.topics[i]; |
428 | - topic.selected = true; | ||
429 | - $scope.proposalList= []; | ||
430 | - $scope.loadProposals($scope.token, topic); | ||
431 | - } | ||
432 | - if ($scope.proposalList.length == 0){ | ||
433 | - $scope.forceReload = true; | ||
434 | - } | ||
435 | - for (var i = 0; i < $scope.proposalList.length; i++) { | ||
436 | - var card = $scope.proposalList[i]; | ||
437 | - if (card.topic.selected) { | ||
438 | - $scope.cards.push(card); | 431 | + if (!topic.empty) { |
432 | + $scope.loadProposals($scope.token, topic); | ||
439 | } | 433 | } |
440 | } | 434 | } |
441 | } | 435 | } |
@@ -449,17 +443,6 @@ angular.module('confjuvapp.controllers', []) | @@ -449,17 +443,6 @@ angular.module('confjuvapp.controllers', []) | ||
449 | $scope.cardDestroyed(index); | 443 | $scope.cardDestroyed(index); |
450 | }; | 444 | }; |
451 | 445 | ||
452 | - // Swipe cards when filters are selected | ||
453 | - $scope.$watch('selection', function() { | ||
454 | - $scope.cards = []; | ||
455 | - for (var i = 0; i < $scope.proposalList.length; i++) { | ||
456 | - var card = $scope.proposalList[i]; | ||
457 | - if (card.topic.selected) { | ||
458 | - $scope.cards.push(card); | ||
459 | - } | ||
460 | - } | ||
461 | - }); | ||
462 | - | ||
463 | /****************************************************************************** | 446 | /****************************************************************************** |
464 | S I N G L E P R O P O S A L | 447 | S I N G L E P R O P O S A L |
465 | ******************************************************************************/ | 448 | ******************************************************************************/ |
@@ -599,9 +582,7 @@ angular.module('confjuvapp.controllers', []) | @@ -599,9 +582,7 @@ angular.module('confjuvapp.controllers', []) | ||
599 | topic: topic, | 582 | topic: topic, |
600 | author: { name: $scope.user.name, id: $scope.user.id } | 583 | author: { name: $scope.user.name, id: $scope.user.id } |
601 | }; | 584 | }; |
602 | - $scope.proposalList.push(proposal); | ||
603 | $scope.cards.push(proposal); | 585 | $scope.cards.push(proposal); |
604 | - $scope.proposalsByTopic[data.topic_id.id].push(proposal); | ||
605 | $scope.loading = false; | 586 | $scope.loading = false; |
606 | $scope.data.title = $scope.data.description = $scope.data.topic_id = null; | 587 | $scope.data.title = $scope.data.description = $scope.data.topic_id = null; |
607 | document.getElementById('save-proposal').innerHTML = 'Criar'; | 588 | document.getElementById('save-proposal').innerHTML = 'Criar'; |