Busca
Capítulo 4
Olá! No Capítulo 3: Classe API, vimos como a plataforma conversa com o servidor para buscar e salvar dados usando a nossa "carteira digital", a Classe API. Agora que sabemos como obter as informações das Entidades, como podemos permitir que os usuários encontrem exatamente o que procuram na vasta quantidade de dados culturais?
É aí que entra a funcionalidade de Busca (Search)!
Para que serve a Busca?
Imagine a plataforma como uma imensa biblioteca cheia de informações sobre artistas, espaços culturais, eventos e oportunidades. Encontrar algo específico poderia ser como procurar uma agulha no palheiro!
A Busca é a ferramenta que transforma essa biblioteca gigante em algo navegável e útil. Ela funciona como o motor de busca do Google, mas totalmente focada no nosso universo cultural. Com ela, os usuários podem:
- Procurar por palavras-chave: Buscar por "teatro", "show de rock", "exposição de arte", "museu no centro", etc.
- Filtrar resultados: Refinar a busca aplicando filtros específicos, como área de atuação (música, teatro, artes visuais), tipo de espaço (galeria, centro cultural), datas de eventos, bairros ou cidades, e muito mais.
- Visualizar como preferir: Ver os resultados em uma lista detalhada ou diretamente em um mapa interativo.
Nosso Caso de Uso: Como um usuário pode encontrar todos os "Espaços Culturais" do tipo "Teatro" que estão localizados no bairro "Centro" e que possuem eventos agendados para a "próxima semana"? É isso que a funcionalidade de Busca nos permite fazer!
Entendendo os Conceitos da Busca
Para construir essa experiência de busca poderosa, combinamos vários elementos:
-
Palavra-chave (
keyword
): O termo principal que o usuário digita na barra de busca. O sistema procura essa palavra nos nomes, descrições e outros campos relevantes das entidades. -
Filtros: São opções adicionais para refinar a busca. Cada tipo de entidade (Agent, Space, Event, Opportunity) tem seus próprios filtros possíveis:
- Agente: Área de atuação.
- Espaço: Área de atuação, Tipo de Espaço.
- Evento: Linguagem/Área, Data (início e fim), Classificação Etária.
- Oportunidade: Área, Tipo, Período de Inscrição.
- Localização: Muitos filtros incluem a busca por proximidade ou em uma área específica do mapa.
-
pseudoQuery
(Pseudo-Consulta): Este é um termo técnico importante! É um objeto JavaScript que representa todos os critérios de busca atuais: a palavra-chave, os filtros selecionados, a ordenação desejada, etc. Ele é "pseudo" porque ainda não é a consulta final enviada para a Classe API, mas contém todas as informações necessárias para montá-la. Pense nele como a "receita" da busca.À medida que o usuário aplica filtros, esse objeto
pseudoQuery
é atualizado. -
Visualização (Lista vs. Mapa): A busca geralmente oferece duas formas de ver os resultados:
- Lista (
search-list
): Mostra as entidades encontradas como uma lista de cartões ou itens, com informações resumidas. Ideal para ver detalhes rápidos. - Mapa (
search-map
): Exibe as entidades como marcadores em um mapa interativo. Ótimo para entender a distribuição geográfica dos resultados.
- Lista (
Usando a Busca na Prática: Os Componentes em Ação
A funcionalidade de busca é construída usando vários Componentes Vue que trabalham juntos. O componente principal é o <search>
, que orquestra os outros.
Estrutura Típica:
Imagine uma página de busca de Espaços Culturais. O código dela poderia se parecer com algo assim (simplificado):
O que acontece aqui?
<search>
: É o componente "maestro". Ele recebe o tipo de entidade (entity-type="space"
) e a configuração inicial (initial-pseudo-query
). Ele mantém o estado atual dapseudoQuery
(a receita da busca).<mc-tabs>
: Cria as abas "Lista" e "Mapa".<search-filter>
: Um contêiner para os filtros. Ele recebe apseudoQuery
atual.<search-filter-space>
: Contém os controles específicos para filtrar espaços (área de atuação, tipo). Quando o usuário muda um filtro aqui, ele modifica o objetopseudoQuery
que recebeu comoprop
.<search-list>
: Responsável por exibir os resultados em formato de lista. Ele também recebe apseudoQuery
. Quando apseudoQuery
muda (porque o usuário aplicou um filtro), este componente reage, pede os novos dados (usando a Classe API internamente, geralmente através de outro componente comomc-entities
) e atualiza a lista.<search-map>
: Similar à lista, mas exibe os resultados no mapa. Ele também "ouve" as mudanças napseudoQuery
e busca os dados atualizados para exibir os marcadores corretos.
A chave aqui é o objeto pseudoQuery
. Ele é passado como prop
para os componentes de filtro, lista e mapa. Os filtros modificam esse objeto, e a lista/mapa reagem a essas modificações buscando e exibindo os novos resultados. É como se todos estivessem olhando para a mesma "receita" de busca, e quando alguém atualiza a receita, os cozinheiros (lista e mapa) preparam o prato novamente.
Por Dentro da Busca: Como Funciona?
Vamos seguir o fluxo quando um usuário aplica um filtro.
O Fluxo Simplificado:
- Usuário Interage: O usuário clica em um checkbox de filtro no
<search-filter-space>
(por exemplo, seleciona a área "Música"). - Componente Filtro (
search-filter-space
): O código JavaScript do componente detecta a mudança e atualiza a propriedade correspondente no objetopseudoQuery
(ex:this.pseudoQuery['space:term:area'].push('Música')
). Como o objetopseudoQuery
foi passado comoprop
e é reativo, essa mudança é comunicada. - Componente
search
(Orquestrador): Percebe a mudança napseudoQuery
. - Componentes de Resultado (
search-list
/search-map
): Eles têm um "observador" (watch
) naprop
pseudoQuery
. Quando detectam a mudança:- Preparam a consulta para a API: Usam uma função utilitária (
Utils.parsePseudoQuery
) para transformar a "receita" (pseudoQuery
) na consulta real que a Classe API entende. - Chamam a API: Fazem a chamada
api.find()
ouapi.fetch()
com a consulta preparada. - Recebem os Resultados: A API retorna a lista de entidades que correspondem aos novos critérios.
- Atualizam a Exibição: Renderizam novamente a lista ou o mapa com os novos dados.
- Preparam a consulta para a API: Usam uma função utilitária (
Diagrama de Sequência (Aplicando um Filtro):
Mergulhando no Código:
-
Orquestração (
modules/Search/components/search/script.js
): Este componente geralmente inicializa apseudoQuery
(baseada nasprops
recebidas) e a torna disponível para os componentes filhos (filtros, lista, mapa).O
data()
retorna o objetopseudoQuery
, que será passado para os componentes filhos via:pseudo-query="pseudoQuery"
no template. -
Modificando a Query (
modules/Search/components/search-filter-space/script.js
): Os componentes de filtro recebem apseudoQuery
e a modificam diretamente quando o usuário interage.Quando um método como
clearFilters
ou um evento de clique num filtro alterathis.pseudoQuery
, a mágica da reatividade do Vue garante que os outros componentes que usam essa mesmapseudoQuery
sejam notificados. -
Reagindo à Query (Mapa) (
modules/Search/components/search-map/script.js
): O componente de mapa observa apseudoQuery
e dispara uma nova busca quando ela muda.A função
watch
é crucial aqui. Ela detecta qualquer mudança napseudoQuery
, e ohandler
chamafetchEntities
.fetchEntities
usaUtils.parsePseudoQuery
para converter a "receita" em uma consulta que a Classe API entende (com a sintaxe correta de filtros, seleção de campos, etc.) e então chamathis.api.fetch
para buscar os dados e atualizar os marcadores no mapa (this.entities
). -
Reagindo à Query (Lista) (
modules/Search/components/search-list/script.js
): A lista funciona de forma similar ao mapa, observando apseudoQuery
. No código fornecido, ela parece delegar a busca real para outro componente (provavelmentemc-entities
, que não está detalhado aqui), mas o princípio é o mesmo: reagir àpseudoQuery
e exibir os resultados.Aqui, o
watch
atualiza athis.query
(a versão formatada). O template dosearch-list
provavelmente usa essaquery
ao renderizar o componente que efetivamente busca e mostra a lista (ex:<mc-entities :query="query" ...>
).
Conclusão
Neste capítulo, exploramos a funcionalidade de Busca (Search), o "Google Cultural" da plataforma. Vimos como ela permite aos usuários encontrar Entidades usando palavras-chave e filtros específicos.
Entendemos o papel central do objeto pseudoQuery
como a "receita" da busca, e como os diferentes Componentes Vue (search
, search-filter-*
, search-list
, search-map
) colaboram: os filtros modificam a pseudoQuery
, e os componentes de resultado (lista e mapa) reagem a essas mudanças, utilizando a Classe API para buscar e exibir os dados atualizados.
Dominar a busca é essencial para oferecer uma boa experiência ao usuário, permitindo que ele navegue e descubra facilmente a riqueza cultural da plataforma.
Agora que sabemos como os usuários podem encontrar informações, como os administradores e proprietários de conteúdo gerenciam suas próprias entidades? No próximo capítulo, vamos conhecer o Painel de Controle (Panel), a área administrativa da plataforma.
Generated by AI Codebase Knowledge Builder
Esse material é fruto do Programa de Difusão Nacional - Funarte Redes das Artes, realizado pelo Laboratório do Futuro (entidade vinculada à Universidade Federal do Ceará) no ano de 2025.