Compare commits

..

No commits in common. "a09280f9157110de29db13d7282ad64b26867fbe" and "b12c31099c59387dfddf4e2a7e25dab7fbb94827" have entirely different histories.

4 changed files with 15 additions and 19 deletions

View File

@ -17,7 +17,6 @@ interface ParagraphDoc {
id?: string id?: string
document_id: string document_id: string
text: string text: string
raw?: string
number: number number: number
locale: string locale: string
type: string type: string
@ -328,7 +327,6 @@ function normalize(s: string): string {
// ---- Refs de estado --------------------------------------------------------- // ---- Refs de estado ---------------------------------------------------------
const paragraphsContainer = ref<HTMLElement | null>(null) const paragraphsContainer = ref<HTMLElement | null>(null)
const scrollContainer = ref<HTMLElement | null>(null)
// 'typesense' = Estado 1 (server-driven), 'local' = Estado 2 (client-driven) // 'typesense' = Estado 1 (server-driven), 'local' = Estado 2 (client-driven)
type SearchMode = 'typesense' | 'local' type SearchMode = 'typesense' | 'local'
@ -483,11 +481,9 @@ async function applyTypesenseHighlights() {
matchElements.value = domMarks matchElements.value = domMarks
currentMatchIdx.value = 0 currentMatchIdx.value = 0
// Paso 4: scroll sin hits (browse mode) volver al inicio; con hits, ir al párrafo correcto. // Paso 4: scroll solo cuando hay hits de Typesense que ubican el párrafo correcto.
if (!hasMatchingHits) { // Sin hits, los marks se muestran para que el usuario navegue, pero no se hace scroll.
if (scrollContainer.value) scrollContainer.value.scrollTop = 0 if (!hasMatchingHits) return
return
}
let targetMark: HTMLElement | null = snippetMarks[0] ?? null let targetMark: HTMLElement | null = snippetMarks[0] ?? null
@ -860,7 +856,7 @@ function highlightTextNodes(root: HTMLElement, terms: string[]): number {
<div class=""> <div class="">
<div <div
class="paragraph-html text-sm leading-relaxed text-gray-800 dark:text-gray-200" class="paragraph-html text-sm leading-relaxed text-gray-800 dark:text-gray-200"
v-html="hit.document.raw || hit.document.text" v-html="hit.document.raw"
/> />
</div> </div>
</div> </div>

View File

@ -4,8 +4,8 @@ import { breakpointsTailwind, useDebounce } from '@vueuse/core'
import EstudiosTypensenseDetail from '~/components/estudiosTypensense/EstudiosTypensenseDetail.vue' import EstudiosTypensenseDetail from '~/components/estudiosTypensense/EstudiosTypensenseDetail.vue'
import { useSettingsStore } from '~/stores/settings' import { useSettingsStore } from '~/stores/settings'
const PARAGRAPHS_COLLECTION = 'conferences_paragraphs' const PARAGRAPHS_COLLECTION = 'paragraphs'
const CONFERENCES_COLLECTION = 'conferences' const DOCUMENTS_COLLECTION = 'documents'
const QUERY_BY = 'text' const QUERY_BY = 'text'
const FAVORITES_COLLECTION = 'conferences-ts' const FAVORITES_COLLECTION = 'conferences-ts'
@ -184,7 +184,7 @@ async function fetchDocumentMeta(docIds: string[]) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: CONFERENCES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: `id:=[${unique.join(',')}]`, filterBy: `id:=[${unique.join(',')}]`,
@ -313,7 +313,7 @@ async function runBrowse(page = 1, append = false) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: CONFERENCES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: filterBy.value, filterBy: filterBy.value,
@ -444,7 +444,7 @@ async function fetchFullDocument(docId: string) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: CONFERENCES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: `id:=${docId}`, filterBy: `id:=${docId}`,

View File

@ -4,8 +4,8 @@ import { breakpointsTailwind, useDebounce } from '@vueuse/core'
import EstudiosTypensenseDetail from '~/components/estudiosTypensense/EstudiosTypensenseDetail.vue' import EstudiosTypensenseDetail from '~/components/estudiosTypensense/EstudiosTypensenseDetail.vue'
import { useSettingsStore } from '~/stores/settings' import { useSettingsStore } from '~/stores/settings'
const PARAGRAPHS_COLLECTION = 'activities_paragraphs' const PARAGRAPHS_COLLECTION = 'paragraphs'
const ACTIVITIES_COLLECTION = 'activities' const DOCUMENTS_COLLECTION = 'documents'
const QUERY_BY = 'text' const QUERY_BY = 'text'
const FAVORITES_COLLECTION = 'bible-studies-ts' const FAVORITES_COLLECTION = 'bible-studies-ts'
@ -185,7 +185,7 @@ async function fetchDocumentMeta(docIds: string[]) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: ACTIVITIES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: `id:=[${unique.join(',')}]`, filterBy: `id:=[${unique.join(',')}]`,
@ -314,7 +314,7 @@ async function runBrowse(page = 1, append = false) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: ACTIVITIES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: filterBy.value, filterBy: filterBy.value,
@ -444,7 +444,7 @@ async function fetchFullDocument(docId: string) {
multiSearchParameters: {}, multiSearchParameters: {},
multiSearchSearchesParameter: { multiSearchSearchesParameter: {
searches: [{ searches: [{
collection: ACTIVITIES_COLLECTION, collection: DOCUMENTS_COLLECTION,
q: '*', q: '*',
queryBy: 'title', queryBy: 'title',
filterBy: `id:=${docId}`, filterBy: `id:=${docId}`,

View File

@ -76,7 +76,7 @@ export default defineNuxtConfig({
typesense: { typesense: {
url: 'https://searchts.carpa.com', // Your Typesense server URL url: 'https://searchts.carpa.com', // Your Typesense server URL
apiKey: 'ULcypm8VYP2vgQkN57CuUqSFypWaR6ox', // Your Typesense API key apiKey: 'a2lbIMTxh48KVteLLndpBfo4tuOIGiwD', // Your Typesense API key
// Habilita los composables auto-importados en cliente // Habilita los composables auto-importados en cliente
// (useTypesenseDocuments, useTypesenseApi, etc.). // (useTypesenseDocuments, useTypesenseApi, etc.).
// ⚠️ Solo usa una clave de búsqueda (search-only) aquí: queda expuesta al navegador. // ⚠️ Solo usa una clave de búsqueda (search-only) aquí: queda expuesta al navegador.