diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 0000000..9138113 --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,7 @@ +- Erro com `lwip` ou `make: g++: Command not found` + - Solução: + 1. Instalar dependências do g++: `sudo apt-get install build-essential g++` + 2. Reinstalar o sprity: + 1. desinstalar: ``npm uninstall sprity`` + 2. limpar cache: ``npm cache clear`` + 3. instalar: ``npm install sprity`` \ No newline at end of file diff --git a/src/app/components/article-box/article-box.directive.js b/src/app/components/article-box/article-box.directive.js index d4c6d94..700fe94 100644 --- a/src/app/components/article-box/article-box.directive.js +++ b/src/app/components/article-box/article-box.directive.js @@ -27,20 +27,15 @@ } if(!vm.category){ - vm.category = vm.article.categories[0]; + throw { name: 'NotDefined', message: 'The attribute "category" is undefined.'}; } - if(!vm.banner && vm.article.image){ - vm.banner = { + if(!vm.image && vm.article.image){ + vm.image = { src: $rootScope.basePath + vm.article.image.url, alt: 'Imagem de destaque do conteúdo' }; } - - // if(vm.article.color && !vm.article.bgColor){ - // // 15% more darker - // vm.article.colorDarker = window.ColorLuminance(vm.article.color, 0.15); - // } }; ArticleBoxController.prototype.showContent = function () { @@ -57,7 +52,8 @@ restrict: 'E', templateUrl: 'app/components/article-box/article-box.html', scope: { - article: '=' + article: '=', + category: '=' }, controller: ArticleBoxController, controllerAs: 'vm', diff --git a/src/app/components/article-box/article-box.html b/src/app/components/article-box/article-box.html index 061b936..6a8284b 100644 --- a/src/app/components/article-box/article-box.html +++ b/src/app/components/article-box/article-box.html @@ -1,9 +1,8 @@
-

{{vm.category.name}}

+

{{ ::vm.category.name }}

- -
+

{{::vm.article.title}}

diff --git a/src/app/components/article-grid/article-grid.directive.js b/src/app/components/article-grid/article-grid.directive.js index 7d8ded4..5ae19e3 100644 --- a/src/app/components/article-grid/article-grid.directive.js +++ b/src/app/components/article-grid/article-grid.directive.js @@ -9,7 +9,7 @@ function articleGrid() { /** @ngInject */ - function ArticleGridController($scope, $rootScope, $element, ArticleService, $location, $filter, $log) { + function ArticleGridController($scope, $rootScope, $element, $location, $filter, $log) { $log.debug('ArticleGridController'); // alias @@ -19,7 +19,6 @@ vm.$scope = $scope; vm.$rootScope = $rootScope; vm.$element = $element; - vm.ArticleService = ArticleService; vm.$location = $location; vm.$filter = $filter; vm.$log = $log; @@ -27,280 +26,29 @@ // initialization vm.init(); + vm.loadData(); + vm.attachListeners(); } ArticleGridController.prototype.init = function() { - var vm = this; - - vm.articles = null; - vm.filtredArticleList = null; - vm.categories = null; - - vm.orderCriteries = [ - { label: 'Título', name: 'titulo' }, - { label: 'Tema', name: 'tema' }, - { label: 'Aleatório', name: 'aleatorio' } - ]; - - vm.search = vm.$location.search(); - - // Add initial values for the filter - vm.query = (vm.search && vm.search.filtro) ? vm.search.filtro : null; - vm.limitTo = (vm.search && vm.search.limite) ? parseInt(vm.search.limite, 10) : vm.defaultLimit; - vm.orderCriteria = (vm.search && vm.search.ordem) ? { name: vm.search.ordem } : null; - vm.reverse = (vm.search && vm.search.reverso) ? true : false; - - // vm.selectedCategory = (vm.search && vm.search.tema) ? vm.getCategoryBySlug(vm.search.tema) : null; - if (vm.search && vm.search.tema) { - var slug = vm.search.tema; - vm.ArticleService.getCategoryBySlug(slug, function(category){ - vm.selectedCategory = category; - }, function(error){ - vm.$log.error('Error when try to "getCategoryBySlug"', error); - }); - } - - if (!angular.equals({}, vm.search)) { - var $el = vm.$element; - angular.element('body').animate({scrollTop: $el.offset().top}, 'slow'); - } - - vm.loadData(function(){ - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - vm.attachListeners(); - }; - - ArticleGridController.prototype.attachListeners = function() { - var vm = this; - - // update window location params - vm.$scope.$on('change-selectedCategory', function(event, selectedCategory){ - vm.selectedCategory = selectedCategory; - }); - - vm.$scope.$watch('vm.query', function(newValue/*, oldValue*/) { - vm.search.filtro = newValue ? newValue : null; - vm.$location.search('filtro', vm.search.filtro); - if(vm.search.filtro){ - vm.limitTo = vm.articles.length; - }else{ - vm.limitTo = vm.defaultLimit; - } - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - vm.$scope.$watch('vm.limitTo', function(newValue/*, oldValue*/) { - vm.search.limite = (newValue && newValue !== vm.defaultLimit) ? newValue : null; - vm.$location.search('limite', vm.search.limite); - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - vm.$scope.$watch('vm.selectedCategory', function(newValue/*, oldValue*/) { - vm.search.tema = newValue ? newValue.slug : null; - vm.$location.search('tema', vm.search.tema); - if(vm.search.tema){ - vm.limitTo = vm.articles.length; - }else{ - vm.limitTo = vm.defaultLimit; - } - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - vm.$scope.$watch('vm.orderCriteria', function(newValue/*, oldValue*/) { - vm.search.ordem = (newValue && newValue.name) ? newValue.name : null; - vm.$location.search('ordem', vm.search.ordem); - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - vm.$scope.$watch('vm.reverse', function(newValue/*, oldValue*/) { - vm.search.reverso = newValue ? newValue : null; - vm.$location.search('reverso', vm.search.reverso); - vm.filtredArticleList = vm.getFiltredArticles(); - }); - - }; - ArticleGridController.prototype.loadData = function(cb) { - var vm = this; - - var articlesLoaded = false; - var categoriesLoaded = false; - - vm.ArticleService.getPrograms(function(programs){ - vm.articles = programs; - articlesLoaded = true; - endLoad(); - }); - - vm.ArticleService.getCategories(function(categories){ - vm.categories = categories; - categoriesLoaded = true; - endLoad(); - }); - - function endLoad () { - if(articlesLoaded && categoriesLoaded){ - cb(); - } - } - }; - - ArticleGridController.prototype.resetFilterValues = function() { - var vm = this; - - vm.query = null; - vm.limitTo = vm.defaultLimit; - vm.selectedCategory = null; - vm.orderCriteria = null; - }; - - ArticleGridController.prototype.getIconClasses = function(category) { - var vm = this; - - vm.$log.debug('[TODO] getIconClasses of category:', category); - return 'glyphicon glyphicon-exclamation-sign'; - }; - - ArticleGridController.prototype.getCategoryBySlug = function(categorySlug) { - var vm = this; - var result = null; - - angular.forEach(vm.categories, function(value/*, key*/) { - if (value.slug === categorySlug) { - result = value; - } - }); - - return result; + // var vm = this; + // vm.programs = null; // scope var }; - ArticleGridController.prototype.showAll = function($event) { - var vm = this; - - $event.stopPropagation(); - - vm.resetFilterValues(); - vm.limitTo = vm.articles.length; + ArticleGridController.prototype.loadData = function() { + // var vm = this; }; - ArticleGridController.prototype.getFiltredArticles = function() { - var vm = this; - - if(!vm.articles){ - vm.$log.warn('No articles loaded yet. Abort.'); - return null; - } - - var input = vm.articles; - var output = input; - var query = vm.query; - var selectedCategory = vm.selectedCategory; - var orderCriteria = vm.orderCriteria ? vm.orderCriteria : { name : 'aleatorio'}; - var filter = vm.$filter('filter'); - var orderBy = vm.$filter('orderBy'); - var limitTo = vm.$filter('limitTo'); - var limit = vm.limitTo ? vm.limitTo : 4; - - if (selectedCategory) { - output = _filterByCategory(output, selectedCategory); - } - - if (query) { - output = filter(output, query, false); - } - - switch (orderCriteria.name) { - case 'titulo': - output = orderBy(output, 'title', vm.reverse); - break; - case 'tema': - output = orderBy(output, 'categories[0].name', vm.reverse); - break; - case 'more_participants': - vm.$log.info('Criteria not handled yet: ', orderCriteria); - break; - case 'aleatorio': - // shuffling - // if (!vm._isShuffled){ - output = vm.filterShuffle(output); - // vm._isShuffled = true; - // } - - if (vm.reverse) { - output = output.slice().reverse(); - } - - break; - default: - vm.$log.warn('Criteria not matched: ', orderCriteria); - break; - } - - output = limitTo(output, limit); - - return output; - }; - - ArticleGridController.prototype.filterShuffle = function(input) { - var result = []; - var resultByCategory = {}; - - // divide by categories - for (var i = 0; i < input.length; i++) { - var program = input[i]; - var categorySlug = program.categories[0].slug; - - if (!resultByCategory[categorySlug]) { - resultByCategory[categorySlug] = []; - } - - resultByCategory[categorySlug].push(program); - } - - // shuffle each array - var prop = null; - var categoryWithPrograms = null; - for (prop in resultByCategory) { - if (resultByCategory.hasOwnProperty(prop)) { - categoryWithPrograms = resultByCategory[prop]; - resultByCategory[prop] = shuffle(categoryWithPrograms); - } - } - - // Concat all into result array - // > while has program at Lists on resultByCategory - var hasProgram = true; - while (hasProgram) { - - var foundProgram = false; - // each categoryList with array of program - prop = null; - categoryWithPrograms = null; - for (prop in resultByCategory) { - - if (resultByCategory.hasOwnProperty(prop)) { - categoryWithPrograms = resultByCategory[prop]; - - if (categoryWithPrograms.length > 0) { - var pivotProgram = categoryWithPrograms.pop(); - result.push(pivotProgram); - foundProgram = true; - } - } - } - - if (!foundProgram) { - hasProgram = false; - } - } - - return result; + ArticleGridController.prototype.attachListeners = function() { + // var vm = this; }; var directive = { restrict: 'E', templateUrl: 'app/components/article-grid/article-grid.html', + scope: { + articles: '=' + }, controller: ArticleGridController, controllerAs: 'vm', bindToController: true @@ -308,44 +56,4 @@ return directive; } - - function _filterByCategory (input, category) { - input = input || []; - - if (!category) { - // no filter - return input; - } - - var out = []; - for (var i = 0; i < input.length; i++) { - var program = input[i]; - if (program.categories[0].slug === category.slug) { - out.push(program); - } - } - - return out; - } - - // -> Fisher–Yates shuffle algorithm - function shuffle (array) { - var currentIndex = array.length, temporaryValue, randomIndex ; - - // While there remain elements to shuffle... - while (0 !== currentIndex) { - - // Pick a remaining element... - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex -= 1; - - // And swap it with the current element. - temporaryValue = array[currentIndex]; - array[currentIndex] = array[randomIndex]; - array[randomIndex] = temporaryValue; - } - - return array; - } - })(); diff --git a/src/app/components/article-grid/article-grid.html b/src/app/components/article-grid/article-grid.html index 41c6c26..4d68a37 100644 --- a/src/app/components/article-grid/article-grid.html +++ b/src/app/components/article-grid/article-grid.html @@ -1,50 +1,9 @@ -
-
-

Conheça os programas ({{vm.filtredArticleList.length}}/{{::vm.articles.length}})

- -
-
-
- -
- -
- -
-
-
- Nenhum programa encontrado. -
+
+
+ +
-
+
+ Nenhum programa encontrado. +
+
diff --git a/src/app/components/article-grid/article-grid.scss b/src/app/components/article-grid/article-grid.scss index 4c1d981..66d8be8 100644 --- a/src/app/components/article-grid/article-grid.scss +++ b/src/app/components/article-grid/article-grid.scss @@ -1,20 +1,2 @@ .article-grid { - .header { - position: relative; - height: 40px; - margin-bottom: 10px; - - button { - position: absolute; - right: 0; - top: 2px; - } - } - - .form-inline { - input, - select { - width: 100%; - } - } } diff --git a/src/app/components/article-service/article.service.js b/src/app/components/article-service/article.service.js index 41513b8..0f9b46c 100644 --- a/src/app/components/article-service/article.service.js +++ b/src/app/components/article-service/article.service.js @@ -90,7 +90,7 @@ }); } - function searchTopics (param, cbSuccess, cbError) { + function searchTopics (params, cbSuccess, cbError) { // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Topic&query=cisternas var url = '/api/v1/search/article'; var paramsExtended = angular.extend({ @@ -98,14 +98,14 @@ 'type': 'ProposalsDiscussionPlugin::Topic' }, params); - UtilService.get(url, {params: paramsExtended).then(function(data){ + UtilService.get(url, {params: paramsExtended}).then(function(data){ cbSuccess(data); }).catch(function(error){ cbError(error); }); } - function searchProposals (param, cbSuccess, cbError) { + function searchProposals (params, cbSuccess, cbError) { // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Proposal&query=cisternas var url = '/api/v1/search/article'; var paramsExtended = angular.extend({ @@ -113,7 +113,7 @@ 'type': 'ProposalsDiscussionPlugin::Proposal' }, params); - UtilService.get(url, {params: paramsExtended).then(function(data){ + UtilService.get(url, {params: paramsExtended}).then(function(data){ cbSuccess(data); }).catch(function(error){ cbError(error); diff --git a/src/app/components/category-list/category-list.directive.js b/src/app/components/category-list/category-list.directive.js index 38ffd42..7f35a43 100644 --- a/src/app/components/category-list/category-list.directive.js +++ b/src/app/components/category-list/category-list.directive.js @@ -9,7 +9,7 @@ function categoryList() { /** @ngInject */ - function CategoryListController($rootScope, ArticleService, $location, $log) { + function CategoryListController($rootScope, $location, $log) { $log.debug('CategoryListController'); // alias @@ -17,33 +17,15 @@ // dependencies vm.$rootScope = $rootScope; - vm.ArticleService = ArticleService; vm.$location = $location; vm.$log = $log; - vm.defaultLimit = 6; // initialization vm.init(); } CategoryListController.prototype.init = function() { - var vm = this; - - vm.selectedCategory = null; - vm.ArticleService.getCategories(function(categories){ - vm.categories = categories; - - }); - - vm.search = vm.$location.search(); - if (vm.search && vm.search.tema) { - var slug = vm.search.tema; - vm.ArticleService.getCategoryBySlug(slug, function(category){ - vm.selectedCategory = category; - }, function(error){ - vm.$log.error('Error when try to "getCategoryBySlug"', error); - }); - } + // var vm = this; }; CategoryListController.prototype.selectCategory = function(category, $event) { @@ -66,6 +48,10 @@ var directive = { restrict: 'E', templateUrl: 'app/components/category-list/category-list.html', + scope: { + categories: '=', + selectedCategory: '@' + }, controller: CategoryListController, controllerAs: 'categoryListCtrl', bindToController: true diff --git a/src/app/components/dialoga-service/dialoga.service.js b/src/app/components/dialoga-service/dialoga.service.js index eb1a805..8960d5b 100644 --- a/src/app/components/dialoga-service/dialoga.service.js +++ b/src/app/components/dialoga-service/dialoga.service.js @@ -6,146 +6,219 @@ .factory('DialogaService', DialogaService); /** @ngInject */ - function DialogaService($rootScope, API, ArticleService, UtilService, Slug, $log) { + function DialogaService($rootScope, $sce, API, ArticleService, UtilService, Slug, $log) { $log.debug('DialogaService'); var service = { - getInicio: getInicio, - getSobre: getSobre, - getTemas: getTemas, - getProgramas: getProgramas, - getPropostas: getPropostas, - getDuvidas: getDuvidas, - buscaPrograma: buscaPrograma, - buscaProposta: buscaProposta, + getHome: getHome, + getAbout: getAbout, + getThemes: getThemes, + getPrograms: getPrograms, + getProgramBySlug: getProgramBySlug, + getProgramsRandom: getProgramsRandom, + getProposals: getProposals, + getEvents: getEvents, + getQuestions: getQuestions, + searchProgram: searchProgram, + searchProposal: searchProposal, }; var CACHE = {}; return service; - function getInicio (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('inicio')){ - cbSuccess(CACHE.inicio); + function getHome (cbSuccess, cbError) { + if( !!CACHE.home ){ + cbSuccess(CACHE.home); }else{ // load main content ArticleService.getArticleById(API.articleId.home, { - fields: 'id,abstract,body,categories,children,children_count,title' - }, function (article){ - CACHE.inicio = article; + 'fields[]': ['id','abstract','body','categories','children','children_count','title','image','url'] + }, function (data){ + CACHE.home = data; - _pipeSetSobre(article); - _pipeSetTemas(article); - _pipeSetProgramas(article); + _pipeHandleYoutube(data); + _pipeHandleSlug(data); + _pipeSetAbout(data); + _pipeSetThemes(data); + _pipeSetPrograms(data); - cbSuccess(article); + cbSuccess(data); }, cbError); } } - function getSobre (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('sobre')){ - cbSuccess(CACHE.sobre); + function getAbout (cbSuccess, cbError) { + if( !!CACHE.about ){ + cbSuccess(CACHE.about); }else{ // load article content ArticleService.getArticleById(API.articleId.about, {}, function (article){ - CACHE.sobre = article; + CACHE.about = article; - cbSuccess(CACHE.sobre); + cbSuccess(CACHE.about); }, cbError); } } - function getTemas (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('temas')){ - cbSuccess(CACHE.temas); + function getThemes (cbSuccess, cbError) { + if( !!CACHE.themes ){ + cbSuccess(CACHE.themes); }else{ // load main content - getInicio(function(){ - if(!CACHE.hasOwnProperty('temas')){ - throw { name: 'NotFound', message: '"temas" is not defined. "article.categories" was handled?'}; + getHome(function(){ + if(!CACHE.hasOwnProperty('themes')){ + throw { name: 'NotFound', message: '"themes" is not defined. "article.categories" was loaded?'}; } - cbSuccess(CACHE.temas); + cbSuccess(CACHE.themes); },cbError); } } - function getProgramas (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('programas')){ - cbSuccess(CACHE.programas); + function getPrograms (cbSuccess, cbError) { + if( !!CACHE.programs ){ + cbSuccess(CACHE.programs); }else{ // load main content - getInicio(function(){ - if(!CACHE.hasOwnProperty('programas')){ - throw { name: 'NotFound', message: '"programas" is not defined. "article.children" was handled?'}; + getHome(function(){ + if(!CACHE.hasOwnProperty('programs')){ + throw { name: 'NotFound', message: '"programs" is not defined. "article.children" was handled?'}; } - cbSuccess(CACHE.programas); + cbSuccess(CACHE.programs); },cbError); } } - function getProgramasAleatorios (cbSuccess, cbError) { - // load article content - UtilService.get(API.random_topics, {params: { - 'fields[]': [ - 'id', 'title', 'slug', 'abstract', 'body', 'categories', 'setting', - 'ranking_position', 'position', 'children_count', 'hits', 'votes_for', - 'votes_against', 'tag_list'] - }}).then(function(data){ - cbSuccess(data); - }).catch(function(error){ - cbError(error); - }); + function getProgramBySlug (slug, cbSuccess, cbError) { + + if( !CACHE.programs ){ + getPrograms(_getProgramBySlug, cbError); + } else { + _getProgramBySlug(); + } + + function _getProgramBySlug(){ + var result = CACHE.programs.filter(function filterProgramBySlug (program) { + if(angular.equals(program.slug, slug)) { + return true; + } + return false; + }); + + cbSuccess(result[0]); + } } - function getPropostas (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('propostas')){ - cbSuccess(CACHE.propostas); + function getProgramsRandom (cbSuccess, cbError) { + getPrograms(cbSuccess, cbError); + // TODO: get endpoint for production + // if( !!CACHE.programsRandom ){ + // cbSuccess(CACHE.programsRandom); + // }else{ + // // load article content + // // UtilService.get(API.random_topics, {params: { + // ArticleService.getArticleById(API.articleId.home, {params: { + // 'fields[]': [ + // 'id', 'title', 'slug', 'abstract', 'children_count'], + // 'content_type': 'ProposalsDiscussionPlugin::Topic' + // }}).then(function(data){ + // CACHE.programsRandom = data; + + // cbSuccess(data); + // }).catch(function(error){ + // cbError(error); + // }); + // } + } + + function getProposals (cbSuccess, cbError) { + if( !!CACHE.proposals ){ + cbSuccess(CACHE.proposals); }else{ // load main content - getInicio(function(){ - if(!CACHE.hasOwnProperty('propostas')){ - throw { name: 'NotFound', message: '"propostas" is not defined. "article.categories" was handled?'}; + getHome(function(){ + if(!CACHE.hasOwnProperty('proposals')){ + throw { name: 'NotFound', message: '"proposals" is not defined. "article.categories" was loaded?'}; } - cbSuccess(CACHE.propostas); + cbSuccess(CACHE.proposals); },cbError); } } - function getDuvidas (cbSuccess, cbError) { - if(CACHE.hasOwnProperty('duvidas')){ - cbSuccess(CACHE.duvidas); + function getEvents (cbSuccess, cbError) { + if( !!CACHE.events ){ + cbSuccess(CACHE.events); + }else{ + // load main content + getHome(function(){ + if(!CACHE.hasOwnProperty('events')){ + throw { name: 'NotFound', message: '"events" is not defined. "article.categories" was loaded?'}; + } + cbSuccess(CACHE.events); + },cbError); + } + } + + function getQuestions (cbSuccess/*, cbError*/) { + if( !!CACHE.questions ){ + cbSuccess(CACHE.questions); }else{ // load content - var duvidas = []; + var questions = []; - CACHE.duvidas = duvidas; - cbSuccess(CACHE.duvidas); + CACHE.questions = questions; + cbSuccess(CACHE.questions); } } - function buscaPrograma (cbSuccess, cbError) {} + function searchProgram (cbSuccess, cbError) {} + + function searchProposal (cbSuccess, cbError) {} + + function _pipeHandleYoutube (data) { + var abstract = data.article.abstract; + + abstract = forceIframeParams(abstract); + abstract = removeStylefromIframe(abstract); + + data.article.abstract = abstract; + + data.article.abstractTrusted = $sce.trustAsHtml(abstract); + } + + function _pipeHandleSlug (data) { + // set slug to article + if(!data.article.slug){ + data.article.slug = Slug.slugify(data.article.title); + } - function buscaProposta (cbSuccess, cbError) {} + // set slug to programs + for (var i = data.article.children.length - 1; i >= 0; i--) { + var program = data.article.children[i]; + if(!program.slug){ + program.slug = Slug.slugify(program.title); + } + } + } - function _pipeSetSobre (article) { - if(!CACHE.hasOwnProperty('sobre')){ - CACHE.sobre = article.body; + function _pipeSetAbout (data) { + if(!CACHE.hasOwnProperty('about')){ + CACHE.about = data.article.body; } } - function _pipeSetTemas (article) { - if(!CACHE.hasOwnProperty('temas')){ - CACHE.temas = article.categories; + function _pipeSetThemes (data) { + if(!CACHE.hasOwnProperty('themes')){ + CACHE.themes = data.article.categories; } - _pipeCalcColors(article); + _pipeCalcColors(data); } - function _pipeSetProgramas (article) { - if(!CACHE.hasOwnProperty('programas')){ - CACHE.programas = article.children; - CACHE.programas_count = article.children_count; + function _pipeSetPrograms (data) { + if(!CACHE.hasOwnProperty('programs')){ + CACHE.programs = data.article.children; + CACHE.programs_count = data.article.children_count; } } @@ -166,5 +239,52 @@ // }; } } + + function forceIframeParams(abstract) { + var patternIframe = '