Highlighting matched part in question search

This commit is contained in:
mrfry 2021-04-13 17:11:06 +02:00
parent f94b99e181
commit 1b3c07fce2
4 changed files with 48 additions and 27 deletions

View file

@ -1,9 +1,11 @@
import React, { PureComponent } from 'react' import React from 'react'
class Question extends PureComponent { function highlightText(text, toHighlight) {
render() { const re = new RegExp(toHighlight, 'gi')
const { question } = this.props return text.replace(re, `<mark>${toHighlight}</mark>`)
}
export default function Question({ question, searchTerm }) {
let qdata = question.data let qdata = question.data
if (typeof qdata === 'object' && qdata.type === 'simple') { if (typeof qdata === 'object' && qdata.type === 'simple') {
qdata = '' qdata = ''
@ -11,17 +13,29 @@ class Question extends PureComponent {
if (qdata) { if (qdata) {
try { try {
qdata = JSON.stringify(qdata) qdata = JSON.stringify(qdata)
} catch (e) {} } catch (e) {
//
} }
}
const questionText = searchTerm
? highlightText(question.Q, searchTerm)
: question.Q
const answerText = searchTerm
? highlightText(question.A, searchTerm)
: question.A
return ( return (
<div className="questionContainer"> <div className="questionContainer">
<div className="question">{question.Q}</div> <div
<div className="answer">{question.A}</div> className="question"
dangerouslySetInnerHTML={{ __html: questionText }}
></div>
<div
className="answer"
dangerouslySetInnerHTML={{ __html: answerText }}
></div>
<div className="data">{qdata || null}</div> <div className="data">{qdata || null}</div>
</div> </div>
) )
}
} }
export default Question

View file

@ -73,7 +73,7 @@ export default function QuestionSearchResult({ data, searchTerm }) {
<div> <div>
<div>{renderCount()}</div> <div>{renderCount()}</div>
<div> <div>
<Questions subjs={subjs} /> <Questions subjs={subjs} searchTerm={searchTerm} />
</div> </div>
</div> </div>
) )

View file

@ -6,7 +6,7 @@ import styles from './Questions.module.css'
class Questions extends PureComponent { class Questions extends PureComponent {
render() { render() {
const { subjs } = this.props const { subjs, searchTerm } = this.props
return ( return (
<div> <div>
@ -16,7 +16,13 @@ class Questions extends PureComponent {
<div className={styles.questionBg} key={i}> <div className={styles.questionBg} key={i}>
<div className={styles.subjName}>{subj.Name}</div> <div className={styles.subjName}>{subj.Name}</div>
{subj.Questions.map((question, i) => { {subj.Questions.map((question, i) => {
return <Question key={i} question={question} /> return (
<Question
key={i}
question={question}
searchTerm={searchTerm}
/>
)
})} })}
</div> </div>
) )

View file

@ -89,6 +89,7 @@ export default function AllQuestions({ router }) {
const querySearch = router.query.question const querySearch = router.query.question
? decodeURIComponent(router.query.question) ? decodeURIComponent(router.query.question)
: '' : ''
console.log(querySearch) console.log(querySearch)
fetchDbs().then((res) => { fetchDbs().then((res) => {