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 apseudoQueryatual.<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 objetopseudoQueryque recebeu comoprop.<search-list>: Responsável por exibir os resultados em formato de lista. Ele também recebe apseudoQuery. Quando apseudoQuerymuda (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 napseudoQuerye 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 objetopseudoQueryfoi passado comoprope é 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) naproppseudoQuery. 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 naspropsrecebidas) 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 apseudoQuerye a modificam diretamente quando o usuário interage.Quando um método como
clearFiltersou um evento de clique num filtro alterathis.pseudoQuery, a mágica da reatividade do Vue garante que os outros componentes que usam essa mesmapseudoQuerysejam notificados. -
Reagindo à Query (Mapa) (
modules/Search/components/search-map/script.js): O componente de mapa observa apseudoQuerye dispara uma nova busca quando ela muda.A função
watché crucial aqui. Ela detecta qualquer mudança napseudoQuery, e ohandlerchamafetchEntities.fetchEntitiesusaUtils.parsePseudoQuerypara 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.fetchpara 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 àpseudoQuerye exibir os resultados.Aqui, o
watchatualiza athis.query(a versão formatada). O template dosearch-listprovavelmente usa essaqueryao 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.