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 | 32 | <h2>Como você vai mudar o Brasil?</h2> |
33 | 33 | |
34 | 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 | 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 | 39 | </div> |
40 | + | |
41 | 41 | <td-card ng-repeat="proposal in cards" on-destroy="cardDestroyed($index)" |
42 | 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 | 44 | <h3> |
45 | 45 | <a ng-click="openProposal(proposal)">{{proposal.title | limitTo:100}}</a> |
46 | 46 | <br /> |
... | ... | @@ -58,6 +58,6 @@ |
58 | 58 | </td-cards> |
59 | 59 | |
60 | 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 | 62 | </div> |
63 | 63 | </div> | ... | ... |
ConfJuvApp/www/html/_right_sidebar.html
... | ... | @@ -4,14 +4,12 @@ |
4 | 4 | <span>Filtros</span> |
5 | 5 | <button menu-toggle="right" class="button button-icon icon ion-close-circled" hide-when="large"></button> |
6 | 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 | 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 | 13 | </label> |
16 | 14 | </ion-content> |
17 | 15 | </div> | ... | ... |
ConfJuvApp/www/index.html
... | ... | @@ -32,13 +32,13 @@ |
32 | 32 | <ng-include src="'html/_header.html?2'"></ng-include> |
33 | 33 | <ion-pane> |
34 | 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 | 36 | </ion-content> |
37 | 37 | </ion-pane> |
38 | 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 | 42 | </ion-side-menu> |
43 | 43 | </ion-side-menus> |
44 | 44 | ... | ... |
ConfJuvApp/www/js/config.js.example
... | ... | @@ -3,6 +3,5 @@ var ConfJuvAppConfig = { |
3 | 3 | noosferoApiPublicHost: 'http://app.juventude.gov.br', |
4 | 4 | noosferoApiVersion: 'v1', |
5 | 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 | 330 | ******************************************************************************/ |
331 | 331 | |
332 | 332 | $scope.topics = []; |
333 | - $scope.proposalList = []; | |
334 | - $scope.proposalsByTopic = {}; | |
335 | 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 | 353 | // Load topics |
357 | 354 | |
358 | 355 | $scope.loadTopics = function(token) { |
359 | - $scope.forceReload = false; | |
360 | 356 | $scope.loading = true; |
361 | - // var path = '?private_token=' + token + '&fields=title,image,body,abstract&content_type=ProposalsDiscussionPlugin::Proposal'; | |
362 | 357 | var params = '?private_token=' + token + '&fields=title,id&content_type=ProposalsDiscussionPlugin::Topic'; |
363 | 358 | var path = 'articles/' + ConfJuvAppConfig.noosferoDiscussion + '/children' + params; |
364 | 359 | |
... | ... | @@ -367,19 +362,11 @@ angular.module('confjuvapp.controllers', []) |
367 | 362 | $scope.loading = false; |
368 | 363 | var topics = resp.data.articles; |
369 | 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 | 370 | $scope.loadProposals(token, topic); |
384 | 371 | } |
385 | 372 | $scope.loading = false; |
... | ... | @@ -392,25 +379,36 @@ angular.module('confjuvapp.controllers', []) |
392 | 379 | // Load proposals |
393 | 380 | |
394 | 381 | $scope.loadProposals = function(token, topic) { |
382 | + if ($scope.topicFilter.value != 'all' && topic.id != $scope.topicFilter.value) { | |
383 | + return; | |
384 | + } | |
385 | + | |
395 | 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 | 395 | var path = 'articles/' + topic.id + '/children' + params; |
402 | 396 | |
403 | 397 | $http.get(ConfJuvAppUtils.pathTo(path)) |
404 | 398 | .then(function(resp) { |
405 | 399 | var proposals = resp.data.articles; |
406 | - $scope.proposalsByTopic[topic.id] = []; | |
400 | + | |
407 | 401 | for (var i = 0; i < proposals.length; i++) { |
408 | 402 | var proposal = proposals[i]; |
409 | 403 | proposal.topic = topic; |
410 | - $scope.proposalList.push(proposal); | |
411 | - $scope.proposalsByTopic[topic.id].push(proposal); | |
412 | 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 | 412 | $scope.loading = false; |
415 | 413 | }, function(err) { |
416 | 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 | 419 | // Cards |
422 | 420 | |
423 | 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 | 427 | $scope.cards.splice(index, 1); |
425 | 428 | if ($scope.cards.length === 0) { |
426 | 429 | for (var i = 0; i < $scope.topics.length; i++) { |
427 | 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 | 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 | 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 | 582 | topic: topic, |
600 | 583 | author: { name: $scope.user.name, id: $scope.user.id } |
601 | 584 | }; |
602 | - $scope.proposalList.push(proposal); | |
603 | 585 | $scope.cards.push(proposal); |
604 | - $scope.proposalsByTopic[data.topic_id.id].push(proposal); | |
605 | 586 | $scope.loading = false; |
606 | 587 | $scope.data.title = $scope.data.description = $scope.data.topic_id = null; |
607 | 588 | document.getElementById('save-proposal').innerHTML = 'Criar'; | ... | ... |