Code Monkey home page Code Monkey logo

maker's Introduction


Título

Coloque uma descrição do projeto aqui. Geralmente essa descrição tem de duas a três linhas de tamanho. Ela deve dar uma visão geral sobre o que é o projeto, ex.: tecnologia usada, filosofia de existência, qual problema tenta-se resolver, etc. Se você precisa escrever mais que 3 linhas de descrição, crie subseções.

IMPORTANTE: coloque aqui alguma mensagem que é muito relevante aos usuários do projeto, se for o caso.

✨ Features

Aqui você pode colocar uma screenshot do produto resultante desse projeto. Descreva também suas features usando uma lista:

  • Fácil integração;
  • Poucas dependências;
  • Utiliza um template lindo para organizar o README;
  • Possui ótima documentação e testes.

🚀 Começando

1. Dependências

Para executar o projeto, você precisa ter o seguinte instalado:

Você precisa de várias extensões PHP instaladas também:

sudo apt install php-cli php-mbstring php-zip php-xml php-curl

2. Configuração

Feito a instalação das dependências, é necessário obter uma cópia do projeto. A forma recomendada é clonar o repositório para a sua máquina.

Para isso, rode:

git clone --recurse-submodules https://github.com/practice-uffs/template && cd template

Isso criará e trocará para a pasta template com o código do projeto.

2.1 PHP

Instale as dependências do PHP usando o comando abaixo:

composer install

2.2 Banco de Dados

O banco de dados mais simples para uso é o SQLite. Para criar uma base usando esse SGBD, rode:

touch database/database.sqlite

2.3 Node

Instale também as dependências do NodeJS executando:

npm install

2.4 Laravel

Crie o arquivo .env a partir do arquivo .env.example gerado automaticamente pelo Laravel:

cp .env.example .env

Criação as tabelas do banco de dados com as migrações esquemas:

php artisan migrate

Por fim execute o comando abaixo para a geração da chave de autenticação da aplicação:

php artisan key:generate

Gere os recursos JavaScript e CSS:

npm run dev

DICA: enquanto estiver desenvolvendo, rode npm run watch para manter os scripts javascript sendo gerados sob demanda quando alterados.

3. Utilizacão

3.1 Rodando o projeto

Depois de seguir todos os passos de instalação, inicie o servidor do Laravel:

php artisan serve

Após isso a aplicação estará rodando na porta 8000 e poderá ser acessada em localhost:8000.

3.2 Utilização da API

Se você utilizar a API dessa aplicacão, todos endpoints estarão acessivel em /api, por exemplo localhost:8000/api. Os endpoints que precisam de uma chave de autenticação devem ser utilizar o seguinte cabeçalho HTTP:

Authorization: Bearer XXX

onde XXX é o valor da sua chave de acesso (api token do Jetstream), por exemplo c08cbbfd6eefc83ac6d23c4c791277e4. Abaixo está um exemplo de requisição para o endpoint user utilizando a chave de acesso acima:

curl -H 'Accept: application/json' -H "Authorization: Bearer c08cbbfd6eefc83ac6d23c4c791277e4" http://localhost:8080/api/user

🤝 Contribua

Sua ajuda é muito bem-vinda, independente da forma! Confira o arquivo CONTRIBUTING.md para conhecer todas as formas de contribuir com o projeto. Por exemplo, sugerir uma nova funcionalidade, reportar um problema/bug, enviar um pull request, ou simplemente utilizar o projeto e comentar sua experiência.

Veja o arquivo ROADMAP.md para ter uma ideia de como o projeto deve evoluir.

🎫 Licença

Esse projeto é licenciado nos termos da licença open-source MIT e está disponível de graça.

🧬 Changelog

Veja todas as alterações desse projeto no arquivo CHANGELOG.md.

🧪 Links úteis

Abaixo está uma lista de links interessantes e projetos similares:

maker's People

Contributors

dovyski avatar guilhermegraeff avatar cleissonvieira avatar zorteaadriano avatar

Stargazers

Alisson Luan de Lima Peloso avatar  avatar João Victor Martins avatar  avatar

Watchers

 avatar Giancarlo Salton avatar Luciano L. Caimi avatar Jean Carlo Hilger avatar

maker's Issues

Atualizar Readme para rodar o Livro digital localmente

Com o readme atual eu consigo instalar todas as dependências, iniciar o maker localmente e utilizar o LBK.
Porém o Livro Didático Digital não é possível.
Em conversa com @GuilhermeGraeff fui informado que existem alguns passos a seguir para utilizar localmente para teste.

Objetivo: Atualizar o readme com os passos e recursos necessários para testar o livro didático digital

Exportar conteúdo utilizando puppeteer

Quando o usuário criar algum material no LBK (um poster, por exemplo) e clicar no botão Download, o conteúdo será gerado por um browser no back-end e, em seguida, enviado ao front-end para download. Esse processo será implementado como um job do Laravel no futuro. Para agora, vamos fazer uma implementação não ideal, porém bem mais simples.

A ideia é a seguinte:

  1. O usuário clica no botão Download
  2. O LBK coleta todas as informações dos campos de criação (textos, imagens, etc) e envia para um controller do Maker (ContentController@download)
  3. O método download do controller ContentController roda um comando na máquina (usando exec(), system(), etc) que é um script node que usa o puppeteer
  4. O script node acessa uma URL (informada pelo LBK) que contem a página de conteúdo do usuário
  5. O script node faz um screenshot da página, depois imprime no console o conteúdo desse screenshot codificado como base64
  6. Nesse momento, o método download() do controller terá o retorno do script, que é a imagem resultado em formato basee64. Essa informação é retornada pelo controller dentro do campo download_url
  7. O LBK recebe a imagem em base64, e solicita para o browser fazer o download dela.

Dica 1

Eu acho que o mais fácil para se começar essa tarefa é criar um script node que utilize o puppeter para acessar uma URL e tirar um screenshot dela. Em seguida, o próximo passo pode ser imprimir no console essa imagem codificada como base64. Existem vários materiais na internet sobre como tirar um screenshot usando puppeter:

Dica 2

O projeto ccuffs/api-cc faz uso desse mesmo fluxo. No caso da api-cc, o script node é utilizado para acessar uma página dos sistemas da UFFS e imprimir seus conteúdos (para que o Laravel faça uso).

A execução do script acontece no arquivo SgaScrapper. Há um arquivo de configuração chamado sgascraper que contém informações sobre como o script node é executado (em linhas gerais, ele tem um node script.js). No caso da API cc, o script node usa um arquivo de configuração externo, que não será utilizado pelo nosso. No nosso caso, o script node pode receber os parâmetros direto pela linha de comando.

Lapidar UI/UX do lbk para ficar no estilo do site

Uniformizar o layout do lbk para que ele fique no mesmo padrão do resto do site. Além disso, verificar as configurações existentes para que somente as configs necessárias sejam utilizadas.

Renderização de livro a partir de link de doc

O objetivo dessa issue é implementar o fluxo para buscar o conteúdo de um arquivo no google drive e, a partir dele, gerar um livro em formato PDF. A seguir estão os passos para que essa issue seja completada.

  • Criar uma página Livro

Criar uma página nova (no menu superior ela se chamada Livro, nas views é resources/views/book.blade.php, e no controller é App/Http/Controller/BookController.php, rota /livro). Essa página deve conter um campo (input) e um botão para enviar. O usuário informará o link de um documento do google drive nesse input.

  • Buscar o conteúdo do documento

Utilizando a informação do campo input, buscar o conteúdo do documento e salvar esse conteúdo como texto puro (sem formatação alguma) localmente. É importante que o conteúdo seja salvo em uma pasta própria, porque teremos outros elementos dentro dessa pasta (que são usados pela ferramenta de criação do livro).

  • Gerar o livro PDF

Utilizar o Ibis para gerar um livro em PDF a partir do conteúdo baixado. Você terá que inicializar a pasta (onde está o texto puro) com os arquivos do ibis via linha de comando. Dá uma olhada no projeto id-uffs-avatar para ver como um arquivo de linha de comando é executado em integração com o projeto. Para o teu caso, você pode assumir que o comando ibis está disponível para rodar (não precisa instalar ele), então é uma questão de rodar algo na linha de comando a partir do Laravel e imprimir na tela a saída desse comando (olha esse arquivo por exemplo).

Criar visualização em tamanhos diferentes para área de conteúdo

Atualmente a área de conteúdo do lbk não faz redimensionamento algum. Isso faz com que conteúdos muito grandes fiquem fora do campo de visão do usuário (ou que muitos scrolls apareção). O objetivo dessa tarefa é criar um painel de visualização da área de conteúdo que permita ao usuário ajudar o zoom de visualização.

Listagem de arquivos compartilhados em conta Google

O objetivo dessa tarefa é incrementar a classe App\Services\GoogleDocs para que ela tenha um método que liste os arquivos compartilhados com a conta do Google do Practice.

Atualmente a obtenção de documentos do Google Drive está sendo feita na conta do Guilherme. Ela tem que ser feita pela conta do Google do Practice.

Colocar a parte da geração do livro digital no ar

Foi levantado nas duas reuniões de líder que eu participei que a funcionalidade da geração de livros digitáis deveria ser utilizável.

Pelo menos para testes, isso envolve alguns ajustes no que está na dev agora, como a parte do credentials e do token.

Adicionar um loading na geração do livro e redirecionar para o livro

O objetivo desta issue é adicionar algo que indique ao usuário que o livro está sendo gerado, para que o mesmo possa aguardar a sua geração e depois ser redirecionado para o livro.

Talvez uma barrinha de carregamento ou algo do tipo.

Como o livro é gerado dentro de um Job do Laravel, e assim que o Job finaliza o livro está disponível para ser acessado, não sei como vai funcionar essa relação (levando em conta que o dispatch do láravel chama o Job para ser processado e a aplicação segue rodando), se tem algum tipo de callback quando o Job finaliza ou algo do tipo, algo a ser estudado.

Gravar um vídeo do iframe com LBK

Na #13 foi criado um botão para salvar as imagens.
Porém nem sempre será em forma de imagem.

O LBK precisa identificar se é imagem, gift ou vídeo e salvar no formato correto.

Geração inicial de sites

O objetivo dessa tarefa é criar o aparato inicial para que páginas web sejam geradas a partir do maker. A ideia básica é o seguinte:

  • Usuário informa um link do google docs para ser usado como conteúdo (cada seção com título formatado como Title será considerado uma página/url).
  • Maker lê o conteúdo do google docs e cria um arquivo html para cada seção do docs (o conteúdo do arquivo é o conteúdo daquela seção no docs).

Nesse primeiro momento, o layout de cada arquivo html não é importante (vamos melhorar isso no futuro).

Eu acho que a melhor forma de organizar isso tudo é criado um job Laravel que faça o que foi descrito acima. O job deve utilizar uma configuração do Laravel (pode ser o arquivo config/sites.php) que informe a pasta no sistema onde os arquivos serão colocados. Cada site deve ser colocado em uma pasta cujo nome é o id do próprio site.

Por exemplo, se o job receber via config que a paste de site é D:\sites e que ele está gerando o site de id 20, os arquivos desse site serão colocados todos na pasta D:\sites\20 (se a pasta 20 não existir, ela precisa ser criada pelo job).

Organização de conteúdo com base em marcações de meta informação

O objetivo dessa issue é implementar uma forma do usuário informar, via texto, meta informações que sirvam para guiar o maker na produção de conteúdo. Inicialmente, precisamos de uma forma de informar:

  • Início de um novo capítulo em livros didáticos digitais
  • Início de uma nova página (em um site) e sua URL (independente do texto).

A forma que isso será implementada é utilizando-se uma marcação como { ... } no começo de uma linha. O que estiver dentro das chaves é a meta informação que o maker deve analisar para entender do que se trata.

Início de um novo capítulo em livros didáticos digitais

Quando o maker estiver gerando o conteúdo para o Ibis renderizar um livro, ele deve procurar pela string {capitulo} no começo da linha. Por exemplo, o texto abaixo produziria 3 capítulos diferentes no livro sendo renderizado:

{capitulo} # Olá mundo

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce interdum eu urna a tempus.
In non facilisis velit, a laoreet purus. Vivamus nec justo in ligula efficitur aliquam id id dui.

Vestibulum venenatis, leo vel elementum dignissim, dui turpis feugiat nibh, sed pellentesque lectus sapien non est.
Quisque mollis ornare lectus posuere placerat.

{capitulo} # Alguma coisa

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce interdum eu urna a tempus.
In non facilisis velit, a laoreet purus. Vivamus nec justo in ligula efficitur aliquam id id dui.

Vestibulum venenatis, leo vel elementum dignissim, dui turpis feugiat nibh, sed pellentesque lectus sapien non est.
Quisque mollis ornare lectus posuere placerat.

{capitulo} # Conclusão

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce interdum eu urna a tempus.
In non facilisis velit, a laoreet purus. Vivamus nec justo in ligula efficitur aliquam id id dui.

Vestibulum venenatis, leo vel elementum dignissim, dui turpis feugiat nibh, sed pellentesque lectus sapien non est.
Quisque mollis ornare lectus posuere placerat.

Detalhe que a string {capitulo} deve ser removida pelo maker quando o conteúdo for passado ao Ibis. Ela é uma marcação puramente para instruir o maker no que fazer, ela não tem contribuição no texto.

Início de uma nova página (em um site)

Quando o maker estiver gerando um site, ele deve procurar pela string { ... } no começo da linha para saber que o conteúdo, a partir daquela linha, refere-se a uma página. O conteúdo que está entre chaves é a URL daquela página.

Por exemplo, se o maker encontrar uma linha que tenha o seguinte conteúdo:

{teste} Dicas de nutrição

Ele saberá que a partir desse ponto (até que ele encontre uma nova marcação dessas, por exemplo {sobre} Sobre o site) o texto encontrado faz parte da página teste.

É importante notar que o conteúdo que está entre chaves é a URL completa daquela página. Logo, se o usuário escrever algo como:

{dicas/saude/nutricao} Dicas de nutrição

Minhas dicas de nutrição.

{dicas/saude/exercicio} Dicas de exercícios

Alguma coisa sobre exercícios.

O maker criará duas páginas para esse site, sendo que a estrutura de arquivos delas será a seguinte:

- /dicas
 |--- /saude
      |--- /exercicios
           |--- index.html    (conteúdo desse arquivo será "Minhas dicas de nutrição.")
      |--- /nutricao
           |--- index.html    (conteúdo desse arquivo será "Alguma coisa sobre exercícios.")

Em linhas gerais, cada vez que uma / seja encontrada dentro da string entre chaves, isso indica a criação de uma pasta no sistema de arquivos. A string {oi/voce/teste/aqui} criará a pasta oi, que tem dentro a voce, que tem dentro a teste, que tem dentro a aqui, que tem dentro o arquivo index.html com o conteúdo daquela página.

Criar modelos Art, Book e Site para controle de dados

Precisamos de dois modelos para representar as ações atuais do maker. O modelo Art será para guardar qualquer coisa relacionada ao LBK, o modelo Book guardará informações de um livro didático digital. Por fim, o modelo Site será usado para coordenar ações de criação de sites (a ser implementado no futuro).

Ajustar layout interno para branco

Ajustar as classes de CSS que são usadas no layout interno para que elas sejam as classes certas para o conteúdo ficar com a página em fundo branco.

Se eu não me engano, estamos usando as classes do tailwind bg-gray-XXX nas páginas. Se remover elas o layout já deve ficar com fundo branco.

Melhorias UI/UX para gerar Livro Digital

  • Melhorar design e modo de acessar ferramentas na tela de Listagem das ferramentas
  • Melhorar design e modo de acessar ferramentas na tela de inicial, final da página
  • Melhorar design na pré-visualização do conteúdo antes de gerar o pdf
  • Adicionar Meus livros no menu
  • Se tela meus livros estiver vazia informar. Oferecer rota para criar livro
  • Ajustar menu para ter o nome de cada ferramenta e um dropdown com suas opções
  • Melhorar o fluxo e design das páginas /livro/create, /livro/index, /livro/show/:id

Ajustes de campos e layout

  • Quando acessado a tela do LBK (/poster) não trazer Header nem Footer, apenas a ferramenta com uma opção para sair dela e retornar a página inicial;
  • Deixar a ferramenta centralizada com a tela do usuário, de forma que só tenha scroll para o menu lateral com as configurações;
  • Alterar o nome dos campos para que sejam termos em português e intuitivos para que de fato serve o campo.

Listagem no maker de arquivos compartilhados no Google Drive

Depende de #7

Depois que a classe GoogleDocs for atualizada para permitir a listagem dos documentos do google drive compartilhadas com a conta Google do Practice, esses dados devem ser mostrados no maker.

O objetivo dessa tarefa é criar uma página (uma rota e uma view) para mostrar a listagem desses documentos. A listagem dos documentos no maker deve mostrar o nome do documento, a URL dele (no google drive) e, se possivel, quem é o dono daquele documento (por exemplo, se o Fernando compartilhou um doc com o practice, o dono desse documento é o Fernando).

Dicas:

Mudar a capa do livro para aceitar o modo dark

Atualmente ao gerar o livro na versão dark, a capa do livro permanece na versão light.

A capa é um arquivo .jpg

Verificar se é possível alterar o nome da capa que será utilizada no ibis

image

Adicionar o widget da aura no maker

Pode se basear nessa issue aqui: practice-uffs/app-practice#219

A ideia é utilizar um iframe e utilizar o token de autenticação (se estiver logado) sem precisar fazer o login pelo widget.

v0/widgets/aura?type=button é a rota de acesso pela API. Vamos utilizar a type button pois é a que faz sentido para uma aplicação web.

Geração do livro como um job (queue)

Utilizar a queue do laravel na geração do livro.
Como a geração do livro demora alguns segundos, para permitir que o usuário navegue livremente pelo site, deve-se usar as queues/Job .
Dessa maneira também é registrado no banco os jobs que foram criados e também os que falharam.

Estrutura inicial para o processamento de sites

O maker será utilizado também para a publicação de websites criados pelos usuários. O fluxo é muito semelhante à publicação de livros: o usuário fornece um link no Google Docs, o maker obtem o conteúdo desse documento, processa ele, e gera um artefato.

No caso do livro, o processamento é rodar o ibis e o artefato é um PDF. No caso do site, o processamento é será a criação de uma pasta com vários arquivos (que comporão o site). O objetivo dessa tarefa é criar o fluxo para a geração de um site, com uma ferramenta de linha de comando que apenas receba o conteúdo do Google Docs e crie um único arquivo html, que tem exatamente o mesmo conteúdo do documento do Google Docs.

Além disso, o fluxo completo para o usuário criar um site, informar a URL, clicar em gerar deve ser implementado. O modelo Site deve ser utilizado para essa tarefa. Em resumo, será uma replicação de tudo que é feito com o modelo Book (e suas páginas) para ser feito para o modelo Site.

A criação do processador que efetivamente criará o site está fora do escopo dessa tarefa (isso será feito no futuro).

Alterar a maneira que armazenamos o livro

No começo do desenvolvimento do livro digital queríamos que a geração funcionasse a qualquer custo, para ver se era possível utilizar o Ibis, foi possível.

Porém do modo que ficou o funcionamento, o livro digital gerado pode ser acessado por qualquer um que tenha o seu id do google Docs, o que não trás segurança para o livro gerado.

O objetivo desta issue é achar outro lugar para armazenar os livros, e dar a permissão de acesso ao livro só aqueles que geraram aquele livro.

Dar a oportunidade de gerar um livro na versão dark

O Ibis tem a opção de tema claro e escuro, disponibilizar esta opção para o usuário.

Atualmente só podemos gerar a versão 'light' do livro digital, o @alissonpeloso sugeriu gerar a opção dark também, eu acredito que esta não é uma tarefa tão difícil, tendo em vista que seria apenas alterar o chamado do ibis e algumas coisas no asset do ibis também.

Ajuste no readme, erros retornado ao usuário e a geração do token

Sexta-feira foram definidos mais alguns ajustes que devem ser feito no maker.

  • Atualizar o readme para conter a informação de que é necessário rodar php artisan queue:work para que os jobs sejam realizados.
  • Alterar no readme na parte de configuração do ibis, seu_usuario -> deixar explícito na descrição.
  • Definir como vai ser feito a geração do token e tempo de duração para acesso ao drive .
  • Atualizar o erro do "not found" para português e dar uma informação de o que aconteceu ou uma sugestão de o que pode ser realizado para que funcione corretamente, 'Arquivo não encontrado em nosso drive, verifique se foi compartilhado corretamente'.

Portar o layout do login do Mural

Portar o layout da página de login do Mural para o Maker. O objetivo é que a página de login do Maker fique exatamente igual à do Mural (só que em vez de Mural a palavra é Maker).

Ajustes para lançamento

Geral:

Atualizar dados da página inicial antes de logar:

  • Alterar nome " Laravel" ao lado da logo do PRACTICE para Maker
  • Criar um breve resumo do Livro didático digital e do LBK
  • Remover conteúdo que tem dados aleatórios e não estão sendo utilizados

Atualizar dados da tela de login

  • Alterar nome " Laravel" ao lado da logo do PRACTICE para Maker
  • Melhorar botão de entrar, é necessário clicar duas vezes em entrar para acessar

Atualizar e melhorar tela inicial após entrar com usuário e senha:

  • Remover dados que não estão sendo utilizados no template.
  • Atualizar todos os dados para dados reais e úteis

Acessando "Ferramentas":

  • Arrumar rotas para Livro digital no maker, está incorreto, se utilizar "/livro/index" direciona sem erro.
  • Atualizar a descrição do Livro digital e Poster
  • Remover a ferramenta Neptune
  • Erro ao gerar um site, o mesmo é gerado, porém ao acessar da erro no php (não está criando o arquivo index para o site);

Relacionadas ao acesso ao google drive:

  • Retirar funções que não estão sendo utilizadas do service/GoogleDoc.php.
  • Retirar views que eram utilizadas pelas funções do GoogleDoc.php que não estão sendo utilizadas.

Adicionar o LBK na página de poster

A página de Poster atualmente não mostra nenhum conteúdo relevante. O objetivo dessa tarefa é integrar o LBK como conteúdo da página de Poster.

O LBK é uma aplicação 100% estática, então é provável que as pastas delas (imagens, css, etc) tenham que ficar na pasta public do Laravel. A única coisa (que eu acho) do LBK que será realmente colocada em uma view do Laravel é o index.html (provavelmente o index.html do LBK se tornará uma view do tipo /views/poster.blade.php).

Ajustar o Credentials do Maker

Assim como no mural na issue 403 do mural, criar um tutorial semelhante e também fazer com que a inserção do arquivo credentials.json e do token seja feito de maneira mais simples.

Imagens no ibis não são renderizadas a partir do link

Na issue 1068 do programa, desenvolvendo o livro digital para um conteúdo específico, notei que o Ibis não conseguiu renderizar uma imagem a partir de um link.

O intuito desta issue é verificar o motivo desse bug acontecer e tentar arrumar.

Na issue foi dada a volta por cima utilizando a imagem em base:64 (muuuuito inviável).

Melhorias na configuração do livro digital gerado

Melhorias no espaçamento entre linhas, tipo de fonte e espaçamento do título do capitulo
Aplicar as alterações da issue 1068

Esse arquivo vai em: public/book/assets/fonts/Roboto-Regular.ttf

Alterar no MakeBookJob e UpdateBookJob;

\'fonts\' => [
                \'roboto\' => \'Roboto-Regular.ttf\',
            ],

Alterar nos arquivos do ibis theme-light e theme-dark: (no light o background collor ñ existe e o color é 252525)

    body {
      font-family: roboto;
      font-size: 14px;
      line-height: 2;
      color: #252525;
    }

     h1, h2 {
        font-family: roboto;
      }

    h3 {
      font-family: roboto;
      font-weight: bold;
    }

    h1 {
      font-size: 30px;
      padding-top: 0;
      padding-bottom: 30px;
    }

    .mpdf_toc {
      font-family: roboto;
      color: #252525;
    }

    span.mpdf_toc_t_level_0, span.mpdf_toc_p_level_0 {
      color: #252525;
      font-family: roboto;
      font-weight: bold;
      font-style: normal;
    }

    span.mpdf_toc_t_level_1, span.mpdf_toc_p_level_1 {
      color: #252525;
      font-family: roboto;
      font-weight: normal;
      font-style: normal;
    }

    span.mpdf_toc_t_level_2, span.mpdf_toc_p_level_2 {
      color: #252525;
      font-family: roboto;
      font-weight: normal;
      font-style: normal;
    }

Opção de atualizar livro após ser gerado

Hoje um livro didático é gerado pelo maker através de um arquivo no google drive. Porém quando esse arquivo é atualizado com novas informações é necessário gerar um novo livro para obtê-las.

Objetivo é criar uma opção dentro do livro, ou na listagem do mesmo, para atualizar os dados de acordo com o momento atual do arquivo no drive.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.