├── app ├── site │ ├── tmp │ │ └── .keep │ ├── cache │ │ └── .keep │ ├── logs │ │ └── .keep │ ├── modules │ │ ├── home │ │ │ ├── home.view │ │ │ └── HomeDocument.site │ │ ├── api │ │ │ └── ResponseSuccess.site │ │ └── share │ │ │ └── ShareDocument.site │ ├── .htaccess │ ├── email │ │ ├── top.png │ │ ├── footer.png │ │ ├── emailFeedback.view │ │ ├── emailReprovado.view │ │ ├── emailInvite.view │ │ ├── emailShareCandidato.view │ │ ├── emailRecovery.view │ │ ├── emailShareCandidatos.view │ │ ├── emailAprovado.view │ │ ├── emailPrimeiroCadastro.view │ │ └── templateEmail.view │ ├── template │ │ └── Template.site │ ├── index.php │ └── utils │ │ └── JWTUtil.php ├── images │ ├── share.jpg │ ├── share.png │ ├── favicon.ico │ ├── favicon.png │ ├── estados │ │ ├── ac.png │ │ ├── al.png │ │ ├── am.png │ │ ├── ap.png │ │ ├── ba.png │ │ ├── ce.png │ │ ├── df.png │ │ ├── es.png │ │ ├── go.png │ │ ├── ma.png │ │ ├── mg.png │ │ ├── ms.png │ │ ├── mt.png │ │ ├── pa.png │ │ ├── pb.png │ │ ├── pe.png │ │ ├── pi.png │ │ ├── pr.png │ │ ├── rj.png │ │ ├── rn.png │ │ ├── ro.png │ │ ├── rr.png │ │ ├── rs.png │ │ ├── sc.png │ │ ├── se.png │ │ ├── sp.png │ │ └── to.png │ ├── loading │ │ ├── ac.png │ │ ├── al.png │ │ ├── am.png │ │ ├── ap.png │ │ ├── ba.png │ │ ├── ce.png │ │ ├── df.png │ │ ├── es.png │ │ ├── go.png │ │ ├── ma.png │ │ ├── mg.png │ │ ├── ms.png │ │ ├── mt.png │ │ ├── pa.png │ │ ├── pb.png │ │ ├── pe.png │ │ ├── pi.png │ │ ├── pr.png │ │ ├── rj.png │ │ ├── rn.png │ │ ├── ro.png │ │ ├── rr.png │ │ ├── rs.png │ │ ├── sc.png │ │ ├── se.png │ │ ├── sp.png │ │ ├── to.png │ │ ├── ac2.png │ │ ├── al2.png │ │ ├── am2.png │ │ ├── ap2.png │ │ ├── ba2.png │ │ ├── ce2.png │ │ ├── df2.png │ │ ├── es2.png │ │ ├── go2.png │ │ ├── ma2.png │ │ ├── mg2.png │ │ ├── ms2.png │ │ ├── mt2.png │ │ ├── pa2.png │ │ ├── pb2.png │ │ ├── pe2.png │ │ ├── pi2.png │ │ ├── pr2.png │ │ ├── rj2.png │ │ ├── rn2.png │ │ ├── ro2.png │ │ ├── rr2.png │ │ ├── rs2.png │ │ ├── sc2.png │ │ ├── se2.png │ │ ├── sp2.png │ │ └── to2.png │ └── emptyProfile.jpg ├── fonts │ ├── Ubuntu-Bold.ttf │ ├── Ubuntu-Light.ttf │ ├── Ubuntu-Medium.ttf │ ├── Ubuntu-Regular.ttf │ ├── ubuntu-bold-webfont.woff │ ├── ubuntu-bold-webfont.woff2 │ ├── ubuntu-light-webfont.ttf │ ├── ubuntu-light-webfont.woff │ ├── ubuntu-light-webfont.woff2 │ ├── ubuntu-medium-webfont.woff │ ├── ubuntu-medium-webfont.woff2 │ ├── ubuntu-regular-webfont.woff │ ├── ubuntu-regular-webfont.woff2 │ └── stylesheet.css ├── politicadeprivacidade.pdf ├── bundle │ └── src │ │ ├── components │ │ ├── bg │ │ │ └── images │ │ │ │ └── bg.jpg │ │ ├── icon │ │ │ └── images │ │ │ │ ├── close.png │ │ │ │ ├── help.png │ │ │ │ ├── menu.png │ │ │ │ ├── logout.png │ │ │ │ └── arrow-small-next.png │ │ ├── logo │ │ │ └── images │ │ │ │ ├── logo.png │ │ │ │ └── logo-dark.png │ │ ├── menu │ │ │ └── images │ │ │ │ ├── close.png │ │ │ │ └── search.png │ │ ├── check │ │ │ └── images │ │ │ │ └── check.png │ │ ├── select │ │ │ └── images │ │ │ │ └── arrow.png │ │ ├── barTop │ │ │ └── images │ │ │ │ └── icon-close.png │ │ ├── favorite │ │ │ └── images │ │ │ │ ├── favorite.png │ │ │ │ └── favorite-check.png │ │ ├── logoResponsive │ │ │ └── images │ │ │ │ ├── logo.png │ │ │ │ └── logo-dark.png │ │ └── buttonArrow │ │ │ └── images │ │ │ ├── arrow-left.png │ │ │ └── arrow-right.png │ │ └── pages │ │ ├── bemvindo │ │ └── images │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 1-mobile.png │ │ │ ├── 2-mobile.png │ │ │ ├── 3-mobile.png │ │ │ ├── 4-mobile.png │ │ │ └── 5-mobile.png │ │ ├── match │ │ ├── home │ │ │ └── images │ │ │ │ └── icon.png │ │ ├── candidato │ │ │ └── images │ │ │ │ ├── link.png │ │ │ │ ├── message.png │ │ │ │ ├── phone.png │ │ │ │ ├── twitter.png │ │ │ │ ├── youtube.png │ │ │ │ ├── facebook.png │ │ │ │ └── instagram.png │ │ ├── regiao │ │ │ ├── cidade │ │ │ │ └── images │ │ │ │ │ └── pin.png │ │ │ └── searchCity │ │ │ │ └── images │ │ │ │ └── icon.png │ │ └── headerMatch │ │ │ └── images │ │ │ └── arrow-back.png │ │ ├── meusCandidatos │ │ └── images │ │ │ ├── bar.png │ │ │ ├── print.png │ │ │ └── download.png │ │ └── localizacao │ │ └── boxMap │ │ └── images │ │ └── pin.png ├── composer.json ├── config.php └── .htaccess ├── react-src ├── .nvmrc ├── src │ ├── components │ │ ├── icon │ │ │ ├── Icon.scss │ │ │ ├── images │ │ │ │ ├── help.png │ │ │ │ ├── menu.png │ │ │ │ ├── close.png │ │ │ │ ├── logout.png │ │ │ │ └── arrow-small-next.png │ │ │ └── Icon.js │ │ ├── spacer │ │ │ ├── Spacer.scss │ │ │ └── Spacer.js │ │ ├── bg │ │ │ ├── images │ │ │ │ └── bg.jpg │ │ │ ├── Bg.scss │ │ │ └── Bg.js │ │ ├── logo │ │ │ ├── images │ │ │ │ ├── logo.png │ │ │ │ └── logo-dark.png │ │ │ ├── Logo.scss │ │ │ └── Logo.js │ │ ├── check │ │ │ ├── images │ │ │ │ ├── check.png │ │ │ │ └── check-old.png │ │ │ ├── Check.js │ │ │ └── Check.scss │ │ ├── menu │ │ │ └── images │ │ │ │ ├── close.png │ │ │ │ └── search.png │ │ ├── select │ │ │ ├── images │ │ │ │ └── arrow.png │ │ │ ├── Select.scss │ │ │ └── Select.js │ │ ├── barTop │ │ │ ├── images │ │ │ │ └── icon-close.png │ │ │ ├── BarTop.js │ │ │ └── BarTop.scss │ │ ├── favorite │ │ │ ├── images │ │ │ │ ├── favorite.png │ │ │ │ └── favorite-check.png │ │ │ ├── Favorite.scss │ │ │ └── Favorite.js │ │ ├── logoResponsive │ │ │ ├── images │ │ │ │ ├── logo.png │ │ │ │ └── logo-dark.png │ │ │ ├── LogoResponsive.scss │ │ │ └── LogoResponsive.js │ │ ├── buttonArrow │ │ │ ├── images │ │ │ │ ├── arrow-left.png │ │ │ │ └── arrow-right.png │ │ │ ├── ButtonArrow.js │ │ │ └── ButtonArrow.scss │ │ ├── errorRequest │ │ │ ├── ErrorRequest.scss │ │ │ └── ErrorRequest.js │ │ ├── title │ │ │ ├── Title.scss │ │ │ └── Title.js │ │ ├── checks │ │ │ └── Checks.scss │ │ ├── modalBarTop │ │ │ ├── ModalBarTop.scss │ │ │ └── ModalBarTop.js │ │ ├── containerForm │ │ │ ├── ContainerForm.scss │ │ │ └── ContainerForm.js │ │ ├── scrollbar │ │ │ ├── Scrollbar.scss │ │ │ └── Scrollbar.js │ │ ├── loading │ │ │ ├── Loading.js │ │ │ └── Loading.scss │ │ ├── info │ │ │ ├── Info.scss │ │ │ └── Info.js │ │ ├── modalHelp │ │ │ ├── ModalHelp.scss │ │ │ └── ModalHelp.js │ │ ├── modal │ │ │ └── Modal.scss │ │ ├── textarea │ │ │ ├── TextArea.js │ │ │ └── TextArea.scss │ │ ├── textinput │ │ │ ├── TextInput.scss │ │ │ └── TextInput.js │ │ ├── button │ │ │ └── Button.js │ │ ├── candidatoInfo │ │ │ ├── CandidatoInfo.scss │ │ │ └── CandidatoInfo.js │ │ ├── loadingState │ │ │ ├── LoadingState.scss │ │ │ └── LoadingState.js │ │ ├── index.js │ │ ├── candidatoVoto │ │ │ └── CandidatoVoto.scss │ │ └── componentConnect │ │ │ └── ComponentConnect.js │ ├── modules │ │ ├── services │ │ │ └── index.js │ │ ├── compute │ │ │ └── computeState.js │ │ ├── AppModule.js │ │ └── InviteModule.js │ ├── pages │ │ ├── bemvindo │ │ │ └── images │ │ │ │ ├── 1.png │ │ │ │ ├── 2.png │ │ │ │ ├── 3.png │ │ │ │ ├── 4.png │ │ │ │ ├── 5.png │ │ │ │ ├── logo.png │ │ │ │ ├── 1-mobile.png │ │ │ │ ├── 2-mobile.png │ │ │ │ ├── 3-mobile.png │ │ │ │ ├── 4-mobile.png │ │ │ │ └── 5-mobile.png │ │ ├── match │ │ │ ├── home │ │ │ │ ├── images │ │ │ │ │ └── icon.png │ │ │ │ └── Home.scss │ │ │ ├── candidato │ │ │ │ └── images │ │ │ │ │ ├── link.png │ │ │ │ │ ├── phone.png │ │ │ │ │ ├── facebook.png │ │ │ │ │ ├── message.png │ │ │ │ │ ├── twitter.png │ │ │ │ │ ├── youtube.png │ │ │ │ │ └── instagram.png │ │ │ ├── regiao │ │ │ │ ├── cidade │ │ │ │ │ ├── images │ │ │ │ │ │ └── pin.png │ │ │ │ │ └── Cidade.scss │ │ │ │ ├── searchCity │ │ │ │ │ ├── images │ │ │ │ │ │ └── icon.png │ │ │ │ │ └── SearchCity.scss │ │ │ │ ├── Regiao.scss │ │ │ │ └── mapa │ │ │ │ │ ├── Mapa.scss │ │ │ │ │ └── Mapa.js │ │ │ ├── headerMatch │ │ │ │ ├── images │ │ │ │ │ └── arrow-back.png │ │ │ │ ├── HeaderMatch.scss │ │ │ │ └── HeaderMatch.js │ │ │ ├── listaTipoCandidato │ │ │ │ ├── images │ │ │ │ │ └── warning.png │ │ │ │ └── ListaTipoCandidato.scss │ │ │ ├── costume │ │ │ │ └── Costume.scss │ │ │ ├── economia │ │ │ │ └── Economia.scss │ │ │ ├── renovacao │ │ │ │ └── Renovacao.scss │ │ │ ├── processoCondenacao │ │ │ │ └── ProcessoCondenacao.scss │ │ │ ├── prioridade1 │ │ │ │ └── Prioridade1.scss │ │ │ ├── prioridade2 │ │ │ │ └── Prioridade2.scss │ │ │ ├── MatchPage.scss │ │ │ ├── transparencia │ │ │ │ └── Transparencia.scss │ │ │ ├── confirmarVoto │ │ │ │ └── ConfirmarVoto.scss │ │ │ ├── listaCandidatos │ │ │ │ ├── itemEmptyCandidato │ │ │ │ │ └── ItemEmptyCandidato.scss │ │ │ │ ├── itemCandidato │ │ │ │ │ ├── ItemCandidato.scss │ │ │ │ │ └── ItemCandidato.js │ │ │ │ └── ListaCandidatos.scss │ │ │ ├── contentMatch │ │ │ │ ├── ContentMatch.scss │ │ │ │ └── ContentMatch.js │ │ │ └── footerMatch │ │ │ │ ├── FooterMatch.scss │ │ │ │ └── FooterMatch.js │ │ ├── meusCandidatos │ │ │ ├── images │ │ │ │ ├── bar.png │ │ │ │ ├── print.png │ │ │ │ └── download.png │ │ │ └── formCad │ │ │ │ └── FormCad.scss │ │ ├── localizacao │ │ │ ├── boxMap │ │ │ │ ├── images │ │ │ │ │ └── pin.png │ │ │ │ ├── BoxMap.scss │ │ │ │ └── BoxMap.js │ │ │ ├── LocalizacaoPage.scss │ │ │ └── listState │ │ │ │ ├── ListState.scss │ │ │ │ └── ListState.js │ │ ├── modals │ │ │ ├── modalInvite │ │ │ │ ├── images │ │ │ │ │ ├── whats.png │ │ │ │ │ ├── message.png │ │ │ │ │ └── facebook.png │ │ │ │ └── ModalInvite.scss │ │ │ ├── modalSendEmail │ │ │ │ ├── ModalSendEmail.scss │ │ │ │ └── ModalSendEmail.js │ │ │ ├── modalFavorito │ │ │ │ └── ModalFavorito.scss │ │ │ ├── modalProximidade │ │ │ │ └── ModalProximidade.js │ │ │ ├── modalCostume │ │ │ │ └── ModalCostume.js │ │ │ ├── modalRenovacao │ │ │ │ └── ModalRenovacao.js │ │ │ ├── modalEconomia │ │ │ │ └── ModalEconomia.js │ │ │ ├── modalBaseDados │ │ │ │ └── ModalBaseDados.js │ │ │ ├── modalPesquisarCandidatos │ │ │ │ └── ModalPesquisarCandidatos.scss │ │ │ ├── modalText │ │ │ │ ├── ModalText.scss │ │ │ │ └── ModalText.js │ │ │ ├── modalListaCandidatos │ │ │ │ └── ModalListaCandidatos.js │ │ │ ├── modalPrioridade │ │ │ │ └── ModalPrioridade.js │ │ │ ├── modalSobre │ │ │ │ └── ModalSobre.js │ │ │ ├── modalContato │ │ │ │ └── ModalContato.js │ │ │ ├── modalTecnologia │ │ │ │ └── ModalTecnologia.js │ │ │ ├── modalOndeDados │ │ │ │ └── ModalOndeDados.js │ │ │ ├── modalComoFunciona │ │ │ │ └── ModalComoFunciona.js │ │ │ └── modalProcessoCondenacao │ │ │ │ └── ModalProcessoCondenacao.js │ │ ├── candidato │ │ │ ├── CandidatoPage.scss │ │ │ └── CandidatoPage.js │ │ └── confirmarVoto │ │ │ ├── ConfirmarVotoPage.scss │ │ │ └── ConfirmarVotoPage.js │ ├── styles │ │ ├── helpers.scss │ │ ├── vars.scss │ │ ├── colors.scss │ │ ├── sizes.scss │ │ ├── main.scss │ │ └── default.scss │ ├── Config.js │ ├── App.js │ ├── utils │ │ ├── RouterUtils.js │ │ ├── GAUtil.js │ │ └── CerebralUtils.js │ ├── index.js │ ├── polyfill.js │ └── Stage.js ├── .babelrc ├── webpack-config │ ├── dev-server.js │ └── index-dev.html └── package.json └── .gitignore /app/site/tmp/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/site/cache/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/site/logs/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /react-src/.nvmrc: -------------------------------------------------------------------------------- 1 | 8.9.4 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | -------------------------------------------------------------------------------- /app/site/modules/home/home.view: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/site/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | DirectoryIndex index.php 3 | 4 | -------------------------------------------------------------------------------- /app/images/share.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/share.jpg -------------------------------------------------------------------------------- /app/images/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/share.png -------------------------------------------------------------------------------- /react-src/src/components/icon/Icon.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Icon { 4 | 5 | } -------------------------------------------------------------------------------- /app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/favicon.ico -------------------------------------------------------------------------------- /app/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/favicon.png -------------------------------------------------------------------------------- /app/site/email/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/site/email/top.png -------------------------------------------------------------------------------- /react-src/src/components/spacer/Spacer.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Spacer { 4 | 5 | } -------------------------------------------------------------------------------- /app/fonts/Ubuntu-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/Ubuntu-Bold.ttf -------------------------------------------------------------------------------- /app/images/estados/ac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ac.png -------------------------------------------------------------------------------- /app/images/estados/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/al.png -------------------------------------------------------------------------------- /app/images/estados/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/am.png -------------------------------------------------------------------------------- /app/images/estados/ap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ap.png -------------------------------------------------------------------------------- /app/images/estados/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ba.png -------------------------------------------------------------------------------- /app/images/estados/ce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ce.png -------------------------------------------------------------------------------- /app/images/estados/df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/df.png -------------------------------------------------------------------------------- /app/images/estados/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/es.png -------------------------------------------------------------------------------- /app/images/estados/go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/go.png -------------------------------------------------------------------------------- /app/images/estados/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ma.png -------------------------------------------------------------------------------- /app/images/estados/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/mg.png -------------------------------------------------------------------------------- /app/images/estados/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ms.png -------------------------------------------------------------------------------- /app/images/estados/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/mt.png -------------------------------------------------------------------------------- /app/images/estados/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/pa.png -------------------------------------------------------------------------------- /app/images/estados/pb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/pb.png -------------------------------------------------------------------------------- /app/images/estados/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/pe.png -------------------------------------------------------------------------------- /app/images/estados/pi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/pi.png -------------------------------------------------------------------------------- /app/images/estados/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/pr.png -------------------------------------------------------------------------------- /app/images/estados/rj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/rj.png -------------------------------------------------------------------------------- /app/images/estados/rn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/rn.png -------------------------------------------------------------------------------- /app/images/estados/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/ro.png -------------------------------------------------------------------------------- /app/images/estados/rr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/rr.png -------------------------------------------------------------------------------- /app/images/estados/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/rs.png -------------------------------------------------------------------------------- /app/images/estados/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/sc.png -------------------------------------------------------------------------------- /app/images/estados/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/se.png -------------------------------------------------------------------------------- /app/images/estados/sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/sp.png -------------------------------------------------------------------------------- /app/images/estados/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/estados/to.png -------------------------------------------------------------------------------- /app/images/loading/ac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ac.png -------------------------------------------------------------------------------- /app/images/loading/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/al.png -------------------------------------------------------------------------------- /app/images/loading/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/am.png -------------------------------------------------------------------------------- /app/images/loading/ap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ap.png -------------------------------------------------------------------------------- /app/images/loading/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ba.png -------------------------------------------------------------------------------- /app/images/loading/ce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ce.png -------------------------------------------------------------------------------- /app/images/loading/df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/df.png -------------------------------------------------------------------------------- /app/images/loading/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/es.png -------------------------------------------------------------------------------- /app/images/loading/go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/go.png -------------------------------------------------------------------------------- /app/images/loading/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ma.png -------------------------------------------------------------------------------- /app/images/loading/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/mg.png -------------------------------------------------------------------------------- /app/images/loading/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ms.png -------------------------------------------------------------------------------- /app/images/loading/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/mt.png -------------------------------------------------------------------------------- /app/images/loading/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pa.png -------------------------------------------------------------------------------- /app/images/loading/pb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pb.png -------------------------------------------------------------------------------- /app/images/loading/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pe.png -------------------------------------------------------------------------------- /app/images/loading/pi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pi.png -------------------------------------------------------------------------------- /app/images/loading/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pr.png -------------------------------------------------------------------------------- /app/images/loading/rj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rj.png -------------------------------------------------------------------------------- /app/images/loading/rn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rn.png -------------------------------------------------------------------------------- /app/images/loading/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ro.png -------------------------------------------------------------------------------- /app/images/loading/rr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rr.png -------------------------------------------------------------------------------- /app/images/loading/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rs.png -------------------------------------------------------------------------------- /app/images/loading/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/sc.png -------------------------------------------------------------------------------- /app/images/loading/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/se.png -------------------------------------------------------------------------------- /app/images/loading/sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/sp.png -------------------------------------------------------------------------------- /app/images/loading/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/to.png -------------------------------------------------------------------------------- /app/site/email/footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/site/email/footer.png -------------------------------------------------------------------------------- /app/fonts/Ubuntu-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/Ubuntu-Light.ttf -------------------------------------------------------------------------------- /app/fonts/Ubuntu-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/Ubuntu-Medium.ttf -------------------------------------------------------------------------------- /app/images/emptyProfile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/emptyProfile.jpg -------------------------------------------------------------------------------- /app/images/loading/ac2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ac2.png -------------------------------------------------------------------------------- /app/images/loading/al2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/al2.png -------------------------------------------------------------------------------- /app/images/loading/am2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/am2.png -------------------------------------------------------------------------------- /app/images/loading/ap2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ap2.png -------------------------------------------------------------------------------- /app/images/loading/ba2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ba2.png -------------------------------------------------------------------------------- /app/images/loading/ce2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ce2.png -------------------------------------------------------------------------------- /app/images/loading/df2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/df2.png -------------------------------------------------------------------------------- /app/images/loading/es2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/es2.png -------------------------------------------------------------------------------- /app/images/loading/go2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/go2.png -------------------------------------------------------------------------------- /app/images/loading/ma2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ma2.png -------------------------------------------------------------------------------- /app/images/loading/mg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/mg2.png -------------------------------------------------------------------------------- /app/images/loading/ms2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ms2.png -------------------------------------------------------------------------------- /app/images/loading/mt2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/mt2.png -------------------------------------------------------------------------------- /app/images/loading/pa2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pa2.png -------------------------------------------------------------------------------- /app/images/loading/pb2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pb2.png -------------------------------------------------------------------------------- /app/images/loading/pe2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pe2.png -------------------------------------------------------------------------------- /app/images/loading/pi2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pi2.png -------------------------------------------------------------------------------- /app/images/loading/pr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/pr2.png -------------------------------------------------------------------------------- /app/images/loading/rj2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rj2.png -------------------------------------------------------------------------------- /app/images/loading/rn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rn2.png -------------------------------------------------------------------------------- /app/images/loading/ro2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/ro2.png -------------------------------------------------------------------------------- /app/images/loading/rr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rr2.png -------------------------------------------------------------------------------- /app/images/loading/rs2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/rs2.png -------------------------------------------------------------------------------- /app/images/loading/sc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/sc2.png -------------------------------------------------------------------------------- /app/images/loading/se2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/se2.png -------------------------------------------------------------------------------- /app/images/loading/sp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/sp2.png -------------------------------------------------------------------------------- /app/images/loading/to2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/images/loading/to2.png -------------------------------------------------------------------------------- /app/fonts/Ubuntu-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/Ubuntu-Regular.ttf -------------------------------------------------------------------------------- /app/politicadeprivacidade.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/politicadeprivacidade.pdf -------------------------------------------------------------------------------- /app/fonts/ubuntu-bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-bold-webfont.woff -------------------------------------------------------------------------------- /app/fonts/ubuntu-bold-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-bold-webfont.woff2 -------------------------------------------------------------------------------- /app/fonts/ubuntu-light-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-light-webfont.ttf -------------------------------------------------------------------------------- /app/fonts/ubuntu-light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-light-webfont.woff -------------------------------------------------------------------------------- /react-src/src/modules/services/index.js: -------------------------------------------------------------------------------- 1 | import {post, get, APIResponse}from './APIService' 2 | export {post, get, APIResponse}; -------------------------------------------------------------------------------- /app/fonts/ubuntu-light-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-light-webfont.woff2 -------------------------------------------------------------------------------- /app/fonts/ubuntu-medium-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-medium-webfont.woff -------------------------------------------------------------------------------- /app/fonts/ubuntu-medium-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-medium-webfont.woff2 -------------------------------------------------------------------------------- /app/fonts/ubuntu-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-regular-webfont.woff -------------------------------------------------------------------------------- /app/fonts/ubuntu-regular-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/fonts/ubuntu-regular-webfont.woff2 -------------------------------------------------------------------------------- /app/bundle/src/components/bg/images/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/bg/images/bg.jpg -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/1.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/2.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/3.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/4.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/5.png -------------------------------------------------------------------------------- /react-src/src/components/bg/images/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/bg/images/bg.jpg -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/1.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/2.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/3.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/4.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/5.png -------------------------------------------------------------------------------- /react-src/src/components/icon/images/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/icon/images/help.png -------------------------------------------------------------------------------- /react-src/src/components/icon/images/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/icon/images/menu.png -------------------------------------------------------------------------------- /react-src/src/components/logo/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/logo/images/logo.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/logo.png -------------------------------------------------------------------------------- /app/bundle/src/components/icon/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/icon/images/close.png -------------------------------------------------------------------------------- /app/bundle/src/components/icon/images/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/icon/images/help.png -------------------------------------------------------------------------------- /app/bundle/src/components/icon/images/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/icon/images/menu.png -------------------------------------------------------------------------------- /app/bundle/src/components/logo/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/logo/images/logo.png -------------------------------------------------------------------------------- /app/bundle/src/components/menu/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/menu/images/close.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/home/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/home/images/icon.png -------------------------------------------------------------------------------- /react-src/src/components/check/images/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/check/images/check.png -------------------------------------------------------------------------------- /react-src/src/components/icon/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/icon/images/close.png -------------------------------------------------------------------------------- /react-src/src/components/icon/images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/icon/images/logout.png -------------------------------------------------------------------------------- /react-src/src/components/menu/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/menu/images/close.png -------------------------------------------------------------------------------- /react-src/src/components/menu/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/menu/images/search.png -------------------------------------------------------------------------------- /react-src/src/pages/match/home/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/home/images/icon.png -------------------------------------------------------------------------------- /app/bundle/src/components/check/images/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/check/images/check.png -------------------------------------------------------------------------------- /app/bundle/src/components/icon/images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/icon/images/logout.png -------------------------------------------------------------------------------- /app/bundle/src/components/menu/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/menu/images/search.png -------------------------------------------------------------------------------- /app/bundle/src/components/select/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/select/images/arrow.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/1-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/1-mobile.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/2-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/2-mobile.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/3-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/3-mobile.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/4-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/4-mobile.png -------------------------------------------------------------------------------- /app/bundle/src/pages/bemvindo/images/5-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/bemvindo/images/5-mobile.png -------------------------------------------------------------------------------- /app/bundle/src/pages/meusCandidatos/images/bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/meusCandidatos/images/bar.png -------------------------------------------------------------------------------- /react-src/src/components/logo/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/logo/images/logo-dark.png -------------------------------------------------------------------------------- /react-src/src/components/select/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/select/images/arrow.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/1-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/1-mobile.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/2-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/2-mobile.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/3-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/3-mobile.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/4-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/4-mobile.png -------------------------------------------------------------------------------- /react-src/src/pages/bemvindo/images/5-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/bemvindo/images/5-mobile.png -------------------------------------------------------------------------------- /react-src/src/pages/meusCandidatos/images/bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/meusCandidatos/images/bar.png -------------------------------------------------------------------------------- /app/bundle/src/components/logo/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/logo/images/logo-dark.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/link.png -------------------------------------------------------------------------------- /app/bundle/src/pages/meusCandidatos/images/print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/meusCandidatos/images/print.png -------------------------------------------------------------------------------- /react-src/src/components/check/images/check-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/check/images/check-old.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/link.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/phone.png -------------------------------------------------------------------------------- /react-src/src/pages/meusCandidatos/images/print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/meusCandidatos/images/print.png -------------------------------------------------------------------------------- /app/bundle/src/components/barTop/images/icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/barTop/images/icon-close.png -------------------------------------------------------------------------------- /app/bundle/src/components/favorite/images/favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/favorite/images/favorite.png -------------------------------------------------------------------------------- /app/bundle/src/pages/localizacao/boxMap/images/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/localizacao/boxMap/images/pin.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/message.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/phone.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/twitter.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/youtube.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/regiao/cidade/images/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/regiao/cidade/images/pin.png -------------------------------------------------------------------------------- /app/bundle/src/pages/meusCandidatos/images/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/meusCandidatos/images/download.png -------------------------------------------------------------------------------- /react-src/src/components/barTop/images/icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/barTop/images/icon-close.png -------------------------------------------------------------------------------- /react-src/src/components/favorite/images/favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/favorite/images/favorite.png -------------------------------------------------------------------------------- /react-src/src/components/logoResponsive/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/logoResponsive/images/logo.png -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/boxMap/images/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/localizacao/boxMap/images/pin.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/facebook.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/message.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/twitter.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/youtube.png -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/cidade/images/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/regiao/cidade/images/pin.png -------------------------------------------------------------------------------- /react-src/src/pages/meusCandidatos/images/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/meusCandidatos/images/download.png -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalInvite/images/whats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/modals/modalInvite/images/whats.png -------------------------------------------------------------------------------- /app/bundle/src/components/logoResponsive/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/logoResponsive/images/logo.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/facebook.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/candidato/images/instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/candidato/images/instagram.png -------------------------------------------------------------------------------- /react-src/src/components/icon/images/arrow-small-next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/icon/images/arrow-small-next.png -------------------------------------------------------------------------------- /react-src/src/pages/match/candidato/images/instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/candidato/images/instagram.png -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalInvite/images/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/modals/modalInvite/images/message.png -------------------------------------------------------------------------------- /app/bundle/src/components/buttonArrow/images/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/buttonArrow/images/arrow-left.png -------------------------------------------------------------------------------- /app/bundle/src/components/buttonArrow/images/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/buttonArrow/images/arrow-right.png -------------------------------------------------------------------------------- /app/bundle/src/components/favorite/images/favorite-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/favorite/images/favorite-check.png -------------------------------------------------------------------------------- /app/bundle/src/components/icon/images/arrow-small-next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/icon/images/arrow-small-next.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/headerMatch/images/arrow-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/headerMatch/images/arrow-back.png -------------------------------------------------------------------------------- /app/bundle/src/pages/match/regiao/searchCity/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/pages/match/regiao/searchCity/images/icon.png -------------------------------------------------------------------------------- /react-src/src/components/buttonArrow/images/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/buttonArrow/images/arrow-left.png -------------------------------------------------------------------------------- /react-src/src/components/buttonArrow/images/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/buttonArrow/images/arrow-right.png -------------------------------------------------------------------------------- /react-src/src/components/favorite/images/favorite-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/favorite/images/favorite-check.png -------------------------------------------------------------------------------- /react-src/src/components/logoResponsive/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/components/logoResponsive/images/logo-dark.png -------------------------------------------------------------------------------- /react-src/src/pages/match/headerMatch/images/arrow-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/headerMatch/images/arrow-back.png -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/searchCity/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/regiao/searchCity/images/icon.png -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalInvite/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/modals/modalInvite/images/facebook.png -------------------------------------------------------------------------------- /app/bundle/src/components/logoResponsive/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/app/bundle/src/components/logoResponsive/images/logo-dark.png -------------------------------------------------------------------------------- /react-src/src/styles/helpers.scss: -------------------------------------------------------------------------------- 1 | @function to-perc($px) { 2 | @return ($px/1440 * 100vw); 3 | } 4 | 5 | @function to-perc-max($px) { 6 | @return ($px/1920* 100vw); 7 | } 8 | -------------------------------------------------------------------------------- /react-src/src/pages/match/listaTipoCandidato/images/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basedigital/temmeuvoto/HEAD/react-src/src/pages/match/listaTipoCandidato/images/warning.png -------------------------------------------------------------------------------- /react-src/src/components/bg/Bg.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Bg { 4 | background-image:url("./images//bg.jpg"); 5 | background-position: center center; 6 | background-size:cover; 7 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/Regiao.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Regiao { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Regiao { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/costume/Costume.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Costume { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Costume { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalSendEmail/ModalSendEmail.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ModalSendEmail { 5 | .list { 6 | width: 300px; 7 | margin: auto; 8 | } 9 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/economia/Economia.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Economia { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Economia { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/src/pages/candidato/CandidatoPage.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .CandidatoPage { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .CandidatoPage { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/renovacao/Renovacao.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Renovacao { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Renovacao { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/src/pages/confirmarVoto/ConfirmarVotoPage.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .ConfirmarVotoPage { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .ConfirmarVotoPage { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /app/site/email/emailFeedback.view: -------------------------------------------------------------------------------- 1 |

Olá data['nome']?>,

2 | 3 |

Seu cadastro foi enviado e será avaliado por nossa equipe. Se tudo estiver correto, logo mais você receberá um e-mail de confirmação informando que seu perfil já está ativo.

-------------------------------------------------------------------------------- /app/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "firebase/php-jwt": "^5.0", 4 | "mailgun/mailgun-php": "~1.8", 5 | "guzzlehttp/psr7": "~1.4", 6 | "aws/aws-sdk-php": "2.*", 7 | "phpoffice/phpspreadsheet": "~1.4" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /react-src/src/pages/match/processoCondenacao/ProcessoCondenacao.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ProcessoCondenacao { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .ProcessoCondenacao { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /react-src/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "env", 4 | "react", 5 | "stage-0" 6 | ], 7 | "plugins": ["transform-decorators-legacy"], 8 | "env": { 9 | "development": { 10 | "plugins": [ 11 | "react-hot-loader/babel" 12 | ] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/prioridade1/Prioridade1.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Prioridade1 { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Prioridade1 { 10 | .Scrollbar { 11 | margin:20px 0px; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/prioridade2/Prioridade2.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Prioridade2 { 5 | 6 | } 7 | 8 | .is-small, .is-extraSmall { 9 | .Prioridade2 { 10 | .Scrollbar { 11 | margin:20px 0px; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /react-src/src/components/errorRequest/ErrorRequest.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .ErrorRequest { 4 | width: 100%; 5 | height: 100vh; 6 | 7 | display: flex; 8 | flex-direction: column; 9 | justify-content: center; 10 | align-items: center; 11 | 12 | text-align: center; 13 | 14 | } -------------------------------------------------------------------------------- /react-src/src/Config.js: -------------------------------------------------------------------------------- 1 | let Config = { 2 | CEREBRAL_DEBUGGER:'192.168.0.105:8585', 3 | // CEREBRAL_DEBUGGER:'10.0.0.129:8585', 4 | ENDPOINT: process.env.NODE_ENV === 'development' ? 'http://localhost:3000/' : '', 5 | RECAPTCHA:"6LfUpmgUAAAAACRgPcQRXjCghb1U6d3Cqh1-J43G" 6 | }; 7 | 8 | export default Config; 9 | -------------------------------------------------------------------------------- /react-src/src/components/bg/Bg.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import './Bg.scss'; 3 | 4 | class Bg extends React.PureComponent { 5 | 6 | render() { 7 | return
8 | {this.props.children} 9 |
; 10 | } 11 | } 12 | 13 | export default Bg; 14 | -------------------------------------------------------------------------------- /react-src/src/components/logo/Logo.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Logo { 4 | display: inline-block; 5 | vertical-align: top; 6 | img { 7 | width: 220px; 8 | height: auto; 9 | } 10 | } 11 | 12 | .is-small, .is-extraSmall { 13 | .Logo { 14 | img { 15 | 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /react-src/src/components/title/Title.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Title { 4 | .subtitle { 5 | line-height:140%; 6 | } 7 | } 8 | .is-extraSmall, .is-small { 9 | .Title { 10 | .subtitle { 11 | br { 12 | display: none; 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /react-src/src/modules/compute/computeState.js: -------------------------------------------------------------------------------- 1 | import {Compute} from 'cerebral' 2 | import {state} from 'cerebral/tags' 3 | 4 | export default Compute(state`app.config.estados`, state`candidato.uf`, (estados, uf) => { 5 | if (!uf) 6 | return {id:0, name:''}; 7 | 8 | return estados.filter((v) => v.uf.toLowerCase() === uf.toLowerCase())[0]; 9 | }) -------------------------------------------------------------------------------- /react-src/src/App.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import Controller from "./Controller"; 3 | import {Container} from '@cerebral/react' 4 | 5 | import Stage from './Stage'; 6 | 7 | export default class App extends Component { 8 | 9 | render() { 10 | return 11 | 12 | 13 | } 14 | } -------------------------------------------------------------------------------- /react-src/src/pages/meusCandidatos/formCad/FormCad.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .FormCad { 5 | .form { 6 | width: 300px; 7 | margin: auto; 8 | } 9 | } 10 | 11 | .is-small, .is-extraSmall { 12 | .form { 13 | width:260px; 14 | .Select { 15 | input { 16 | font-size:12px; 17 | } 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /react-src/src/utils/RouterUtils.js: -------------------------------------------------------------------------------- 1 | let _router; 2 | let _memoryRouter; 3 | 4 | export function setMemoryRouter(router) { 5 | _memoryRouter = router; 6 | } 7 | 8 | export function getMemoryRouter() { 9 | return _memoryRouter; 10 | } 11 | 12 | export function setRouter(router) { 13 | _router = router; 14 | } 15 | 16 | export function getRouter() { 17 | return _router; 18 | } 19 | -------------------------------------------------------------------------------- /app/site/email/emailReprovado.view: -------------------------------------------------------------------------------- 1 |

Olá data['nome']?>,

2 | 3 |

Seu cadastro foi reprovado por nossa equipe por conter informações inconsistentes em seu perfil.

4 | 5 |

Caso queira revisar o conteúdo enviado para que ele possa ser novamente avaliado, entre em contato conosco pelo e-mail contato@temmeuvoto.com

-------------------------------------------------------------------------------- /react-src/src/components/logoResponsive/LogoResponsive.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/helpers'; 2 | 3 | .LogoResponsive { 4 | display: inline-block; 5 | vertical-align: top; 6 | 7 | img { 8 | width: to-perc(219); 9 | height: auto; 10 | } 11 | } 12 | 13 | .is-small, .is-extraSmall { 14 | .LogoResponsive { 15 | img { 16 | width: 240px; 17 | height: 22px; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /react-src/src/styles/vars.scss: -------------------------------------------------------------------------------- 1 | .lnh-150 { 2 | line-height: 150% 3 | } 4 | 5 | $z-modal: 40; 6 | $z-top: 30; 7 | $z-middle: 20; 8 | $z-background: 10; 9 | 10 | .z-modal { 11 | z-index: $z-modal !important; 12 | } 13 | 14 | .z-top { 15 | z-index: $z-top !important; 16 | } 17 | 18 | .z-middle { 19 | z-index: $z-middle !important; 20 | } 21 | 22 | .z-background { 23 | z-index: $z-background !important; 24 | } 25 | 26 | -------------------------------------------------------------------------------- /app/site/email/emailInvite.view: -------------------------------------------------------------------------------- 1 |

www.temmeuvoto.com já está no ar.

2 | 3 |

Quanto mais a eleição se aproxima, mais perdido você fica? #TEMMEUVOTO é a plataforma que te ajuda a escolher os candidatos ao legislativo nas eleições de 2018.

4 | 5 |

Basta responder a poucas perguntas para encontrar os candidatos ao legislativo que mais se aproximam dos seus ideais.

6 | 7 |

Acesse. Participe. Compartilhe.

-------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/mapa/Mapa.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../styles/vars'; 2 | @import '../../../../styles/helpers'; 3 | 4 | .Mapa { 5 | .img { 6 | width: to-perc(290); 7 | height: auto; 8 | margin: auto; 9 | } 10 | 11 | .btns { 12 | display: flex; 13 | flex-direction: row; 14 | justify-content: center; 15 | } 16 | } 17 | 18 | .is-small, .is-extraSmall { 19 | .Mapa { 20 | .img { 21 | width: 250px; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /react-src/src/components/checks/Checks.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | @import '../../styles/helpers'; 3 | 4 | .Checks { 5 | &:last-child { 6 | margin-bottom: 0px; 7 | } 8 | 9 | .column { 10 | 11 | } 12 | 13 | .error { 14 | font-size: 14px; 15 | color: $red; 16 | font-style: italic; 17 | margin: to-perc(10); 18 | } 19 | } 20 | 21 | .is-small, .is-extraSmall { 22 | .Checks { 23 | .error { 24 | margin: 10px; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /react-src/src/components/favorite/Favorite.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .Favorite { 5 | cursor: pointer; 6 | 7 | opacity: 1; 8 | transition: opacity .3s; 9 | 10 | img { 11 | width: to-perc(32); 12 | height: to-perc(32); 13 | } 14 | 15 | &:hover { 16 | opacity: .6; 17 | } 18 | } 19 | 20 | .is-small, .is-extraSmall { 21 | .Favorite { 22 | img { 23 | width: 32px; 24 | height: 32px; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/site/modules/api/ResponseSuccess.site: -------------------------------------------------------------------------------- 1 | data = $data; 9 | } 10 | 11 | public function toJSON() { 12 | header('Content-Type: application/json'); 13 | 14 | echo json_encode(array( 15 | "data"=>$this->data 16 | ), JSON_PRETTY_PRINT); 17 | 18 | die(); 19 | } 20 | } 21 | ?> -------------------------------------------------------------------------------- /react-src/src/components/modalBarTop/ModalBarTop.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | body.is-modal-top-open { 4 | .MatchPage, .CandidatoPage{ 5 | display: none; 6 | } 7 | } 8 | 9 | .ModalBarTop { 10 | z-index: $z-top; 11 | 12 | position: absolute; 13 | top: 0px; 14 | left: 0px; 15 | right: 0px; 16 | bottom: 0px; 17 | 18 | background-color: #FFF; 19 | } 20 | 21 | .is-small, 22 | .is-extraSmall { 23 | .ModalBarTop { 24 | bottom: initial; 25 | min-height: 100vh; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/site/email/emailShareCandidato.view: -------------------------------------------------------------------------------- 1 |

Acesse www.temmeuvoto.com. Porque eleitor consciente é eleitor bem informado.

2 | 3 |

A plataforma www.temmeuvoto.com já está no ar trazendo informações sobre todos os candidatos. É muito simples: basta responder a poucas perguntas e #temmeuvoto encontra os candidatos que mais se aproximam dos seus ideias.

4 | 5 |

www.temmeuvoto.com

6 | 7 |

Acesse. Faça seu match. Compartilhe.

-------------------------------------------------------------------------------- /react-src/src/components/containerForm/ContainerForm.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .ContainerForm { 4 | max-width:700px; 5 | margin:auto; 6 | 7 | text-align: center; 8 | 9 | .btn-help { 10 | cursor: pointer; 11 | 12 | position:absolute; 13 | top:30px; 14 | right:100px; 15 | } 16 | } 17 | 18 | .is-extraSmall, .is-small { 19 | .ContainerForm { 20 | padding:10px 20px; 21 | 22 | .btn-help { 23 | top:10px; 24 | right:60px; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /react-src/src/components/scrollbar/Scrollbar.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/helpers'; 2 | 3 | .Scrollbar { 4 | text-align: left; 5 | 6 | .content-scrollbar { 7 | padding-right: 20px; 8 | } 9 | 10 | .track-vertical { 11 | width: 3px !important; 12 | background-color: #D8D8D8; 13 | } 14 | 15 | .scrollbar-vertical { 16 | width: 100%; 17 | background-color: #000; 18 | } 19 | 20 | .track-horizontal { 21 | display: none; 22 | } 23 | } 24 | 25 | .is-small, .is-extraSmall { 26 | .content-scrollbar { 27 | padding: 0px; 28 | } 29 | } -------------------------------------------------------------------------------- /app/site/email/emailRecovery.view: -------------------------------------------------------------------------------- 1 |

Olá data['nome']?>,

2 | 3 |

Foi solicitada a recuperação da sua senha de acesso à Plataforma #TEMMEUVOTO.

4 | 5 |

A nova senha criada é: data['pass']?>

6 | 7 |

Caso hajam tentativas consecutivas de recuperação, não se preocupe: nosso sistema bloqueará automaticamente o acesso, evitando assim qualquer chance de fraude.

8 | 9 |

Nesse caso, entre em contato conosco pelo e-mail contato@temmeuvoto.com.

10 | -------------------------------------------------------------------------------- /react-src/src/components/loading/Loading.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import cls from 'classnames'; 4 | 5 | import './Loading.scss'; 6 | 7 | class Loading extends React.PureComponent { 8 | 9 | static propTypes = { 10 | small: PropTypes.bool, 11 | } 12 | 13 | render() { 14 | const {small} = this.props; 15 | 16 | return
17 |
18 |
; 19 | } 20 | } 21 | 22 | export default Loading; 23 | -------------------------------------------------------------------------------- /app/site/modules/home/HomeDocument.site: -------------------------------------------------------------------------------- 1 | defaultAction = 'home'; 13 | } 14 | 15 | public function home() 16 | { 17 | $c = new Controller(new FileView('modules/home/home.view')); 18 | App::$instance->getTemplate()->addChild($c, 'CRAWLER'); 19 | } 20 | } 21 | 22 | ?> 23 | -------------------------------------------------------------------------------- /react-src/src/pages/match/MatchPage.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .MatchPage { 5 | display: flex; 6 | flex-direction: column; 7 | height: 100%; 8 | 9 | .content-match { 10 | display: flex; 11 | flex: 1; 12 | } 13 | .wrap-content-match { 14 | display: flex; 15 | flex:1; 16 | } 17 | 18 | .DefaultMatch { 19 | display: flex; 20 | flex-direction: column; 21 | width: 100%; 22 | } 23 | } 24 | 25 | .is-small, .is-extraSmall { 26 | .MatchPage { 27 | .content-match { 28 | padding-bottom: 30px; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/transparencia/Transparencia.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Transparencia { 5 | width:100%; 6 | text-align: center; 7 | 8 | .content-home { 9 | text-align: center; 10 | 11 | width: to-perc(520); 12 | margin: 100px auto; 13 | } 14 | 15 | .icon { 16 | display: inline-block; 17 | } 18 | } 19 | 20 | .is-small, .is-extraSmall { 21 | .Transparencia { 22 | .content-home { 23 | width: 100%; 24 | margin: 40px 0px; 25 | } 26 | 27 | .Button { 28 | width: 100%; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /react-src/src/index.js: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {render} from 'react-dom'; 3 | 4 | import App from "./App"; 5 | import './styles/main.scss'; 6 | 7 | import {AppContainer} from 'react-hot-loader'; 8 | const rootEl = document.getElementById('app'); 9 | 10 | render(, rootEl); 11 | 12 | if (module.hot) { 13 | module.hot.accept('./App', () => { 14 | const NextApp = require('./App').default; 15 | render( 16 | 17 | 18 | , 19 | rootEl, 20 | ); 21 | }); 22 | } -------------------------------------------------------------------------------- /app/site/email/emailShareCandidatos.view: -------------------------------------------------------------------------------- 1 |

www.temmeuvoto.com já está no ar.

2 | 3 |

Quanto mais a eleição se aproxima, mais perdido você fica? #TEMMEUVOTO é a plataforma que te ajuda a escolher os candidatos ao legislativo nas eleições de 2018.

4 | 5 |

Basta responder a poucas perguntas para encontrar os candidatos ao legislativo que mais se aproximam dos seus ideais.

6 | 7 |

Acesse. Participe. Compartilhe.

8 | 9 | VER MEUS CANDIDATOS -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/LocalizacaoPage.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .LocalizacaoPage { 5 | text-align: center; 6 | 7 | .title { 8 | margin: to-perc(66); 9 | color: #1C1C1C; 10 | } 11 | } 12 | 13 | .is-small, .is-extraSmall { 14 | .LocalizacaoPage { 15 | margin:40px 0px; 16 | 17 | .title { 18 | width:300px; 19 | margin: 0px auto; 20 | text-align: left; 21 | 22 | br { 23 | display: none; 24 | } 25 | } 26 | 27 | .ListState { 28 | margin-top: 20px; 29 | } 30 | 31 | .Button { 32 | width:100%; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /react-src/src/components/info/Info.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .Info { 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | 8 | min-height:100vh; 9 | 10 | .content { 11 | max-width:780px; 12 | text-align: center; 13 | 14 | .icon { 15 | display: inline-block; 16 | vertical-align: top; 17 | } 18 | } 19 | } 20 | 21 | .is-small, .is-extraSmall { 22 | .Info { 23 | .content { 24 | margin:auto; 25 | 26 | .icon { 27 | width:70px; 28 | height: auto; 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /react-src/src/pages/match/home/Home.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .Home { 5 | margin: auto; 6 | text-align: center; 7 | 8 | width: to-perc(520); 9 | 10 | .HeaderMatch { 11 | display: none; 12 | } 13 | 14 | .content-home { 15 | margin: 100px 0px; 16 | } 17 | 18 | .icon { 19 | display: inline-block; 20 | } 21 | } 22 | 23 | .is-small, .is-extraSmall { 24 | .Home { 25 | width: 100%; 26 | 27 | .HeaderMatch { 28 | display: flex; 29 | } 30 | 31 | .content-home { 32 | margin: 40px 0px; 33 | } 34 | 35 | .Button { 36 | width: 100%; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /app/site/email/emailAprovado.view: -------------------------------------------------------------------------------- 1 |

Olá data['nome']?>,

2 | 3 |

Seu cadastro foi aprovado por nossa equipe e encontra-se ativo em nossa plataforma. No próximo dia 10 de setembro o #TEMMEUVOTO será aberto para que os eleitores encontrem seus candidatos ao legislativo.

4 | 5 |

Caso encontre alguma informação errada em seu perfil após esta data, entre em contato conosco pelo e-mail contato@temmeuvoto.com

6 | 7 |

#TEMMEUVOTO é uma iniciativa independente e apartidária que vai ajudar o eleitor a decidir o que ele tem de mais valioso: o voto.

8 | 9 |

Compartilhe, divulgue e dissemine essa ideia em suas redes.

-------------------------------------------------------------------------------- /react-src/src/components/logo/Logo.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import './Logo.scss'; 6 | 7 | class Logo extends React.PureComponent { 8 | static propTypes = { 9 | theme:PropTypes.string, 10 | } 11 | 12 | static defaultProps = { 13 | theme:'default', 14 | } 15 | 16 | render() { 17 | const {theme} = this.props; 18 | 19 | return
20 | {theme === 'default' && } 21 | 22 | {theme === 'dark' && } 23 |
; 24 | } 25 | } 26 | 27 | export default Logo; 28 | -------------------------------------------------------------------------------- /react-src/src/pages/match/confirmarVoto/ConfirmarVoto.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ConfirmarVoto { 5 | text-align: center; 6 | 7 | .ContentMatch { 8 | margin-top: to-perc(60); 9 | } 10 | 11 | .btns { 12 | width: to-perc(280); 13 | margin: 0px auto; 14 | 15 | display: flex; 16 | flex-direction: row; 17 | justify-content: space-between; 18 | } 19 | } 20 | 21 | .is-small, .is-extraSmall { 22 | .ConfirmarVoto { 23 | width: 100%; 24 | overflow: hidden; 25 | 26 | .ContentMatch { 27 | margin-top: 0px; 28 | padding-top: 50px; 29 | } 30 | 31 | .btns { 32 | width: 300px; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /react-src/src/styles/colors.scss: -------------------------------------------------------------------------------- 1 | $black: #000000; 2 | $white: #ffffff; 3 | $dark: #2e3138; 4 | $gray78: #787878; 5 | $gray23: #232323; 6 | $gray46: #464646; 7 | $gray1c: #1C1C1C; 8 | $gray9a: #9A9898; 9 | $red: #c00000; 10 | 11 | //colors 12 | .color-black { 13 | color: $black; 14 | } 15 | 16 | .color-white { 17 | color: $white; 18 | } 19 | 20 | .color-dark { 21 | color: $dark; 22 | } 23 | 24 | .color-gray1c { 25 | color: $gray1c; 26 | } 27 | 28 | .color-gray78 { 29 | color: $gray78; 30 | } 31 | 32 | .color-gray46 { 33 | color: $gray46; 34 | } 35 | 36 | .color-gray23{ 37 | color: $gray23; 38 | } 39 | 40 | .color-gray9a { 41 | color: $gray9a; 42 | } 43 | 44 | .color-red { 45 | color: $red; 46 | } 47 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalFavorito/ModalFavorito.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ModalFavorito { 5 | .Scrollbar { 6 | width: to-perc(680); 7 | height: 50vh; 8 | margin: auto; 9 | 10 | .list { 11 | display: flex; 12 | flex-direction: row; 13 | flex-wrap: wrap; 14 | 15 | justify-content: space-between; 16 | align-items: center; 17 | 18 | padding-right: to-perc(20); 19 | } 20 | } 21 | } 22 | 23 | .is-small, .is-extraSmall { 24 | .ModalFavorito { 25 | .Scrollbar { 26 | width: 100%; 27 | height: initial; 28 | 29 | .list { 30 | padding-right: 0px; 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/listaCandidatos/itemEmptyCandidato/ItemEmptyCandidato.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../styles/vars'; 2 | @import '../../../../styles/helpers'; 3 | 4 | .ItemEmptyCandidato { 5 | width: 100%; 6 | 7 | border-radius: 4px; 8 | background-color: #FFF; 9 | padding: to-perc(25) to-perc(20); 10 | 11 | display: flex; 12 | justify-content: space-between; 13 | 14 | margin-bottom: to-perc(15); 15 | 16 | &.is-empty { 17 | border: 2px solid #000000; 18 | background-color: #e6e6e6; 19 | } 20 | 21 | &:last-child { 22 | margin-bottom: 0px; 23 | } 24 | } 25 | 26 | .is-small, .is-extraSmall { 27 | .ItemEmptyCandidato { 28 | padding: 25px 20px; 29 | margin-bottom: 15px; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalProximidade/ModalProximidade.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalProximidade extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/ajuda-proximidade'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 |

O resultado aplicado aqui refere-se as cidades que estão em um raio de até 100 km da cidade de votação descrita em sua resposta.

15 | `; 16 | 17 | return 18 | } 19 | } 20 | 21 | export default ModalProximidade; 22 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalCostume/ModalCostume.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalCostume extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/ajuda-costume'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 |

Descrevemos aqui, de forma livre e simples, opções que remetem a um posicionamento conservador, intermediário ou progressista no que se refere aos costumes.

15 | `; 16 | 17 | return 18 | } 19 | } 20 | 21 | export default ModalCostume; 22 | -------------------------------------------------------------------------------- /react-src/src/components/barTop/BarTop.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import './BarTop.scss'; 5 | 6 | class BarTop extends React.PureComponent { 7 | static propTypes = { 8 | onClick: PropTypes.func, 9 | } 10 | 11 | componentDidMount() { 12 | window.scrollTo(0, 0); 13 | } 14 | 15 | render() { 16 | return
17 |
18 |
19 | 20 |
21 |
22 |
; 23 | } 24 | } 25 | 26 | export default BarTop; 27 | -------------------------------------------------------------------------------- /react-src/src/components/modalHelp/ModalHelp.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | 3 | .ModalHelp { 4 | .btn-close { 5 | cursor: pointer; 6 | 7 | position: fixed; 8 | top: 20px; 9 | right: 20px; 10 | } 11 | 12 | .text { 13 | margin: auto; 14 | max-width: 860px; 15 | padding: 0px 20px; 16 | 17 | a { 18 | color: #FFF; 19 | text-decoration: underline; 20 | } 21 | } 22 | } 23 | 24 | .is-small, 25 | .is-extraSmall { 26 | .btn-close { 27 | width: 40px; 28 | height: 40px; 29 | 30 | img { 31 | width: 100%; 32 | height: auto; 33 | } 34 | } 35 | .text { 36 | width: 300px; 37 | max-width: inherit; 38 | margin: auto; 39 | font-size:18px; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/site/template/Template.site: -------------------------------------------------------------------------------- 1 | setView(new FileView('template/template.view')); 16 | 17 | Template::$metaImage = App::url().'images/share.jpg'; 18 | Template::$metaTitle = App::$instance->getSystemVars('share_title'); 19 | Template::$metaDescription = App::$instance->getSystemVars('share_description'); 20 | } 21 | } 22 | ?> 23 | -------------------------------------------------------------------------------- /react-src/src/components/logoResponsive/LogoResponsive.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import './LogoResponsive.scss'; 6 | 7 | class LogoResponsive extends React.PureComponent { 8 | static propTypes = { 9 | theme:PropTypes.string, 10 | } 11 | 12 | static defaultProps = { 13 | theme:'default', 14 | } 15 | 16 | render() { 17 | const {theme} = this.props; 18 | 19 | return
20 | {theme === 'default' && } 21 | {theme === 'dark' && } 22 |
; 23 | } 24 | } 25 | 26 | export default LogoResponsive; 27 | -------------------------------------------------------------------------------- /app/config.php: -------------------------------------------------------------------------------- 1 | server = 'temmeuvoto.com'; 8 | $config->path = 'https://@SERVER@/'; 9 | 10 | $config->useFriendlyURLS = true; 11 | $config->dbCrypt = false; 12 | 13 | $config->dbEncoding = 'utf8'; 14 | $config->cacheScale = 0; 15 | $config->dbType = 'mysql'; 16 | $config->debug = 1; 17 | $config->isMultiLanguage = false; 18 | $config->useRemoveAccents = false; 19 | $config->uploadsPath = '../upload/'; 20 | 21 | $config->dateFormatPHP = 'm/d/Y'; 22 | $config->dateFormatJS = 'mm/dd/yy'; 23 | 24 | $config->domain = 'site'; 25 | 26 | $config->extra = ['basehref' => '/']; 27 | 28 | $configs = array($config); 29 | ?> 30 | -------------------------------------------------------------------------------- /react-src/src/pages/candidato/CandidatoPage.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import cls from 'classnames'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import Candidato from './../match/candidato/Candidato'; 9 | 10 | import './CandidatoPage.scss'; 11 | 12 | class CandidatoPage extends Component { 13 | constructor(props) { 14 | super(props); 15 | } 16 | 17 | render() { 18 | const {ref_candidato, position, page} = this.props.match.params; 19 | 20 | return
21 | 22 |
23 | } 24 | } 25 | 26 | export default connect({}, CandidatoPage); 27 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalRenovacao/ModalRenovacao.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalRenovacao extends React.PureComponent { 7 | componentDidMount() { 8 | trackPageview('interna/ajuda-renovacao'); 9 | } 10 | 11 | render() { 12 | const text = ` 13 |

A fonte de informação aqui foi o Tribunal Superior Eleitoral.

14 | 15 |

Caso encontre algo errado nas informações disponibilizadas aqui, entre em contato com a gente pelo e-mail contato@temmeuvoto.com

16 | `; 17 | 18 | return 19 | } 20 | } 21 | 22 | export default ModalRenovacao; 23 | -------------------------------------------------------------------------------- /react-src/src/components/title/Title.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {Spacer} from '../'; 7 | 8 | import './Title.scss'; 9 | 10 | class Title extends React.PureComponent { 11 | static propTypes = { 12 | title:PropTypes.string, 13 | subtitle:PropTypes.string, 14 | } 15 | 16 | render() { 17 | const {title, subtitle} = this.props; 18 | 19 | return
20 |
{title}
21 | 22 |
23 |
24 | } 25 | } 26 | 27 | export default Title; 28 | -------------------------------------------------------------------------------- /react-src/src/pages/confirmarVoto/ConfirmarVotoPage.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import cls from 'classnames'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import ConfirmarVoto from './../match/confirmarVoto/ConfirmarVoto'; 9 | 10 | import './ConfirmarVotoPage.scss'; 11 | 12 | class ConfirmarVotoPage extends Component { 13 | constructor(props) { 14 | super(props); 15 | } 16 | 17 | render() { 18 | const {ref_candidato, position} = this.props.match.params; 19 | 20 | return
21 | 22 |
23 | } 24 | } 25 | 26 | export default connect({}, ConfirmarVotoPage); 27 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalEconomia/ModalEconomia.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalEconomia extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/ajuda-economia'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 |

Descrevemos aqui, de forma livre e simples, opções que remetem a um posicionamento conservador, intermediário ou progressista no que se refere 15 | à atuação do Estado na economia e no bem-estar social do País.

16 | `; 17 | 18 | return 19 | } 20 | } 21 | 22 | export default ModalEconomia; 23 | -------------------------------------------------------------------------------- /react-src/src/components/icon/Icon.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import './Icon.scss'; 7 | 8 | class Icon extends React.PureComponent { 9 | static icons = { 10 | help:require("./images/help.png"), 11 | close:require("./images/close.png"), 12 | logout:require("./images/logout.png"), 13 | arrowSmallNext:require("./images/arrow-small-next.png"), 14 | menu:require("./images/menu.png") 15 | } 16 | 17 | static propTypes = { 18 | icon:PropTypes.string 19 | } 20 | 21 | render() { 22 | const { icon } = this.props; 23 | 24 | return
25 | 26 |
27 | } 28 | } 29 | 30 | export default Icon; 31 | -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/listState/ListState.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/helpers'; 2 | 3 | .ListState { 4 | .list { 5 | width: to-perc(300); 6 | height: to-perc(400); 7 | margin: auto; 8 | 9 | .item { 10 | cursor: pointer; 11 | 12 | color: #acacac; 13 | 14 | padding: to-perc(10); 15 | margin-bottom: to-perc(10); 16 | 17 | text-align: center; 18 | font-style: italic; 19 | 20 | &:last-child { 21 | margin-bottom: 0px; 22 | } 23 | 24 | &:hover { 25 | color: #000; 26 | } 27 | } 28 | } 29 | } 30 | 31 | .is-small, .is-extraSmall { 32 | .ListState { 33 | .list { 34 | width: 100%; 35 | height: initial; 36 | 37 | .item { 38 | padding: 10px; 39 | margin-bottom: 10px; 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /react-src/src/components/containerForm/ContainerForm.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import { Title, Spacer } from '../'; 7 | 8 | import './ContainerForm.scss'; 9 | 10 | class ContainerForm extends React.PureComponent { 11 | static propTypes = { 12 | title: PropTypes.string, 13 | subtitle: PropTypes.string, 14 | } 15 | 16 | render() { 17 | const { title, subtitle } = this.props; 18 | 19 | return
20 | 21 | 22 | 23 | 24 | <Spacer vertical={4}/> 25 | 26 | {this.props.children} 27 | </div> 28 | } 29 | } 30 | 31 | export default ContainerForm; 32 | -------------------------------------------------------------------------------- /app/site/email/emailPrimeiroCadastro.view: -------------------------------------------------------------------------------- 1 | <p>Olá <?=$this->data['nome']?>,</p> 2 | 3 | <p>Bem-vindo ao #TEMMEUVOTO, a plataforma que vai ajudar os brasileiros a encontrar seus candidatos ao legislativo.</p> 4 | 5 | <p>Sua senha de acesso é: <b><?=$this->data['pass']?></b></p> 6 | 7 | <p><a style="color:#4a4a4a" href="https://temmeuvoto.com/candidato" target="_blank">Clique aqui</a>, selecione "JÁ TENHO MINHA SENHA DE ACESSO" e insira o seu <b>CPF</b> e <b>SENHA</b> acima para acessar a plataforma.</p> 8 | 9 | <p>Caso encontre alguma informação errada em seu perfil, entre em contato conosco pelo e-mail <a style="color:#4a4a4a;" href="mailto:contato@temmeuvoto.com">contato@temmeuvoto.com</a>.</p> 10 | 11 | <p>#TEMMEUVOTO é uma iniciativa independente e apartidária que vai ajudar o eleitor a decidir o que ele tem de mais valioso: o voto.</p> 12 | 13 | <p>Participe e fique conhecido por milhares de eleitores.</p> -------------------------------------------------------------------------------- /react-src/src/components/errorRequest/ErrorRequest.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {Button, Spacer} from '../'; 6 | 7 | import './ErrorRequest.scss'; 8 | 9 | class ErrorRequest extends React.PureComponent { 10 | static propTypes = { 11 | onClick: PropTypes.func 12 | } 13 | 14 | render() { 15 | return <div className="ErrorRequest"> 16 | <div className={'content'}> 17 | <div className={'size-34 light'}>Aviso!</div> 18 | 19 | <Spacer/> 20 | 21 | <div className={'size-20 light'}>Houve um erro ao carregar as informações.</div> 22 | 23 | <Spacer vertical={2}/> 24 | 25 | <Button title={'Tentar Novamente'} onClick={this.props.onClick} theme={'dark'}></Button> 26 | </div> 27 | </div>; 28 | } 29 | } 30 | 31 | export default ErrorRequest; 32 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalBaseDados/ModalBaseDados.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalBaseDados extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/base-de-dados'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p> Disponibilizamos nossa base de dados para que seja utilizada como fonte de informação.</p> 15 | 16 | <p>Se você é um veículo de comunicação o ou uma organização que disponibiliza informações aos cidadãos, entre em contato com a gente no e-mail <a class="link" href="mailto:contato@temmeuvoto.com">contato@temmeuvoto.com</a></p> 17 | `; 18 | 19 | return <ModalText {...this.props} title={'Base de Dados'} text={text}/> 20 | } 21 | } 22 | 23 | export default ModalBaseDados; 24 | -------------------------------------------------------------------------------- /react-src/src/components/buttonArrow/ButtonArrow.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import cls from 'classnames'; 3 | 4 | import PropTypes from 'prop-types'; 5 | 6 | import './ButtonArrow.scss'; 7 | 8 | class ButtonArrow extends React.PureComponent { 9 | static propTypes = { 10 | title: PropTypes.string, 11 | onClick: PropTypes.func, 12 | 13 | left: PropTypes.bool, 14 | } 15 | 16 | static defaultProps = { 17 | left: false 18 | } 19 | 20 | render() { 21 | const {title, onClick, left} = this.props; 22 | 23 | return <div className={cls('ButtonArrow')} onClick={onClick}> 24 | {left && <img src={require("./images/arrow-left.png")}/>} 25 | 26 | <span className={'size-14'}>{title}</span> 27 | 28 | {!left && <img src={require("./images/arrow-right.png")}/>} 29 | </div>; 30 | } 31 | } 32 | 33 | export default ButtonArrow; 34 | -------------------------------------------------------------------------------- /react-src/src/polyfill.js: -------------------------------------------------------------------------------- 1 | //https://reactjs.org/docs/javascript-environment-requirements.html 2 | //Warning: React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. http://fb.me/react-polyfills 3 | 4 | import 'whatwg-fetch' 5 | 6 | import 'core-js/fn/object/assign'; //IE 11 7 | import 'core-js/fn/promise'; //IE 11 8 | import 'core-js/fn/set'; //IE 10 (react-dom) 9 | import 'core-js/fn/array/includes'; //IE 10 10 | import 'core-js/fn/map'; //IE 10 11 | import 'core-js/fn/array'; //IE 11 12 | import 'core-js/es6/string'; //IE 10 13 | import 'core-js/fn/object/define-property'; //IE 9 14 | import 'core-js/fn/weak-map'; //IE 10 15 | 16 | if (!global['requestAnimationFrame']) { //IE 9 17 | global['requestAnimationFrame'] = function (callback) { 18 | setTimeout(callback, 30); 19 | }; 20 | } 21 | 22 | if (!global['WebSocket']) { //IE 9 23 | global['WebSocket'] = function() { 24 | 25 | } 26 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalPesquisarCandidatos/ModalPesquisarCandidatos.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ModalPesquisarCandidatos { 5 | .Scrollbar { 6 | width: to-perc(250) !important; 7 | height: 50vh; 8 | 9 | .list { 10 | padding-right: 20px; 11 | 12 | .item { 13 | text-align: left; 14 | display: flex; 15 | flex-direction: row; 16 | justify-content: flex-start; 17 | align-items: center; 18 | font-style: normal; 19 | color: #1c1c1c; 20 | 21 | .image { 22 | width: 60px; 23 | height: 60px; 24 | background-size: cover; 25 | background-position: top center; 26 | border-radius: 4px; 27 | flex-shrink: 0; 28 | } 29 | 30 | .info { 31 | width: 100%; 32 | margin-left: 15px; 33 | } 34 | } 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /app/fonts/stylesheet.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'ubuntu'; 3 | src: url('ubuntu-light-webfont.woff2') format('woff2'), 4 | url('ubuntu-light-webfont.woff') format('woff'); 5 | font-weight: 300; 6 | font-style: normal; 7 | } 8 | 9 | 10 | @font-face { 11 | font-family: 'ubuntu'; 12 | src: url('ubuntu-regular-webfont.woff2') format('woff2'), 13 | url('ubuntu-regular-webfont.woff') format('woff'); 14 | font-weight: normal; 15 | font-style: normal; 16 | } 17 | 18 | @font-face { 19 | font-family: 'ubuntu'; 20 | src: url('ubuntu-medium-webfont.woff2') format('woff2'), 21 | url('ubuntu-medium-webfont.woff') format('woff'); 22 | font-weight: 500; 23 | font-style: normal; 24 | } 25 | 26 | @font-face { 27 | font-family: 'ubuntu'; 28 | src: url('ubuntu-bold-webfont.woff2') format('woff2'), 29 | url('ubuntu-bold-webfont.woff') format('woff'); 30 | font-weight: bold; 31 | font-style: normal; 32 | } -------------------------------------------------------------------------------- /react-src/src/utils/GAUtil.js: -------------------------------------------------------------------------------- 1 | export function trackEvent(category, action, label) { 2 | // console.log(category, action, label); 3 | 4 | if (window['dataLayer']) { 5 | window['dataLayer'].push({ 6 | 'gaCategory': category, 7 | 'gaAction': action, 8 | 'gaLabel': label, 9 | 'event': `${category} | ${action} | ${label}` 10 | }) 11 | } 12 | } 13 | 14 | export function trackClickText(clickText, event) { 15 | console.log(clickText, event); 16 | 17 | if (window['dataLayer']) { 18 | window['dataLayer'].push({ 19 | 'Click Text': clickText, 20 | 'event': `${event}_${clickText}` 21 | }) 22 | } 23 | } 24 | 25 | export function trackPageview(pageview) { 26 | //console.log(pageview); 27 | 28 | if (window['dataLayer']) { 29 | window['dataLayer'].push({ 30 | 'event': 'pageview', 31 | 'virtualPagePath': pageview, 32 | }) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /react-src/src/pages/match/contentMatch/ContentMatch.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ContentMatch { 5 | width: to-perc(570); 6 | margin: auto; 7 | 8 | text-align: center; 9 | 10 | .Scrollbar { 11 | height: to-perc(320); 12 | } 13 | 14 | .text-and-help { 15 | display: flex; 16 | justify-content: space-between; 17 | align-items: center; 18 | 19 | .btn-help { 20 | display: none; 21 | } 22 | } 23 | } 24 | 25 | .is-small, .is-extraSmall { 26 | .ContentMatch { 27 | width: 100%; 28 | padding-bottom: 80px; 29 | 30 | .Scrollbar { 31 | height: initial; 32 | } 33 | 34 | .text-and-help { 35 | .btn-help { 36 | display: block; 37 | width: 24px; 38 | height: 24px; 39 | 40 | img { 41 | width: 100%; 42 | height: auto; 43 | } 44 | } 45 | } 46 | 47 | .title-contentmatch { 48 | text-align: left; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /react-src/src/components/modal/Modal.scss: -------------------------------------------------------------------------------- 1 | $z-modal:100; 2 | 3 | .fake-modal { 4 | display: none; 5 | } 6 | 7 | .is-modal-open { 8 | overflow: hidden; 9 | } 10 | 11 | .Modal { 12 | display: flex; 13 | align-items: center; 14 | text-align: center; 15 | 16 | position: fixed; 17 | z-index: $z-modal+1; 18 | 19 | top: 0; 20 | right: 0; 21 | bottom: 0; 22 | left: 0; 23 | 24 | background-color: rgba(0, 0, 0, .87); 25 | 26 | overflow: auto; 27 | 28 | transition: visibility .3s, opacity .3s; 29 | visibility: hidden; 30 | opacity: 0; 31 | 32 | &.is-visible { 33 | visibility: visible; 34 | opacity: 1; 35 | } 36 | 37 | .bg-modal { 38 | z-index: $z-modal; 39 | position: fixed; 40 | top: 0px; 41 | left: 0px; 42 | 43 | width: 100%; 44 | width: calc(100% - 18px); 45 | height: 100%; 46 | 47 | background-color: transparent; 48 | } 49 | 50 | .content-modal { 51 | position: relative; 52 | z-index: $z-modal + 5; 53 | margin: auto; 54 | } 55 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalInvite/ModalInvite.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ModalInvite { 5 | .list { 6 | width: 300px; 7 | margin: auto; 8 | 9 | a { 10 | display: block; 11 | box-sizing: border-box; 12 | } 13 | 14 | .item { 15 | cursor: pointer; 16 | 17 | width: 100%; 18 | padding: 0px 30px; 19 | height: 74px; 20 | 21 | border-radius: 4px; 22 | background-color: #FFF; 23 | 24 | box-shadow: 2px 2px 15px #e1e1e1; 25 | 26 | display: flex; 27 | flex-direction: row; 28 | justify-content: flex-start; 29 | align-items: center; 30 | 31 | transition: opacity .3s; 32 | &:hover { 33 | opacity:.5; 34 | } 35 | 36 | img { 37 | width: 30px; 38 | height: auto; 39 | } 40 | 41 | span { 42 | color: #1c1c1c; 43 | 44 | font-size: 17px; 45 | margin-left: 15px; 46 | } 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalText/ModalText.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ModalText { 5 | .modaltext-title { 6 | text-align: center; 7 | padding: to-perc(70) 0px to-perc(30) 0px; 8 | } 9 | 10 | .Scrollbar { 11 | margin: auto; 12 | width: to-perc(600); 13 | height: calc(50vh); 14 | 15 | font-style: italic; 16 | 17 | p, div { 18 | line-height: 150%; 19 | } 20 | 21 | a { 22 | color: #787878; 23 | text-decoration: underline; 24 | margin-right: 10px; 25 | } 26 | 27 | .link { 28 | font-weight: 500; 29 | text-decoration: none; 30 | color: #1c1c1c; 31 | margin-right: 10px; 32 | } 33 | } 34 | } 35 | 36 | .is-small, .is-extraSmall { 37 | .ModalText { 38 | .Scrollbar { 39 | width: 100%; 40 | height: initial; 41 | 42 | font-style: normal; 43 | text-align: center; 44 | } 45 | 46 | .modaltext-title { 47 | text-align: center; 48 | padding: 60px 0px 20px; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/headerMatch/HeaderMatch.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .HeaderMatch { 5 | width: 90%; 6 | margin: 0px auto; 7 | margin-top: to-perc(20); 8 | 9 | display: flex; 10 | flex-direction: row; 11 | align-items: center; 12 | justify-content: space-between; 13 | 14 | .item-left, .item-right { 15 | width: to-perc(100); 16 | } 17 | 18 | .item-right { 19 | text-align: right; 20 | 21 | .btn { 22 | cursor: pointer; 23 | 24 | display: inline-block; 25 | vertical-align: top; 26 | } 27 | } 28 | } 29 | 30 | .is-small, .is-extraSmall { 31 | .HeaderMatch { 32 | position: relative; 33 | width:100%; 34 | margin:15px 0px; 35 | 36 | .item-left, .item-right{ 37 | width: initial; 38 | width: 20px; 39 | height: 20px; 40 | } 41 | 42 | .btn-help { 43 | display: none; 44 | } 45 | 46 | .btn { 47 | width: 20px; 48 | height: 20px; 49 | 50 | img { 51 | width: 100%; 52 | height: auto; 53 | } 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /react-src/src/components/textarea/TextArea.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import './TextArea.scss'; 7 | 8 | class TextArea extends React.PureComponent { 9 | static propTypes = { 10 | placeholder:PropTypes.string, 11 | value:PropTypes.string, 12 | 13 | onChange:PropTypes.func, 14 | onBlur:PropTypes.func, 15 | 16 | error:PropTypes.string, 17 | } 18 | 19 | static defaultProps = { 20 | } 21 | 22 | render() { 23 | const {placeholder, value, error, maxLength} = this.props; 24 | 25 | return <div className={cls('TextArea', {'is-error':!!error})}> 26 | <textarea value={value} placeholder={placeholder} onChange={this.props.onChange} onBlur={this.props.onBlur} maxLength={maxLength}/> 27 | 28 | <div className="count">{maxLength - (value ? value.length : 0)} caracteres</div> 29 | 30 | {!!error && <div className="error">{error}</div>} 31 | </div> 32 | } 33 | } 34 | 35 | export default TextArea; 36 | -------------------------------------------------------------------------------- /react-src/src/components/loading/Loading.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .LoadingCenter { 5 | display: flex; 6 | width: 100%; 7 | height: 100vh; 8 | } 9 | 10 | .Loading { 11 | width: 100%; 12 | 13 | display: flex; 14 | align-items: center; 15 | justify-content: center; 16 | transition: opacity .3s; 17 | 18 | .loading { 19 | position: relative; 20 | box-sizing: border-box; 21 | width: to-perc(40); 22 | height: to-perc(40); 23 | border-radius: 100%; 24 | border: 6px solid rgba(0, 0, 0, 0.2); 25 | border-top-color: #000; 26 | animation: spin 1s infinite linear; 27 | } 28 | 29 | &.is-small { 30 | .loading { 31 | width: to-perc(18); 32 | height: to-perc(18); 33 | border: 3px solid rgba(0, 0, 0, 0.2); 34 | border-top-color: #000; 35 | } 36 | } 37 | } 38 | .is-extraSmall, .is-small { 39 | .Loading { 40 | .loading { 41 | width: 40px; 42 | height: 40px;; 43 | } 44 | } 45 | &.is-small { 46 | .loading { 47 | width: 18px; 48 | height: 18px; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /react-src/src/components/check/Check.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import './Check.scss'; 7 | 8 | class Check extends React.PureComponent { 9 | static propTypes = { 10 | label: PropTypes.string, 11 | value: PropTypes.any, 12 | 13 | checked: PropTypes.bool, 14 | 15 | type: PropTypes.string, 16 | } 17 | 18 | static defaultProps = { 19 | type: 'default', 20 | checked: false, 21 | checkText: false, 22 | small: false 23 | } 24 | 25 | render() { 26 | const {label, value, type, checked} = this.props; 27 | 28 | return <div className={cls('Check', 'type-' + type, {'is-selected': checked})} 29 | onClick={this.props.onClick.bind(this, value, label)}> 30 | <div className="circle"> 31 | <img src={require('./images/check.png')}/> 32 | </div> 33 | 34 | <div className={cls('label', 'size-17')}>{label}</div> 35 | </div> 36 | } 37 | } 38 | 39 | export default Check; 40 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalListaCandidatos/ModalListaCandidatos.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalListaCandidatos extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/ajuda-lista-candidatos'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p>O foco do #TEMMEUVOTO é ajudar o eleitor na escolha dos seus candidatos aos cargos legislativos – senador, deputado federal e deputado estadual.</p> 15 | 16 | <p>Porém, para facilitar a tomada de decisão, optamos por disponibilizar aqui a lista de todos os cargos elelivos nas eleições de 2018, o que inclui também os candidatos ao executivo – governador e presidente. Nesses casos, disponibilizamos a lista de todos os candidatos, sem aplicação dos filtros utilizados nesta plataforma.</p> 17 | `; 18 | 19 | return <ModalText {...this.props} title={'Lista de Candidatos'} text={text}/> 20 | } 21 | } 22 | 23 | export default ModalListaCandidatos; 24 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalPrioridade/ModalPrioridade.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalPrioridade extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/ajuda-prioridade'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p>As prioridades aqui agrupadas estão de acordo com aquelas levantadas pelas principais pesquisas de opinião do país, quando perguntam sobre as prioridades do brasileiro.</p> 15 | 16 | <p>Separamos em dois blocos para que os candidatos(as) possam expressar mais de uma prioridade, dando chance aos eleitores conhecerem e analisarem duas propostas concretas.</p> 17 | 18 | <p>Sabemos que as prioridades não são exaustivas, porém o intuito não é ter uma lista completa e sim uma lista que reflita as prioridades brasileiras.</p> 19 | `; 20 | 21 | return <ModalText {...this.props} title={'Prioridades'} text={text}/> 22 | } 23 | } 24 | 25 | export default ModalPrioridade; 26 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalSobre/ModalSobre.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | 5 | import {trackPageview} from "../../../utils/GAUtil"; 6 | 7 | class ModalSobre extends React.PureComponent { 8 | 9 | componentDidMount() { 10 | trackPageview('interna/sobre'); 11 | } 12 | 13 | render() { 14 | const text = ` 15 | <p>#TEMMEUVOTO é uma plataforma independente que ajuda o eleitor a encontrar o candidato ou a candidata a deputado estadual, deputado federal e senador com quem mais se identifica.</p> 16 | 17 | <p>A ideia é unir toda a tecnologia e informação que a Era dos Dados nos fornece, para facilitar e ajudar o eleitor a encontrar seu candidato de forma fácil, rápida e confiável.</p> 18 | 19 | <p>O acesso à informação é a chave para fortalecer a democracia. Afinal, conhecer bem os candidatos permite escolher com consciência o que nós, cidadãos, temos de mais valioso: o voto.</p> 20 | `; 21 | 22 | return <ModalText {...this.props} title={'Sobre'} text={text}/> 23 | } 24 | } 25 | 26 | export default ModalSobre; 27 | -------------------------------------------------------------------------------- /react-src/src/components/buttonArrow/ButtonArrow.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .ButtonArrow { 5 | cursor: pointer; 6 | 7 | display: flex; 8 | flex-direction: row; 9 | align-items: center; 10 | 11 | flex-shrink: 0; 12 | 13 | img { 14 | display: inline-block; 15 | 16 | width: to-perc(6); 17 | height: to-perc(10); 18 | 19 | margin-right: to-perc(10); 20 | margin-left: to-perc(10); 21 | 22 | flex-shrink: 0; 23 | } 24 | 25 | span { 26 | position: relative; 27 | 28 | &:after { 29 | position: absolute; 30 | bottom: 0px; 31 | left: 0px; 32 | content: ' '; 33 | width: 100%; 34 | height: 1px; 35 | background-color: #000; 36 | 37 | opacity: 0; 38 | transition: opacity .3s; 39 | } 40 | } 41 | 42 | &:hover { 43 | span { 44 | &:after { 45 | opacity: 1; 46 | } 47 | } 48 | } 49 | } 50 | 51 | .is-small, .is-extraSmall { 52 | .ButtonArrow { 53 | img { 54 | width: 6px; 55 | height: 10px; 56 | 57 | margin-right: 5px; 58 | margin-left: 5px; 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalContato/ModalContato.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalContato extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/fale-conosco'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <div class="text-center"> 15 | <p>Tem alguma dúvida sobre o #TEMMEUVOTO?<br/>Gostaria de confirmar alguma informação?</p> 16 | 17 | <p>Entre em contato com a gente: <a class="link" href="mailto:contato@temmeuvoto.com">contato@temmeuvoto.com</a></p> 18 | 19 | <p> 20 | <span class="medium color-gray1c">Assessoria de imprensa:</span><br/> 21 | Thalita Pires<br/> 22 | thalita@oficinadeimpacto.com.br<br/> 23 | 11 97200-0023 24 | </p> 25 | </div> 26 | `; 27 | 28 | return <ModalText {...this.props} title={'Fale-Conosco'} text={text}/> 29 | } 30 | } 31 | 32 | export default ModalContato; 33 | -------------------------------------------------------------------------------- /react-src/src/components/textinput/TextInput.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | 3 | .TextInput { 4 | & { 5 | position: relative; 6 | text-align: left; 7 | } 8 | 9 | &.is-error { 10 | input { 11 | border:1px solid #FF9191; 12 | } 13 | } 14 | 15 | input { 16 | -webkit-appearance: none; 17 | 18 | width: 100%; 19 | font-family: 'Ubuntu'; 20 | font-size:14px; 21 | color:#1c1c1c; 22 | box-sizing: border-box; 23 | 24 | background-color:#FFF; 25 | border: 1px solid #D2D0D2; 26 | border-radius:3px; 27 | 28 | padding: 10px; 29 | 30 | &::placeholder, &:-ms-input-placeholder, &::-ms-input-placeholder { 31 | color:#9A9898; 32 | opacity: 1; 33 | } 34 | } 35 | 36 | .error { 37 | font-size:14px; 38 | color:$red; 39 | font-style: italic; 40 | margin-top:5px; 41 | } 42 | } 43 | 44 | .is-small, .is-extraSmall { 45 | .TextInput { 46 | input { 47 | width: 100%; 48 | font-size:16px; 49 | padding:10px; 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /react-src/src/components/modalHelp/ModalHelp.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import { Modal, Icon, Spacer } from '../'; 6 | 7 | import './ModalHelp.scss'; 8 | 9 | class ModalHelp extends React.PureComponent { 10 | static propTypes = { 11 | visible: PropTypes.bool, 12 | onClose: PropTypes.func, 13 | 14 | title: PropTypes.string, 15 | text: PropTypes.string, 16 | } 17 | 18 | render() { 19 | const { visible, onClose, title, text } = this.props; 20 | 21 | return <Modal className="WrapModalHelp" visible={visible} onClose={onClose}> 22 | <div className="ModalHelp"> 23 | <div className="btn-close" onClick={onClose}> 24 | <Icon icon={Icon.icons.close} /> 25 | </div> 26 | 27 | <div className="size-36 color-white medium">{title}</div> 28 | 29 | <Spacer vertical={4}/> 30 | 31 | <div className="size-32 color-white medium text" dangerouslySetInnerHTML={{__html:text}}></div> 32 | </div> 33 | </Modal> 34 | } 35 | } 36 | 37 | export default ModalHelp; 38 | -------------------------------------------------------------------------------- /react-src/src/components/barTop/BarTop.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .BarTop { 5 | position: relative; 6 | z-index: $z-top - 10; 7 | 8 | .content-bartop { 9 | width: 100%; 10 | height: to-perc(112); 11 | background-color: #9E9E9E; 12 | 13 | .btn { 14 | cursor: pointer; 15 | 16 | width: to-perc(54); 17 | height: to-perc(54); 18 | 19 | border-radius: 50%; 20 | background-color: #1c1c1c; 21 | 22 | position: absolute; 23 | bottom: 0px; 24 | left: 50%; 25 | margin-left: to-perc(-27); 26 | margin-bottom: to-perc(-27); 27 | 28 | box-shadow: 2px 5px 20px #c1c1c1; 29 | 30 | img { 31 | width: 100%; 32 | height: auto; 33 | } 34 | } 35 | } 36 | } 37 | 38 | .is-extraSmall, .is-small { 39 | .BarTop { 40 | height: 80px; 41 | 42 | .content-bartop { 43 | position: fixed; 44 | top: 0px; 45 | left: 0px; 46 | 47 | height: 80px; 48 | 49 | .btn { 50 | width: 54px; 51 | height: 54px; 52 | 53 | margin-left: -27px; 54 | margin-bottom: -27px; 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalTecnologia/ModalTecnologia.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalTecnologia extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/tecnologia'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p>A programação do #TEMMEUVOTO é feita em código aberto, dando total transparência à plataforma.</p> 15 | <p>A todo momento, o usuário pode apontar informações erradas preenchidas pelos candidatos ou mesmo pelo #TEMMEUVOTO.</p> 16 | <p>Todos os dados consolidados, sem nenhuma identificação individual, estarão disponíveis e com livre acesso no site da plataforma após o período eleitoral.</p> 17 | <p>Os dados pessoais assim como a escolha dos eleitores, nunca serão repassados aos candidatos ou partidos.</p> 18 | <p>Todas as regras e leis de privacidade de dados estão sendo e serão rigorosamente cumpridas.</p> 19 | `; 20 | 21 | return <ModalText {...this.props} title={'Tecnologia'} text={text}/> 22 | } 23 | } 24 | 25 | export default ModalTecnologia; 26 | -------------------------------------------------------------------------------- /react-src/src/components/textinput/TextInput.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import InputMask from 'react-input-mask'; 7 | 8 | import './TextInput.scss'; 9 | 10 | class TextInput extends React.PureComponent { 11 | static propTypes = { 12 | placeholder:PropTypes.string, 13 | value:PropTypes.string, 14 | 15 | onChange:PropTypes.func, 16 | onBlur:PropTypes.func, 17 | 18 | error:PropTypes.string, 19 | 20 | mask:PropTypes.string, 21 | 22 | type:PropTypes.string, 23 | } 24 | 25 | static defaultProps = { 26 | type:'text', 27 | } 28 | 29 | render() { 30 | const {placeholder, value, error, type, mask} = this.props; 31 | 32 | const Comp = mask ? InputMask : "input"; 33 | 34 | return <div className={cls('TextInput', {'is-error':!!error})}> 35 | <Comp type={type} mask={mask} value={value} autoComplete={'off'} placeholder={placeholder} onChange={this.props.onChange} onBlur={this.props.onBlur}/> 36 | 37 | {!!error && <div className="error">{error}</div>} 38 | </div> 39 | } 40 | } 41 | 42 | export default TextInput; 43 | -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/boxMap/BoxMap.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/helpers'; 2 | 3 | .BoxMap { 4 | position: relative; 5 | 6 | display: inline-block; 7 | vertical-align: top; 8 | text-align: left; 9 | 10 | width: to-perc(570); 11 | height: to-perc(340); 12 | 13 | background-color: #FFF; 14 | 15 | border-radius: 4px; 16 | 17 | box-shadow: 5px 5px 20px #e6e6e6; 18 | 19 | .image { 20 | width: 100%; 21 | height: 100%; 22 | padding: to-perc(50); 23 | margin-top: to-perc(-20); 24 | 25 | img { 26 | margin: auto; 27 | height: 100%; 28 | } 29 | } 30 | 31 | .content { 32 | padding: to-perc(30); 33 | 34 | position: absolute; 35 | left: 0px; 36 | bottom: 0px; 37 | 38 | .text { 39 | color: #787878; 40 | font-style: italic; 41 | } 42 | } 43 | } 44 | 45 | .is-small, .is-extraSmall { 46 | .BoxMap { 47 | width: 100%; 48 | height: 260px; 49 | margin-top: 20px; 50 | overflow: hidden; 51 | 52 | .content { 53 | padding: 20px; 54 | } 55 | 56 | .image { 57 | width: 150px; 58 | margin: 0px auto; 59 | padding: 10px; 60 | img { 61 | width: 100%; 62 | height: auto; 63 | } 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /react-src/src/components/textarea/TextArea.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | 3 | .TextArea { 4 | & { 5 | position: relative; 6 | text-align: left; 7 | } 8 | 9 | &.is-error { 10 | input { 11 | border:1px solid #FF9191; 12 | } 13 | } 14 | 15 | textarea { 16 | width: 100%; 17 | font-family: 'Ubuntu'; 18 | font-size:14px; 19 | color:#1c1c1c; 20 | box-sizing: border-box; 21 | 22 | background-color:#FFF; 23 | border:1px solid #D2D0D2; 24 | border-radius:3px; 25 | 26 | height:200px; 27 | 28 | padding: 10px; 29 | resize: none; 30 | 31 | &::placeholder, &:-ms-input-placeholder, &::-ms-input-placeholder { 32 | color:#9A9898; 33 | opacity: 1; 34 | } 35 | } 36 | 37 | .count { 38 | text-align:right; 39 | } 40 | 41 | .error { 42 | font-size:14px; 43 | color: $red; 44 | font-style: italic; 45 | margin-top:5px; 46 | } 47 | } 48 | 49 | .is-small, .is-extraSmall { 50 | .TextArea { 51 | textarea { 52 | width: 100%; 53 | font-size:16px; 54 | padding:10px; 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/listState/ListState.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {state} from "cerebral/tags"; 6 | import {connect} from "@cerebral/react"; 7 | 8 | import {Scrollbar} from '../../../components/'; 9 | 10 | import './ListState.scss'; 11 | 12 | import {trackEvent} from "../../../utils/GAUtil"; 13 | 14 | class ListState extends React.PureComponent { 15 | static propTypes = { 16 | onClick: PropTypes.func, 17 | } 18 | 19 | onClick = (state) => { 20 | trackEvent('fase3/localizacao', 'click', 'selecionou-cidade'); 21 | 22 | this.props.onClick(state); 23 | } 24 | 25 | renderStates = () => { 26 | const {estados} = this.props.config; 27 | 28 | return estados.map((v) => { 29 | return <div className={'item size-20'} key={v.uf} 30 | onClick={this.onClick.bind(this, v)}>{v.name} - {v.uf}</div> 31 | }) 32 | } 33 | 34 | render() { 35 | return <div className='ListState'> 36 | <Scrollbar className={'list'}> 37 | {this.renderStates()} 38 | </Scrollbar> 39 | </div>; 40 | } 41 | } 42 | 43 | export default connect({ 44 | config: state`app.config`, 45 | }, ListState); 46 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalText/ModalText.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import './ModalText.scss'; 9 | 10 | import {ModalBarTop, Spacer, Scrollbar} from "../../../components"; 11 | 12 | class ModalText extends Component { 13 | static propTypes = { 14 | title: PropTypes.string, 15 | text: PropTypes.string, 16 | } 17 | 18 | constructor(props) { 19 | super(props); 20 | } 21 | 22 | render() { 23 | const {title, text, onClose} = this.props; 24 | 25 | return <div className={'ModalText'}> 26 | <ModalBarTop visible={true} onClose={this.props.onClose}> 27 | 28 | <div className={'modaltext-title size-28'}>{title}</div> 29 | 30 | <Scrollbar> 31 | <div className={'content-scrollbar size-15 color-gray78'} 32 | dangerouslySetInnerHTML={{__html: text}}></div> 33 | </Scrollbar> 34 | 35 | <Spacer vertical={4}/> 36 | </ModalBarTop> 37 | </div> 38 | } 39 | } 40 | 41 | export default connect({ 42 | media: state`useragent.media`, 43 | }, ModalText); 44 | -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/mapa/Mapa.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import './Mapa.scss'; 9 | 10 | import {Button, Spacer} from "../../../../components"; 11 | 12 | import ContentMatch from '../../contentMatch/ContentMatch'; 13 | 14 | class Mapa extends Component { 15 | static propTypes = { 16 | state:PropTypes.any, 17 | 18 | onYesClick:PropTypes.func, 19 | onNoClick:PropTypes.func, 20 | } 21 | 22 | render() { 23 | const {state: {name, image}} = this.props; 24 | 25 | return <ContentMatch className={'Mapa'} title={'É importante que seu candidato seja da sua cidade?'}> 26 | <Spacer/> 27 | 28 | <img className={'img'} src={'images/estados/' + image}/> 29 | 30 | <Spacer vertical={2}/> 31 | 32 | <div className={'btns'}> 33 | <Button title={'SIM'} onClick={this.props.onYesClick}/> 34 | 35 | <Spacer horizontal={2}/> 36 | 37 | <Button title={'NÃO'} onClick={this.props.onNoClick}/> 38 | </div> 39 | </ContentMatch> 40 | } 41 | } 42 | 43 | export default connect({}, Mapa); 44 | 45 | -------------------------------------------------------------------------------- /react-src/src/components/modalBarTop/ModalBarTop.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {BarTop} from '../'; 6 | 7 | import './ModalBarTop.scss'; 8 | 9 | class ModalBarTop extends React.Component { 10 | static propTypes = { 11 | visible: PropTypes.bool, 12 | onClose: PropTypes.func, 13 | 14 | noAddClass: PropTypes.bool, 15 | } 16 | 17 | constructor(props) { 18 | super(props); 19 | } 20 | 21 | componentDidMount() { 22 | window.scrollTo(0, 0); 23 | 24 | if (!this.props.noAddClass) 25 | document.body.classList.add('is-modal-top-open'); 26 | } 27 | 28 | 29 | componentWillUnmount() { 30 | if (document.querySelectorAll('.ModalBarTop').length <= 1) { 31 | document.body.classList.remove('is-modal-top-open'); 32 | } 33 | } 34 | 35 | render() { 36 | const {visible, onClose} = this.props; 37 | 38 | if (!visible) 39 | return null; 40 | 41 | return <div className="ModalBarTop"> 42 | <BarTop onClick={onClose}/> 43 | 44 | <div className={'container'}> 45 | {this.props.children} 46 | </div> 47 | </div> 48 | } 49 | } 50 | 51 | export default ModalBarTop; 52 | -------------------------------------------------------------------------------- /app/.htaccess: -------------------------------------------------------------------------------- 1 | php_value short_open_tag 1 2 | 3 | <IfModule mod_rewrite.c> 4 | RewriteEngine on 5 | 6 | RewriteCond %{HTTP:Authorization} ^(.*) 7 | RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] 8 | 9 | RewriteCond %{REQUEST_FILENAME} !-d 10 | RewriteCond %{REQUEST_FILENAME} !-f 11 | RewriteRule ^ site/index.php 12 | 13 | #php_flag log_errors on 14 | #php_value error_log D:\www\2018\temmeuvoto\website\PHP_errors.log 15 | </IfModule> 16 | 17 | <IfModule mod_deflate.c> 18 | AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/x-javascript text/xml application/xhtml+xml application/xml application/x-httpd-php application/x-httpd-fastphp 19 | </IfModule> 20 | 21 | <IfModule dir_module> 22 | DirectoryIndex site/index.php 23 | </IfModule> 24 | 25 | <FilesMatch ".(ico|jpg|jpeg|png|gif|woff2|woff|ttf|otf)$"> 26 | Header set Vary "Accept-Encoding" 27 | Header set Cache-Control "max-age=1800, public" 28 | 29 | RequestHeader unset Cookie 30 | Header unset Cookie 31 | Header unset Set-Cookie 32 | </FilesMatch> 33 | 34 | <FilesMatch ".(js|css)$"> 35 | Header set Vary "Accept-Encoding" 36 | Header set Cache-Control "max-age=900, public" 37 | 38 | RequestHeader unset Cookie 39 | Header unset Cookie 40 | Header unset Set-Cookie 41 | </FilesMatch> -------------------------------------------------------------------------------- /react-src/src/pages/match/footerMatch/FooterMatch.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .FooterMatch { 5 | .content-barcandidatos { 6 | width: to-perc(656); 7 | margin: auto; 8 | 9 | border-bottom: 3px solid #000; 10 | 11 | .text { 12 | span { 13 | cursor: pointer; 14 | margin-left: 20px; 15 | text-decoration: underline; 16 | } 17 | } 18 | 19 | .list { 20 | display: flex; 21 | flex-direction: row; 22 | 23 | justify-content: space-between; 24 | align-items: center; 25 | 26 | .item { 27 | width: 100%; 28 | 29 | .total { 30 | margin-top: to-perc(5); 31 | } 32 | } 33 | } 34 | } 35 | } 36 | 37 | .is-small, .is-extraSmall { 38 | .FooterMatch { 39 | position: fixed; 40 | bottom: 0px; 41 | left: 0px; 42 | right: 0px; 43 | 44 | background-color: #808080; 45 | 46 | .content-barcandidatos { 47 | width: 100%; 48 | border: 0px; 49 | margin: 0px; 50 | padding: 10px; 51 | 52 | .text { 53 | color: #FFF; 54 | font-size: 16px; 55 | font-weight: 400; 56 | width: 250px; 57 | margin: auto; 58 | } 59 | 60 | .Spacer { 61 | display: none; 62 | } 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /react-src/src/modules/AppModule.js: -------------------------------------------------------------------------------- 1 | import {Module} from 'cerebral' 2 | 3 | import {set, wait, when} from 'cerebral/operators' 4 | import {state, props} from 'cerebral/tags' 5 | 6 | import {post, get, APIResponse} from "./services"; 7 | 8 | export default Module({ 9 | state: { 10 | requestInit: APIResponse(), 11 | config: null, 12 | 13 | modal: '', 14 | modalData: null, 15 | 16 | menu: false, 17 | }, 18 | signals: { 19 | openModal: [ 20 | set(state`app.modal`, props`modal`), 21 | ({props, state}) => { 22 | if (props.modalData) { 23 | state.set('app.modalData', props.modalData); 24 | } 25 | }, 26 | ], 27 | closeModal: [ 28 | set(state`app.modal`, null), 29 | set(state`app.modalData`, null) 30 | ], 31 | 32 | openMenu: [ 33 | set(state`app.menu`, true) 34 | ], 35 | closeMenu: [ 36 | set(state`app.menu`, false) 37 | ], 38 | 39 | initApp: [ 40 | ...get('api/config', 'app.requestInit'), { 41 | success: [ 42 | set(state`app.config`, props`response.result`) 43 | ], 44 | error: [] 45 | } 46 | ] 47 | } 48 | }); -------------------------------------------------------------------------------- /react-src/src/components/button/Button.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import cls from 'classnames'; 3 | 4 | import PropTypes from 'prop-types'; 5 | 6 | import './Button.scss'; 7 | 8 | class Button extends React.PureComponent { 9 | static propTypes = { 10 | title: PropTypes.string, 11 | loading: PropTypes.bool, 12 | onClick: PropTypes.func, 13 | className: PropTypes.string, 14 | 15 | disabled: PropTypes.bool, 16 | 17 | theme: PropTypes.oneOf(['dark', 'dark-border', 'voto']), 18 | } 19 | 20 | static defaultProps = { 21 | className: '', 22 | theme: 'dark' 23 | } 24 | 25 | onClick = () => { 26 | const { loading } = this.props; 27 | 28 | if (!loading) { 29 | this.props.onClick(); 30 | } 31 | } 32 | 33 | render() { 34 | const { title, loading, className, theme, disabled, small} = this.props; 35 | 36 | return <div className={cls('Button', 'theme-' + theme, { 'is-loading': loading }, { 'is-disabled': disabled }, className)} onClick={this.onClick}> 37 | <span className={'size-12'}>{title}</span> 38 | 39 | {loading && <div className="loadingContent"> 40 | <div className="loading" /> 41 | </div>} 42 | </div>; 43 | } 44 | } 45 | 46 | export default Button; 47 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalOndeDados/ModalOndeDados.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalOndeDados extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('interna/de-onde-vem-os-dados'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p> As informaçõees disponibilizadas aqui são obtidas a partir de fontes públicas oficiais, como o TSE, STF, STJ, TJs, TRFs e pelos próprios candidatos.</p> 15 | 16 | <p>Para a leitura de processos e condenações, utilizamos a base de dados do Instituto ReclameAqui, aplicada no app Detector de Ficha de Políticos, que utiliza reconhecimento facial para detectar os processos de corrupção e improbidade administrativa que cada político responde na justiça brasileira.</p> 17 | 18 | <p>Para os demais filtros, foram utilizados dados disponibilizados pelo TSE ou informações registradas pelos próprios candidatos em seus perfis.</p> 19 | 20 | <p>Caso encontre algo errado, entre em contato com a gente pelo e-mail contato@temmeuvoto.com</p> 21 | `; 22 | 23 | return <ModalText {...this.props} title={'De onde vem os dados'} text={text}/> 24 | } 25 | } 26 | 27 | export default ModalOndeDados; 28 | -------------------------------------------------------------------------------- /react-src/src/pages/localizacao/boxMap/BoxMap.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {Spacer, ButtonArrow} from "../../../components"; 6 | 7 | import './BoxMap.scss'; 8 | 9 | class BoxMap extends React.PureComponent { 10 | static propTypes = { 11 | state: PropTypes.shape({ 12 | id: PropTypes.any, 13 | name: PropTypes.string, 14 | uf: PropTypes.string, 15 | }), 16 | onChangeClick: PropTypes.func, 17 | } 18 | 19 | constructor(props) { 20 | super(props); 21 | } 22 | 23 | render() { 24 | const {state: {name, image}} = this.props; 25 | 26 | return <div className='BoxMap'> 27 | 28 | <div className={'image'}> 29 | <img src={'images/estados/' + image}/> 30 | </div> 31 | 32 | <div className={'content'}> 33 | <img src={require("./images/pin.png")}/> 34 | 35 | <Spacer vertical={.5}/> 36 | 37 | <div className={'size-26 medium'}>{name}</div> 38 | 39 | <div className={'size-15 medium text'}>baseado na sua localização atual</div> 40 | 41 | <Spacer/> 42 | 43 | <ButtonArrow title={'Alterar'} onClick={this.props.onChangeClick}/> 44 | </div> 45 | 46 | </div> 47 | } 48 | } 49 | 50 | export default BoxMap; 51 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalComoFunciona/ModalComoFunciona.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | 5 | import {trackPageview} from "../../../utils/GAUtil"; 6 | 7 | class ModalComoFunciona extends React.PureComponent { 8 | componentDidMount() { 9 | trackPageview('interna/como-funciona'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 | <p>Aqui você encontra uma série de informações sobre os candidatos a deputados estaduais, deputados federais e senadores.</p> 15 | 16 | <p>Você responde 7 perguntas sobre o que você quer para o Brasil. A cada resposta, uma seleção dos candidatos alinhados com o que você acredita aparecerá na tela. Quando chegar em 10 candidatos finalistas, o sistema disponibilizará informações indispensáveis sobre cada um: partido, mini biografia, sites oficiais, processos e condenações (quando houver), prioridades, posição ideológica, entre outras.</p> 17 | 18 | <p>Caberá a você se informar, refletir e decidir quem estará à frente do Brasil nos próximos anos.</p> 19 | 20 | <p>Para facilitar, também inserimos na plataforma os dados de candidatos a Presidente e Governador, porém eles não fazem match.</p> 21 | `; 22 | 23 | return <ModalText {...this.props} title={'Como Funciona'} text={text}/> 24 | } 25 | } 26 | 27 | export default ModalComoFunciona; 28 | -------------------------------------------------------------------------------- /react-src/src/components/favorite/Favorite.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import cls from 'classnames'; 5 | 6 | import './Favorite.scss'; 7 | 8 | class Favorite extends Component { 9 | static propTypes = { 10 | id: PropTypes.any 11 | } 12 | 13 | constructor(props) { 14 | super(props); 15 | 16 | const favorite = localStorage.getItem('favorite'); 17 | this.state = {selected: favorite ? JSON.parse(favorite)[props.id] : false} 18 | } 19 | 20 | onFavoriteClick = () => { 21 | const {id} = this.props; 22 | 23 | const selected = !this.state.selected; 24 | 25 | this.setState({selected}); 26 | 27 | let favorite = localStorage.getItem('favorite'); 28 | if (!favorite) 29 | favorite = {}; 30 | else 31 | favorite = JSON.parse(favorite); 32 | 33 | favorite[id] = selected; 34 | 35 | localStorage.setItem('favorite', JSON.stringify(favorite)); 36 | } 37 | 38 | render() { 39 | const {selected} = this.state; 40 | 41 | return <div className={cls("Favorite", {"is-selected": this.state.selected})} onClick={this.onFavoriteClick}> 42 | {!selected && <img src={require("./images/favorite.png")}/>} 43 | {selected && <img src={require("./images/favorite-check.png")}/>} 44 | </div> 45 | } 46 | } 47 | 48 | export default Favorite; 49 | -------------------------------------------------------------------------------- /react-src/src/pages/match/contentMatch/ContentMatch.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {connect} from '@cerebral/react'; 7 | import {state, signal} from 'cerebral/tags'; 8 | 9 | import './ContentMatch.scss'; 10 | 11 | import {Icon, Spacer} from "../../../components"; 12 | 13 | class ContentMatch extends Component { 14 | static propTypes = { 15 | title: PropTypes.string, 16 | text: PropTypes.string, 17 | className: PropTypes.string, 18 | 19 | onHelpClick: PropTypes.func, 20 | } 21 | static defaultProps = { 22 | className: '', 23 | } 24 | 25 | render() { 26 | const {title, text} = this.props; 27 | 28 | return <div className={cls("ContentMatch", this.props.className)}> 29 | {!!title && <div className={'text-center light size-24 title-contentmatch'}>{title}</div>} 30 | 31 | {!!title && <Spacer vertical={2}/>} 32 | 33 | <div className={'text-and-help'}> 34 | {!!text && <div className={'color-gray78 medium italic text-left'}>{text}</div>} 35 | 36 | {this.props.onHelpClick && <div className={'btn-help'} onClick={this.props.onHelpClick}> 37 | <Icon icon={Icon.icons.help} /> 38 | </div>} 39 | </div> 40 | 41 | {this.props.children} 42 | </div> 43 | } 44 | } 45 | 46 | export default connect({}, ContentMatch); 47 | -------------------------------------------------------------------------------- /react-src/webpack-config/dev-server.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var webpack = require('webpack'); 3 | var express = require('express'); 4 | var devMiddleware = require('webpack-dev-middleware'); 5 | var hotMiddleware = require('webpack-hot-middleware'); 6 | var fs = require('fs'); 7 | var config = require('./webpack.dev.js'); 8 | var proxyMiddleware = require('http-proxy-middleware'); 9 | 10 | var app = express(); 11 | var compiler = webpack(config); 12 | 13 | var bodyParser = require('body-parser'); 14 | 15 | app.get('/', function (req, res) { 16 | res.sendFile(path.join(__dirname, 'index-dev.html')); 17 | }); 18 | 19 | app.use(devMiddleware(compiler, { 20 | publicPath: config.output.publicPath, 21 | historyApiFallback: true 22 | })); 23 | 24 | app.use(hotMiddleware(compiler)); 25 | 26 | app.use(express.static(path.join(__dirname, '../../app/'))); 27 | 28 | //antes do bodyparser p/ não bugar o POST 29 | if (config.devServer.proxy) { 30 | const {proxy} = config.devServer; 31 | Object.keys(proxy).forEach(function (context) { 32 | app.use(proxyMiddleware(context, proxy[context])); 33 | }) 34 | } 35 | 36 | app.use(bodyParser.json({limit: '5mb'})); //json 37 | app.use(bodyParser.urlencoded({extended: false, limit: '5mb'})); //POST 38 | 39 | app.get('*', function (req, res) { 40 | res.sendFile(path.join(__dirname, 'index-dev.html')); 41 | }); 42 | 43 | let server = app.listen(3000, (server) => { 44 | console.log('Dev server listening at http://localhost:3000/'); 45 | }); 46 | 47 | server.timeout = 0; 48 | -------------------------------------------------------------------------------- /app/site/index.php: -------------------------------------------------------------------------------- 1 | <? 2 | mb_internal_encoding('utf8'); 3 | 4 | $importPathWeb = '../lib/auxteam/core/coding/Import.fw'; 5 | $classPathWeb = array("../lib/", "./", '../adminbase/'); 6 | 7 | //RODANDO LOCAL 8 | $importPathLocal = '../../../../frameworks/php/lib/auxteam/core/coding/Import.fw'; 9 | $classPathLocal = array("../../../../frameworks/php/lib/", "./", '../../../../frameworks/php/adminbase/'); 10 | 11 | if (file_exists($importPathWeb)) { 12 | include($importPathWeb); 13 | Import::setClasspath($classPathWeb); 14 | } else { 15 | include($importPathLocal); 16 | Import::setClasspath($classPathLocal); 17 | } 18 | 19 | include('../config.php'); 20 | Import::setRelativePath("../", "site/"); 21 | 22 | importFast("auxteam/core/App.fw"); 23 | importFast('auxteam/core/utils/ArrayUtil.fw'); 24 | importFast("template/Template.site"); 25 | importFast("utils/AppUtil.php"); 26 | importFast("utils/JWTUtil.php"); 27 | 28 | Log::$enabled = false; 29 | 30 | $app = new App($configs); 31 | $app->cacheAllSystemVars(array(), true, 5 * 60); 32 | 33 | $app->clearAllJS(); 34 | $app->clearAllCSS(); 35 | 36 | $app->registerDefaultDocument('home', 'modules/home/HomeDocument.site'); 37 | $app->registerDocument('api', 'modules/api/ApiDocument.site'); 38 | $app->registerDocument('share', 'modules/share/ShareDocument.site'); 39 | 40 | $template = new Template(); 41 | $app->setTemplate($template); 42 | 43 | $app->initGoByURL(); 44 | 45 | echo $app->render(); 46 | ?> 47 | -------------------------------------------------------------------------------- /react-src/src/components/candidatoInfo/CandidatoInfo.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | @import '../../styles/helpers'; 3 | 4 | .CandidatoInfo { 5 | text-align: center; 6 | 7 | width: to-perc(300); 8 | margin: 0px auto; 9 | 10 | .image { 11 | display: inline-block; 12 | vertical-align: top; 13 | background-color: #FFF; 14 | 15 | width: to-perc(130); 16 | height: to-perc(130); 17 | box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5); 18 | 19 | background-size: cover; 20 | background-position: top center; 21 | } 22 | 23 | .numbers { 24 | display: flex; 25 | flex-direction: row; 26 | justify-content: center; 27 | 28 | .number { 29 | display: flex; 30 | flex-direction: column; 31 | align-items: center; 32 | justify-content: center; 33 | 34 | flex-shrink: 0; 35 | 36 | width: to-perc(56); 37 | height: to-perc(56); 38 | //padding: to-perc(15) 0px; 39 | 40 | margin: 0px to-perc(10); 41 | 42 | border-radius: 4px; 43 | 44 | background-color: #FFF; 45 | box-shadow: 4px 3px 13px 1px rgba(0, 0, 0, 0.09); 46 | 47 | font-size: 36px; 48 | font-size: to-perc(36); 49 | } 50 | } 51 | } 52 | 53 | .is-extraSmall, .is-small { 54 | .CandidatoInfo { 55 | width: 100%; 56 | 57 | .image { 58 | width: 130px; 59 | height: 130px; 60 | } 61 | 62 | .numbers { 63 | .number { 64 | width: 52px; 65 | height: 52px; 66 | 67 | margin: 0px 5px; 68 | 69 | font-size: 28px; 70 | } 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /react-src/src/components/candidatoInfo/CandidatoInfo.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {Button, Spacer} from '../'; 7 | 8 | import {getMemoryRouter} from "../../utils/RouterUtils"; 9 | import {getImage} from "../../utils/AppUtils"; 10 | 11 | import './CandidatoInfo.scss'; 12 | 13 | class CandidatoInfo extends React.PureComponent { 14 | static propTypes = { 15 | data: PropTypes.any, 16 | } 17 | 18 | renderNumbers = (numero) => { 19 | return numero.toString().split('').map((v, k) => { 20 | return <div className={'number'} key={k}> 21 | <span className={'medium'}>{v}</span> 22 | </div> 23 | }) 24 | } 25 | 26 | render() { 27 | const {nome, partido, numero, cargo, image} = this.props.data; 28 | 29 | return <div className={'CandidatoInfo'}> 30 | <div className={'image'} style={{backgroundImage: `url(${getImage(image)})`}}></div> 31 | 32 | <Spacer vertical={3}/> 33 | 34 | <div className={'size-18 medium'}>{nome}</div> 35 | 36 | <Spacer vertical={2}/> 37 | 38 | <div className={'size-15'}>{partido}</div> 39 | 40 | <div className={'size-15 color-gray78 medium italic'}>Candidato a {cargo.name}</div> 41 | 42 | <Spacer vertical={3}/> 43 | 44 | <div className={'numbers'}> 45 | {this.renderNumbers(numero)} 46 | </div> 47 | </div> 48 | } 49 | } 50 | 51 | export default CandidatoInfo; 52 | -------------------------------------------------------------------------------- /react-src/src/modules/InviteModule.js: -------------------------------------------------------------------------------- 1 | import {Module} from 'cerebral' 2 | 3 | import {set, wait} from 'cerebral/operators' 4 | import {state, props} from 'cerebral/tags' 5 | 6 | import {post, get, APIResponse} from "./services"; 7 | import {resetFormCustom} from "./FormModule"; 8 | 9 | export default Module({ 10 | state: { 11 | requestInvite: APIResponse(), 12 | 13 | formEmail: { 14 | email: { 15 | value: null, 16 | validationRules: ['isRequired', 'isEmail'], 17 | isRequired: true, 18 | }, 19 | } 20 | }, 21 | signals: { 22 | sendInvite: [ 23 | prepareSendInvite, 24 | ...post('api/sendInvite', 'invite.requestInvite', props`variables`), { 25 | success: [ 26 | () => { 27 | alert("Mensagem enviada com sucesso!"); 28 | }, 29 | 30 | resetFormCustom(state`invite.formEmail`), 31 | set(state`app.modal`, ''), 32 | set(state`app.modalData`, null), 33 | ], 34 | error: [ 35 | ({state}) => { 36 | alert(state.get('invite.requestInvite.result.error.message')); 37 | } 38 | ] 39 | }, 40 | ] 41 | } 42 | }); 43 | 44 | function prepareSendInvite({props, forms}) { 45 | let data = forms.toJSON('invite.formEmail'); 46 | data.template = props.template; 47 | data.url = props.url; 48 | 49 | props.variables = data; 50 | } -------------------------------------------------------------------------------- /react-src/src/components/select/Select.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | 3 | .Select { 4 | &.is-error { 5 | input { 6 | border: 1px solid #FF9191; 7 | } 8 | } 9 | 10 | .wrap-select { 11 | position: relative; 12 | overflow: hidden; 13 | 14 | font-family: 'Ubuntu'; 15 | font-size: 14px; 16 | 17 | width: 100%; 18 | color: #1c1c1c; 19 | box-sizing: border-box; 20 | 21 | background-color: #FFF; 22 | border: 1px solid #D2D0D2; 23 | border-radius: 3px; 24 | 25 | padding: 10px; 26 | 27 | select { 28 | position: absolute; 29 | z-index: 10; 30 | 31 | top: 0px; 32 | left: 0px; 33 | bottom: 0px; 34 | right: 0px; 35 | 36 | width: 100%; 37 | height: 100%; 38 | 39 | opacity: 0; 40 | } 41 | 42 | input { 43 | background-color: transparent; 44 | width: 100%; 45 | border: 0px; 46 | border-radius: 0px; 47 | padding:0px; 48 | } 49 | } 50 | 51 | .arrow { 52 | position: absolute; 53 | top: 0px; 54 | right: 0px; 55 | 56 | padding: 12px; 57 | 58 | img { 59 | width: 15px; 60 | height: auto; 61 | } 62 | } 63 | 64 | .error { 65 | font-size: 14px; 66 | color: $red; 67 | font-style: italic; 68 | margin-top: 5px; 69 | } 70 | } 71 | 72 | .is-small, .is-extraSmall { 73 | .Select { 74 | width: 100%; 75 | font-size: 16px; 76 | 77 | .wrap-select { 78 | padding: 10px; 79 | 80 | input { 81 | -webkit-appearance: none; 82 | font-size: 16px; 83 | border: 0px; 84 | } 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/headerMatch/HeaderMatch.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import './HeaderMatch.scss'; 9 | 10 | import {ButtonArrow, Icon} from "../../../components"; 11 | 12 | class HeaderMatch extends Component { 13 | static propTypes = { 14 | onBackClick: PropTypes.func, 15 | onHelpClick: PropTypes.func, 16 | } 17 | 18 | onMenuClick = () => { 19 | this.props.signalOpenMenu(); 20 | } 21 | 22 | render() { 23 | const {step, media} = this.props; 24 | 25 | return <div className="HeaderMatch"> 26 | <div className={'item-left'}> 27 | {(this.props.onBackClick) && <ButtonArrow title={'Voltar'} left={true} onClick={this.props.onBackClick}/>} 28 | </div> 29 | 30 | {step && <div className={'size-17 color-gray78'}>Passo <span className={'color-black'}>{step}</span> - 6</div>} 31 | 32 | <div className={'item-right'}> 33 | {this.props.onHelpClick && <div className={'btn btn-help'} onClick={this.props.onHelpClick}> 34 | <Icon icon={Icon.icons.help} /> 35 | </div>} 36 | 37 | {(!media.large && !media.medium) && <div className={'btn'} onClick={this.onMenuClick}> 38 | <Icon icon={Icon.icons.menu} /> 39 | </div>} 40 | </div> 41 | </div> 42 | } 43 | } 44 | 45 | export default connect({media: state`useragent.media`, signalOpenMenu:signal`app.openMenu`}, HeaderMatch); 46 | -------------------------------------------------------------------------------- /react-src/src/pages/match/listaCandidatos/itemCandidato/ItemCandidato.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../styles/vars'; 2 | @import '../../../../styles/helpers'; 3 | 4 | .ItemCandidato { 5 | 6 | .wrap-itemcandidato { 7 | text-align: left; 8 | 9 | width: 100%; 10 | 11 | border-radius: 4px; 12 | background-color: #FFF; 13 | border: 2px solid #000; 14 | 15 | display: flex; 16 | flex-direction: row; 17 | justify-content: space-between; 18 | 19 | margin-bottom: to-perc(15); 20 | } 21 | 22 | .content-itemcandidato { 23 | display: flex; 24 | flex-direction: row; 25 | align-items: center; 26 | 27 | flex: 1; 28 | 29 | .image { 30 | width: to-perc(100); 31 | height: to-perc(100); 32 | background-size: cover; 33 | background-position: top center; 34 | 35 | flex-shrink: 0; 36 | } 37 | } 38 | 39 | &:last-child { 40 | margin-bottom: 0px; 41 | } 42 | 43 | .btn-change-mobile { 44 | display: none; 45 | } 46 | } 47 | 48 | .is-small, .is-extraSmall { 49 | .ItemCandidato { 50 | text-align: center; 51 | margin-bottom: 10px; 52 | 53 | .wrap-itemcandidato { 54 | margin: 0px; 55 | 56 | .ButtonArrow { 57 | display: none; 58 | } 59 | } 60 | 61 | .content-itemcandidato { 62 | .image { 63 | width: 100px; 64 | height: 100px; 65 | } 66 | } 67 | 68 | .btn-change-mobile { 69 | display: inline-block; 70 | vertical-align: top; 71 | 72 | padding: 15px 5px; 73 | 74 | .ButtonArrow { 75 | span { 76 | display: block !important; 77 | } 78 | } 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /react-src/src/components/info/Info.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {Logo, Button, Spacer, getRouter} from '../'; 7 | 8 | import './Info.scss'; 9 | 10 | class Info extends React.PureComponent { 11 | static propTypes = { 12 | image:PropTypes.string, 13 | title:PropTypes.string, 14 | text:PropTypes.string, 15 | 16 | theme:PropTypes.string, 17 | } 18 | 19 | static defaultProps = { 20 | theme:'default', 21 | } 22 | 23 | onBackClick = () =>{ 24 | getRouter().history.goBack(); 25 | } 26 | 27 | render() { 28 | const {image, title, text, theme} = this.props; 29 | 30 | const color = theme === 'default' ? 'color-white' : 'color-dark'; 31 | 32 | return <div className="Info"> 33 | <div className="content"> 34 | <Spacer vertical={4} /> 35 | 36 | <Logo theme={theme}/> 37 | 38 | <Spacer vertical={6} /> 39 | 40 | <img className="icon" src={image} /> 41 | 42 | <Spacer vertical={4} /> 43 | 44 | <div className={cls("title size-24 light", color)} dangerouslySetInnerHTML={{__html:title}}></div> 45 | 46 | <Spacer vertical={3} /> 47 | 48 | <div className={cls("text size-24 light", color)} dangerouslySetInnerHTML={{__html:text}}></div> 49 | 50 | <Spacer vertical={6} /> 51 | 52 | <Button title="VOLTAR" onClick={this.onBackClick} /> 53 | 54 | <Spacer vertical={4} /> 55 | </div> 56 | </div>; 57 | } 58 | } 59 | 60 | export default Info; 61 | -------------------------------------------------------------------------------- /react-src/src/components/loadingState/LoadingState.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/vars'; 2 | @import '../../styles/helpers'; 3 | 4 | .LoadingState { 5 | position: absolute; 6 | z-index: $z-top; 7 | 8 | top: 0px; 9 | left: 0px; 10 | right: 0px; 11 | bottom: 0px; 12 | 13 | display: flex; 14 | flex-direction: column; 15 | align-items: center; 16 | justify-content: center; 17 | transition: opacity .3s; 18 | 19 | background-color: #FFF; 20 | 21 | .content-loadingstate { 22 | position: relative; 23 | overflow: hidden; 24 | 25 | width: to-perc(485); 26 | height: to-perc(292); 27 | 28 | margin-top: to-perc(-50); 29 | 30 | .loading { 31 | opacity: 0; 32 | 33 | position: absolute; 34 | top: 0px; 35 | left: 0px; 36 | width: 100%; 37 | height: 100%; 38 | overflow: hidden; 39 | 40 | transition: height 2s ease-in-out; 41 | 42 | img { 43 | margin: auto; 44 | width: to-perc(327); 45 | height: to-perc(292); 46 | } 47 | 48 | &.none { 49 | z-index: 2; 50 | height: 100%; 51 | } 52 | 53 | &.fill { 54 | z-index: 1; 55 | } 56 | } 57 | } 58 | 59 | &.is-start { 60 | .loading { 61 | opacity: 1; 62 | } 63 | 64 | .loading.none { 65 | height: 0%; 66 | } 67 | } 68 | } 69 | 70 | .is-small, .is-extraSmall { 71 | .LoadingState { 72 | height: 100vh; 73 | 74 | .content-loadingstate { 75 | width: 300px; 76 | height: 268px; 77 | margin-top: -100px; 78 | } 79 | 80 | .loading img { 81 | width: 100%; 82 | height: auto; 83 | } 84 | 85 | .text-loading { 86 | text-align: center; 87 | padding:0px 30px; 88 | } 89 | 90 | } 91 | } -------------------------------------------------------------------------------- /react-src/src/Stage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cls from 'classnames'; 3 | 4 | import {connect} from '@cerebral/react'; 5 | import {state, signal} from 'cerebral/tags'; 6 | 7 | import Routes from './Routes'; 8 | import {Loading, ErrorRequest} from "./components"; 9 | 10 | class Stage extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | } 14 | 15 | componentDidMount() { 16 | this.props.signalInitApp(); 17 | } 18 | 19 | onTryPress = () => { 20 | this.props.signalInitApp(); 21 | } 22 | 23 | getMediaType = () => { 24 | const {media} = this.props; 25 | 26 | let mediaType = 'extraSmall'; //mobile tablet < 1024 27 | if (media.large) { 28 | mediaType = 'large'; // >= 1440 29 | } else if (media.medium) { 30 | mediaType = 'medium'; // > 1024 // < 1440 31 | } else if (media.small) { 32 | mediaType = 'small'; // > 768 < 1024 //TABLET VERTICAL 33 | } 34 | 35 | return mediaType; 36 | } 37 | 38 | render() { 39 | const {user, requestInit} = this.props; 40 | 41 | const {loading, error, status} = requestInit; 42 | 43 | return <div className={cls("Stage", "is-" + this.getMediaType())}> 44 | <div id="container-modal"></div> 45 | 46 | {!!loading && <div className={'loading-center'}> 47 | <Loading/> 48 | </div>} 49 | 50 | {status === 200 && <Routes/>} 51 | 52 | {!!error && <ErrorRequest onClick={this.onTryPress}/>} 53 | </div>; 54 | } 55 | } 56 | 57 | export default connect({ 58 | requestInit: state`app.requestInit`, 59 | signalInitApp: signal`app.initApp`, 60 | media: state`useragent.media` 61 | }, Stage); -------------------------------------------------------------------------------- /react-src/src/styles/sizes.scss: -------------------------------------------------------------------------------- 1 | @import "helpers"; 2 | 3 | .size-10 { 4 | font-size: 10px; 5 | font-size: to-perc(10); 6 | } 7 | 8 | .size-12 { 9 | font-size: 12px; 10 | font-size: to-perc(12); 11 | } 12 | 13 | .size-14 { 14 | font-size: 14px; 15 | font-size: to-perc(14); 16 | } 17 | 18 | .size-15 { 19 | font-size: 15px; 20 | font-size: to-perc(15); 21 | } 22 | 23 | .size-16 { 24 | font-size: 16px; 25 | font-size: to-perc(16); 26 | } 27 | 28 | .size-17 { 29 | font-size: 17px; 30 | font-size: to-perc(17); 31 | } 32 | 33 | .size-18 { 34 | font-size: 18px; 35 | font-size: to-perc(18); 36 | } 37 | 38 | .size-20 { 39 | font-size: 20px; 40 | font-size: to-perc(20); 41 | } 42 | 43 | .size-24 { 44 | font-size: 24px; 45 | font-size: to-perc(24); 46 | } 47 | 48 | .size-26 { 49 | font-size: 26px; 50 | font-size: to-perc(26); 51 | } 52 | 53 | .size-28 { 54 | font-size: 28px; 55 | font-size: to-perc(28); 56 | } 57 | 58 | .size-34 { 59 | font-size: 34px; 60 | font-size: to-perc(34); 61 | } 62 | 63 | .is-small, .is-extraSmall { 64 | .size-10 { 65 | font-size: 10px; 66 | } 67 | .size-12 { 68 | font-size: 12px; 69 | } 70 | .size-14 { 71 | font-size: 14px; 72 | } 73 | .size-15 { 74 | font-size: 15px; 75 | } 76 | .size-16 { 77 | font-size: 16px; 78 | } 79 | .size-17 { 80 | font-size: 17px; 81 | } 82 | .size-18 { 83 | font-size: 18px; 84 | } 85 | .size-20 { 86 | font-size: 20px; 87 | } 88 | .size-24 { 89 | font-size: 22px; 90 | } 91 | .size-26 { 92 | font-size: 26px; 93 | } 94 | .size-28 { 95 | font-size: 28px; 96 | } 97 | .size-34 { 98 | font-size: 28px; //TOOD 99 | } 100 | } -------------------------------------------------------------------------------- /react-src/src/utils/CerebralUtils.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment'; 2 | 3 | export function isCpf(value, form, arg) { 4 | value = value.split('.').join('').replace("-", ""); 5 | 6 | if(value.length!=11){ 7 | return false; 8 | } 9 | let Soma; 10 | let Resto; 11 | Soma = 0; 12 | if (value == "00000000000" || 13 | value == "11111111111" || 14 | value == "22222222222" || 15 | value == "33333333333" || 16 | value == "44444444444" || 17 | value == "55555555555" || 18 | value == "66666666666" || 19 | value == "77777777777" || 20 | value == "88888888888" || 21 | value == "99999999999") return false; 22 | 23 | for (let i = 1; i <= 9; i++) Soma = Soma + parseInt(value.substring(i - 1, i)) * (11 - i); 24 | Resto = (Soma * 10) % 11; 25 | 26 | if ((Resto == 10) || (Resto == 11)) Resto = 0; 27 | if (Resto != parseInt(value.substring(9, 10))) return false; 28 | 29 | Soma = 0; 30 | for (let i = 1; i <= 10; i++) Soma = Soma + parseInt(value.substring(i - 1, i)) * (12 - i); 31 | Resto = (Soma * 10) % 11; 32 | 33 | if ((Resto == 10) || (Resto == 11)) Resto = 0; 34 | if (Resto != parseInt(value.substring(10, 11))) return false; 35 | 36 | return true; 37 | } 38 | 39 | export function isPhone(value, arg, get) { 40 | value = value.split(' ').join('').replace("-", ""); 41 | return value.length > 9; 42 | } 43 | 44 | export function isRequired(value, arg, get) { 45 | return value ? !!value.toString().replace(/ /g, '') : false; 46 | } 47 | 48 | export function isDate(value, arg, get) { 49 | if (!value) { 50 | return true; 51 | } 52 | return value && value.length === 10 53 | ? moment(value, 'DD/MM/YYYY').isValid() 54 | : false; 55 | } -------------------------------------------------------------------------------- /app/site/utils/JWTUtil.php: -------------------------------------------------------------------------------- 1 | <? 2 | use \Firebase\JWT\JWT; 3 | 4 | class JWTUtil 5 | { 6 | private static $key = '@@@@@@@@@@@@@@@@@@@@'; 7 | 8 | public static function generateToken($data) 9 | { 10 | $tokenId = base64_encode(bin2hex(openssl_random_pseudo_bytes(32))); 11 | $issuedAt = time(); 12 | $notBefore = $issuedAt - 5; //Remove 5 seconds 13 | $expire = $notBefore + 60 * 60 * 24 * 30; // Adicionando 30 dias 14 | 15 | $data = [ 16 | 'iat' => $issuedAt, // Issued at: time when the token was generated 17 | 'jti' => $tokenId, // Json Token Id: an unique identifier for the token 18 | 'iss' => '@@@@@@@@@@@@', // Issuer 19 | 'nbf' => $notBefore, // Not before 20 | 'exp' => $expire, // Expire 21 | 'data' => $data 22 | ]; 23 | 24 | return JWT::encode($data, JWTUtil::$key, 'HS512'); 25 | } 26 | 27 | public static function isValidToken() 28 | { 29 | $data = JWTUtil::getDataToken(); 30 | 31 | return $data ? true : false; 32 | } 33 | 34 | public static function getDataToken() 35 | { 36 | $headers = getallheaders(); 37 | $headerAuth = @$headers['authorization'] ?: @$headers['Authorization']; 38 | 39 | if ($headerAuth) { 40 | list($jwt) = sscanf($headerAuth, 'Bearer %s'); 41 | 42 | if ($jwt) { 43 | try { 44 | $token = JWT::decode($jwt, JWTUtil::$key, array('HS512')); 45 | return $token; 46 | } catch (Exception $e) { 47 | //var_dump($e->getMessage()); 48 | } 49 | } 50 | } 51 | 52 | return null; 53 | } 54 | } 55 | 56 | ?> 57 | -------------------------------------------------------------------------------- /react-src/src/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import "vars.scss"; 2 | @import "carousel.scss"; 3 | @import "default.scss"; 4 | @import "sizes.scss"; 5 | @import "colors.scss"; 6 | 7 | body, html { 8 | position: relative; 9 | font-family: 'ubuntu', sans-serif; 10 | background-color: #F9F9F9; 11 | color: #1c1c1c; 12 | 13 | min-width: 320px; 14 | 15 | margin: 0px; 16 | padding: 0px; 17 | } 18 | 19 | body { 20 | &.is-modal-open { 21 | overflow: hidden; 22 | } 23 | } 24 | 25 | #react-loading { 26 | position: fixed; 27 | top: 0px; 28 | left: 0px; 29 | width: 100%; 30 | height: 100%; 31 | background-color: #FFF; 32 | 33 | .spinner { 34 | position: absolute; 35 | top: 50%; 36 | left: 50%; 37 | margin-left: -22px; 38 | margin-top: -22px; 39 | 40 | height: 45px; 41 | width: 45px; 42 | } 43 | 44 | .spinner span { 45 | border-radius: 40px; 46 | position: absolute; 47 | top: 0; 48 | bottom: 0; 49 | right: 0; 50 | left: 0; 51 | border: 3px solid $dark; 52 | opacity: 0; 53 | animation: scale 3s ease-out infinite; 54 | -webkit-animation: scale 3s ease-out infinite; 55 | } 56 | 57 | .spinner span:nth-child(2) { 58 | animation-delay: 2s; 59 | -webkit-animation-delay: 2s; 60 | } 61 | 62 | .spinner span:nth-child(3) { 63 | animation-delay: 1s; 64 | -webkit-animation-delay: 1s; 65 | } 66 | } 67 | 68 | @-webkit-keyframes scale { 69 | 0% { 70 | opacity: 0; 71 | -webkit-transform: scale(0); 72 | } 73 | 70% { 74 | opacity: 1; 75 | } 76 | 100% { 77 | opacity: 0; 78 | -webkit-transform: scale(1); 79 | } 80 | } 81 | 82 | @keyframes scale { 83 | 0% { 84 | opacity: 0; 85 | transform: scale(0); 86 | } 87 | 70% { 88 | opacity: 1; 89 | } 90 | 100% { 91 | opacity: 0; 92 | transform: scale(1); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/site/email/templateEmail.view: -------------------------------------------------------------------------------- 1 | <? 2 | $link = App::url(); 3 | $link = str_replace("admin/", "", App::url()); 4 | ?> 5 | 6 | <!DOCTYPE html> 7 | <html> 8 | <head> 9 | <meta charset="utf-8"> 10 | <meta http-equiv="Content-Language" content="pt-br"> 11 | <title>#temmeuvoto 12 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 27 | 28 | 37 | 38 | 39 | 40 | 49 | 50 |
23 | 24 |
29 | 30 | 31 | 34 | 35 |
32 | <@TARGET@> 33 |
36 |
41 | 42 | 43 | 46 | 47 |
44 |

Em caso de dúvidas entre em contato pelo email contato@temmeuvoto.com

45 |
48 |
51 | 52 | -------------------------------------------------------------------------------- /react-src/src/components/check/Check.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | @import '../../styles/helpers'; 3 | 4 | .Check { 5 | cursor: pointer; 6 | 7 | display: flex; 8 | align-items: center; 9 | text-align: left; 10 | 11 | background-color: #FFF; 12 | padding: to-perc(30) to-perc(20); 13 | 14 | margin: to-perc(10) 0px; 15 | 16 | .label { 17 | user-select: none; 18 | 19 | margin-left: to-perc(15); 20 | border-radius: 4px; 21 | font-weight: 300; 22 | 23 | color: $gray1c; 24 | } 25 | 26 | .circle { 27 | border: 1px solid #BBB7BD; 28 | border-radius: 50%; 29 | width: to-perc(32); 30 | height: to-perc(32); 31 | flex-shrink: 0; 32 | 33 | img { 34 | display: none; 35 | width: 100%; 36 | height: auto; 37 | } 38 | } 39 | 40 | &.is-selected { 41 | .circle { 42 | border: 1px solid transparent; 43 | 44 | img { 45 | display: block; 46 | } 47 | } 48 | 49 | .label { 50 | color: $gray1c; 51 | } 52 | } 53 | 54 | &.type-economia { 55 | padding: to-perc(10) to-perc(20); 56 | } 57 | 58 | &.type-prioridade { 59 | background-color: transparent; 60 | padding: to-perc(10); 61 | 62 | border-top: 1px solid #D8D8D8; 63 | 64 | margin: 0px; 65 | 66 | &:last-child { 67 | border-bottom: 1px solid #D8D8D8; 68 | } 69 | } 70 | } 71 | 72 | .is-extraSmall, .is-small { 73 | .Check { 74 | padding: 20px; 75 | margin:20px 0px; 76 | box-shadow: 4px 3px 13px 1px rgba(0,0,0,0.09); 77 | 78 | .label { 79 | margin-left: 15px; 80 | } 81 | 82 | .circle { 83 | width: 32px; 84 | height: 32px; 85 | } 86 | 87 | &.type-economia { 88 | padding: 10px 20px; 89 | } 90 | 91 | &.type-prioridade { 92 | margin: 0px; 93 | padding: 10px; 94 | box-shadow: none; 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /react-src/src/components/loadingState/LoadingState.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state} from 'cerebral/tags'; 7 | 8 | import cls from 'classnames'; 9 | 10 | import './LoadingState.scss'; 11 | import computeState from "../../modules/compute/computeState"; 12 | 13 | class LoadingState extends React.PureComponent { 14 | static propTypes = { 15 | onComplete: PropTypes.func, 16 | } 17 | 18 | constructor(props) { 19 | super(props); 20 | 21 | this.count = 0; 22 | 23 | this.state = {loading: false}; 24 | } 25 | 26 | handleImageLoaded = () => { 27 | this.count += 1; 28 | if (this.count >= 2) { 29 | this.setState({loading: true}) 30 | } 31 | } 32 | 33 | render() { 34 | let {state} = this.props; 35 | 36 | if (!state || !state.uf) 37 | return null; 38 | 39 | const uf = state.uf.toLowerCase(); 40 | 41 | return
42 |
43 |
44 | 45 |
46 | 47 |
48 | 49 |
50 |
51 | 52 |
Carregando lista de candidatos
para o estado d{state.prep} {state.name}. 54 |
55 |
; 56 | } 57 | } 58 | 59 | export default connect({state: computeState}, LoadingState); 60 | -------------------------------------------------------------------------------- /react-src/src/components/index.js: -------------------------------------------------------------------------------- 1 | import CandidatoVoto from "./candidatoVoto/CandidatoVoto"; 2 | 3 | export {default as Bg} from './bg/Bg'; 4 | export {default as Logo} from './logo/Logo'; 5 | export {default as Button} from './button/Button'; 6 | export {default as TextInput} from './textinput/TextInput'; 7 | export {default as ComponentConnect} from './componentConnect/ComponentConnect'; 8 | export {default as Spacer} from './spacer/Spacer'; 9 | export {default as Loading} from './loading/Loading'; 10 | export {default as Title} from './title/Title'; 11 | export {default as ContainerForm} from './containerForm/ContainerForm'; 12 | export {default as TextArea} from './textarea/TextArea'; 13 | export {default as Check} from './check/Check'; 14 | export {default as Checks} from './checks/Checks'; 15 | export {default as Icon} from './icon/Icon'; 16 | export {default as Modal} from './modal/Modal'; 17 | export {default as ModalHelp} from './modalHelp/ModalHelp'; 18 | export {default as Info} from './info/Info'; 19 | export {default as LogoResponsive} from './logoResponsive/LogoResponsive'; 20 | export {default as Scrollbar} from './scrollbar/Scrollbar'; 21 | export {default as BarTop} from './barTop/BarTop'; 22 | export {default as ErrorRequest} from './errorRequest/ErrorRequest'; 23 | export {default as ButtonArrow} from './buttonArrow/ButtonArrow'; 24 | export {default as ModalBarTop} from './modalBarTop/ModalBarTop'; 25 | export {default as Menu} from './menu/Menu'; 26 | export {default as LoadingState} from './loadingState/LoadingState'; 27 | export {default as CandidatoVoto} from './candidatoVoto/CandidatoVoto'; 28 | export {default as CandidatoInfo} from './candidatoInfo/CandidatoInfo'; 29 | export {default as Favorite} from './favorite/Favorite'; 30 | export {default as Select} from './select/Select'; 31 | 32 | export {getRouter} from './../utils/RouterUtils'; 33 | export computeState from './../modules/compute/computeState'; 34 | -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/cidade/Cidade.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../styles/vars'; 2 | @import '../../../../styles/helpers'; 3 | 4 | .Cidade { 5 | .content-city { 6 | width: to-perc(570); 7 | background-color: #FFF; 8 | 9 | border-radius: 4px; 10 | box-shadow: 5px 5px 20px #e6e6e6; 11 | 12 | padding: to-perc(40); 13 | 14 | text-align: center; 15 | 16 | .header-city { 17 | display: flex; 18 | flex-direction: row; 19 | justify-content: space-between; 20 | text-align: left; 21 | 22 | .img-state { 23 | display: flex; 24 | align-items: flex-end; 25 | 26 | width: to-perc(80); 27 | 28 | img { 29 | width: 100%; 30 | height: auto; 31 | } 32 | } 33 | } 34 | 35 | .line { 36 | width: 100%; 37 | height: 1px; 38 | background-color: #D8D8D8; 39 | } 40 | 41 | .input-city { 42 | position: relative; 43 | 44 | cursor: pointer; 45 | 46 | width: to-perc(270); 47 | min-height: to-perc(40); 48 | 49 | margin: auto; 50 | 51 | padding: to-perc(10) to-perc(20); 52 | border: 1px solid #D2D0D2; 53 | border-radius: 3px; 54 | background-color: #FFF; 55 | 56 | text-align: left; 57 | 58 | .Loading { 59 | position: absolute; 60 | top: 0px; 61 | left: 0px; 62 | right: 0px; 63 | bottom: 0px; 64 | } 65 | } 66 | 67 | .ButtonArrow { 68 | display: inline-block; 69 | vertical-align: top; 70 | } 71 | } 72 | } 73 | 74 | .is-small, .is-extraSmall { 75 | .Cidade { 76 | .content-city { 77 | width: 100%; 78 | padding: 40px; 79 | 80 | .header-city { 81 | .img-state { 82 | width: 80px; 83 | } 84 | } 85 | 86 | .input-city { 87 | width: 100%; 88 | min-height: 40px; 89 | padding: 10px 20px; 90 | } 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalProcessoCondenacao/ModalProcessoCondenacao.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ModalText from './../modalText/ModalText'; 4 | import {trackPageview} from "../../../utils/GAUtil"; 5 | 6 | class ModalProcessoCondenacao extends React.PureComponent { 7 | 8 | componentDidMount() { 9 | trackPageview('ajuda/processo-e-condenacao'); 10 | } 11 | 12 | render() { 13 | const text = ` 14 |

Compartilhamos aqui a base de dados do Detector de Ficha de Políticos, aplicativo realizado pelo Instituto ReclameAqui que consolida informações oficiais pulverizadas em diversas instâncias de tribunais como STF, STJ, TJs e TRFs.

15 | 16 |

São considerados aqui os seguintes processos, desde que ativos e que o candidato relacionado esteja sendo investigado:

17 | 18 |

a) Ações de improbidade administrativa;

19 |

b) Ações penais que versem sobre crimes como os de corrupção, peculato, lavagem de dinheiro, formação de quadrilha, entre outros;

20 |

c) Inquéritos relacionados a esses temas;

21 | 22 |

Não foram incluídos os crimes contra a honra.

23 | 24 |

Processos sob sigilo de Justiça não foram exibidos, uma vez que não constam na base de dados oficial dos tribunais.

25 | 26 |

A consolidação de informações referente aos deputados estaduais foram feitas seguindo os mesmos parâmetros adotados pelo Instituto ReclameAqui, mas são de responsabilidade do #TemMeuVoto e encontram-se em nossa base de dados.

27 | 28 |

Caso encontre algo errado nas informações disponibilizadas aqui, entre em contato com a gente pelo e-mail contato@temmeuvoto.com

29 | `; 30 | 31 | return 32 | } 33 | } 34 | 35 | export default ModalProcessoCondenacao; 36 | -------------------------------------------------------------------------------- /react-src/src/components/select/Select.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import './Select.scss'; 7 | 8 | class Select extends React.PureComponent { 9 | static propTypes = { 10 | placeholder: PropTypes.string, 11 | value: PropTypes.string, 12 | 13 | onChange: PropTypes.func, 14 | onBlur: PropTypes.func, 15 | 16 | error: PropTypes.string, 17 | 18 | data: PropTypes.array, 19 | } 20 | 21 | static defaultProps = {} 22 | 23 | renderItems = () => { 24 | const {data} = this.props; 25 | return data.map((v) => ()) 26 | } 27 | 28 | getLabel = () => { 29 | const {value, data} = this.props; 30 | if (!data) 31 | return ''; 32 | 33 | const item = data.filter((v) => v.id == value); 34 | 35 | if (!value || item.length === 0) 36 | return ''; 37 | 38 | return item[0].name; 39 | } 40 | 41 | onChange = (evt) => { 42 | this.props.onChange(evt); 43 | this.props.onBlur(evt); 44 | } 45 | 46 | render() { 47 | const {placeholder, value, error} = this.props; 48 | 49 | return
50 |
51 | 52 | 53 |
54 | 55 |
56 | 57 | 61 |
62 | 63 | {!!error &&
{error}
} 64 |
65 | } 66 | } 67 | 68 | export default Select; 69 | -------------------------------------------------------------------------------- /react-src/src/components/scrollbar/Scrollbar.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import cls from 'classnames'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state} from 'cerebral/tags'; 7 | 8 | import ScrollWrapper from 'react-customized-scrollbar' 9 | 10 | import './Scrollbar.scss'; 11 | 12 | class Scrollbar extends React.Component { 13 | componentDidMount() { 14 | // setTimeout(() => { 15 | // var evt = window.document.createEvent('UIEvents'); 16 | // evt.initUIEvent('resize', true, false, window, 0); 17 | // window.dispatchEvent(evt); 18 | // }) 19 | 20 | this.interval = setInterval(this.verifyScroll, 1000); 21 | setTimeout(() => this.verifyScroll()); 22 | } 23 | 24 | verifyScroll = () => { 25 | const elem = document.querySelector('.scrollbar-vertical'); 26 | if (elem) { 27 | if (elem.clientHeight == 0) { 28 | elem.parentElement.style.visibility = 'hidden'; 29 | } else { 30 | elem.parentElement.style.visibility = 'visible'; 31 | } 32 | } 33 | } 34 | 35 | componentWillUnmount() { 36 | clearInterval(this.interval); 37 | } 38 | 39 | render() { 40 | const {media} = this.props; 41 | 42 | if (!media.large && !media.medium) { 43 | return
44 | {this.props.children} 45 |
46 | } 47 | 48 | return 53 | {this.props.children} 54 | 55 | } 56 | } 57 | 58 | export default connect({media: state`useragent.media`}, Scrollbar); -------------------------------------------------------------------------------- /react-src/src/styles/default.scss: -------------------------------------------------------------------------------- 1 | a { 2 | cursor: pointer; 3 | text-decoration: none; 4 | } 5 | 6 | textarea, input { 7 | outline: none; 8 | } 9 | 10 | .relative { 11 | position: relative; 12 | } 13 | 14 | .light { 15 | font-weight: 100; 16 | } 17 | 18 | .upper { 19 | text-transform: uppercase; 20 | } 21 | 22 | .regular { 23 | font-weight: normal; 24 | } 25 | 26 | .bold { 27 | font-weight: bold; 28 | } 29 | 30 | .regular { 31 | font-weight: 400; 32 | } 33 | 34 | .medium { 35 | font-weight: 500; 36 | } 37 | 38 | .light { 39 | font-weight: 300; 40 | } 41 | 42 | .text-center { 43 | text-align: center; 44 | } 45 | 46 | .text-left { 47 | text-align: left; 48 | } 49 | 50 | .italic { 51 | font-style: italic; 52 | } 53 | 54 | div { 55 | box-sizing: border-box; 56 | } 57 | 58 | .clear { 59 | clear: both; 60 | } 61 | 62 | img { 63 | display: block; 64 | border: 0px; 65 | } 66 | 67 | .clearfix::after { 68 | content: ""; 69 | clear: both; 70 | display: table; 71 | } 72 | 73 | .no-underline { 74 | text-decoration: none; 75 | } 76 | 77 | .img-aspect { 78 | width: 100%; 79 | height: auto; 80 | display: block; 81 | margin: 0; 82 | opacity: 0; 83 | visibility: hidden; 84 | } 85 | 86 | input:-webkit-autofill { 87 | -webkit-box-shadow: 0 0 0 30px white inset; 88 | } 89 | 90 | .offline -ui { 91 | display: none; 92 | } 93 | 94 | .loading-center { 95 | width: 100%; 96 | height: 100vh; 97 | 98 | display: flex; 99 | justify-content: center; 100 | align-items: center; 101 | } 102 | 103 | .Routes { 104 | display: flex; 105 | flex-direction: row; 106 | 107 | .container-page { 108 | position: relative; 109 | width: 100%; 110 | } 111 | 112 | .container { 113 | position: relative; 114 | } 115 | } 116 | 117 | .is-extraSmall, .is-small { 118 | .Routes { 119 | display: block; 120 | flex-direction: initial; 121 | 122 | .container-page { 123 | padding: 0px 20px; 124 | } 125 | } 126 | 127 | .container { 128 | padding: 0px 20px; 129 | } 130 | } -------------------------------------------------------------------------------- /react-src/src/components/candidatoVoto/CandidatoVoto.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/colors'; 2 | @import '../../styles/helpers'; 3 | 4 | .CandidatoVoto { 5 | display: inline-block; 6 | vertical-align: top; 7 | text-align: left; 8 | 9 | margin-bottom: to-perc(50); 10 | 11 | .content-cadidatovoto { 12 | display: flex; 13 | flex-direction: row; 14 | align-items: center; 15 | 16 | background-color: #FFF; 17 | border-radius: 4px; 18 | 19 | width: to-perc(312); 20 | height: to-perc(100); 21 | overflow: hidden; 22 | 23 | .image { 24 | flex-shrink: 0; 25 | 26 | width: to-perc(100); 27 | height: to-perc(100); 28 | 29 | background-size: cover; 30 | background-position: top center; 31 | } 32 | 33 | .info { 34 | padding: to-perc(10); 35 | } 36 | } 37 | 38 | .total { 39 | text-align: center; 40 | 41 | padding: to-perc(5); 42 | background-color: #1c1c1c; 43 | color: #FFF; 44 | 45 | display: flex; 46 | flex-direction: row; 47 | align-items: center; 48 | 49 | .total-perc { 50 | flex-shrink: 0; 51 | width: to-perc(98); 52 | border-right:2px solid #FFF; 53 | } 54 | .total-text { 55 | width: 100%; 56 | text-align: center; 57 | } 58 | } 59 | 60 | .btns { 61 | display: flex; 62 | flex-direction: row; 63 | justify-content: space-between; 64 | 65 | .Button { 66 | width: 100%; 67 | } 68 | } 69 | } 70 | 71 | .is-extraSmall, .is-small { 72 | .CandidatoVoto { 73 | margin: auto; 74 | margin-bottom: 40px; 75 | width: 100%; 76 | 77 | .content-cadidatovoto { 78 | width: 100%; 79 | height: 100px; 80 | 81 | box-shadow: 4px 3px 13px 1px rgba(0, 0, 0, 0.09); 82 | 83 | .image { 84 | width: 100px; 85 | height: 100px; 86 | } 87 | 88 | .info { 89 | padding: 15px; 90 | } 91 | } 92 | 93 | .total { 94 | padding: 5px; 95 | .total-perc { 96 | width:100px; 97 | } 98 | } 99 | } 100 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/regiao/searchCity/SearchCity.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../styles/vars'; 2 | @import '../../../../styles/helpers'; 3 | 4 | .SearchCity { 5 | .input { 6 | position: relative; 7 | 8 | width: to-perc(200); 9 | 10 | padding: to-perc(5); 11 | border: 1px solid #D2D0D2; 12 | border-radius: 3px; 13 | 14 | display: flex; 15 | flex-direction: row; 16 | align-items: center; 17 | justify-content: center; 18 | 19 | margin: auto; 20 | 21 | img { 22 | display: inline-block; 23 | vertical-align: top; 24 | 25 | width: to-perc(16); 26 | height: auto; 27 | } 28 | 29 | input { 30 | width: 100%; 31 | padding: to-perc(5); 32 | margin: 0px; 33 | border: 0px; 34 | 35 | font-size: 14px; 36 | color: #1c1c1c; 37 | 38 | font-family: Ubuntu, Arial; 39 | 40 | margin-right: to-perc(30); 41 | } 42 | 43 | .Loading { 44 | width: to-perc(30); 45 | 46 | position: absolute; 47 | top: 0px; 48 | right: 0px; 49 | bottom: 0px; 50 | } 51 | } 52 | 53 | .Scrollbar { 54 | width: to-perc(200); 55 | height: to-perc(380); 56 | margin: auto; 57 | text-align: center; 58 | 59 | .list { 60 | .item { 61 | cursor: pointer; 62 | 63 | color: #acacac; 64 | 65 | padding: to-perc(10) 0px; 66 | 67 | text-align: center; 68 | font-style: italic; 69 | 70 | &:last-child { 71 | margin-bottom: 0px; 72 | } 73 | 74 | &:hover { 75 | color: #000; 76 | } 77 | } 78 | } 79 | 80 | } 81 | } 82 | 83 | .is-small, .is-extraSmall { 84 | .SearchCity { 85 | .input { 86 | width: 200px; 87 | padding: 5px; 88 | 89 | img { 90 | width: 16px; 91 | } 92 | 93 | input { 94 | width: 100%; 95 | padding:5px; 96 | margin-right: 30px; 97 | } 98 | 99 | .Loading { 100 | width: 30px; 101 | } 102 | } 103 | 104 | .Scrollbar { 105 | width: 300px; 106 | height: initial; 107 | 108 | .list { 109 | .item { 110 | padding: 10px 0px; 111 | } 112 | } 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /react-src/src/components/spacer/Spacer.js: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {connect} from '@cerebral/react'; 7 | import {state} from 'cerebral/tags'; 8 | 9 | import './Spacer.scss'; 10 | 11 | class Spacer extends React.Component { 12 | static propTypes = { 13 | horizontal: PropTypes.number, 14 | vertical: PropTypes.number, 15 | left: PropTypes.number, 16 | right: PropTypes.number, 17 | top: PropTypes.number, 18 | bottom: PropTypes.number, 19 | size: PropTypes.number, 20 | 21 | element: PropTypes.string, 22 | className: PropTypes.string 23 | } 24 | 25 | static defaultProps = { 26 | horizontal: 0, 27 | vertical: 1, 28 | element: 'div', 29 | size: 5, 30 | } 31 | 32 | render() { 33 | const {media, element, vertical, horizontal, left, right, top, bottom, className} = this.props; 34 | 35 | const size = (media.large || media.medium) ? this.props.size : this.props.size; 36 | 37 | let ml, mr, mt, mb; 38 | 39 | ml = mr = horizontal * size; 40 | mt = mb = vertical * size; 41 | 42 | if (left !== undefined) { 43 | ml = left * size; 44 | } 45 | if (right !== undefined) { 46 | mr = right * size; 47 | } 48 | if (top !== undefined) { 49 | mt = +top * size; 50 | } 51 | if (bottom !== undefined) { 52 | mb = +bottom * size; 53 | } 54 | 55 | let Elem = element; 56 | 57 | if (media.large || media.medium) { 58 | mt = (mt / 1440 * 100) + 'vw'; 59 | ml = (ml / 1440 * 100) + 'vw'; 60 | mb = (mb / 1440 * 100) + 'vw'; 61 | mr = (mr / 1440 * 100) + 'vw'; 62 | } else { 63 | mt = Math.round(mt)+"px"; 64 | ml = Math.round(ml)+"px"; 65 | mb = Math.round(mb)+"px"; 66 | mr = Math.round(mr)+"px"; 67 | } 68 | 69 | return 72 | {this.props.children} 73 | ; 74 | } 75 | } 76 | 77 | export default connect({media: state`useragent.media`}, Spacer); -------------------------------------------------------------------------------- /react-src/src/components/componentConnect/ComponentConnect.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import { connect } from '@cerebral/react'; 6 | import { field } from '@cerebral/forms'; 7 | 8 | import { state, signal, props } from 'cerebral/tags'; 9 | 10 | export class ComponentConnect extends React.Component { 11 | static propTypes = { 12 | path: PropTypes.string.isRequired, 13 | 14 | value: PropTypes.any, 15 | field: PropTypes.any, 16 | 17 | signalSetField: PropTypes.any, 18 | signalTouchedField: PropTypes.any, 19 | }; 20 | 21 | constructor(props) { 22 | super(props); 23 | } 24 | 25 | componentDidMount() { 26 | const { path, value, signalSetField } = this.props; 27 | 28 | if (value) { 29 | signalSetField({ path, value }); 30 | } 31 | } 32 | 33 | onBlur = (child, event) => { 34 | const { path, signalTouchedField } = this.props; 35 | signalTouchedField({ path }); 36 | 37 | if (child.props.onBlur) { 38 | child.props.onBlur(event); 39 | } 40 | }; 41 | 42 | onChange = (child, event, ...args) => { 43 | const { path, signalSetField } = this.props; 44 | 45 | const value = event && event.target ? event.target.value : event; 46 | 47 | signalSetField({ path, value }); 48 | 49 | if (child.props.onChange) { 50 | child.props.onChange(event, ...args); 51 | } 52 | }; 53 | 54 | render() { 55 | const { 56 | field: { touched, errorMessage, customErrorMessage, value, isValid }, 57 | } = this.props; 58 | 59 | return React.Children.map(this.props.children, child => { 60 | return React.cloneElement(child, { 61 | onChange: this.onChange.bind(this, child), 62 | onBlur: this.onBlur.bind(this, child), 63 | value, 64 | error: touched && !isValid ? (customErrorMessage ? customErrorMessage : errorMessage) : null, 65 | touched, 66 | }); 67 | })[0]; 68 | } 69 | } 70 | 71 | export default connect( 72 | { 73 | field: field(state`${props`path`}`), 74 | signalSetField: signal`form.setField`, 75 | signalTouchedField: signal`form.touchedField`, 76 | }, 77 | ComponentConnect 78 | ); 79 | -------------------------------------------------------------------------------- /react-src/src/pages/match/footerMatch/FooterMatch.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import {connect} from '@cerebral/react'; 6 | import {state, signal} from 'cerebral/tags'; 7 | 8 | import './FooterMatch.scss'; 9 | 10 | import {ButtonArrow, computeState, Spacer} from "../../../components"; 11 | import {formatNumber, getCargos} from "../../../utils/AppUtils"; 12 | import {trackEvent} from "../../../utils/GAUtil"; 13 | 14 | class FooterMatch extends Component { 15 | static propTypes = { 16 | requestMatch: PropTypes.any, 17 | state: PropTypes.any, 18 | } 19 | 20 | onNextClick = () => { 21 | trackEvent('fase3/match', 'click', 'botao_ver'); 22 | 23 | this.props.signalGoStep({step: '/transparencia'}); 24 | } 25 | 26 | /*renderCandidatos = () => { 27 | const {requestMatch: {result}, state: {uf}} = this.props; 28 | 29 | if (result) { 30 | return getCargos(result.data.list, uf).map((v, k) => { 31 | if (!v) 32 | return null; 33 | 34 | return
35 |
{v.name}
36 |
{formatNumber(v.total)}
37 |
38 | }) 39 | } 40 | 41 | return null; 42 | }*/ 43 | 44 | getTotal = () => { 45 | const {requestMatch: {result}} = this.props; 46 | 47 | if (result) { 48 | let total = 0; 49 | result.data.list.map((v) => { 50 | total += v.total * 1; 51 | }) 52 | 53 | return formatNumber(total); 54 | } 55 | 56 | return '-'; 57 | } 58 | 59 | render() { 60 | return
61 |
62 |
Total de candidatos 100% alinhados às suas 63 | respostas: {this.getTotal()} VER
64 | 65 |
66 |
67 | } 68 | } 69 | 70 | export default connect({ 71 | state: computeState, 72 | requestMatch: state`candidato.requestMatch`, 73 | 74 | signalGoStep: signal`candidato.goStep`, 75 | }, FooterMatch); 76 | -------------------------------------------------------------------------------- /react-src/webpack-config/index-dev.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Home 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 39 | 40 | 41 |
42 |
43 |
44 | 45 | 46 | 47 |
48 |
49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /react-src/src/pages/match/listaCandidatos/ListaCandidatos.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ListaCandidatos { 5 | .HeaderMatch { 6 | position: absolute; 7 | top: 0px; 8 | width: 100%; 9 | left: 0px; 10 | } 11 | 12 | .btn-help { 13 | cursor: pointer; 14 | 15 | position: absolute; 16 | top: to-perc(30); 17 | right: to-perc(30); 18 | } 19 | 20 | .ButtonArrow { 21 | padding-left: to-perc(20); 22 | } 23 | 24 | .btn-help-mobile { 25 | display: none; 26 | } 27 | 28 | .Scrollbar { 29 | width: to-perc(600); 30 | margin: 0px auto; 31 | 32 | height: to-perc(500); 33 | } 34 | 35 | .list { 36 | width: to-perc(570); 37 | margin: 0px auto; 38 | 39 | .item { 40 | width: 100%; 41 | 42 | border-radius: 4px; 43 | background-color: #FFF; 44 | padding: to-perc(25) to-perc(20); 45 | 46 | display: flex; 47 | justify-content: space-between; 48 | 49 | margin-bottom: to-perc(15); 50 | 51 | &.is-empty { 52 | border: 2px solid #000000; 53 | background-color: #e6e6e6; 54 | } 55 | 56 | &:last-child { 57 | margin-bottom: 0px; 58 | } 59 | } 60 | } 61 | } 62 | 63 | .is-small, .is-extraSmall { 64 | .ListaCandidatos { 65 | .HeaderMatch { 66 | position: relative; 67 | top: initial; 68 | width: 100%; 69 | left: initial; 70 | } 71 | 72 | .btn-help { 73 | display: none; 74 | } 75 | 76 | .ButtonArrow { 77 | padding-left: 0px; 78 | } 79 | 80 | .ContentMatch { 81 | padding-bottom: 10px; 82 | text-align: left; 83 | 84 | .Scrollbar { 85 | width: 100%; 86 | margin: auto; 87 | height: initial; 88 | } 89 | } 90 | 91 | .btn-help-mobile { 92 | display: block; 93 | 94 | position: relative; 95 | top: initial; 96 | right: initial; 97 | 98 | float: right; 99 | 100 | margin-bottom: 15px; 101 | } 102 | 103 | .list { 104 | width: 100%; 105 | 106 | .ButtonArrow { 107 | span { 108 | display: none; 109 | } 110 | } 111 | 112 | .item { 113 | padding: 25px 20px; 114 | margin-bottom: 15px; 115 | } 116 | } 117 | } 118 | } -------------------------------------------------------------------------------- /react-src/src/pages/match/listaCandidatos/itemCandidato/ItemCandidato.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | import cls from 'classnames'; 5 | 6 | import {connect} from '@cerebral/react'; 7 | import {state, signal} from 'cerebral/tags'; 8 | import {form} from '@cerebral/forms'; 9 | 10 | import './ItemCandidato.scss'; 11 | 12 | import {Spacer, ButtonArrow} from "../../../../components"; 13 | import {getMemoryRouter} from "../../../../utils/RouterUtils"; 14 | import {getImage} from "../../../../utils/AppUtils"; 15 | 16 | class ItemCandidato extends Component { 17 | static propTypes = { 18 | data: PropTypes.any, 19 | position: PropTypes.any, 20 | 21 | onClick: PropTypes.func, 22 | } 23 | 24 | onClick = () => { 25 | const {data: {cargo, cargo_codigo}, position, onClick} = this.props; 26 | 27 | if (onClick) { 28 | this.props.onClick(cargo, cargo_codigo, position); 29 | } else { 30 | getMemoryRouter().history.replace(`/lista-tipo-candidatos/${cargo.id}/${position}`) 31 | } 32 | } 33 | 34 | render() { 35 | const {id, nome, partido, numero, image, cargo} = this.props.data; 36 | 37 | return
38 |
{cargo && cargo.name ? cargo.name : cargo}
39 | 40 | 41 | 42 |
43 |
44 |
45 | 46 | 47 | 48 |
49 |
{nome}
50 | 51 |
{partido}
52 |
{numero}
53 |
54 | 55 | 56 |
57 | 58 | 59 |
60 | 61 |
62 | 63 |
64 |
65 | } 66 | } 67 | 68 | export default ItemCandidato; 69 | -------------------------------------------------------------------------------- /app/site/modules/share/ShareDocument.site: -------------------------------------------------------------------------------- 1 | defaultAction = 'foo'; 9 | } 10 | 11 | public function foo() 12 | { 13 | die(-1); 14 | } 15 | 16 | public function invite($foo='') { 17 | Template::$metaImage = App::url().'images/share.png'; 18 | Template::$metaTitle = App::$instance->getSystemVars('share_title'); 19 | Template::$metaDescription = App::$instance->getSystemVars('share_invite_desc'); 20 | 21 | App::$instance->getTemplate()->addChild(new Controller(new View('')), 'CRAWLER'); 22 | } 23 | 24 | public function candidatos($candidatos, $foo = '') 25 | { 26 | $names = array(); 27 | if ($candidatos) { 28 | $rs = DBUtil::select("select id, nome from candidato where id in (?)", array($candidatos), true)->getValues(); 29 | foreach ($rs as $k=>$v) { 30 | $names[] = $v['nome']; 31 | } 32 | } 33 | 34 | Template::$metaImage = App::url().'images/share.png'; 35 | Template::$metaTitle = App::$instance->getSystemVars('share_title'); 36 | 37 | $description = 'Esses são os candidatos que mais se alinham com o que eu quero para o Brasil. Eles #temmeuvoto '; 38 | $description .= "\n"; 39 | $description .= "\n"; 40 | $description .= join(',', $names); 41 | $description .= "\n"; 42 | $description .= "\n"; 43 | $description .= ' Acesse www.temmeuvoto.com, responda as perguntas e veja quais candidatos mais se alinham com o que você quer.'; 44 | 45 | Template::$metaDescription = $description; 46 | 47 | App::$instance->getTemplate()->addChild(new Controller(new View('')), 'CRAWLER'); 48 | } 49 | 50 | public function politico($ref_candidato, $foo = '') 51 | { 52 | Template::$metaImage = App::url().'images/share.png'; 53 | Template::$metaTitle = App::$instance->getSystemVars('share_title'); 54 | Template::$metaDescription = App::$instance->getSystemVars('share_candidato_desc'); 55 | 56 | App::$instance->getTemplate()->addChild(new Controller(new View('')), 'CRAWLER'); 57 | } 58 | } 59 | 60 | ?> 61 | -------------------------------------------------------------------------------- /react-src/src/pages/modals/modalSendEmail/ModalSendEmail.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | 3 | import {connect} from '@cerebral/react'; 4 | import {state, signal} from 'cerebral/tags'; 5 | import {form} from '@cerebral/forms'; 6 | 7 | import './ModalSendEmail.scss'; 8 | 9 | import {Button, ComponentConnect, ModalBarTop, Spacer, TextArea, TextInput} from "../../../components"; 10 | import {trackEvent} from "../../../utils/GAUtil"; 11 | 12 | class ModalSendEmail extends Component { 13 | constructor(props) { 14 | super(props); 15 | } 16 | 17 | onSendPress = () => { 18 | const {template, url, track} = this.props.modalData; 19 | 20 | trackEvent(track, 'form_submit', 'compartilhe/email/form/sucesso'); 21 | 22 | this.props.signalSendInvite({template, url}) 23 | } 24 | 25 | 26 | onEmailChange = () => { 27 | const {track} = this.props.modalData; 28 | 29 | if (!this.trackingEmail) { 30 | this.trackingEmail = true; 31 | trackEvent(track, 'form_filled', 'compartilhe/email/campo_email'); 32 | } 33 | } 34 | 35 | render() { 36 | /* 37 | invite 38 | candidatos 39 | candidato 40 | */ 41 | 42 | const {form} = this.props; 43 | 44 | return
45 | 46 | 47 | 48 | 49 |
Enviar Email
50 | 51 | 52 | 53 |
54 | 55 | 56 | 57 | 58 | 59 | 60 |
61 |
63 |
64 | 65 | 66 |
67 |
68 | } 69 | } 70 | 71 | export default connect({ 72 | modalData: state`app.modalData`, 73 | 74 | signalSendInvite: signal`invite.sendInvite`, 75 | 76 | form: form(state`invite.formEmail`), 77 | 78 | media: state`useragent.media`, 79 | }, ModalSendEmail); 80 | -------------------------------------------------------------------------------- /react-src/src/pages/match/listaTipoCandidato/ListaTipoCandidato.scss: -------------------------------------------------------------------------------- 1 | @import '../../../styles/vars'; 2 | @import '../../../styles/helpers'; 3 | 4 | .ListaTipoCandidato { 5 | .ContentMatch { 6 | width: to-perc(680); 7 | } 8 | 9 | .filters { 10 | width: to-perc(500); 11 | padding-bottom: to-perc(20); 12 | 13 | margin: 0px auto; 14 | 15 | display: flex; 16 | flex-direction: row; 17 | justify-content: space-between; 18 | 19 | .item-filter { 20 | position: relative; 21 | 22 | cursor: pointer; 23 | color: #9A9898; 24 | 25 | padding-bottom: to-perc(15); 26 | 27 | transition: color .3s; 28 | 29 | &::after { 30 | content: ' '; 31 | opacity: 0; 32 | 33 | position: absolute; 34 | left: 50%; 35 | bottom: 0; 36 | margin-left: to-perc(-4); 37 | 38 | width: to-perc(8); 39 | height: to-perc(8); 40 | 41 | background-color: #1c1c1c; 42 | border-radius: 50%; 43 | 44 | transition: opacity .3s;; 45 | } 46 | 47 | &.is-selected { 48 | color: #1c1c1c; 49 | 50 | &::after { 51 | opacity: 1; 52 | } 53 | } 54 | 55 | &:hover { 56 | color: #1c1c1c; 57 | } 58 | } 59 | } 60 | 61 | .Scrollbar { 62 | height: to-perc(460); 63 | 64 | .list { 65 | display: flex; 66 | flex-direction: row; 67 | flex-wrap: wrap; 68 | 69 | justify-content: space-between; 70 | align-items: center; 71 | 72 | padding-right: to-perc(20); 73 | } 74 | 75 | } 76 | } 77 | 78 | .is-small, .is-extraSmall { 79 | .ListaTipoCandidato { 80 | .ContentMatch { 81 | width: 100%; 82 | padding-bottom: 0px; 83 | 84 | text-align: left; 85 | } 86 | 87 | .t3 { 88 | font-style: normal; 89 | } 90 | 91 | .filters { 92 | width: 100%; 93 | padding-bottom: 20px; 94 | flex-wrap: wrap; 95 | 96 | .item-filter { 97 | padding-bottom: 15px; 98 | 99 | &::after { 100 | margin-left: -4px; 101 | width: 8px; 102 | height: 8px; 103 | } 104 | } 105 | 106 | .Select { 107 | margin-top:15px; 108 | display: block; 109 | } 110 | } 111 | 112 | .Scrollbar { 113 | height: initial; 114 | .list { 115 | padding-right: 0px; 116 | } 117 | } 118 | 119 | } 120 | } -------------------------------------------------------------------------------- /react-src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "temmeuvoto", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npm run react:dev", 8 | "react:dev": "rimraf dist/bundle && cross-env NODE_ENV=development node webpack-config/dev-server.js", 9 | "react:build": "rimraf dist/bundle && webpack-cli --env=production --progress --profile --colors --config=webpack-config/webpack.prod.js" 10 | }, 11 | "engines": { 12 | "node": "8.9.4" 13 | }, 14 | "author": "Rafael Busetti", 15 | "license": "ISC", 16 | "dependencies": { 17 | "@cerebral/forms": "3.2.2", 18 | "@cerebral/http": "4.2.3", 19 | "@cerebral/react": "3.1.1", 20 | "@cerebral/useragent": "3.2.2", 21 | "cerebral": "4.1.1", 22 | "autoprefixer": "8.1.0", 23 | "axios": "0.18.0", 24 | "babel-core": "6.26.0", 25 | "babel-loader": "7.1.4", 26 | "babel-plugin-transform-decorators-legacy": "1.3.4", 27 | "babel-preset-env": "1.6.1", 28 | "babel-preset-react": "6.24.1", 29 | "babel-preset-stage-0": "6.24.1", 30 | "body-parser": "1.18.2", 31 | "classnames": "2.2.5", 32 | "cross-env": "5.1.3", 33 | "css-loader": "0.28.10", 34 | "dotenv": "5.0.1", 35 | "env-cmd": "8.0.2", 36 | "exif-orientation-image": "1.0.1", 37 | "express": "4.16.2", 38 | "express-http-proxy": "^1.2.0", 39 | "extract-text-webpack-plugin": "4.0.0-beta.0", 40 | "file-loader": "1.1.11", 41 | "html2canvas": "^1.0.0-alpha.12", 42 | "http-proxy-middleware": "0.18.0", 43 | "image-webpack-loader": "4.1.0", 44 | "jimp": "0.2.28", 45 | "jwt-decode": "2.2.0", 46 | "lodash": "4.17.10", 47 | "moment": "2.22.2", 48 | "node-sass": "4.7.2", 49 | "postcss-loader": "2.1.1", 50 | "react": "16.4.2", 51 | "react-customized-scrollbar": "^1.2.3", 52 | "react-dom": "16.4.2", 53 | "react-helmet": "5.2.0", 54 | "react-hot-loader": "4.3.4", 55 | "react-input-mask": "2.0.3", 56 | "react-recaptcha": "2.3.10", 57 | "react-router-config": "1.0.0-beta.4", 58 | "react-router-dom": "4.3.1", 59 | "react-slick": "0.15.4", 60 | "react-transition-group": "2.4.0", 61 | "react-visibility-sensor": "3.11.0", 62 | "responsive-loader": "1.1.0", 63 | "rimraf": "2.6.2", 64 | "sass-loader": "6.0.7", 65 | "style-loader": "0.20.2", 66 | "webpack": "4.5.0", 67 | "webpack-cli": "2.0.10", 68 | "webpack-dev-middleware": "3.0.1", 69 | "webpack-hot-middleware": "2.21.2", 70 | "whatwg-fetch": "2.0.4" 71 | }, 72 | "devDependencies": { 73 | "webpack-bundle-analyzer": "^2.11.1" 74 | } 75 | } 76 | --------------------------------------------------------------------------------