Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rendering changes to embedded dashboards #6752

Merged
merged 5 commits into from
Jun 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ All notable changes to the Wazuh app project will be documented in this file.

### Changed

- Removed embedded discover [#6120](https:/wazuh/wazuh-dashboard-plugins/pull/6120) [#6235](https:/wazuh/wazuh-dashboard-plugins/pull/6235) [#6254](https:/wazuh/wazuh-dashboard-plugins/pull/6254) [#6285](https:/wazuh/wazuh-dashboard-plugins/pull/6285) [#6288](https:/wazuh/wazuh-dashboard-plugins/pull/6288) [#6290](https:/wazuh/wazuh-dashboard-plugins/pull/6290) [#6289](https:/wazuh/wazuh-dashboard-plugins/pull/6289) [#6286](https:/wazuh/wazuh-dashboard-plugins/pull/6286) [#6275](https:/wazuh/wazuh-dashboard-plugins/pull/6275) [#6287](https:/wazuh/wazuh-dashboard-plugins/pull/6287) [#6297](https:/wazuh/wazuh-dashboard-plugins/pull/6297) [#6291](https:/wazuh/wazuh-dashboard-plugins/pull/6287) [#6459](https:/wazuh/wazuh-dashboard-plugins/pull/6459) [#6434](https:/wazuh/wazuh-dashboard-plugins/pull/6434) [#6504](https:/wazuh/wazuh-dashboard-plugins/pull/6504) [#6649](https:/wazuh/wazuh-dashboard-plugins/pull/6649) [#6506](https:/wazuh/wazuh-dashboard-plugins/pull/6506) [#6537](https:/wazuh/wazuh-dashboard-plugins/pull/6537) [#6528](https:/wazuh/wazuh-dashboard-plugins/pull/6528) [#6675](https:/wazuh/wazuh-dashboard-plugins/pull/6675) [#6674](https:/wazuh/wazuh-dashboard-plugins/pull/6674) [#6558](https:/wazuh/wazuh-dashboard-plugins/pull/6558) [#6685](https:/wazuh/wazuh-dashboard-plugins/pull/6685) [#6691](https:/wazuh/wazuh-dashboard-plugins/pull/6691) [#6712](https:/wazuh/wazuh-dashboard-plugins/pull/6712) [#6734](https:/wazuh/wazuh-dashboard-plugins/pull/6734) [#6746](https:/wazuh/wazuh-dashboard-plugins/pull/6746)
- Removed embedded discover [#6120](https:/wazuh/wazuh-dashboard-plugins/pull/6120) [#6235](https:/wazuh/wazuh-dashboard-plugins/pull/6235) [#6254](https:/wazuh/wazuh-dashboard-plugins/pull/6254) [#6285](https:/wazuh/wazuh-dashboard-plugins/pull/6285) [#6288](https:/wazuh/wazuh-dashboard-plugins/pull/6288) [#6290](https:/wazuh/wazuh-dashboard-plugins/pull/6290) [#6289](https:/wazuh/wazuh-dashboard-plugins/pull/6289) [#6286](https:/wazuh/wazuh-dashboard-plugins/pull/6286) [#6275](https:/wazuh/wazuh-dashboard-plugins/pull/6275) [#6287](https:/wazuh/wazuh-dashboard-plugins/pull/6287) [#6297](https:/wazuh/wazuh-dashboard-plugins/pull/6297) [#6291](https:/wazuh/wazuh-dashboard-plugins/pull/6287) [#6459](https:/wazuh/wazuh-dashboard-plugins/pull/6459) [#6434](https:/wazuh/wazuh-dashboard-plugins/pull/6434) [#6504](https:/wazuh/wazuh-dashboard-plugins/pull/6504) [#6649](https:/wazuh/wazuh-dashboard-plugins/pull/6649) [#6506](https:/wazuh/wazuh-dashboard-plugins/pull/6506) [#6537](https:/wazuh/wazuh-dashboard-plugins/pull/6537) [#6528](https:/wazuh/wazuh-dashboard-plugins/pull/6528) [#6675](https:/wazuh/wazuh-dashboard-plugins/pull/6675) [#6674](https:/wazuh/wazuh-dashboard-plugins/pull/6674) [#6558](https:/wazuh/wazuh-dashboard-plugins/pull/6558) [#6685](https:/wazuh/wazuh-dashboard-plugins/pull/6685) [#6691](https:/wazuh/wazuh-dashboard-plugins/pull/6691) [#6712](https:/wazuh/wazuh-dashboard-plugins/pull/6712) [#6734](https:/wazuh/wazuh-dashboard-plugins/pull/6734) [#6746](https:/wazuh/wazuh-dashboard-plugins/pull/6746) [#6746](https:/wazuh/wazuh-dashboard-plugins/pull/6752)
- Allow editing groups for an agent from Endpoints Summary [#6250](https:/wazuh/wazuh-dashboard-plugins/pull/6250)
- Change how the configuration is managed in the backend side [#6337](https:/wazuh/wazuh-dashboard-plugins/pull/6337) [#6519](https:/wazuh/wazuh-dashboard-plugins/pull/6519) [#6573](https:/wazuh/wazuh-dashboard-plugins/pull/6573)
- Change the view of API is down and check connection to Server APIs application [#6337](https:/wazuh/wazuh-dashboard-plugins/pull/6337)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,105 +1,111 @@
import { tDataSourceRepository } from "../index";
import { tDataSourceRepository } from '../index';
import { GenericRequest } from '../../../../react-services/generic-request';
import { AppState } from '../../../../react-services';

export type tSavedObjectResponse = {
data: {
attributes: {
fields: string;
title: string;
};
id: string;
migrationVersion: {
'index-pattern': string;
};
namespace: string[];
references: any[];
score: number;
type: string;
updated_at: string;
version: string;
}
}

export type tParsedIndexPattern = {
data: {
attributes: {
fields: string;
title: string;
fields: string;
title: string;
};
title: string;
id: string;
migrationVersion: {
'index-pattern': string;
'index-pattern': string;
};
namespace: string[];
references: any[];
score: number;
type: string;
updated_at: string;
version: string;
_fields: any[];
};
};

export type tParsedIndexPattern = {
attributes: {
fields: string;
title: string;
};
title: string;
id: string;
migrationVersion: {
'index-pattern': string;
};
namespace: string[];
references: any[];
score: number;
type: string;
updated_at: string;
version: string;
_fields: any[];
} & object;

export class PatternDataSourceRepository implements tDataSourceRepository<tParsedIndexPattern>{
async get(id: string): Promise<tParsedIndexPattern> {
try {
const savedObjectResponse = await GenericRequest.request(
'GET',
`/api/saved_objects/index-pattern/${id}?fields=title&fields=fields`,
) as tSavedObjectResponse;
export class PatternDataSourceRepository
implements tDataSourceRepository<tParsedIndexPattern>
{
async get(id: string): Promise<tParsedIndexPattern> {
try {
const savedObjectResponse = (await GenericRequest.request(
'GET',
`/api/saved_objects/index-pattern/${id}?fields=title&fields=fields`,
)) as tSavedObjectResponse;

const indexPatternData = (savedObjectResponse || {}).data;
if(!indexPatternData){
throw new Error(`Index pattern "${id}" not found`);
}
const parsedIndexPatternData = this.parseIndexPattern(indexPatternData);
if (!parsedIndexPatternData.title || !parsedIndexPatternData.id) {
throw new Error(`Invalid index pattern data`);
}
return parsedIndexPatternData;
} catch (error) {
throw new Error(`Error getting index pattern: ${error.message}`);
}
const indexPatternData = (savedObjectResponse || {}).data;
if (!indexPatternData) {
throw new Error(`Index pattern "${id}" not found`);
}
const parsedIndexPatternData = this.parseIndexPattern(indexPatternData);
if (!parsedIndexPatternData.title || !parsedIndexPatternData.id) {
throw new Error(`Invalid index pattern data`);
}
return parsedIndexPatternData;
} catch (error) {
throw new Error(`Error getting index pattern: ${error.message}`);
}
async getAll(): Promise<tParsedIndexPattern[]> {
try {
const savedObjects = await GenericRequest.request(
'GET',
`/api/saved_objects/_find?type=index-pattern&fields=title&fields=fields&per_page=9999`,
);
const indexPatterns = ((savedObjects || {}).data || {}).saved_objects || [];
return indexPatterns.map(this.parseIndexPattern);
} catch (error) {
throw new Error(`Error getting index patterns: ${error.message}`);
}
}
async getAll(): Promise<tParsedIndexPattern[]> {
try {
const savedObjects = await GenericRequest.request(
'GET',
`/api/saved_objects/_find?type=index-pattern&fields=title&fields=fields&per_page=9999`,
);
const indexPatterns =
((savedObjects || {}).data || {}).saved_objects || [];
return indexPatterns.map(this.parseIndexPattern);
} catch (error) {
throw new Error(`Error getting index patterns: ${error.message}`);
}
}

parseIndexPattern(indexPatternData): tParsedIndexPattern {
const title = ((indexPatternData || {}).attributes || {}).title;
const id = (indexPatternData || {}).id;
return {
...indexPatternData,
id: id,
title: title,
_fields: indexPatternData?.attributes?.fields
? JSON.parse(indexPatternData.attributes.fields)
: [],
};
}

setDefault(dataSource: tParsedIndexPattern): void {
if(!dataSource){
throw new Error('Index pattern is required');
}
AppState.setCurrentPattern(dataSource.id);
return;
parseIndexPattern(indexPatternData): tParsedIndexPattern {
const title = ((indexPatternData || {}).attributes || {}).title;
const id = (indexPatternData || {}).id;
return {
...indexPatternData,
id: id,
title: title,
_fields: indexPatternData?.attributes?.fields
? JSON.parse(indexPatternData.attributes.fields)
: [],
};
}

setDefault(dataSource: tParsedIndexPattern): void {
if (!dataSource) {
throw new Error('Index pattern is required');
}
async getDefault(): Promise<tParsedIndexPattern | null> {
const currentPattern = AppState.getCurrentPattern();
if(!currentPattern){
return Promise.resolve(null);
}
return await this.get(currentPattern);
AppState.setCurrentPattern(dataSource.id);
return;
}
async getDefault(): Promise<tParsedIndexPattern | null> {
const currentPattern = this.getStoreIndexPatternId();
if (!currentPattern) {
return Promise.resolve(null);
}
return await this.get(currentPattern);
}

getStoreIndexPatternId(): string {
return AppState.getCurrentPattern();
}
}
103 changes: 54 additions & 49 deletions plugins/main/public/components/common/wazuh-discover/wz-discover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ const WazuhDiscoverComponent = (props: WazuhDiscoverProps) => {
const [isExporting, setIsExporting] = useState<boolean>(false);
const sideNavDocked = getWazuhCorePlugin().hooks.useDockedSideNav();

const AlertsRepository = new AlertsDataSourceRepository();

const {
dataSource,
filters,
Expand All @@ -74,7 +76,7 @@ const WazuhDiscoverComponent = (props: WazuhDiscoverProps) => {
fetchData,
setFilters,
} = useDataSource<tParsedIndexPattern, PatternDataSource>({
repository: new AlertsDataSourceRepository(), // this makes only works with alerts index pattern
repository: AlertsRepository, // this makes only works with alerts index pattern
DataSource,
});

Expand Down Expand Up @@ -206,55 +208,58 @@ const WazuhDiscoverComponent = (props: WazuhDiscoverProps) => {
{!isDataSourceLoading && results?.hits?.total === 0 ? (
<DiscoverNoResults timeFieldName={timeField} queryLanguage={''} />
) : null}
{!isDataSourceLoading && dataSource && results?.hits?.total > 0 ? (
<EuiPanel
paddingSize='s'
hasShadow={false}
hasBorder={false}
color='transparent'
>
<EuiFlexGroup gutterSize='s' direction='column'>
<EuiFlexItem grow={false} className='discoverChartContainer'>
<EuiPanel
hasBorder={false}
hasShadow={false}
color='transparent'
paddingSize='none'
>
<EuiPanel>
<DashboardByRenderer
input={histogramChartInput(
dataSource?.id,
fetchFilters,
query,
dateRangeFrom,
dateRangeTo,
)}
/>
</EuiPanel>
<EuiPanel
paddingSize='s'
hasShadow={false}
hasBorder={false}
color='transparent'
className={
!isDataSourceLoading && dataSource && results?.hits?.total > 0
? ''
: 'wz-no-display'
}
>
<EuiFlexGroup gutterSize='s' direction='column'>
<EuiFlexItem grow={false} className='discoverChartContainer'>
<EuiPanel
hasBorder={false}
hasShadow={false}
color='transparent'
paddingSize='none'
>
<EuiPanel>
<DashboardByRenderer
input={histogramChartInput(
AlertsRepository.getStoreIndexPatternId(),
fetchFilters,
query,
dateRangeFrom,
dateRangeTo,
)}
/>
</EuiPanel>
</EuiFlexItem>
<EuiFlexItem>
<EuiDataGrid
{...dataGridProps}
className={sideNavDocked ? 'dataGridDockedNav' : ''}
toolbarVisibility={{
additionalControls: (
<>
<DiscoverDataGridAdditionalControls
totalHits={results.hits.total}
isExporting={isExporting}
onClickExportResults={onClickExportResults}
maxEntriesPerQuery={MAX_ENTRIES_PER_QUERY}
/>
</>
),
}}
/>
</EuiFlexItem>
</EuiFlexGroup>
</EuiPanel>
) : null}
</EuiPanel>
</EuiFlexItem>
<EuiFlexItem>
<EuiDataGrid
{...dataGridProps}
className={sideNavDocked ? 'dataGridDockedNav' : ''}
toolbarVisibility={{
additionalControls: (
<>
<DiscoverDataGridAdditionalControls
totalHits={results?.hits?.total || 0}
isExporting={isExporting}
onClickExportResults={onClickExportResults}
maxEntriesPerQuery={MAX_ENTRIES_PER_QUERY}
/>
</>
),
}}
/>
</EuiFlexItem>
</EuiFlexGroup>
</EuiPanel>
{inspectedHit && (
<EuiFlyout onClose={() => setInspectedHit(undefined)} size='m'>
<EuiFlyoutHeader>
Expand Down
Loading
Loading