diff --git a/app/Http/Controllers/NoteController.php b/app/Http/Controllers/NoteController.php new file mode 100644 index 000000000..adc0dc9ee --- /dev/null +++ b/app/Http/Controllers/NoteController.php @@ -0,0 +1,29 @@ +notes()->latest()->get(); + return view('notes.index', compact('notes')); + } + + public function store(Request $request) + { + $request->validate([ + 'content' => 'required|string|max:1000', + ]); + + Auth::user()->notes()->create([ + 'content' => $request->content, + ]); + + return redirect()->route('notes.index')->with('message', 'Nota salva com sucesso!'); + } +} diff --git a/app/Livewire/Admin/Users.php b/app/Livewire/Admin/Users.php index b57ff341c..3f3e3b174 100644 --- a/app/Livewire/Admin/Users.php +++ b/app/Livewire/Admin/Users.php @@ -26,7 +26,6 @@ class Users extends Component 'active' => 'boolean', ]; - public function openModal() { $this->resetInputFields(); @@ -133,6 +132,7 @@ public function delete($id) User::find($id)->delete(); session()->flash('message', 'Usuário deletado com sucesso!'); } + public function render() { $users = User::paginate(10); diff --git a/app/Livewire/Conducting/QualityAssessment/QualityScor.php b/app/Livewire/Conducting/QualityAssessment/QualityScor.php new file mode 100644 index 000000000..029f2e272 --- /dev/null +++ b/app/Livewire/Conducting/QualityAssessment/QualityScor.php @@ -0,0 +1,13 @@ +notes = Auth::user()->notes()->latest()->get(); + } + + public function saveNote() + { + $this->validate([ + 'note' => 'required|string|max:1000', + ]); + + Note::create([ + 'user_id' => Auth::id(), + 'content' => $this->note, + ]); + + $this->note = ''; + $this->notes = Auth::user()->notes()->latest()->get(); + } + + public function render() + { + return view('livewire.notes'); + } +} diff --git a/app/Livewire/UserNotes.php b/app/Livewire/UserNotes.php new file mode 100644 index 000000000..c4586e6cf --- /dev/null +++ b/app/Livewire/UserNotes.php @@ -0,0 +1,36 @@ +validate([ + 'newNote' => 'required|string|max:1000' + ]); + + Note::create([ + 'user_id' => Auth::id(), + 'content' => $this->newNote, + ]); + + $this->newNote = ''; + session()->flash('message', 'Nota salva com sucesso!'); + } + + public function render() + { + $notes = Auth::user()->notes()->latest()->get(); + + return view('livewire.user-notes', [ + 'notes' => $notes, + ]); + } +} diff --git a/app/Models/Note.php b/app/Models/Note.php new file mode 100644 index 000000000..51c95a8c1 --- /dev/null +++ b/app/Models/Note.php @@ -0,0 +1,18 @@ +belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index e48c9b3e5..2e8881e2b 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -99,6 +99,11 @@ public function profile() return $this->belongsTo(Profile::class, 'profile_id'); } + public function notes() +{ + return $this->hasMany(Note::class); +} + public function deleteUserData() { // Anonimiza os dados do usuário diff --git a/database/migrations/2025_04_14_184022_create_notes_table.php b/database/migrations/2025_04_14_184022_create_notes_table.php new file mode 100644 index 000000000..dbe567650 --- /dev/null +++ b/database/migrations/2025_04_14_184022_create_notes_table.php @@ -0,0 +1,9 @@ +public function up() +{ + Schema::create('notes', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->text('content'); + $table->timestamps(); + }); +} diff --git a/lang/pt_BR/pages/about.php b/lang/pt_BR/pages/about.php index d10940c13..5a8c72391 100644 --- a/lang/pt_BR/pages/about.php +++ b/lang/pt_BR/pages/about.php @@ -1,122 +1,47 @@ 'Sobre', - 'about' => 'Sobre nós', - 'description' => 'Use esses formulários incríveis para fazer login ou criar uma nova conta no seu projeto gratuitamente.', - - 'new_features' => 'Novas funcionalidades:', - 'recover_password' => 'Recuperar Senha', - 'bug_databases' => 'Planejamento - Bases de Dados (base de dados padrão definidos)', - 'suggest_databases' => 'Sugerir Base de Dados (implementação com aprovação do superusuário)', - 'new_interface' => 'Nova Interface Frontend e Backend com Livewire', - 'new_framework' => 'Novo Framework (Laravel 10)', - 'internationalization' => 'Internacionalização (PT/BR e EN)', - 'usability' => 'Correções de erros de usabilidade e acessibilidade (Helpers)', - 'users_management' => 'Gerenciamento de Usuários (ativação/permissões)', - 'profile_management' => 'Gerenciamento de Perfis (ACL/gates e policies)', - 'members_invitation' => 'Convite a Membros (notificação por e-mail)', - 'pwa' => 'Aplicativo Web Progressivo (PWA Mobile)', - 'snowballing' => 'Módulo Snowballing (em desenvolvimento)', - 'new_qa' => 'Planejamento - Nova forma de configurar as questões de avaliação de qualidade (QA)', - 'algolia_api' => 'API Algolia AI Synonyms - implementação para sugerir sinônimos para palavras-chave e auxiliar na construção de strings', - 'crossref_api' => 'API CrossRef - implementação junto ao módulo snowballing para busca de referências dos estudos.', - - - 'development' => 'Desenvolvimento', - 'development_description' => 'Thoth foi criado por estudantes de graduação em Engenharia de Software, mantido e atualizado por alunos e professores do Programa de Pós-Graduação em Engenharia de Software - PPGES da Universidade Federal do Pampa (UNIPAMPA).', - - 'open_source_project' => 'Projeto de Código Aberto', - 'mit_license' => 'Licença MIT', - 'technologies_used' => 'Tecnologias Utilizadas:', - - 'about_the_tool' => 'Sobre a Ferramenta:', - 'about_the_tool_description' => 'Thoth é uma poderosa ferramenta para apoiar revisões sistemáticas colaborativas. É uma solução multiplataforma desenvolvida para automatizar partes importantes do processo de revisão sistemática, facilitando e agilizando o trabalho de pesquisadores e profissionais envolvidos nesse tipo de estudo.', - - 'cross_platform' => 'Ferramenta colaborativa multiplataforma', - 'cross_platform_description' => 'Thoth foi projetado para funcionar em diferentes plataformas, como computadores, tablets e smartphones, permitindo que os usuários trabalhem colaborativamente em um ambiente virtual compartilhado. Essa característica possibilita que vários investigadores trabalhem simultaneamente, compartilhando informações e colaborando em tempo real.', - - 'automate_process' => 'Automatizar partes do processo', - 'automate_process_description' => 'Thoth tem como objetivo automatizar várias etapas do processo de revisão sistemática, reduzindo a necessidade de trabalho manual e minimizando erros. Algumas das funcionalidades automatizadas incluem a geração de strings de pesquisa, gerenciamento de estudos nas etapas de seleção e qualidade, geração de dados para uso em trabalhos e criação de gráficos e tabelas que representam as etapas de importação, seleção, qualidade e extração.', - - 'search_string' => 'Geração de strings de pesquisa', - 'search_string_description' => 'Uma das tarefas cruciais na revisão sistemática é a definição de termos de pesquisa apropriados para localizar estudos relevantes. A Thoth é capaz de gerar automaticamente strings de pesquisa com base em critérios definidos pelo usuário, ajudando a obter resultados mais precisos e abrangentes.', - - 'management_selection' => 'Gerenciamento de estudos na etapa de seleção', - 'management_selection_description' => 'Durante a etapa de seleção, onde os estudos são avaliados quanto à sua relevância para a revisão, a Thoth oferece recursos para facilitar o gerenciamento desses estudos. Os usuários podem importar estudos para a ferramenta, organizá-los e realizar triagem com base em critérios pré-definidos, tornando o processo mais eficiente e rastreável.', - - 'management_quality' => 'Gerenciamento de estudos na etapa de qualidade', - 'management_quality_description' => 'Após a seleção inicial de estudos, é essencial realizar uma avaliação da qualidade metodológica de cada estudo incluído. O Thoth auxilia nessa tarefa, permitindo que os usuários gerenciem e avaliem os estudos selecionados, garantindo a integridade e confiabilidade dos dados usados na revisão.', - - 'data_generation' => 'Geração de dados para uso em trabalhos', - 'data_generation_description' => 'A Thoth é capaz de gerar dados estruturados e organizados a partir de estudos selecionados, que podem ser usados diretamente em trabalhos científicos ou na produção de relatórios. Essa funcionalidade economiza tempo e esforço dos pesquisadores, fornecendo informações prontas para análise e interpretação.', - - 'graphs_tables_generation' => 'Geração de gráficos e tabelas', - 'graphs_tables_generation_description' => 'Para visualizar clara e objetivamente o progresso e os resultados das etapas de revisão sistemática, a Thoth oferece a geração automática de gráficos e tabelas. Essas representações visuais permitem uma análise rápida e uma melhor compreensão do estado atual do trabalho.', - - 'report_generation' => 'Geração de relatórios', - 'report_generation_description' => 'Além de gerar gráficos e tabelas, o Thoth também fornece a criação de relatórios detalhados sobre as etapas de importação, seleção, qualidade e extração de estudos. Esses relatórios fornecem uma visão completa do processo de revisão sistemática, incluindo informações sobre os critérios utilizados, estudos incluídos e excluídos, avaliação de qualidade e dados extraídos. Esses relatórios podem ser exportados em diferentes formatos, como PDF ou Word, facilitando a comunicação dos resultados e o compartilhamento com colegas e supervisores.', - 'report_generation_description2' => 'Em resumo, o Thoth é uma ferramenta poderosa que visa otimizar atividades relacionadas a revisões sistemáticas colaborativas. Com recursos de automação, geração de strings de pesquisa, gerenciamento de estudos, geração de dados, gráficos, tabelas e relatórios, o Thoth oferece maior eficiência, precisão e colaboração no processo de revisão sistemática. Ao simplificar tarefas complexas e fornecer insights visuais e relatórios abrangentes, o Thoth contribui para a produção de pesquisas de alta qualidade e baseadas em evidências.', - 'report_generation_description3' => 'Para entender melhor as funcionalidades desenvolvidas, cada uma delas será explicada nos itens seguintes.', - - 'multiple_member_management' => 'Gerenciamento de Membros Múltiplos', - 'multiple_member_management_description' => 'É possível adicionar vários membros a um SR com diferentes níveis e gerenciá-los.', - - 'manage_projects' => 'Gerenciar Projetos', - 'manage_projects_description' => 'O administrador do projeto tem a possibilidade de editar e excluir o projeto.', - - 'activity_view' => 'Visualização de Atividade', - 'activity_view_description' => 'O usuário visualiza todos os registros de atividades dos membros para um determinado projeto.', - - 'progress_display' => 'Exibição de Progresso', - 'progress_display_description' => 'O usuário tem a opção de visualizar o progresso de seu projeto em cada etapa do SR, permitindo um maior controle sobre ele.', - - 'protocol_management' => 'Gerenciamento de Protocolo', - 'protocol_management_description' => 'Os pesquisadores de um projeto têm a possibilidade de adicionar, excluir, editar e visualizar todas as informações referentes ao protocolo de uma determinada RS.', - - 'study_import' => 'Importação de Estudos', - 'study_import_description' => 'Os pesquisadores importam estudos para a RS por meio de arquivos bib ou csv de um determinado banco de dados, podendo excluir os arquivos incluídos.', - - 'selection_of_studies' => 'Seleção de Estudos', - 'selection_of_studies_description' => 'A seleção de estudos de acordo com os critérios é realizada individualmente por cada membro do projeto.', - - 'checking_duplicate_studies' => 'Verificação de Estudos Duplicados', - 'checking_duplicate_studies_description' => 'Cada pesquisador pode usar este recurso para encontrar estudos duplicados nos arquivos que ele adicionou ao projeto.', - - 'selection_ranking_information' => 'Informações de Classificação da Seleção', - 'selection_ranking_information_description' => 'O usuário é apresentado com a quantidade e porcentagem de cada status na etapa de seleção.', - - 'study_information_visualization' => 'Visualização de Informações do Estudo', - 'study_information_visualization_description' => 'O pesquisador pode visualizar as informações dos estudos para ajudar na seleção.', - - 'status_for_each_member' => 'Status para Cada Membro', - 'status_for_each_member_description' => 'O revisor é apresentado com a porcentagem de cada status na etapa de seleção referente a cada pesquisador no projeto.', - - 'conflicts_in_selection' => 'Conflitos na Seleção', - 'conflicts_in_selection_description' => 'O revisor é apresentado com todos os conflitos gerados por divergências no status de um estudo classificado por dois ou mais pesquisadores.', - - 'resolution_of_conflicts_in_selection' => 'Resolução de Conflitos na Seleção', - 'resolution_of_conflicts_in_selection_description' => 'O revisor tem a possibilidade de visualizar os comentários deixados pelos pesquisadores em cada estudo e isso pode ajudá-lo a decidir qual status o estudo se encaixa.', - - 'quality_assessment_of_studies' => 'Avaliação da Qualidade dos Estudos', - 'quality_assessment_of_studies_description' => 'Os pesquisadores têm a possibilidade de avaliar cada estudo em relação a questões de qualidade.', - - 'quality_conflicts' => 'Conflitos de Qualidade', - 'quality_conflicts_description' => 'O revisor é apresentado com todos os conflitos gerados por diferenças no status de qualidade de um estudo classificado por dois ou mais pesquisadores.', - - 'data_extraction' => 'Extração de Dados', - 'data_extraction_description' => 'Os pesquisadores têm a possibilidade de responder às perguntas de extração para cada estudo, sendo capazes de extrair dados para responder às perguntas de qualidade.', - - 'report' => 'Relatório', - 'report_description' => 'É exposto aos usuários gráficos com as informações de cada etapa do projeto, tornando possível exportá-las e editá-las.', - - 'export_to_latex' => 'Exportar para Latex', - 'export_to_latex_description' => 'Os dados do projeto podem ser exportados para um arquivo latex, possibilitando a criação de outros estudos para disseminar os resultados.', - - 'export_to_bibtex' => 'Exportar para BibTex', - 'export_to_bibtex_description' => 'Os estudos podem ser exportados no formato BibTex para serem usados como referência em outros estudos.', - - 'improvement_of_search_strings' => 'Melhoria das Strings de Pesquisa', - 'improvement_of_search_strings_description' => 'Essa função foi desenvolvida por outros membros do grupo de pesquisa, chamada StringImprover 2, sendo um serviço da web baseado em web-sockets. A escolha dos web-sockets foi feita considerando a necessidade de a ferramenta fornecer atualizações sobre o progresso da geração de strings, já que a pesquisa pode levar muito tempo. Para usá-la, o cliente deve enviar as palavras-chave, que serão usadas na criação de strings e na avaliação de artigos, e um grupo de artigos ideais. Esses documentos ideais são artigos que o pesquisador considerou e considerou relevantes, então eles serão usados como referência para avaliar os artigos encontrados na pesquisa.', - + 'about' => 'Sobre o Thoth', + 'introduction' => 'O Thoth é uma plataforma colaborativa desenvolvida para facilitar revisões sistemáticas, promovendo organização, transparência e eficiência durante o processo.', + 'functionalities' => 'Funcionalidades', + 'manage_projects' => 'Gerencie seus projetos', + 'manage_projects_description' => 'Crie, edite e organize projetos colaborativos com facilidade.', + 'activity_view' => 'Acompanhamento de atividades', + 'activity_view_description' => 'Veja o histórico de atividades realizadas pelos membros.', + 'progress_display' => 'Visualização de progresso', + 'progress_display_description' => 'Monitore o andamento do projeto em tempo real.', + 'protocol_management' => 'Gerenciamento de protocolo', + 'protocol_management_description' => 'Crie e edite protocolos diretamente na plataforma.', + 'study_import' => 'Importação de estudos', + 'study_import_description' => 'Implemente arquivos com referências bibliográficas (BibTeX, RIS, etc.).', + 'selection_of_studies' => 'Seleção de estudos', + 'selection_of_studies_description' => 'Classifique os estudos de acordo com os critérios do protocolo.', + 'checking_duplicate_studies' => 'Verificação de duplicatas', + 'checking_duplicate_studies_description' => 'Detecte automaticamente referências duplicadas.', + 'selection_ranking_information' => 'Classificação e informações de seleção', + 'selection_ranking_information_description' => 'Organize os estudos de acordo com a relevância e outras métricas.', + 'study_information_visualization' => 'Visualização de informações dos estudos', + 'study_information_visualization_description' => 'Veja resumos, autores e metadados dos estudos de forma clara.', + 'status_for_each_member' => 'Status por membro', + 'status_for_each_member_description' => 'Acompanhe a contribuição individual de cada integrante.', + 'conflicts_in_selection' => 'Conflitos na seleção', + 'conflicts_in_selection_description' => 'Identifique quando há divergência entre revisores.', + 'resolution_of_conflicts_in_selection' => 'Resolução de conflitos', + 'resolution_of_conflicts_in_selection_description' => 'Realize a mediação entre decisões conflitantes.', + 'quality_assessment_of_studies' => 'Avaliação de qualidade', + 'quality_assessment_of_studies_description' => 'Atribua pontuações de qualidade conforme critérios definidos.', + 'quality_conflicts' => 'Conflitos na avaliação de qualidade', + 'quality_conflicts_description' => 'Identifique e resolva discrepâncias nas avaliações.', + 'data_extraction' => 'Extração de dados', + 'data_extraction_description' => 'Colete e organize os dados relevantes de cada estudo.', + 'report' => 'Geração de relatório', + 'report_description' => 'Crie relatórios com base nas decisões e dados extraídos.', + 'export_to_latex' => 'Exportar para LaTeX', + 'export_to_latex_description' => 'Gere arquivos LaTeX prontos para publicação.', + 'export_to_bibtex' => 'Exportar para BibTeX', + 'export_to_bibtex_description' => 'Exporte as referências em formato BibTeX.', + 'improvement_of_search_strings' => 'Melhoria das estratégias de busca', + 'improvement_of_search_strings_description' => 'Otimize os termos de busca para melhores resultados.', + 'terms_and_lgpd' => 'Termos e LGPD', + 'terms_and_conditions' => 'Termos e Condições', ]; diff --git a/lang/pt_BR/pages/help.php b/lang/pt_BR/pages/help.php index 865d5cdd5..f855b6438 100644 --- a/lang/pt_BR/pages/help.php +++ b/lang/pt_BR/pages/help.php @@ -2,35 +2,80 @@ return [ '10_questions' => 'Aqui estão as 10 perguntas mais frequentes sobre o Thoth.', - 'common_questions' => 'Perguntas Mais Frequentes:', + 'common_questions' => '📚 Perguntas Mais Frequentes:', - 'question1' => 'O que é a Thoth?', + 'question1' => '❓ O que é a Thoth?', 'answer1' => 'Thoth é uma poderosa ferramenta para apoiar revisões sistemáticas colaborativas. É uma solução multiplataforma desenvolvida para automatizar partes importantes do processo de revisão sistemática, facilitando e agilizando o trabalho de pesquisadores e profissionais envolvidos nesse tipo de estudo.', - 'question2' => 'Quais são os principais recursos da Thoth?', + 'question2' => '⚙️ Quais são os principais recursos da Thoth?', 'answer2' => 'Os principais recursos da Thoth incluem: geração automatizada de strings de busca, gerenciamento de estudos nas etapas de seleção e qualidade, geração de dados para uso em trabalhos científicos, geração de gráficos e tabelas, criação de relatórios detalhados e colaboração entre membros da equipe.', - 'question3' => 'Quais tecnologias foram usadas no desenvolvimento da Thoth?', + 'question3' => '💻 Quais tecnologias foram usadas no desenvolvimento da Thoth?', 'answer3' => 'Thoth foi desenvolvido usando as seguintes tecnologias: Linguagem PHP, MySQL, Git, Framework Laravel, Docker, Bootstrap, Migrations, PHPSpreadSheet, League/CSV, PHPUnit, JavaScript e Git Actions.', - 'question4' => 'Quem são os responsáveis pelo desenvolvimento e manutenção da Thoth?', + 'question4' => '👥 Quem são os responsáveis pelo desenvolvimento e manutenção da Thoth?', 'answer4' => 'Thoth foi criado por estudantes de graduação em Engenharia de Software e é mantido e atualizado por estudantes e professores do Programa de Pós-Graduação em Engenharia de Software (PPGES) da Universidade Federal do Pampa (UNIPAMPA).', - 'question5' => 'A Thoth é uma ferramenta de código aberto? Qual licença é usada?', + 'question5' => '🔓 A Thoth é uma ferramenta de código aberto? Qual licença é usada?', 'answer5' => 'Sim, Thoth é um projeto de código aberto. Ele é licenciado sob a Licença MIT, que permite seu uso, modificação e distribuição livremente, desde que os direitos autorais e a licença original sejam mantidos.', - 'question6' => 'A Thoth é uma ferramenta multiplataforma? Quais dispositivos ele suporta?', - 'answer6' => 'Sim, a Thoth foi projetado para funcionar em diferentes plataformas, como computadores, tablets e smartphones. Isso permite que os usuários trabalhem colaborativamente em um ambiente virtual compartilhado, independentemente do dispositivo usado.', + 'question6' => '📱 A Thoth é uma ferramenta multiplataforma? Quais dispositivos ela suporta?', + 'answer6' => 'Sim, a Thoth foi projetada para funcionar em diferentes plataformas, como computadores, tablets e smartphones. Isso permite que os usuários trabalhem colaborativamente em um ambiente virtual compartilhado, independentemente do dispositivo usado.', - 'question7' => 'Como a Thoth automatiza partes do processo de revisão sistemática?', + 'question7' => '🧠 Como a Thoth automatiza partes do processo de revisão sistemática?', 'answer7' => 'Thoth automatiza muitas etapas do processo de revisão sistemática, reduzindo a necessidade de trabalho manual e minimizando erros. Ele gera strings de busca, gerencia estudos nas etapas de seleção e qualidade, gera dados estruturados, cria gráficos e tabelas e produz relatórios detalhados sobre as etapas do processo.', - 'question8' => 'Quais são as funcionalidades de gerenciamento de estudos oferecidas pela Thoth?', + 'question8' => '🗂️ Quais são as funcionalidades de gerenciamento de estudos oferecidas pela Thoth?', 'answer8' => 'Thoth oferece funcionalidades para importar estudos, selecionar estudos com base em critérios, verificar estudos duplicados, visualizar informações do estudo, avaliar a qualidade do estudo e resolver conflitos gerados por diferenças de classificação.', - 'question9' => 'Como a Thoth gera dados estruturados e organizados para uso em trabalhos científicos?', + 'question9' => '📊 Como a Thoth gera dados estruturados e organizados para uso em trabalhos científicos?', 'answer9' => 'A Thoth é capaz de extrair dados relevantes de estudos selecionados, permitindo que os pesquisadores respondam a perguntas de extração. Esses dados são então organizados e estruturados, prontos para serem usados em trabalhos científicos, facilitando a análise e interpretação dos resultados obtidos.', - 'question10' => 'A Thoth oferece a geração de gráficos, tabelas e relatórios? Como esses resultados podem ser compartilhados?', + 'question10' => '📈 A Thoth oferece a geração de gráficos, tabelas e relatórios? Como esses resultados podem ser compartilhados?', 'answer10' => 'Sim, a Thoth oferece a geração automática de gráficos, tabelas e relatórios. Essas representações visuais ajudam a visualizar clara e objetivamente o progresso e os resultados das etapas de revisão sistemática. Os resultados podem ser compartilhados exportando relatórios em diferentes formatos, como PDF ou Word, facilitando a comunicação de resultados com colegas e supervisores.', -]; \ No newline at end of file + + + // Contato com suporte + 'support_title' => '📩 Contato com Suporte', + 'support_text' => 'Caso você tenha dúvidas que não foram respondidas acima, ou esteja enfrentando problemas técnicos, entre em contato com a nossa equipe de suporte:', + 'support_email' => 'Envie um e-mail para ', + 'support_email_address' => 'suporte@thoth.com', + + // Novas perguntas para aumentar o conteúdo + 'question11' => '🔎 Quais são os critérios para selecionar um estudo no Thoth?', + 'answer11' => 'O Thoth permite que você defina critérios de inclusão e exclusão para a seleção dos estudos. A plataforma oferece ferramentas para ajudar a garantir que os estudos selecionados atendam aos critérios necessários para a revisão sistemática.', + + 'question12' => '📝 Como os estudos são avaliados no Thoth?', + 'answer12' => 'Os estudos podem ser avaliados com base em critérios de qualidade pré-definidos. O Thoth oferece um conjunto de métricas e opções para avaliar a qualidade dos estudos, o que ajuda os pesquisadores a realizar uma análise mais precisa e confiável.', + + 'question13' => '📥 Como importar uma lista de estudos?', + 'answer13' => 'Você pode importar uma lista de estudos no Thoth usando arquivos CSV ou Excel. A plataforma processa automaticamente os dados e os organiza para que você possa começar a análise imediatamente.', + + 'question14' => '🔄 O Thoth permite a colaboração entre múltiplos usuários?', + 'answer14' => 'Sim, o Thoth permite a colaboração em tempo real entre múltiplos usuários. Os membros da equipe podem colaborar, discutir e tomar decisões em conjunto durante todo o processo de revisão sistemática.', + + 'question15' => '📅 Como o Thoth gerencia o cronograma de um projeto?', + 'answer15' => 'O Thoth permite a definição de prazos e tarefas. Você pode configurar notificações para lembrar os membros do projeto sobre as próximas etapas e garantir que os prazos sejam cumpridos.', + + 'question16' => '📤 Como exportar os dados da Thoth?', + 'answer16' => 'O Thoth permite exportar os dados de seu projeto para diferentes formatos, como PDF, Word e Excel. Isso facilita a criação de relatórios ou a integração com outras ferramentas de análise.', + + 'question17' => '🌐 O Thoth oferece integração com outras ferramentas?', + 'answer17' => 'Sim, o Thoth oferece integração com várias outras ferramentas de análise de dados e gerenciamento de projetos. Você pode conectar sua conta Thoth a outras plataformas para otimizar o fluxo de trabalho.', + + 'question18' => '🛠️ O Thoth oferece suporte técnico?', + 'answer18' => 'Sim, o Thoth oferece suporte técnico através de e-mail e outros canais. Se você encontrar problemas técnicos ou tiver dúvidas sobre o uso da plataforma, nossa equipe de suporte está pronta para ajudar.', + + 'question19' => '🔐 Como a segurança dos dados é garantida no Thoth?', + 'answer19' => 'A Thoth segue as melhores práticas de segurança para garantir a proteção dos dados dos usuários. Todos os dados são armazenados de forma segura e criptografada, e o acesso é controlado por um sistema de autenticação robusto.', + + 'question20' => '🏆 A Thoth foi premiada ou reconhecida?', + 'answer20' => 'Sim, o Thoth recebeu vários reconhecimentos da comunidade acadêmica por sua contribuição ao campo da pesquisa científica e pela inovação no processo de revisão sistemática.', + + // Outros detalhes + 'thoth_project' => 'Thoth é um projeto inovador, desenvolvido com a missão de facilitar o processo de revisão sistemática na pesquisa científica.', + 'use_thoth' => 'Se você é pesquisador, acadêmico ou profissional envolvido em revisões sistemáticas, o Thoth é a ferramenta ideal para otimizar seu trabalho e garantir resultados mais rápidos e precisos.', + 'feedback' => 'Nosso compromisso é melhorar continuamente, e seu feedback é fundamental para isso. Não hesite em nos enviar sugestões ou opiniões!', + 'credits' => 'Desenvolvido por estudantes de Engenharia de Software da Universidade Federal do Pampa (UNIPAMPA).', +]; + diff --git a/resources/views/components/help-button.blade.php b/resources/views/components/help-button.blade.php index da69bda16..eade5c9bd 100644 --- a/resources/views/components/help-button.blade.php +++ b/resources/views/components/help-button.blade.php @@ -1,3 +1,20 @@ - + + + + + + + diff --git a/resources/views/components/prev-next.blade.php b/resources/views/components/prev-next.blade.php index c66b69cd0..1b039ecb6 100644 --- a/resources/views/components/prev-next.blade.php +++ b/resources/views/components/prev-next.blade.php @@ -1,4 +1,4 @@ - + + +
+ + + + + +
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ef99f2d70..2c5246ab5 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -197,7 +197,7 @@ class="btn-close" aria-label="Close">
- + @endauth + + + + + + @@ -359,7 +365,7 @@ function carregarMensagens() { function setupInputSuggestions() { // Get all inputs with datalists const inputsWithDatalist = document.querySelectorAll('input[list]'); - + // Debounce function to limit how often we save function debounce(func, wait) { let timeout; @@ -368,12 +374,12 @@ function debounce(func, wait) { timeout = setTimeout(() => func.apply(this, args), wait); }; } - + inputsWithDatalist.forEach(input => { const datalistId = input.getAttribute('list'); const datalist = document.getElementById(datalistId); const storageKey = `suggestions_${input.id || input.name}`; - + // Load existing suggestions from localStorage const savedSuggestions = localStorage.getItem(storageKey); if (savedSuggestions) { @@ -387,7 +393,7 @@ function debounce(func, wait) { } }); } - + // Function to save suggestion const saveSuggestion = () => { const value = input.value.trim(); @@ -396,12 +402,12 @@ function debounce(func, wait) { if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + // Add new suggestion if it doesn't exist if (!suggestions.includes(value)) { suggestions.push(value); localStorage.setItem(storageKey, JSON.stringify(suggestions)); - + // Add to datalist if needed if (!Array.from(datalist.options).some(option => option.value === value)) { const option = document.createElement('option'); @@ -411,16 +417,16 @@ function debounce(func, wait) { } } }; - + // Debounced version for input event const debouncedSave = debounce(saveSuggestion, 300); - + // Listen for input (typing) events - save while typing input.addEventListener('input', debouncedSave); - + // Also listen for change events (when input loses focus) input.addEventListener('change', saveSuggestion); - + // Special handling for Livewire: save before Livewire updates input.addEventListener('keydown', function(e) { // Save immediately on Tab or Enter @@ -428,24 +434,24 @@ function debounce(func, wait) { saveSuggestion(); } }); - + // Save on blur (when focus leaves the input) input.addEventListener('blur', saveSuggestion); - + // Handle Livewire update - very important input.addEventListener('beforeinput', saveSuggestion); - + // Create a hidden form to prevent browser autocomplete from being blocked const form = document.createElement('form'); form.style.display = 'none'; form.setAttribute('autocomplete', 'on'); document.body.appendChild(form); - + // Clone the input and append to hidden form const clonedInput = input.cloneNode(true); clonedInput.removeAttribute('wire:model'); form.appendChild(clonedInput); - + // Sync values between visible and hidden inputs input.addEventListener('input', function() { clonedInput.value = input.value; @@ -459,13 +465,13 @@ function debounce(func, wait) { document.querySelectorAll('input[list]').forEach(input => { const storageKey = `suggestions_${input.id || input.name}`; const value = input.value.trim(); - + if (value) { let suggestions = []; if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + if (!suggestions.includes(value)) { suggestions.push(value); localStorage.setItem(storageKey, JSON.stringify(suggestions)); @@ -492,24 +498,24 @@ function populateSuggestions() { 'quality_question_id': ['QA01', 'QA02', 'QA1', 'QA2'], 'research_question_id': ['RQ1', 'RQ2', 'RQ3', 'GQ1'] }; - + // Add these to localStorage for immediate availability for (const [fieldName, values] of Object.entries(commonFields)) { const storageKey = `suggestions_${fieldName}`; let suggestions = []; - + // Get existing suggestions if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + // Add new common values if they don't exist values.forEach(value => { if (!suggestions.includes(value)) { suggestions.push(value); } }); - + // Save back to localStorage localStorage.setItem(storageKey, JSON.stringify(suggestions)); } @@ -526,18 +532,18 @@ function forceBrowserAutocompleteRefresh() { const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); - + // Create a form inside the iframe with autocomplete on const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; iframeDoc.body.innerHTML = '
'; const tempForm = iframeDoc.getElementById('temp-form'); - + // For each input we care about, create a parallel input in the iframe const inputFields = document.querySelectorAll('input[list]'); inputFields.forEach(input => { const name = input.name || input.id; const value = input.value; - + if (value) { // Get existing suggestions const storageKey = `suggestions_${name}`; @@ -545,13 +551,13 @@ function forceBrowserAutocompleteRefresh() { if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + // Add the new value if not present if (!suggestions.includes(value)) { suggestions.push(value); localStorage.setItem(storageKey, JSON.stringify(suggestions)); } - + // Create all inputs and add all values as options in the iframe suggestions.forEach((suggestion, index) => { const tempInput = document.createElement('input'); @@ -563,10 +569,10 @@ function forceBrowserAutocompleteRefresh() { }); } }); - + // Submit the form to register values with browser's autocomplete tempForm.submit(); - + // Clean up after a delay setTimeout(() => { document.body.removeChild(iframe); @@ -594,8 +600,8 @@ function forceBrowserAutocompleteRefresh() { // Bypass browser autocomplete memory limitations (function() { // Store a reference to all suggestions - const allSuggestions = {}; - + const allSuggestions = {}; + // Special workaround to force browser to update input suggestions function refreshInputBrowserCache(input) { // Create a form that we'll later submit and destroy @@ -608,80 +614,80 @@ function refreshInputBrowserCache(input) { form.style.left = '-9999px'; form.setAttribute('autocomplete', 'on'); document.body.appendChild(form); - + // Create a reset button to clear browser cache const resetBtn = document.createElement('button'); resetBtn.type = 'reset'; form.appendChild(resetBtn); - + // Reset the form to clear browser state resetBtn.click(); - + // Create a clone of our input const inputClone = document.createElement('input'); inputClone.type = 'text'; inputClone.name = input.name || input.id; inputClone.setAttribute('autocomplete', 'on'); form.appendChild(inputClone); - + // Get all suggestions for this input const storageKey = `suggestions_${input.name || input.id}`; if (localStorage.getItem(storageKey)) { const suggestions = JSON.parse(localStorage.getItem(storageKey)); - + // We'll use this to preserve our suggestions allSuggestions[storageKey] = suggestions; - + // Create a hidden submit button const submitBtn = document.createElement('button'); submitBtn.type = 'submit'; submitBtn.style.display = 'none'; form.appendChild(submitBtn); - + // For each suggestion, set the value and submit the form // This forces the browser to register each value for (let i = 0; i < suggestions.length; i++) { const suggestion = suggestions[i]; - + // Set value and trigger events inputClone.value = suggestion; inputClone.dispatchEvent(new Event('input', { bubbles: true })); inputClone.dispatchEvent(new Event('change', { bubbles: true })); - + // Submit the form for this value submitBtn.click(); } } - + // Remove the temporary form setTimeout(() => document.body.removeChild(form), 100); } - + // Monitor for new inputs and refresh their cache function checkForNewInputs() { document.querySelectorAll('input[list]').forEach(input => { const name = input.name || input.id; if (name && !input.hasAttribute('data-autocomplete-monitored')) { input.setAttribute('data-autocomplete-monitored', 'true'); - + // Immediately refresh this input's cache refreshInputBrowserCache(input); - + // Set up event listeners input.addEventListener('focus', () => refreshInputBrowserCache(input)); - + // Save new values when they're entered input.addEventListener('change', function() { const value = this.value.trim(); if (value) { const storageKey = `suggestions_${name}`; let suggestions = allSuggestions[storageKey] || []; - + if (!suggestions.includes(value)) { suggestions.push(value); allSuggestions[storageKey] = suggestions; localStorage.setItem(storageKey, JSON.stringify(suggestions)); - + // Update datalist const datalistId = input.getAttribute('list'); if (datalistId) { @@ -693,7 +699,7 @@ function checkForNewInputs() { datalist.appendChild(option); } } - + // Force browser to update refreshInputBrowserCache(input); } @@ -702,13 +708,13 @@ function checkForNewInputs() { } }); } - + // Check regularly for new inputs setInterval(checkForNewInputs, 1000); - + // Initial check on page load document.addEventListener('DOMContentLoaded', checkForNewInputs); - + // Check after Livewire updates document.addEventListener('livewire:load', checkForNewInputs); document.addEventListener('livewire:update', checkForNewInputs); @@ -721,27 +727,27 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { // Find the input and datalist elements const input = document.getElementById(inputId); const datalist = document.getElementById(datalistId); - + if (!input || !datalist) return; - + // Clear the browser's cache by toggling autocomplete input.setAttribute('autocomplete', 'off'); - + // Get current values from localStorage const storageKey = `suggestions_${inputName || inputId}`; let suggestions = []; - + if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + // Add the current value if it's not already in the list const currentValue = input.value.trim(); if (currentValue && !suggestions.includes(currentValue)) { suggestions.push(currentValue); localStorage.setItem(storageKey, JSON.stringify(suggestions)); } - + // Clear and rebuild the datalist datalist.innerHTML = ''; suggestions.forEach(suggestion => { @@ -749,14 +755,14 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { option.value = suggestion; datalist.appendChild(option); }); - + // Create a hidden form to force browser to register suggestions const form = document.createElement('form'); form.setAttribute('autocomplete', 'on'); form.style.position = 'absolute'; form.style.left = '-9999px'; document.body.appendChild(form); - + // Add a hidden input for each suggestion suggestions.forEach((suggestion, index) => { const hiddenInput = document.createElement('input'); @@ -766,17 +772,17 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { hiddenInput.setAttribute('autocomplete', 'on'); form.appendChild(hiddenInput); }); - + // Submit the form to register with browser form.submit(); - + // Remove the form after a delay setTimeout(() => { document.body.removeChild(form); - + // Re-enable autocomplete on the original input input.setAttribute('autocomplete', 'on'); - + // Show a message only if requested if (showAlert) { alert("Sugestões atualizadas! Agora você pode começar a digitar para ver todas as sugestões."); @@ -793,13 +799,13 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { form.addEventListener('submit', function(e) { // Find all input fields with datalists in this form const inputs = form.querySelectorAll('input[list]'); - + // For each input, refresh its suggestions inputs.forEach(input => { const inputId = input.id; const inputName = input.name || input.id; const datalistId = input.getAttribute('list'); - + // Use a small setTimeout to ensure this runs after the Livewire update setTimeout(() => { refreshSuggestions(inputId, inputName, datalistId, false); @@ -807,7 +813,7 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { }); }); }); - + // Also monitor Livewire events for form submission document.addEventListener('livewire:load', function() { if (typeof window.Livewire !== 'undefined') { @@ -819,7 +825,7 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { const inputId = input.id; const inputName = input.name || input.id; const datalistId = input.getAttribute('list'); - + // Refresh silently without alert refreshSuggestions(inputId, inputName, datalistId, false); }); @@ -843,11 +849,11 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { if (value) { const storageKey = `suggestions_${input.name || input.id}`; let suggestions = []; - + if (localStorage.getItem(storageKey)) { suggestions = JSON.parse(localStorage.getItem(storageKey)); } - + if (!suggestions.includes(value)) { suggestions.push(value); localStorage.setItem(storageKey, JSON.stringify(suggestions)); @@ -855,7 +861,7 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { } }); }); - + // After Livewire processes a request, update suggestions window.Livewire.hook('message.processed', (message, component) => { // Wait a bit for the DOM to settle @@ -864,16 +870,16 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { document.querySelectorAll('input[list]').forEach(input => { const datalistId = input.getAttribute('list'); const datalist = document.getElementById(datalistId); - + if (datalist) { const storageKey = `suggestions_${input.name || input.id}`; if (localStorage.getItem(storageKey)) { // Get saved suggestions const suggestions = JSON.parse(localStorage.getItem(storageKey)); - + // Clear datalist datalist.innerHTML = ''; - + // Add all suggestions as options suggestions.forEach(suggestion => { const option = document.createElement('option'); @@ -883,13 +889,13 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { } } }); - + // Also force browser to refresh its autocomplete cache document.querySelectorAll('input[list]').forEach(input => { const inputId = input.id; const inputName = input.name; const datalistId = input.getAttribute('list'); - + if (inputId && inputName && datalistId) { refreshSuggestions(inputId, inputName, datalistId, false); } @@ -900,4 +906,5 @@ function refreshSuggestions(inputId, inputName, datalistId, showAlert = true) { }); + diff --git a/resources/views/layouts/navbars/auth/sidenav.blade.php b/resources/views/layouts/navbars/auth/sidenav.blade.php index 5bca84d0c..25126040d 100644 --- a/resources/views/layouts/navbars/auth/sidenav.blade.php +++ b/resources/views/layouts/navbars/auth/sidenav.blade.php @@ -214,3 +214,14 @@ class="{{ Route::currentRouteName() == "levels.index" ? "text-primary" : "text-d +
  • + + + + + Minhas Notas + +
  • + diff --git a/resources/views/livewire/conducting/data-extraction/buttons.blade.php b/resources/views/livewire/conducting/data-extraction/buttons.blade.php index 922e2d91e..d12107dda 100644 --- a/resources/views/livewire/conducting/data-extraction/buttons.blade.php +++ b/resources/views/livewire/conducting/data-extraction/buttons.blade.php @@ -23,5 +23,6 @@ $wire.on('buttons', ([{ message, type }]) => { toasty({ message, type }); }); + @endscript diff --git a/resources/views/livewire/conducting/data-extraction/paper-modal.blade.php b/resources/views/livewire/conducting/data-extraction/paper-modal.blade.php index 6d926d591..3b83eb861 100644 --- a/resources/views/livewire/conducting/data-extraction/paper-modal.blade.php +++ b/resources/views/livewire/conducting/data-extraction/paper-modal.blade.php @@ -215,4 +215,5 @@ function debounceSave(questionId, content) { toasty({ message, type }); }); -@endscript \ No newline at end of file +@endscript + diff --git a/resources/views/livewire/conducting/data-extraction/paper-status.blade.php b/resources/views/livewire/conducting/data-extraction/paper-status.blade.php index 6b884dd5d..3f119336e 100644 --- a/resources/views/livewire/conducting/data-extraction/paper-status.blade.php +++ b/resources/views/livewire/conducting/data-extraction/paper-status.blade.php @@ -10,4 +10,8 @@ toasty({ message, type }); }); + +

    📝 Minhas Anotações

    +@livewire('notes') + @endscript diff --git a/resources/views/livewire/conducting/quality-assessment/quality-scor.blade.php b/resources/views/livewire/conducting/quality-assessment/quality-scor.blade.php new file mode 100644 index 000000000..4fa7442ee --- /dev/null +++ b/resources/views/livewire/conducting/quality-assessment/quality-scor.blade.php @@ -0,0 +1,27 @@ +status_paper = 'Accepted'; // Exemplo + $this->score = 4.5; // Exemplo + $this->quality_description = 'Alto nível de evidência'; // Exemplo + } + + public function render() + { + return view('livewire.conducting.quality-assessment.quality-score'); + } +} diff --git a/resources/views/livewire/conducting/quality-assessment/quality-score.blade.php b/resources/views/livewire/conducting/quality-assessment/quality-score.blade.php index 9fcb40cff..873f12856 100644 --- a/resources/views/livewire/conducting/quality-assessment/quality-score.blade.php +++ b/resources/views/livewire/conducting/quality-assessment/quality-score.blade.php @@ -1,19 +1,33 @@ -
    - {{ __('project/conducting.quality-assessment.modal.status-quality' )}}: - - {{ __("project/conducting.quality-assessment.status." . strtolower($status_paper)) }} - - | - {{ __('project/conducting.quality-assessment.modal.quality-score' )}}: - - {{ $score ?? 'N/A' }} - - | - {{ __('project/conducting.quality-assessment.modal.quality-description' )}}: - - {{ $quality_description }} - +{{-- Última atualização feita por Luiza Velasque --}} +
    + {{-- Status do artigo --}} +
    + {{ __('project/conducting.quality-assessment.modal.status-quality') }}: + + {{ __("project/conducting.quality-assessment.status." . strtolower($status_paper)) }} + +
    + + {{-- Score de qualidade (editável) --}} +
    + {{ __('project/conducting.quality-assessment.modal.quality-score') }}: + +
    + + {{-- Descrição do score --}} +
    + {{ __('project/conducting.quality-assessment.modal.quality-description') }}: + + {{ $quality_description }} + +
    + @script -@endscript +@endscript \ No newline at end of file diff --git a/resources/views/livewire/user-notes.blade.php b/resources/views/livewire/user-notes.blade.php new file mode 100644 index 000000000..d761a6852 --- /dev/null +++ b/resources/views/livewire/user-notes.blade.php @@ -0,0 +1,22 @@ +
    +

    Minhas Notas

    + + @if (session()->has('message')) +
    {{ session('message') }}
    + @endif + + + + +
    +

    Notas anteriores:

    + @forelse ($notes as $note) +
    +

    {{ $note->content }}

    + {{ $note->created_at->format('d/m/Y H:i') }} +
    + @empty +

    Você ainda não escreveu nenhuma nota.

    + @endforelse +
    +
    diff --git a/resources/views/notes/index.blade.php b/resources/views/notes/index.blade.php new file mode 100644 index 000000000..4bf07e983 --- /dev/null +++ b/resources/views/notes/index.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('content') +
    +
    +

    📝 Minhas Notas

    + + @if (session('message')) +
    + {{ session('message') }} +
    + @endif + +
    + @csrf + + @error('content') +
    {{ $message }}
    + @enderror + + +
    + +
    + +

    📚 Notas anteriores

    + + @forelse ($notes as $note) +
    +

    {{ $note->content }}

    + {{ $note->created_at->format('d/m/Y H:i') }} +
    + @empty +

    Você ainda não tem notas salvas.

    + @endforelse +
    +
    +@endsection diff --git a/resources/views/pages/about.blade.php b/resources/views/pages/about.blade.php index bc9d2008d..441507154 100644 --- a/resources/views/pages/about.blade.php +++ b/resources/views/pages/about.blade.php @@ -1,269 +1,197 @@ @extends("layouts.app") @section("content") -@include("layouts.navbars.guest.navbar", ["title" => "Home"]) + @include("layouts.navbars.guest.navbar", ["title" => "Início"]) -
    - -