Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 34x 34x 34x 34x 34x 34x | /* * Copyright 2021 Harness Inc. All rights reserved. * Use of this source code is governed by the PolyForm Shield 1.0.0 license * that can be found in the licenses directory at the root of this repository, also available at * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt. */ import produce from 'immer' import { mapValues, range } from 'lodash-es' import { sanitizeHTML } from '@common/utils/StringUtils' import { getRegexForSearch } from './utils' import type { Action, ActionType, TextKeys, State } from './types' // make sure that this array has same order as render const dataKeys: TextKeys[] = ['level', 'time', 'out'] export function search(state: State, action: Action<ActionType.Search>): State { const { payload } = action const searchRegex = getRegexForSearch(sanitizeHTML(payload)) return produce(state, draft => { const linesWithResults: number[] = [] let prevLinesCount = 0 draft.dataMap = mapValues(state.dataMap, unit => { // do not search in closed units if (!unit.isOpen) { return unit } return { ...unit, data: unit.data.map(lineData => { const searchIndices: Partial<Record<TextKeys, number[]>> = {} dataKeys.forEach(key => { const value = lineData.text[key] if (value) { const matches = value.match(searchRegex) if (matches && matches.length) { const prevResultsCount = linesWithResults.length // store all the indices of the search results searchIndices[key] = range(prevResultsCount, prevResultsCount + matches.length) // store the line numbers of the search results // same line number is stored multiple times for multiple results of search linesWithResults.push(...Array.from<number>({ length: matches.length }).fill(prevLinesCount)) } } }) prevLinesCount++ return { ...lineData, searchIndices } }) } }) draft.searchData = { currentIndex: 0, text: payload, linesWithResults } }) } |