/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/
import { EuiDataGrid, EuiDataGridColumn, EuiSpacer, EuiText, EuiToolTip } from "@elastic/eui";
import { CoreStart } from "opensearch-dashboards/public";
import React, { useCallback, useState } from "react";
import { ContentPanel } from "../../../../components/ContentPanel";
import { FieldItem, TransformAggItem, TransformGroupItem } from "../../../../../models/interfaces";
import { TransformService } from "../../../../services";
import { getErrorMessage } from "../../../../utils/helpers";
import PreviewTransform from "../PreviewTransform";
import TransformOptions from "../TransformOptions";
import { DefaultSampleDataSize } from "../../utils/constants";
import { renderTime } from "../../../Transforms/utils/helpers";
interface DefineTransformsProps {
transformService: TransformService;
notifications: CoreStart["notifications"];
sourceIndex: string;
sourceIndexFilter: string;
fields: FieldItem[];
selectedGroupField: TransformGroupItem[];
onGroupSelectionChange: (selectedFields: TransformGroupItem[], aggItem: TransformAggItem) => void;
selectedAggregations: any;
aggList: TransformAggItem[];
onAggregationSelectionChange: (selectedFields: any, aggItem: TransformAggItem) => void;
onEditTransformation: (oldName: string, newName: string) => void;
onRemoveTransformation: (name: string) => void;
previewTransform: any[];
isReadOnly: boolean;
}
export default function DefineTransforms({
transformService,
notifications,
sourceIndex,
sourceIndexFilter,
fields,
selectedGroupField,
onGroupSelectionChange,
selectedAggregations,
aggList,
onAggregationSelectionChange,
onEditTransformation,
onRemoveTransformation,
previewTransform,
isReadOnly,
}: DefineTransformsProps) {
let columns: EuiDataGridColumn[] = [];
fields.map((field: FieldItem) => {
columns.push({
id: field.label,
display: isReadOnly ? (
{field.label}
) : (
),
schema: field.type,
path: field.path,
actions: {
showHide: false,
showMoveLeft: false,
showMoveRight: false,
showSortAsc: false,
showSortDesc: false,
},
});
});
const [loading, setLoading] = useState(true);
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });
const [from, setFrom] = useState(0);
const [size, setSize] = useState(10);
const [sortingColumns, setSortingColumns] = useState([]);
const [visibleColumns, setVisibleColumns] = useState(() => columns.map(({ id }) => id).slice(0, 5));
const [data, setData] = useState([]);
const [dataCount, setDataCount] = useState(0);
const fetchData = useCallback(async () => {
setLoading(true);
try {
const response = await transformService.searchSampleData(sourceIndex, { from: 0, size: DefaultSampleDataSize }, sourceIndexFilter);
if (response.ok) {
setData(response.response.data);
setDataCount(response.response.total.value);
}
} catch (err) {
notifications.toasts.addDanger(getErrorMessage(err, "There was a problem loading the transforms"));
}
setLoading(false);
}, [sourceIndex]);
React.useEffect(() => {
fetchData();
}, []);
const onChangeItemsPerPage = useCallback(
(pageSize) => {
setPagination((pagination) => ({
...pagination,
pageSize,
pageIndex: 0,
}));
setFrom(0);
setSize(pageSize);
},
[setPagination]
);
const onChangePage = useCallback(
(pageIndex) => {
setPagination((pagination) => ({ ...pagination, pageIndex }));
setFrom(pageIndex * size);
},
[setPagination]
);
const onSort = useCallback(
(sortingColumns) => {
setSortingColumns(sortingColumns);
},
[setSortingColumns]
);
const renderCellValue = ({ rowIndex, columnId }) => {
if (!loading && data.hasOwnProperty(rowIndex)) {
let lookupId = columnId;
if (columns?.find((column) => column.id == columnId).schema == "alias") {
lookupId = columns?.find((column) => column.id == columnId).path;
}
return getColumnValue(rowIndex, lookupId);
}
return "-";
};
const getColumnValue = (rowIndex, columnId) => {
if (columns?.find((column) => column.id == columnId).schema == "keyword") {
// Remove the keyword postfix for getting correct data from array
const correspondingTextColumnId = columnId.replace(".keyword", "");
return data[rowIndex]._source[correspondingTextColumnId] ? data[rowIndex]._source[correspondingTextColumnId] : "-";
} else if (columns?.find((column) => column.id == columnId).schema == "date") {
return data[rowIndex]._source[columnId] ? renderTime(data[rowIndex]._source[columnId]) : "-";
} else if (columns?.find((column) => column.id == columnId).schema == "boolean") {
return data[rowIndex]._source[columnId] == null ? "-" : data[rowIndex]._source[columnId] ? "true" : "false";
}
const val = data[rowIndex]._source[columnId];
return val !== undefined ? JSON.stringify(val) : "-";
}
//TODO: remove duplicate code here after extracting the first table as separate component
if (isReadOnly)
return (
Original fields with sample data
Transformed fields preview based on sample data
);
return (
Original fields with sample data
{/*TODO: Substitute "source index", and "filtered by" fields with actual values*/}
{`Viewing sample data from index ${sourceIndex}`}
Transformed fields preview based on sample data
This fields preview displays only the first 10 results of your transform job.
);
}