/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { forwardRef, useContext, useEffect, useImperativeHandle, useRef, Ref, useState } from "react"; import { EuiButton, EuiButtonEmpty, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiTitle } from "@elastic/eui"; import { TemplateItemRemote } from "../../../../../models/interfaces"; import useField, { FieldInstance } from "../../../../lib/field"; import CustomFormRow from "../../../../components/CustomFormRow"; import { ServicesContext } from "../../../../services"; import { BrowserServices } from "../../../../models/interfaces"; import { CoreServicesContext } from "../../../../components/core_services"; import { CoreStart } from "opensearch-dashboards/public"; import { getAllDataStreamTemplate, createDataStream, getDataStream } from "./hooks"; import { Modal } from "../../../../components/Modal"; import JSONEditor from "../../../../components/JSONEditor"; import { RouteComponentProps } from "react-router-dom"; import { ROUTES } from "../../../../utils/constants"; import DefineDataStream from "../DefineDataStream"; import IndexSettings from "../../components/IndexSettings"; import IndexAlias from "../IndexAlias"; import TemplateMappings from "../TemplateMappings"; import { ContentPanel } from "../../../../components/ContentPanel"; import { DataStreamInEdit } from "../../interface"; import BackingIndices from "../BackingIndices"; import DataStreamsActions from "../../../DataStreams/containers/DataStreamsActions"; export interface DataStreamDetailProps { dataStream?: string; onCancel?: () => void; onSubmitSuccess?: (templateName: string) => void; readonly?: boolean; history: RouteComponentProps["history"]; } const DataStreamDetail = (props: DataStreamDetailProps, ref: Ref) => { const { dataStream, onCancel, onSubmitSuccess } = props; const isEdit = !!dataStream; const services = useContext(ServicesContext) as BrowserServices; const coreServices = useContext(CoreServicesContext) as CoreStart; const [templates, setTemplates] = useState< { name: string; index_template: TemplateItemRemote; }[] >([]); const [isLoading, setIsLoading] = useState(false); const field = useField({ values: {} as Partial, }); const destroyRef = useRef(false); const onSubmit = async () => { const { errors, values: dataStream } = (await field.validatePromise()) || {}; if (errors) { return; } setIsLoading(true); const result = await createDataStream({ value: dataStream.name || "", commonService: services.commonService, isEdit, }); if (result && result.ok) { coreServices.notifications.toasts.addSuccess(`${dataStream.name} has been successfully ${isEdit ? "updated" : "created"}.`); onSubmitSuccess && onSubmitSuccess(dataStream.name || ""); } else { coreServices.notifications.toasts.addDanger(result.error); } if (destroyRef.current) { return; } setIsLoading(false); }; useImperativeHandle(ref, () => field); useEffect(() => { if (isEdit) { getDataStream({ dataStream, coreService: coreServices, commonService: services.commonService, }) .then((dataStreamDetail) => { field.resetValues(dataStreamDetail); }) .catch(() => { props.history.replace(ROUTES.DATA_STREAMS); }); } else { setIsLoading(true); getAllDataStreamTemplate({ commonService: services.commonService, }) .then((result) => setTemplates(result)) .finally(() => { setIsLoading(false); }); } return () => { destroyRef.current = true; }; }, []); const values = field.getValues(); const subCompontentProps = { ...props, isEdit, field, }; return ( <> {isEdit ?

{values.name}

:

Create data stream

}
{isEdit ? null : ( A data stream is composed of multiple backing indexes. Search requests are routed to all the backing indexes, while indexing requests are routed to the latest write index.{" "} Learn more } > <> )}
{isEdit ? ( { Modal.show({ "data-test-subj": "dataStreamJSONDetailModal", title: values.name, content: , }); }} > View JSON props.history.replace(ROUTES.DATA_STREAMS)} /> ) : null}
{!isLoading && !templates.length && !isEdit ? ( <> To create a data stream, you must first define its mappings and settings by creating a data stream template.
props.history.push(`${ROUTES.CREATE_TEMPLATE}?values=${JSON.stringify({ data_stream: {} })}`)}> Create template
) : null} {values.matchedTemplate ? ( <> ) : null} {isEdit ? ( <> ) : null} {isEdit ? null : ( <> Cancel {isEdit ? "Save changes" : "Create data stream"} )} ); }; // @ts-ignore export default forwardRef(DataStreamDetail);