From c519df297cd92404af7e16a9af73c7992e17a1fa Mon Sep 17 00:00:00 2001 From: Zoey de Souza Pessanha Date: Sun, 30 Jul 2023 20:05:28 -0300 Subject: [PATCH 1/2] Tela de listagem de Pesquisadores (#130) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tela básica de listagem de pesquisadores * implementa tabela de pesquisadores dinâmica * adiciona handler para pesquisador * resolve diferentes cores nas colunas de uma tabela --- .../lib/identidades/models/usuario.ex | 2 +- .../adapters/pesquisador_adapter.ex | 19 ++++++ .../handlers/i_manage_pesquisador_handler.ex | 5 ++ .../handlers/pesquisador_handler.ex | 14 ++++ .../lib/modulo_pesquisa/repository.ex | 4 +- .../modulo_pesquisa/schemas/pesquisador.ex | 34 ++++++++++ apps/plataforma_digital/assets/css/app.scss | 1 + .../plataforma_digital/assets/css/button.scss | 8 ++- .../app/researcher/listagem_pesquisador.scss | 21 ++++++ .../plataforma_digital/assets/css/search.scss | 3 +- .../lib/plataforma_digital/design_system.ex | 3 +- .../design_system/authenticated_navbar.ex | 19 +++--- .../design_system/search_input.ex | 57 ++++++++++++---- .../live/pesquisa/list_pesquisador_live.ex | 67 +++++++++++++++++++ .../pesquisa/list_pesquisador_live.html.heex | 31 +++++++++ .../relatorio/list_report_live.html.heex | 2 +- .../lib/plataforma_digital/router.ex | 3 +- 17 files changed, 266 insertions(+), 27 deletions(-) create mode 100644 apps/modulo_pesquisa/lib/modulo_pesquisa/adapters/pesquisador_adapter.ex create mode 100644 apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/i_manage_pesquisador_handler.ex create mode 100644 apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/pesquisador_handler.ex create mode 100644 apps/modulo_pesquisa/lib/modulo_pesquisa/schemas/pesquisador.ex create mode 100644 apps/plataforma_digital/assets/css/pages/app/researcher/listagem_pesquisador.scss create mode 100644 apps/plataforma_digital/lib/plataforma_digital/live/pesquisa/list_pesquisador_live.ex create mode 100644 apps/plataforma_digital/lib/plataforma_digital/live/pesquisa/list_pesquisador_live.html.heex diff --git a/apps/identidades/lib/identidades/models/usuario.ex b/apps/identidades/lib/identidades/models/usuario.ex index ae374b08..2f35b354 100644 --- a/apps/identidades/lib/identidades/models/usuario.ex +++ b/apps/identidades/lib/identidades/models/usuario.ex @@ -4,7 +4,7 @@ defmodule Identidades.Models.Usuario do import Brcpfcnpj.Changeset, only: [validate_cpf: 3] alias Identidades.Models.Contato - # alias ModuloPesquisa.Models.Pesquisador + alias ModuloPesquisa.Models.Pesquisador @type t :: %Usuario{ cpf: binary, diff --git a/apps/modulo_pesquisa/lib/modulo_pesquisa/adapters/pesquisador_adapter.ex b/apps/modulo_pesquisa/lib/modulo_pesquisa/adapters/pesquisador_adapter.ex new file mode 100644 index 00000000..32465822 --- /dev/null +++ b/apps/modulo_pesquisa/lib/modulo_pesquisa/adapters/pesquisador_adapter.ex @@ -0,0 +1,19 @@ +defmodule ModuloPesquisa.Adapters.PesquisadorAdapter do + alias Identidades.Handlers.UsuarioHandler + + alias ModuloPesquisa.Models.Pesquisador, as: Model + alias ModuloPesquisa.Schemas.Pesquisador, as: Schema + + @spec internal_to_external(Model.t()) :: Schema.t() + def internal_to_external(pesquisador) do + attrs = %{ + id: pesquisador.id_publico, + nome: UsuarioHandler.build_usuario_name(pesquisador.usuario), + cpf: pesquisador.usuario.cpf, + email: pesquisador.usuario.contato.email_principal, + participacao: pesquisador.bolsa + } + + Schema.parse!(attrs) + end +end diff --git a/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/i_manage_pesquisador_handler.ex b/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/i_manage_pesquisador_handler.ex new file mode 100644 index 00000000..fa6bb07e --- /dev/null +++ b/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/i_manage_pesquisador_handler.ex @@ -0,0 +1,5 @@ +defmodule ModuloPesquisa.Handlers.IManagePesquisadorHandler do + alias ModuloPesquisa.Models.Pesquisador + + @callback list_pesquisadores() :: [Pesquisador.t()] +end diff --git a/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/pesquisador_handler.ex b/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/pesquisador_handler.ex new file mode 100644 index 00000000..a350780e --- /dev/null +++ b/apps/modulo_pesquisa/lib/modulo_pesquisa/handlers/pesquisador_handler.ex @@ -0,0 +1,14 @@ +defmodule ModuloPesquisa.Handlers.PesquisadorHandler do + alias ModuloPesquisa.Adapters.PesquisadorAdapter + alias ModuloPesquisa.Handlers.IManagePesquisadorHandler + alias ModuloPesquisa.Repository + + @behaviour IManagePesquisadorHandler + + @impl true + def list_pesquisadores do + Repository.list_pesquisador() + |> Enum.sort_by(& &1.usuario.primeiro_nome) + |> Enum.map(&PesquisadorAdapter.internal_to_external/1) + end +end diff --git a/apps/modulo_pesquisa/lib/modulo_pesquisa/repository.ex b/apps/modulo_pesquisa/lib/modulo_pesquisa/repository.ex index b9dad51b..d8414b8b 100644 --- a/apps/modulo_pesquisa/lib/modulo_pesquisa/repository.ex +++ b/apps/modulo_pesquisa/lib/modulo_pesquisa/repository.ex @@ -99,7 +99,9 @@ defmodule ModuloPesquisa.Repository do @impl true def list_pesquisador do - Repo.replica().all(Pesquisador) + query = from p in Pesquisador, preload: [usuario: [:contato]] + + Repo.replica().all(query) end @impl true diff --git a/apps/modulo_pesquisa/lib/modulo_pesquisa/schemas/pesquisador.ex b/apps/modulo_pesquisa/lib/modulo_pesquisa/schemas/pesquisador.ex new file mode 100644 index 00000000..8e010c82 --- /dev/null +++ b/apps/modulo_pesquisa/lib/modulo_pesquisa/schemas/pesquisador.ex @@ -0,0 +1,34 @@ +defmodule ModuloPesquisa.Schemas.Pesquisador do + use Ecto.Schema + + import Ecto.Changeset + + alias __MODULE__ + alias ModuloPesquisa.Models.Pesquisador, as: Model + + @type t :: %Pesquisador{ + id: String.t(), + nome: String.t(), + cpf: String.t(), + email: String.t(), + participacao: String.t() + } + + @required_fields ~w(id nome cpf email participacao)a + + @primary_key false + embedded_schema do + field :id, Database.Types.PublicId, autogenerate: false + field :nome, :string + field :cpf, :string + field :email, :string + field :participacao, Ecto.Enum, values: Model.tipo_bolsas() + end + + def parse!(attrs) do + %Pesquisador{} + |> cast(attrs, @required_fields) + |> validate_required(@required_fields) + |> apply_action!(:parse) + end +end diff --git a/apps/plataforma_digital/assets/css/app.scss b/apps/plataforma_digital/assets/css/app.scss index 78259d6b..307c2c96 100644 --- a/apps/plataforma_digital/assets/css/app.scss +++ b/apps/plataforma_digital/assets/css/app.scss @@ -177,6 +177,7 @@ footer { // Com autenticação @import "./pages/app/researcher/profile.scss"; +@import "./pages/app/researcher/listagem_pesquisador.scss"; @import "./pages/app/researcher/relatorio/mensal.scss"; @import "./pages/app/researcher/relatorio/list_report.scss"; diff --git a/apps/plataforma_digital/assets/css/button.scss b/apps/plataforma_digital/assets/css/button.scss index af55894a..9f066f71 100644 --- a/apps/plataforma_digital/assets/css/button.scss +++ b/apps/plataforma_digital/assets/css/button.scss @@ -1,10 +1,16 @@ .btn { @apply py-6 px-4; - @apply flex-center; + display: flex; + justify-content: center; + align-items: center; height: 3rem; gap: 0.5rem; border-radius: 0.25rem; + + svg { + display: inline; + } } .btn-primary { diff --git a/apps/plataforma_digital/assets/css/pages/app/researcher/listagem_pesquisador.scss b/apps/plataforma_digital/assets/css/pages/app/researcher/listagem_pesquisador.scss new file mode 100644 index 00000000..875be4be --- /dev/null +++ b/apps/plataforma_digital/assets/css/pages/app/researcher/listagem_pesquisador.scss @@ -0,0 +1,21 @@ +.listagem-pesquisador { + width: 100%; + height: 100%; + padding: 2.5rem; + display: flex; + flex-direction: column; + + .listagem-actions { + display: flex; + margin-bottom: 2.62rem; + + button { + margin-left: 1.5rem; + width: 10rem; + } + } + + a { + @apply text-black-100; + } +} diff --git a/apps/plataforma_digital/assets/css/search.scss b/apps/plataforma_digital/assets/css/search.scss index 43879064..0a7530cb 100644 --- a/apps/plataforma_digital/assets/css/search.scss +++ b/apps/plataforma_digital/assets/css/search.scss @@ -6,7 +6,7 @@ } &.large { - width: 32.5rem; + width: 36rem; } } @@ -54,6 +54,7 @@ } .search-input-wrapper .search-menu { + @apply bg-white-100; @apply border-x-black-10 border-b-black-10 border-2; border-top: 0; diff --git a/apps/plataforma_digital/lib/plataforma_digital/design_system.ex b/apps/plataforma_digital/lib/plataforma_digital/design_system.ex index 7a50d7ff..f0510ef2 100644 --- a/apps/plataforma_digital/lib/plataforma_digital/design_system.ex +++ b/apps/plataforma_digital/lib/plataforma_digital/design_system.ex @@ -556,6 +556,7 @@ defmodule PlataformaDigital.DesignSystem do end attr :rows, :list, default: [] + attr :"text-color", :string, required: true def table(assigns) do ~H""" @@ -578,7 +579,7 @@ defmodule PlataformaDigital.DesignSystem do <%= for col <- @column do %> <%= if Map.get(col, :type, "text") == "text" do %> - <.text size="md" color="text-blue-100"> + <.text size="md" color={Map.get(assigns, :"text-color")}> <%= render_slot(col, row) %> <% else %> diff --git a/apps/plataforma_digital/lib/plataforma_digital/design_system/authenticated_navbar.ex b/apps/plataforma_digital/lib/plataforma_digital/design_system/authenticated_navbar.ex index b46fc4b0..a219420d 100644 --- a/apps/plataforma_digital/lib/plataforma_digital/design_system/authenticated_navbar.ex +++ b/apps/plataforma_digital/lib/plataforma_digital/design_system/authenticated_navbar.ex @@ -2,6 +2,7 @@ defmodule PlataformaDigital.DesignSystem.AuthenticatedNavbar do use PlataformaDigital, :live_component alias Identidades.Models.Usuario + alias PlataformaDigital.DesignSystem attr :user, Usuario, required: true attr :open, :boolean, default: nil @@ -25,19 +26,21 @@ defmodule PlataformaDigital.DesignSystem.AuthenticatedNavbar do <.text :if={@open} size="base" color="text-black-60">Home - - - + +