' },
+# { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }]
+
+# ----------------------------------------------------
+# Theme CONFIG
+# ----------------------------------------------------
+# Flask App Builder comes up with a number of predefined themes
+# that you can use for Apache Airflow.
+# http://flask-appbuilder.readthedocs.io/en/latest/customizing.html#changing-themes
+# Please make sure to remove "navbar_color" configuration from airflow.cfg
+# in order to fully utilize the theme. (or use that property in conjunction with theme)
+# APP_THEME = "bootstrap-theme.css" # default bootstrap
+# APP_THEME = "amelia.css"
+# APP_THEME = "cerulean.css"
+# APP_THEME = "cosmo.css"
+# APP_THEME = "cyborg.css"
+# APP_THEME = "darkly.css"
+# APP_THEME = "flatly.css"
+# APP_THEME = "journal.css"
+# APP_THEME = "lumen.css"
+# APP_THEME = "paper.css"
+# APP_THEME = "readable.css"
+# APP_THEME = "sandstone.css"
+# APP_THEME = "simplex.css"
+# APP_THEME = "slate.css"
+# APP_THEME = "solar.css"
+# APP_THEME = "spacelab.css"
+# APP_THEME = "superhero.css"
+# APP_THEME = "united.css"
+# APP_THEME = "yeti.css"
diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf
index 5c75883..5e7218e 100644
--- a/docker/nginx/nginx.conf
+++ b/docker/nginx/nginx.conf
@@ -8,7 +8,7 @@ http {
proxy_pass http://history-server:18080;
proxy_hide_header X-Frame-Options;
add_header X-Frame-Options "ALLOW-FROM http://localhost:3000" always; # Add the new header
- add_header X-Frame-Options "ALLOW-FROM http://localhost:5001" always; # Add the new header
+ add_header X-Frame-Options "ALLOW-FROM http://webapp:5001" always; # Add the new header
}
}
}
diff --git a/webapp/.env.dev b/webapp/.env.dev
index 61f2985..0c1de63 100644
--- a/webapp/.env.dev
+++ b/webapp/.env.dev
@@ -1,3 +1,4 @@
REACT_APP_SERVER_BASE_URL=http://localhost:5002
REACT_APP_JUPYTER_BASE_URL=http://localhost:8888
-REACT_APP_SPARK_UI_BASE_URL=http://localhost:18081
\ No newline at end of file
+REACT_APP_SPARK_UI_BASE_URL=http://localhost:18081
+REACT_APP_AIRFLOW_BASE_URL=http://localhost:8090
\ No newline at end of file
diff --git a/webapp/.env.test b/webapp/.env.test
new file mode 100644
index 0000000..c284b85
--- /dev/null
+++ b/webapp/.env.test
@@ -0,0 +1,4 @@
+REACT_APP_SERVER_BASE_URL=server:5002
+REACT_APP_JUPYTER_BASE_URL=notebook:8888
+REACT_APP_SPARK_UI_BASE_URL=history-server:18080
+REACT_APP_AIRFLOW_BASE_URL=airflow-webserver:8080
\ No newline at end of file
diff --git a/webapp/public/env.template.js b/webapp/public/env.template.js
index ff6a579..82d5f78 100644
--- a/webapp/public/env.template.js
+++ b/webapp/public/env.template.js
@@ -1,4 +1,6 @@
window._env_ = {
REACT_APP_JUPYTER_BASE_URL: "$REACT_APP_JUPYTER_BASE_URL",
REACT_APP_SERVER_BASE_URL: "$REACT_APP_SERVER_BASE_URL",
+ REACT_APP_SPARK_UI_BASE_URL: "$REACT_APP_SPARK_UI_BASE_URL",
+ REACT_APP_AIRFLOW_BASE_URL: "$REACT_APP_AIRFLOW_BASE_URL",
};
diff --git a/webapp/src/App.js b/webapp/src/App.js
index 6a371a4..e07fc55 100644
--- a/webapp/src/App.js
+++ b/webapp/src/App.js
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import Sidebar from './components/sidebar/Sidebar';
import Notebook from './components/notebook/Notebook';
import HistoryServer from './components/HistoryServer';
+import Scheduler from './components/Scheduler';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import config from './config';
import NotebookModel from './models/NotebookModel';
@@ -34,6 +35,7 @@ const App = () => {
const baseUrl = `${config.jupyterBaseUrl}/api/contents/`
const [showHistoryServer, setShowHistoryServer] = useState(false);
+ const [showScheduler, setShowScheduler] = useState(false);
const [showNotebook, setShowNotebook] = useState(false);
const [notebook, setNotebook] = useState({});
@@ -80,6 +82,7 @@ const App = () => {
NotebookModel.fetchNotebook(notebookPath).then((data) => {
setNotebook(data);
setShowHistoryServer(false);
+ setShowScheduler(false);
setShowNotebook(true);
}).catch((error) => {
console.error('Failed to fetch newly created notebook:', error);
@@ -97,6 +100,7 @@ const App = () => {
console.log('Fetched notebook:', data);
setNotebook(data);
setShowHistoryServer(false);
+ setShowScheduler(false);
setShowNotebook(true);
}).catch((error) => {
console.error('Failed to fetch notebook:', error);
@@ -118,16 +122,29 @@ const App = () => {
const handleHistoryServerClick = () => {
if (handleUnsavedChanges()) {
setShowNotebook(false);
+ setShowScheduler(false);
setShowHistoryServer(true);
}
};
+ // Scheduler
+ const handleSchedulerClick = () => {
+ console.log(config.airflowBaseUrl)
+ console.log('Scheduler clicked');
+ if (handleUnsavedChanges()) {
+ setShowNotebook(false);
+ setShowHistoryServer(false);
+ setShowScheduler(true);
+ }
+ };
+
return (
{
setIsNotebookModified={setIsNotebookModified}
handleDeleteNotebook={handleDeleteNotebook} />
+
);
};
diff --git a/webapp/src/components/Scheduler.js b/webapp/src/components/Scheduler.js
new file mode 100644
index 0000000..a18d7d0
--- /dev/null
+++ b/webapp/src/components/Scheduler.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import config from '../config';
+
+function Scheduler({ showScheduler }) {
+ return (
+ {/* Adjust marginLeft based on your sidebar width */}
+ {showScheduler && (
+
+ )}
+ {/* You can add more content or conditional rendering here */}
+
+ );
+}
+
+export default Scheduler;
\ No newline at end of file
diff --git a/webapp/src/components/sidebar/Sidebar.js b/webapp/src/components/sidebar/Sidebar.js
index d10b33d..d7ac622 100644
--- a/webapp/src/components/sidebar/Sidebar.js
+++ b/webapp/src/components/sidebar/Sidebar.js
@@ -9,6 +9,7 @@ function Sidebar({
onNewNotebookClick,
onExistinNotebookClick,
onHistoryServerClick,
+ onSchedulerClick,
handleDirectoryClick,
openWorkspaceDrawer,
setOpenWorkspaceDrawer,
@@ -218,6 +219,7 @@ function Sidebar({
{/* Scheduler */}
{
+ onSchedulerClick();
setOpenWorkspaceDrawer(false);
setOpenCreateDrawer(false);}
}
diff --git a/webapp/src/config.js b/webapp/src/config.js
index b865c8c..2f481c3 100644
--- a/webapp/src/config.js
+++ b/webapp/src/config.js
@@ -2,6 +2,7 @@ const config = {
jupyterBaseUrl: (window._env_ && window._env_.REACT_APP_JUPYTER_BASE_URL) || process.env.REACT_APP_JUPYTER_BASE_URL,
serverBaseUrl: (window._env_ && window._env_.REACT_APP_SERVER_BASE_URL) || process.env.REACT_APP_SERVER_BASE_URL,
sparkUiBaseUrl: (window._env_ && window._env_.REACT_APP_SPARK_UI_BASE_URL) || process.env.REACT_APP_SPARK_UI_BASE_URL,
+ airflowBaseUrl: (window._env_ && window._env_.REACT_APP_AIRFLOW_BASE_URL) || process.env.REACT_APP_AIRFLOW_BASE_URL,
};
export default config;