/** * Copyright (c) 2020-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { BlankPanelPlaceholder, clsx, ContextMenu, CustomSelectorInput, Dialog, MenuContent, MenuContentItem, Modal, ModalBody, ModalFooter, ModalFooterButton, ModalHeader, PanelFormBooleanField, PlusIcon, ResizablePanel, ResizablePanelGroup, ResizablePanelSplitter, ResizablePanelSplitterLine, UploadIcon, } from '@finos/legend-art'; import { type Table, getAllTablesFromDatabase, RelationalCSVDataTable, } from '@finos/legend-graph'; import { observer } from 'mobx-react-lite'; import { forwardRef, useState } from 'react'; import type { RelationalCSVDataState } from '../../../../stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js'; import { CODE_EDITOR_LANGUAGE } from '@finos/legend-code-editor'; import { CodeEditor } from '@finos/legend-lego/code-editor'; import { LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY } from '../../../../__lib__/LegendStudioApplicationNavigationContext.js'; import { useApplicationNavigationContext } from '@finos/legend-application'; import { relationalData_addTable, relationalData_setTableName, relationalData_setTableSchemaName, } from '../../../../stores/graph-modifier/DSL_Data_GraphModifierHelper.js'; import { createMockDataForMappingElementSource } from '../../../../stores/editor/utils/MockDataUtils.js'; export interface TableOption { value: Table; label: string; } const RelationalTableIdentifierEditor = observer( (props: { dataState: RelationalCSVDataState; isReadOnly: boolean }) => { const { isReadOnly, dataState } = props; const applicationStore = dataState.editorStore.applicationStore; const resolvedDb = dataState.database; const existingDataTable = dataState.tableToEdit; // table const [schemaName, setSchemaName] = useState( existingDataTable?.schema, ); const [tableName, setTableName] = useState( existingDataTable?.table, ); // selectors if db provided const tables = resolvedDb ? getAllTablesFromDatabase(resolvedDb) : undefined; const [dbTable, setDbTable] = useState(tables?.[0]); const [includeBare, setIncludeBare] = useState(true); const showFullPath = resolvedDb && resolvedDb.schemas.length > 2; const tableOptions = tables?.map((_t) => ({ label: showFullPath ? `${_t.schema.name}.${_t.name}` : `${_t.name}`, value: _t, })) ?? []; const onTableChange = (val: TableOption | null): void => { setDbTable(val?.value); }; const selectedTable = dbTable ? { label: showFullPath ? `${dbTable.schema.name}.${dbTable.name}` : `${dbTable.name}`, value: dbTable, } : undefined; const closeModal = (): void => dataState.closeModal(); const changeSchemaValue: React.ChangeEventHandler = ( event, ) => { setSchemaName(event.target.value); }; const changeTableValue: React.ChangeEventHandler = ( event, ) => { setTableName(event.target.value); }; const toggleIncludeBare = (): void => { setIncludeBare(!includeBare); }; const useSelector = resolvedDb && !existingDataTable; const isDisabled = useSelector ? !dbTable : !(schemaName && tableName); const handleSubmit = (): void => { const newTable = new RelationalCSVDataTable(); newTable.values = ''; const editTable = existingDataTable ?? newTable; const _schemaName = useSelector ? dbTable?.schema.name : schemaName; const _name = useSelector ? dbTable?.name : tableName; relationalData_setTableSchemaName(editTable, _schemaName ?? ''); relationalData_setTableName(editTable, _name ?? ''); if (!existingDataTable && dbTable && includeBare) { editTable.values = createMockDataForMappingElementSource( dbTable, dataState.editorStore, ); } if (!existingDataTable) { relationalData_addTable(dataState.embeddedData, editTable); dataState.changeSelectedTable(editTable); } closeModal(); }; return (
{ event.preventDefault(); handleSubmit(); closeModal(); }} className="modal modal--dark search-modal" >
{existingDataTable ? 'Rename Relational Data Table' : 'Add Relational Data Table'}
{resolvedDb && !existingDataTable ? ( <>
Table
) : ( <>
)}
); }, ); const RelationalCSVTableContextMenu = observer( forwardRef< HTMLDivElement, { dataState: RelationalCSVDataState; table: RelationalCSVDataTable; } >(function TestContainerContextMenu(props, ref) { const { dataState, table } = props; const rename = (): void => dataState.openIdentifierModal(table); const remove = (): void => dataState.deleteTable(table); return ( Rename Delete ); }), ); const ImportModal = observer( (props: { dataState: RelationalCSVDataState; isReadOnly: boolean }) => { const { isReadOnly, dataState } = props; const applicationStore = dataState.editorStore.applicationStore; const [csv, setCSV] = useState(''); const closeModal = (): void => dataState.closeCSVModal(); const importVal = (): void => { dataState.importCSV(csv); setCSV(''); closeModal(); }; const changeCSV: React.ChangeEventHandler< HTMLTextAreaElement | HTMLInputElement > = (event) => { setCSV(event.target.value); }; return (