fix(kb): search preview shows section-in-context for text sources
User reported the search card "looks broken" when the selected hit is the
law (Wikisource source 5) — the right preview pane just duplicates the
chunk text already visible in the left list card. For PDF sources the
right pane shows the PDF page, but for text-only sources it had nothing
useful to add and fell back to a copy.
Fix:
- /kb/search hits gained chunk_index (shira-hermes b127caf), and
/kb/source/{id}/chunks gained an `around=<chunk_index>&ctx=<k>` window.
- Espo proxy plumbing: getActionChunks reads `around`/`ctx` query
params and forwards them; KnowledgeBaseService::sourceChunks accepts
optional $around + $ctx and appends them to the upstream URL.
- showSearchPreview for non-PDF hits now fetches the matched chunk plus
2 sections before and 2 after, renders them as stacked panels: the
matched section gets a yellow #fff3cd highlight, neighbors render as
muted context blocks. The panel header carries a prominent
"פתח ב-Wikisource" button so users can jump to the public source page.
After render the matched section auto-scrolls into view.
- Race protection via _previewToken: a click on a different hit while a
fetch is in flight cancels the stale render so the user always sees
the section that matches the currently-selected card.
PDF path unchanged.
Refs Task Master #7
This commit is contained in:
@@ -73,7 +73,12 @@ class KnowledgeBase
|
||||
throw new BadRequest('sourceId (numeric) is required.');
|
||||
}
|
||||
|
||||
return $this->getService()->sourceChunks((int) $sourceId);
|
||||
$around = $request->getQueryParam('around');
|
||||
$ctx = $request->getQueryParam('ctx');
|
||||
$aroundInt = ($around !== null && is_numeric($around)) ? (int) $around : null;
|
||||
$ctxInt = ($ctx !== null && is_numeric($ctx)) ? (int) $ctx : 2;
|
||||
|
||||
return $this->getService()->sourceChunks((int) $sourceId, $aroundInt, $ctxInt);
|
||||
}
|
||||
|
||||
public function postActionAsk(Request $request, Response $response): array
|
||||
|
||||
@@ -48,9 +48,13 @@ class KnowledgeBaseService
|
||||
return $this->get('/kb/sources');
|
||||
}
|
||||
|
||||
public function sourceChunks(int $sourceId): array
|
||||
public function sourceChunks(int $sourceId, ?int $around = null, int $ctx = 2): array
|
||||
{
|
||||
return $this->get('/kb/source/' . $sourceId . '/chunks');
|
||||
$path = '/kb/source/' . $sourceId . '/chunks';
|
||||
if ($around !== null) {
|
||||
$path .= '?around=' . $around . '&ctx=' . $ctx;
|
||||
}
|
||||
return $this->get($path);
|
||||
}
|
||||
|
||||
public function ask(string $message, ?string $conversationId, array $history): array
|
||||
|
||||
Reference in New Issue
Block a user