diff --git a/src/components/DataflowCanvas.jsx b/src/components/DataflowCanvas.jsx
index 8fe4329..c306411 100644
--- a/src/components/DataflowCanvas.jsx
+++ b/src/components/DataflowCanvas.jsx
@@ -1587,6 +1587,13 @@ const DataflowCanvas = ({ dbSlug, hasSchemas = true }) => {
}
}, [error]);
+ // Create a loading component
+ // const LoadingComponent = () => (
+ //
+ //
Loading data from API...
+ //
+ // );
+
// Log error but continue with mockApiData as fallback
useEffect(() => {
if (error) {
@@ -2562,10 +2569,7 @@ const DataflowCanvas = ({ dbSlug, hasSchemas = true }) => {
setShowProcessPopup(false);
};
- // Show the table creation popup
- const addTableNode = () => {
- setShowTablePopup(true);
- };
+
// Handle table creation from the popup
const handleCreateTable = async (tableData) => {
diff --git a/src/components/ERDiagramCanvas.jsx b/src/components/ERDiagramCanvas.jsx
index f9b0625..5779d1f 100644
--- a/src/components/ERDiagramCanvas.jsx
+++ b/src/components/ERDiagramCanvas.jsx
@@ -563,167 +563,61 @@ const ERDiagramCanvasContent = () => {
};
// Mock database data representing ONE database with multiple schemas (fallback only)
- // const mockDatabaseData = {
- // id: 1,
- // name: "Sample Database",
- // slug: "sample_database",
- // description: "Sample Database Structure (Mock Data)",
- // service: selectedService?.name || "Unknown Service",
- // dataSource: selectedDataSource?.name || "Unknown DataSource",
- // schemas: [
- // {
- // sch: "FINANCE_MART",
- // tables: [
- // {
- // id: 1,
- // name: "accounts",
- // table_type: "dimension",
- // columns: [
- // { name: "account_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "account_number", data_type: "VARCHAR(20)", is_primary_key: false, is_foreign_key: false },
- // { name: "account_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "account_type", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "balance", data_type: "DECIMAL(15,2)", is_primary_key: false, is_foreign_key: false },
- // { name: "created_date", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 2,
- // name: "transactions",
- // table_type: "fact",
- // columns: [
- // { name: "transaction_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "account_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "transaction_date", data_type: "DATE", is_primary_key: false, is_foreign_key: false },
- // { name: "amount", data_type: "DECIMAL(12,2)", is_primary_key: false, is_foreign_key: false },
- // { name: "transaction_type", data_type: "VARCHAR(20)", is_primary_key: false, is_foreign_key: false },
- // { name: "description", data_type: "VARCHAR(255)", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 3,
- // name: "customers",
- // table_type: "dimension",
- // columns: [
- // { name: "customer_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "first_name", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "last_name", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "email", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "phone", data_type: "VARCHAR(20)", is_primary_key: false, is_foreign_key: false },
- // { name: "registration_date", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 4,
- // name: "financial_reports",
- // table_type: "fact",
- // columns: [
- // { name: "report_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "account_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "report_date", data_type: "DATE", is_primary_key: false, is_foreign_key: false },
- // { name: "balance_amount", data_type: "DECIMAL(15,2)", is_primary_key: false, is_foreign_key: false },
- // { name: "profit_loss", data_type: "DECIMAL(12,2)", is_primary_key: false, is_foreign_key: false }
- // ]
- // }
- // ]
- // },
- // {
- // sch: "Schema100",
- // tables: [
- // {
- // id: 5,
- // name: "products",
- // table_type: "dimension",
- // columns: [
- // { name: "product_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "product_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "category", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "price", data_type: "DECIMAL(10,2)", is_primary_key: false, is_foreign_key: false },
- // { name: "stock_quantity", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 6,
- // name: "orders",
- // table_type: "fact",
- // columns: [
- // { name: "order_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "customer_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "product_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "order_date", data_type: "DATE", is_primary_key: false, is_foreign_key: false },
- // { name: "quantity", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false },
- // { name: "total_amount", data_type: "DECIMAL(12,2)", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 7,
- // name: "inventory",
- // table_type: "stage",
- // columns: [
- // { name: "inventory_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "product_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "warehouse_location", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "stock_level", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false },
- // { name: "last_updated", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 8,
- // name: "suppliers",
- // table_type: "dimension",
- // columns: [
- // { name: "supplier_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "supplier_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "contact_email", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "phone_number", data_type: "VARCHAR(20)", is_primary_key: false, is_foreign_key: false }
- // ]
- // }
- // ]
- // },
- // {
- // sch: "New_sch",
- // tables: [
- // {
- // id: 9,
- // name: "analytics_summary",
- // table_type: "fact",
- // columns: [
- // { name: "summary_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "date", data_type: "DATE", is_primary_key: false, is_foreign_key: false },
- // { name: "total_revenue", data_type: "DECIMAL(15,2)", is_primary_key: false, is_foreign_key: false },
- // { name: "total_orders", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false },
- // { name: "unique_customers", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 10,
- // name: "user_sessions",
- // table_type: "stage",
- // columns: [
- // { name: "session_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "customer_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
- // { name: "session_start", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false },
- // { name: "session_end", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false },
- // { name: "pages_viewed", data_type: "INTEGER", is_primary_key: false, is_foreign_key: false },
- // { name: "device_type", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false }
- // ]
- // },
- // {
- // id: 11,
- // name: "reports",
- // table_type: "dimension",
- // columns: [
- // { name: "report_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
- // { name: "report_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
- // { name: "report_type", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "created_by", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
- // { name: "created_date", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false }
- // ]
- // }
- // ]
- // }
- // ]
- // };
+ const mockDatabaseData = {
+ id: 1,
+ name: "Sample Database",
+ slug: "sample_database",
+ description: "Sample Database Structure (Mock Data)",
+ service: selectedService?.name || "Unknown Service",
+ dataSource: selectedDataSource?.name || "Unknown DataSource",
+ schemas: [
+ {
+ sch: "FINANCE_MART",
+ tables: [
+ {
+ id: 1,
+ name: "accounts",
+ table_type: "dimension",
+ columns: [
+ { name: "account_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
+ { name: "account_number", data_type: "VARCHAR(20)", is_primary_key: false, is_foreign_key: false },
+ { name: "account_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
+ { name: "account_type", data_type: "VARCHAR(50)", is_primary_key: false, is_foreign_key: false },
+ { name: "balance", data_type: "DECIMAL(15,2)", is_primary_key: false, is_foreign_key: false },
+ { name: "created_date", data_type: "TIMESTAMP", is_primary_key: false, is_foreign_key: false }
+ ]
+ },
+ {
+ id: 2,
+ name: "transactions",
+ table_type: "fact",
+ columns: [
+ { name: "transaction_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
+ { name: "account_id", data_type: "INTEGER", is_primary_key: false, is_foreign_key: true },
+ { name: "transaction_date", data_type: "DATE", is_primary_key: false, is_foreign_key: false },
+ { name: "amount", data_type: "DECIMAL(12,2)", is_primary_key: false, is_foreign_key: false }
+ ]
+ }
+ ]
+ },
+ {
+ sch: "SALES_MART",
+ name: "Sales Mart",
+ tables: [
+ {
+ id: 3,
+ name: "customers",
+ table_type: "dimension",
+ columns: [
+ { name: "customer_id", data_type: "INTEGER", is_primary_key: true, is_foreign_key: false },
+ { name: "customer_name", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false },
+ { name: "email", data_type: "VARCHAR(100)", is_primary_key: false, is_foreign_key: false }
+ ]
+ }
+ ]
+ }
+ ]
+ };
// API Functions for fetching real data
const fetchDatabases = async () => {
@@ -1155,48 +1049,99 @@ const ERDiagramCanvasContent = () => {
try {
console.log('Adding new table:', tableData);
- // Here you would typically make an API call to create the table
- // For now, we'll add it to the current diagram
-
// Find the target schema
const targetSchema = availableSchemas.find(schema => schema.sch === tableData.schema);
if (!targetSchema) {
throw new Error('Target schema not found');
}
-
- // Create a new table object
- const newTable = {
- id: `new-table-${Date.now()}`,
+
+ // Prepare API payload
+ const apiPayload = {
+ token: token,
+ org: orgSlug,
+ con: selectedDatabase?.slug || "my_dwh", // Use selected database slug
+ sch: tableData.schema,
name: tableData.name,
- description: tableData.description,
+ external_name: null,
table_type: tableData.table_type,
- columns: tableData.columns,
- schema: tableData.schema,
- database: selectedDatabase?.name || 'Unknown'
+ description: tableData.description,
+ columns: tableData.columns.map(col => ({
+ column_name: col.name,
+ data_type: col.data_type,
+ is_nullable: col.is_nullable
+ })),
+ keys: tableData.keys.map(key => ({
+ key_name: key.name,
+ key_type: key.key_type,
+ key_columns: [{
+ column_name: key.column_name,
+ sequence: key.sequence
+ }]
+ }))
};
-
- // Add the table to existing tables list
- setExistingTables(prev => [...prev, newTable]);
-
- // Update the current database structure and regenerate the diagram
- const updatedDatabase = { ...selectedDatabase };
- const schemaIndex = updatedDatabase.schemas.findIndex(s => s.sch === tableData.schema);
-
- if (schemaIndex !== -1) {
- if (!updatedDatabase.schemas[schemaIndex].tables) {
- updatedDatabase.schemas[schemaIndex].tables = [];
+
+ console.log('API Payload:', apiPayload);
+
+ // Make API call to create the table
+ const response = await axios.post(ENDPOINTS.TABLE_CREATE, apiPayload, {
+ headers: {
+ 'Content-Type': 'application/json'
}
- updatedDatabase.schemas[schemaIndex].tables.push(newTable);
+ });
+
+ console.log('API Response:', response.data);
+
+ if (response.data.status === 200) {
+ // API call successful, create new table object for local state
+ const newTable = {
+ id: response.data.id || `new-table-${Date.now()}`,
+ name: tableData.name,
+ tbl: response.data.tbl || tableData.name.toLowerCase(), // Table slug from API or fallback
+ description: tableData.description,
+ table_type: tableData.table_type,
+ columns: tableData.columns,
+ schema: tableData.schema,
+ database: selectedDatabase?.slug || 'Unknown',
+ created_at: new Date().toISOString()
+ };
- // Regenerate the ER diagram with the new table
- generateERDiagram(updatedDatabase);
+ // Add the table to existing tables list
+ setExistingTables(prev => [...prev, newTable]);
- console.log('Table added successfully:', newTable);
+ // Update the current database structure and regenerate the diagram
+ const updatedDatabase = { ...selectedDatabase };
+ const schemaIndex = updatedDatabase.schemas.findIndex(s => s.sch === tableData.schema);
+
+ if (schemaIndex !== -1) {
+ if (!updatedDatabase.schemas[schemaIndex].tables) {
+ updatedDatabase.schemas[schemaIndex].tables = [];
+ }
+ updatedDatabase.schemas[schemaIndex].tables.push(newTable);
+
+ // Update the selected database state
+ setSelectedDatabase(updatedDatabase);
+
+ // Regenerate the ER diagram with the new table
+ generateERDiagram(updatedDatabase);
+
+ console.log('Table added successfully:', newTable);
+ }
+ } else {
+ throw new Error(response.data.message || 'Failed to create table');
}
} catch (error) {
console.error('Error adding table:', error);
- throw error;
+
+ // Check if it's an API error
+ if (error.response) {
+ const errorMessage = error.response.data?.message || `API Error: ${error.response.status}`;
+ throw new Error(errorMessage);
+ } else if (error.request) {
+ throw new Error('Network error: Unable to connect to the API');
+ } else {
+ throw new Error(error.message || 'Unknown error occurred');
+ }
}
};
diff --git a/src/components/InfiniteCanvas.jsx b/src/components/InfiniteCanvas.jsx
index 8d85085..e106d89 100644
--- a/src/components/InfiniteCanvas.jsx
+++ b/src/components/InfiniteCanvas.jsx
@@ -1104,6 +1104,17 @@ const ServiceNode = ({ data = {} }) => {
}}
onClick={() => data.onToggle && data.onToggle(data.id)}
>
+ {data.expanded ? (
+ <>
+ Collapse Connections
+
+ >
+ ) : (
+ <>
+ Expand Connections
+
+ >
+ )}
diff --git a/src/components/children/Pipelines.jsx b/src/components/children/Pipelines.jsx
new file mode 100644
index 0000000..e69de29