/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useCallback, useContext } from 'react'; import { batch, useDispatch } from 'react-redux'; import { isEmpty } from 'lodash'; import { EuiTitle, EuiSpacer, EuiFieldSearch, EuiAccordion } from '@elastic/eui'; import { I18nProvider } from '@osd/i18n/react'; import { Field } from './field'; import { ExplorerFields, IExplorerFields, IField } from '../../../../../common/types/explorer'; import { AVAILABLE_FIELDS, SELECTED_FIELDS } from '../../../../../common/constants/explorer'; import { sortFields, updateFields } from '../../redux/slices/field_slice'; import { TabContext } from '../../hooks/use_tab_context'; interface ISidebarProps { query: string; explorerFields: IExplorerFields; explorerData: any; selectedPattern: string; isOverridingPattern: boolean; selectedTimestamp: string; isOverridingTimestamp: boolean; isFieldToggleButtonDisabled: boolean; handleOverridePattern: (pattern: IField) => void; handleOverrideTimestamp: (timestamp: IField) => void; } export const Sidebar = (props: ISidebarProps) => { const { query, explorerFields, explorerData, selectedPattern, isOverridingPattern, selectedTimestamp, isOverridingTimestamp, isFieldToggleButtonDisabled, handleOverridePattern, handleOverrideTimestamp, } = props; const dispatch = useDispatch(); const { tabId } = useContext(TabContext); const [showFields, setShowFields] = useState(false); const [searchTerm, setSearchTerm] = useState(''); /** * Toggle fields between selected and unselected sets * @param fieldState all fields in store * @param field field to be toggled * @param FieldSetToRemove the set where this field to be removed from * @param FieldSetToAdd the set where this field to be added to * returns new fields state */ const toggleFields = ( fieldState: ExplorerFields, field: IField, fieldSetToRemove: string, fieldSetToAdd: string ): ExplorerFields => { const nextFields = { ...fieldState }; nextFields[fieldSetToRemove] = nextFields[fieldSetToRemove].filter( (fd: IField) => fd.name !== field.name ); nextFields[fieldSetToAdd] = [...nextFields[fieldSetToAdd], field]; return nextFields; }; const updateStoreFields = (fieldsData: ExplorerFields, tabID: string, modifiedField: string) => { batch(() => { dispatch( updateFields({ tabId: tabID, data: { ...fieldsData, }, }) ); dispatch( sortFields({ tabId: tabID, data: [modifiedField], }) ); }); }; const handleAddField = useCallback( (field: IField) => { updateStoreFields( toggleFields(explorerFields, field, AVAILABLE_FIELDS, SELECTED_FIELDS), tabId, SELECTED_FIELDS ); }, [explorerFields, tabId] ); const handleRemoveField = useCallback( (field: IField) => { updateStoreFields( toggleFields(explorerFields, field, SELECTED_FIELDS, AVAILABLE_FIELDS), tabId, AVAILABLE_FIELDS ); }, [explorerFields, tabId] ); return (
{ setSearchTerm(e.target.value); }} placeholder="Search field names" value={searchTerm} data-test-subj="eventExplorer__sidebarSearch" />
{((explorerData && !isEmpty(explorerData.jsonData) && !isEmpty(explorerFields)) || !isEmpty(explorerFields.availableFields)) && ( <> {explorerFields?.queriedFields && explorerFields.queriedFields?.length > 0 && ( Query fields } paddingSize="xs" >
    {explorerFields.queriedFields && explorerFields.queriedFields.map((field) => { return (
  • ); })}
)} Selected Fields } paddingSize="xs" >
    {explorerData && !isEmpty(explorerData.jsonData) && explorerFields.selectedFields && explorerFields.selectedFields.map((field) => { return (
  • ); })}
Available Fields } paddingSize="xs" >
    {explorerFields.availableFields && explorerFields.availableFields .filter((field) => searchTerm === '' || field.name.indexOf(searchTerm) !== -1) .map((field) => { return (
  • ); })}
)}
); };