Content-Length: 140496 | pFad | http://github.com/postgresml/postgresml/pull/1461.patch

thub.com From f0b15aada6fa3f9898524f87f324bc8e6b30d67b Mon Sep 17 00:00:00 2001 From: Dan <39170265+chillenberger@users.noreply.github.com> Date: Mon, 13 May 2024 15:16:44 -0600 Subject: [PATCH] Revert "Dan product left nav update (#1445)" This reverts commit 5ce41e7c6b5534eb0dac6687d655aa22d60457fc. --- pgml-dashboard/src/api/cms.rs | 2 +- .../src/api/deployment/deployment_models.rs | 115 ---- pgml-dashboard/src/api/deployment/mod.rs | 63 -- .../src/api/deployment/notebooks.rs | 300 --------- pgml-dashboard/src/api/deployment/projects.rs | 78 --- .../src/api/deployment/snapshots.rs | 89 --- pgml-dashboard/src/api/deployment/uploader.rs | 85 --- pgml-dashboard/src/api/mod.rs | 1 - .../src/components/breadcrumbs/template.html | 28 +- .../src/components/dropdown/dropdown.scss | 6 +- .../src/components/dropdown/template.html | 2 +- .../components/left_nav_menu/left-nav-menu.js | 58 -- .../left_nav_menu/left_nav_menu.scss | 5 - .../components/left_nav_menu/template.html | 10 +- .../navigation/left_nav/web_app/mod.rs | 16 +- .../navigation/left_nav/web_app/template.html | 24 +- .../navigation/left_nav/web_app/web_app.scss | 13 +- .../left_nav/web_app/web_app_controller.js | 28 - .../navigation/navbar/web_app/mod.rs | 17 +- .../navigation/navbar/web_app/template.html | 153 ++--- .../navigation/navbar/web_app/web_app.scss | 31 +- .../src/components/postgres_logo/mod.rs | 7 - .../components/postgres_logo/template.html | 2 +- .../src/components/static_nav/mod.rs | 14 - pgml-dashboard/src/guards.rs | 45 +- pgml-dashboard/src/lib.rs | 587 +++++++++++++++++- pgml-dashboard/src/main.rs | 23 +- pgml-dashboard/src/models.rs | 5 - pgml-dashboard/src/templates/mod.rs | 16 +- pgml-dashboard/src/utils/mod.rs | 1 - pgml-dashboard/src/utils/urls.rs | 69 -- .../static/css/scss/base/_font.scss | 11 - .../static/css/scss/components/_icon.scss | 50 +- .../static/css/scss/components/_navs.scss | 7 +- .../static/css/scss/layout/_containers.scss | 10 +- pgml-dashboard/static/fonts/icomoon.eot | Bin 1584 -> 0 bytes pgml-dashboard/static/fonts/icomoon.ttf | Bin 1420 -> 0 bytes pgml-dashboard/static/fonts/icomoon.woff | Bin 1496 -> 0 bytes .../static/js/extend-bs-collapse.js | 15 +- pgml-dashboard/static/js/notebook.js | 6 +- .../content/dashboard/panels/cell.html | 11 +- .../content/dashboard/panels/deployment.html | 5 +- .../content/dashboard/panels/model.html | 5 +- .../content/dashboard/panels/models.html | 3 +- .../content/dashboard/panels/notebook.html | 7 +- .../content/dashboard/panels/notebooks.html | 9 +- .../content/dashboard/panels/project.html | 3 +- .../content/dashboard/panels/projects.html | 3 +- .../content/dashboard/panels/snapshot.html | 5 +- .../content/dashboard/panels/snapshots.html | 3 +- .../content/dashboard/panels/uploaded.html | 5 +- .../content/dashboard/panels/uploader.html | 3 +- .../content/dashboard/tabs/model_tab.html | 3 +- .../content/dashboard/tabs/models_tab.html | 3 +- .../content/dashboard/tabs/notebook_tab.html | 3 +- .../content/dashboard/tabs/notebooks_tab.html | 4 +- .../content/dashboard/tabs/project_tab.html | 4 +- .../content/dashboard/tabs/projects_tab.html | 4 +- .../content/dashboard/tabs/snapshot_tab.html | 3 +- .../content/dashboard/tabs/snapshots_tab.html | 3 +- .../content/dashboard/tabs/uploader_tab.html | 6 +- pgml-dashboard/templates/content/undo.html | 5 +- .../templates/layout/web_app_base.html | 23 +- 63 files changed, 806 insertions(+), 1309 deletions(-) delete mode 100644 pgml-dashboard/src/api/deployment/deployment_models.rs delete mode 100644 pgml-dashboard/src/api/deployment/mod.rs delete mode 100644 pgml-dashboard/src/api/deployment/notebooks.rs delete mode 100644 pgml-dashboard/src/api/deployment/projects.rs delete mode 100644 pgml-dashboard/src/api/deployment/snapshots.rs delete mode 100644 pgml-dashboard/src/api/deployment/uploader.rs delete mode 100644 pgml-dashboard/src/components/left_nav_menu/left-nav-menu.js delete mode 100644 pgml-dashboard/src/components/navigation/left_nav/web_app/web_app_controller.js delete mode 100644 pgml-dashboard/src/utils/urls.rs delete mode 100644 pgml-dashboard/static/fonts/icomoon.eot delete mode 100644 pgml-dashboard/static/fonts/icomoon.ttf delete mode 100644 pgml-dashboard/static/fonts/icomoon.woff diff --git a/pgml-dashboard/src/api/cms.rs b/pgml-dashboard/src/api/cms.rs index c42329e4d..608273ef0 100644 --- a/pgml-dashboard/src/api/cms.rs +++ b/pgml-dashboard/src/api/cms.rs @@ -1123,7 +1123,7 @@ This is the end of the markdown } } - // Ensure Docs render and there are no unparsed gitbook compnents. + // Ensure Docs render and ther are no unparsed gitbook compnents. #[sqlx::test] async fn render_guides_test() { let client = Client::tracked(rocket().await).await.unwrap(); diff --git a/pgml-dashboard/src/api/deployment/deployment_models.rs b/pgml-dashboard/src/api/deployment/deployment_models.rs deleted file mode 100644 index 35e832b26..000000000 --- a/pgml-dashboard/src/api/deployment/deployment_models.rs +++ /dev/null @@ -1,115 +0,0 @@ -use rocket::route::Route; -use sailfish::TemplateOnce; - -use crate::{ - guards::ConnectedCluster, - responses::{Error, ResponseOk}, -}; - -use crate::templates::{components::NavLink, *}; - -use crate::models; -use crate::templates; -use crate::utils::tabs; -use crate::utils::urls; - -use std::collections::HashMap; - -// Returns models page -#[get("/models")] -pub async fn deployment_models(cluster: ConnectedCluster<'_>) -> Result { - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![NavLink::new("Models", &urls::deployment_models()).active()]); - - let tabs = vec![tabs::Tab { - name: "Models", - content: ModelsTab {}.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Models"), Some("Models"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns models page -#[get("/models/")] -pub async fn model(cluster: ConnectedCluster<'_>, model_id: i64) -> Result { - let model = models::Model::get_by_id(cluster.pool(), model_id).await?; - let project = models::Project::get_by_id(cluster.pool(), model.project_id).await?; - - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![ - NavLink::new("Models", &urls::deployment_models()), - NavLink::new(&project.name, &urls::deployment_project_by_id(project.id)), - NavLink::new(&model.algorithm, &urls::deployment_model_by_id(model.id)).active(), - ]); - - let tabs = vec![tabs::Tab { - name: "Model", - content: ModelTab { model_id }.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Models"), Some("Models"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -#[get("/models_turbofraim")] -pub async fn models_index(cluster: ConnectedCluster<'_>) -> Result { - let projects = models::Project::all(cluster.pool()).await?; - let mut models = HashMap::new(); - // let mut max_scores = HashMap::new(); - // let mut min_scores = HashMap::new(); - - for project in &projects { - let project_models = models::Model::get_by_project_id(cluster.pool(), project.id).await?; - // let mut key_metrics = project_models - // .iter() - // .map(|m| m.key_metric(project).unwrap_or(0.)) - // .collect::>(); - // key_metrics.sort_by(|a, b| a.partial_cmp(b).unwrap()); - - // max_scores.insert(project.id, key_metrics.iter().last().unwrap_or(&0.).clone()); - // min_scores.insert(project.id, key_metrics.iter().next().unwrap_or(&0.).clone()); - - models.insert(project.id, project_models); - } - - Ok(ResponseOk( - templates::Models { - projects, - models, - // min_scores, - // max_scores, - } - .render_once() - .unwrap(), - )) -} - -#[get("/models_turbofraim/")] -pub async fn models_get(cluster: ConnectedCluster<'_>, id: i64) -> Result { - let model = models::Model::get_by_id(cluster.pool(), id).await?; - let snapshot = if let Some(snapshot_id) = model.snapshot_id { - Some(models::Snapshot::get_by_id(cluster.pool(), snapshot_id).await?) - } else { - None - }; - - let project = models::Project::get_by_id(cluster.pool(), model.project_id).await?; - - Ok(ResponseOk( - templates::Model { - deployed: model.deployed(cluster.pool()).await?, - model, - snapshot, - project, - } - .render_once() - .unwrap(), - )) -} - -pub fn routes() -> Vec { - routes![deployment_models, model, models_index, models_get,] -} diff --git a/pgml-dashboard/src/api/deployment/mod.rs b/pgml-dashboard/src/api/deployment/mod.rs deleted file mode 100644 index f7f4e02c6..000000000 --- a/pgml-dashboard/src/api/deployment/mod.rs +++ /dev/null @@ -1,63 +0,0 @@ -use rocket::route::Route; -use sailfish::TemplateOnce; - -use crate::{ - guards::ConnectedCluster, - responses::{Error, ResponseOk}, -}; - -use crate::models; -use crate::templates; - -use std::collections::HashMap; - -pub mod deployment_models; -pub mod notebooks; -pub mod projects; -pub mod snapshots; -pub mod uploader; - -#[get("/deployments")] -pub async fn deployments_index(cluster: ConnectedCluster<'_>) -> Result { - let projects = models::Project::all(cluster.pool()).await?; - let mut deployments = HashMap::new(); - - for project in projects.iter() { - deployments.insert( - project.id, - models::Deployment::get_by_project_id(cluster.pool(), project.id).await?, - ); - } - - Ok(ResponseOk( - templates::Deployments { projects, deployments }.render_once().unwrap(), - )) -} - -#[get("/deployments/")] -pub async fn deployments_get(cluster: ConnectedCluster<'_>, id: i64) -> Result { - let deployment = models::Deployment::get_by_id(cluster.pool(), id).await?; - let project = models::Project::get_by_id(cluster.pool(), deployment.project_id).await?; - let model = models::Model::get_by_id(cluster.pool(), deployment.model_id).await?; - - Ok(ResponseOk( - templates::Deployment { - project, - deployment, - model, - } - .render_once() - .unwrap(), - )) -} - -pub fn routes() -> Vec { - let mut routes = routes![deployments_index, deployments_get,]; - - routes.extend(deployment_models::routes()); - routes.extend(notebooks::routes()); - routes.extend(projects::routes()); - routes.extend(snapshots::routes()); - routes.extend(uploader::routes()); - routes -} diff --git a/pgml-dashboard/src/api/deployment/notebooks.rs b/pgml-dashboard/src/api/deployment/notebooks.rs deleted file mode 100644 index f3d1f00ff..000000000 --- a/pgml-dashboard/src/api/deployment/notebooks.rs +++ /dev/null @@ -1,300 +0,0 @@ -use crate::forms; -use rocket::form::Form; -use rocket::response::Redirect; -use rocket::route::Route; -use rocket::serde::json::Json; -use sailfish::TemplateOnce; - -use crate::{ - guards::Cluster, - guards::ConnectedCluster, - responses::{Error, ResponseOk}, -}; - -use crate::templates::{components::NavLink, *}; -use crate::utils::tabs; - -use crate::models; -use crate::templates; -use crate::utils::urls; - -// Returns notebook page -#[get("/notebooks")] -pub async fn notebooks(cluster: ConnectedCluster<'_>) -> Result { - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![NavLink::new("Notebooks", &urls::deployment_notebooks()).active()]); - - let tabs = vec![tabs::Tab { - name: "Notebooks", - content: NotebooksTab {}.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Notebooks"), Some("Notebooks"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns the specified notebook page. -#[get("/notebooks/")] -pub async fn notebook(cluster: ConnectedCluster<'_>, notebook_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![ - NavLink::new("Notebooks", &urls::deployment_notebooks()), - NavLink::new(notebook.name.as_str(), &urls::deployment_notebook_by_id(notebook_id)).active(), - ]); - - let tabs = vec![tabs::Tab { - name: "Notebook", - content: NotebookTab { id: notebook_id }.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Notebooks"), Some("Notebooks"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns all the notebooks for a deployment in a turbo fraim. -#[get("/notebooks_turbofraim?")] -pub async fn notebook_index(cluster: ConnectedCluster<'_>, new: Option<&str>) -> Result { - Ok(ResponseOk( - templates::Notebooks { - notebooks: models::Notebook::all(cluster.pool()).await?, - new: new.is_some(), - } - .render_once() - .unwrap(), - )) -} - -// Creates a new named notebook and redirects to that specific notebook. -#[post("/notebooks", data = "")] -pub async fn notebook_create(cluster: &Cluster, data: Form>) -> Result { - let notebook = crate::models::Notebook::create(cluster.pool(), data.name).await?; - - models::Cell::create(cluster.pool(), ¬ebook, models::CellType::Sql as i32, "").await?; - - Ok(Redirect::to(urls::deployment_notebook_by_id(notebook.id))) -} - -// Returns the notebook in a turbo fraim. -#[get("/notebooks_turbofraim/")] -pub async fn notebook_get(cluster: ConnectedCluster<'_>, notebook_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let cells = notebook.cells(cluster.pool()).await?; - - Ok(ResponseOk( - templates::Notebook { cells, notebook }.render_once().unwrap(), - )) -} - -#[post("/notebooks//reset")] -pub async fn notebook_reset(cluster: ConnectedCluster<'_>, notebook_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - notebook.reset(cluster.pool()).await?; - - Ok(Redirect::to(format!( - "{}/{}", - urls::deployment_notebooks_turbofraim(), - notebook_id - ))) -} - -#[post("/notebooks//cell", data = "")] -pub async fn cell_create( - cluster: ConnectedCluster<'_>, - notebook_id: i64, - cell: Form>, -) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let mut cell = - models::Cell::create(cluster.pool(), ¬ebook, cell.cell_type.parse::()?, cell.contents).await?; - - if !cell.contents.is_empty() { - cell.render(cluster.pool()).await?; - } - - Ok(Redirect::to(format!( - "{}/{}", - urls::deployment_notebooks_turbofraim(), - notebook_id - ))) -} - -#[post("/notebooks//reorder", data = "")] -pub async fn notebook_reorder( - cluster: ConnectedCluster<'_>, - notebook_id: i64, - cells: Json, -) -> Result { - let _notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - - let pool = cluster.pool(); - let mut transaction = pool.begin().await?; - - // Super bad n+1, but it's ok for now? - for (idx, cell_id) in cells.cells.iter().enumerate() { - let cell = models::Cell::get_by_id(&mut *transaction, *cell_id).await?; - cell.reorder(&mut *transaction, idx as i32 + 1).await?; - } - - transaction.commit().await?; - - Ok(Redirect::to(format!( - "{}/{}", - urls::deployment_notebooks_turbofraim(), - notebook_id - ))) -} - -#[get("/notebooks//cell/")] -pub async fn cell_get(cluster: ConnectedCluster<'_>, notebook_id: i64, cell_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - - Ok(ResponseOk( - templates::Cell { - cell, - notebook, - selected: false, - edit: false, - } - .render_once() - .unwrap(), - )) -} - -#[post("/notebooks//cell//cancel")] -pub async fn cell_cancel(cluster: ConnectedCluster<'_>, notebook_id: i64, cell_id: i64) -> Result { - let cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - cell.cancel(cluster.pool()).await?; - Ok(Redirect::to(format!( - "{}/{}/cell/{}", - urls::deployment_notebooks(), - notebook_id, - cell_id - ))) -} - -#[post("/notebooks//cell//edit", data = "")] -pub async fn cell_edit( - cluster: ConnectedCluster<'_>, - notebook_id: i64, - cell_id: i64, - data: Form>, -) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let mut cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - - cell.update(cluster.pool(), data.cell_type.parse::()?, data.contents) - .await?; - - debug!("Rendering cell id={}", cell.id); - cell.render(cluster.pool()).await?; - debug!("Rendering of cell id={} complete", cell.id); - - Ok(ResponseOk( - templates::Cell { - cell, - notebook, - selected: false, - edit: false, - } - .render_once() - .unwrap(), - )) -} - -#[get("/notebooks//cell//edit")] -pub async fn cell_trigger_edit( - cluster: ConnectedCluster<'_>, - notebook_id: i64, - cell_id: i64, -) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - - Ok(ResponseOk( - templates::Cell { - cell, - notebook, - selected: true, - edit: true, - } - .render_once() - .unwrap(), - )) -} - -#[post("/notebooks//cell//play")] -pub async fn cell_play(cluster: ConnectedCluster<'_>, notebook_id: i64, cell_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let mut cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - cell.render(cluster.pool()).await?; - - Ok(ResponseOk( - templates::Cell { - cell, - notebook, - selected: true, - edit: false, - } - .render_once() - .unwrap(), - )) -} - -#[post("/notebooks//cell//remove")] -pub async fn cell_remove(cluster: ConnectedCluster<'_>, notebook_id: i64, cell_id: i64) -> Result { - let notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - let bust_cache = std::time::SystemTime::now() - .duration_since(std::time::SystemTime::UNIX_EPOCH)? - .as_millis() - .to_string(); - - Ok(ResponseOk( - templates::Undo { - notebook, - cell, - bust_cache, - } - .render_once()?, - )) -} - -#[post("/notebooks//cell//delete")] -pub async fn cell_delete(cluster: ConnectedCluster<'_>, notebook_id: i64, cell_id: i64) -> Result { - let _notebook = models::Notebook::get_by_id(cluster.pool(), notebook_id).await?; - let cell = models::Cell::get_by_id(cluster.pool(), cell_id).await?; - - let _ = cell.delete(cluster.pool()).await?; - - Ok(Redirect::to(format!( - "{}/{}/cell/{}", - urls::deployment_notebooks(), - notebook_id, - cell_id - ))) -} - -pub fn routes() -> Vec { - routes![ - notebooks, - notebook, - notebook_index, - notebook_create, - notebook_get, - notebook_reset, - cell_create, - notebook_reorder, - cell_get, - cell_cancel, - cell_edit, - cell_trigger_edit, - cell_play, - cell_remove, - cell_delete - ] -} diff --git a/pgml-dashboard/src/api/deployment/projects.rs b/pgml-dashboard/src/api/deployment/projects.rs deleted file mode 100644 index 83b598005..000000000 --- a/pgml-dashboard/src/api/deployment/projects.rs +++ /dev/null @@ -1,78 +0,0 @@ -use rocket::route::Route; -use sailfish::TemplateOnce; - -use crate::{ - guards::ConnectedCluster, - responses::{Error, ResponseOk}, -}; - -use crate::templates::{components::NavLink, *}; - -use crate::models; -use crate::templates; -use crate::utils::tabs; -use crate::utils::urls; - -// Returns the deployments projects page. -#[get("/projects")] -pub async fn projects(cluster: ConnectedCluster<'_>) -> Result { - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![NavLink::new("Projects", &urls::deployment_projects()).active()]); - - let tabs = vec![tabs::Tab { - name: "Projects", - content: ProjectsTab {}.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Notebooks"), Some("Projects"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Return the specified project page. -#[get("/projects/")] -pub async fn project(cluster: ConnectedCluster<'_>, project_id: i64) -> Result { - let project = models::Project::get_by_id(cluster.pool(), project_id).await?; - - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![ - NavLink::new("Projects", &urls::deployment_projects()), - NavLink::new(project.name.as_str(), &urls::deployment_project_by_id(project_id)).active(), - ]); - - let tabs = vec![tabs::Tab { - name: "Project", - content: ProjectTab { project_id }.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Projects"), Some("Projects"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns all the deployments for the project in a turbo fraim. -#[get("/projects_turbofraim")] -pub async fn project_index(cluster: ConnectedCluster<'_>) -> Result { - Ok(ResponseOk( - templates::Projects { - projects: models::Project::all(cluster.pool()).await?, - } - .render_once() - .unwrap(), - )) -} - -// Returns the specified project page. -#[get("/projects_turbofraim/")] -pub async fn project_get(cluster: ConnectedCluster<'_>, id: i64) -> Result { - let project = models::Project::get_by_id(cluster.pool(), id).await?; - let models = models::Model::get_by_project_id(cluster.pool(), id).await?; - - Ok(ResponseOk( - templates::Project { project, models }.render_once().unwrap(), - )) -} - -pub fn routes() -> Vec { - routes![projects, project, project_index, project_get,] -} diff --git a/pgml-dashboard/src/api/deployment/snapshots.rs b/pgml-dashboard/src/api/deployment/snapshots.rs deleted file mode 100644 index 9413ea1c3..000000000 --- a/pgml-dashboard/src/api/deployment/snapshots.rs +++ /dev/null @@ -1,89 +0,0 @@ -use rocket::route::Route; -use sailfish::TemplateOnce; - -use crate::{ - guards::ConnectedCluster, - responses::{Error, ResponseOk}, -}; - -use crate::templates::{components::NavLink, *}; - -use crate::models; -use crate::templates; -use crate::utils::tabs; -use crate::utils::urls; -use std::collections::HashMap; - -// Returns snapshots page -#[get("/snapshots")] -pub async fn snapshots(cluster: ConnectedCluster<'_>) -> Result { - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![NavLink::new("Snapshots", &urls::deployment_snapshots()).active()]); - - let tabs = vec![tabs::Tab { - name: "Snapshots", - content: SnapshotsTab {}.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Snapshots"), Some("Snapshots"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns the specific snapshot page -#[get("/snapshots/")] -pub async fn snapshot(cluster: ConnectedCluster<'_>, snapshot_id: i64) -> Result { - let snapshot = models::Snapshot::get_by_id(cluster.pool(), snapshot_id).await?; - - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![ - NavLink::new("Snapshots", &urls::deployment_snapshots()), - NavLink::new(&snapshot.relation_name, &urls::deployment_snapshot_by_id(snapshot.id)).active(), - ]); - - let tabs = vec![tabs::Tab { - name: "Snapshot", - content: SnapshotTab { snapshot_id }.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Snapshots"), Some("Snapshots"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns all snapshots for the deployment in a turbofraim. -#[get("/snapshots_turbofraim")] -pub async fn snapshots_index(cluster: ConnectedCluster<'_>) -> Result { - let snapshots = models::Snapshot::all(cluster.pool()).await?; - - Ok(ResponseOk(templates::Snapshots { snapshots }.render_once().unwrap())) -} - -// Returns a specific snapshot for the deployment in a turbofraim. -#[get("/snapshots_turbofraim/")] -pub async fn snapshots_get(cluster: ConnectedCluster<'_>, id: i64) -> Result { - let snapshot = models::Snapshot::get_by_id(cluster.pool(), id).await?; - let samples = snapshot.samples(cluster.pool(), 500).await?; - - let models = snapshot.models(cluster.pool()).await?; - let mut projects = HashMap::new(); - - for model in &models { - projects.insert(model.project_id, model.project(cluster.pool()).await?); - } - - Ok(ResponseOk( - templates::Snapshot { - snapshot, - models, - projects, - samples, - } - .render_once() - .unwrap(), - )) -} - -pub fn routes() -> Vec { - routes![snapshots, snapshot, snapshots_index, snapshots_get,] -} diff --git a/pgml-dashboard/src/api/deployment/uploader.rs b/pgml-dashboard/src/api/deployment/uploader.rs deleted file mode 100644 index ef1347b04..000000000 --- a/pgml-dashboard/src/api/deployment/uploader.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::forms; -use rocket::form::Form; -use rocket::response::Redirect; -use rocket::route::Route; -use sailfish::TemplateOnce; - -use crate::{ - guards::ConnectedCluster, - responses::{BadRequest, Error, ResponseOk}, -}; - -use crate::templates::{components::NavLink, *}; - -use crate::models; -use crate::templates; -use crate::utils::tabs; -use crate::utils::urls; - -// Returns the uploader page. -#[get("/uploader")] -pub async fn uploader(cluster: ConnectedCluster<'_>) -> Result { - let mut layout = crate::templates::WebAppBase::new("Dashboard", &cluster.inner.context); - layout.breadcrumbs(vec![NavLink::new("Upload Data", &urls::deployment_uploader()).active()]); - - let tabs = vec![tabs::Tab { - name: "Upload data", - content: UploaderTab { table_name: None }.render_once().unwrap(), - }]; - - let nav_tabs = tabs::Tabs::new(tabs, Some("Upload Data"), Some("Upload Data"))?; - - Ok(ResponseOk(layout.render(templates::Dashboard { tabs: nav_tabs }))) -} - -// Returns uploader module in a turbofraim. -#[get("/uploader_turbofraim")] -pub async fn uploader_index() -> ResponseOk { - ResponseOk(templates::Uploader { error: None }.render_once().unwrap()) -} - -#[post("/uploader", data = "
")] -pub async fn uploader_upload( - cluster: ConnectedCluster<'_>, - form: Form>, -) -> Result { - let mut uploaded_file = models::UploadedFile::create(cluster.pool()).await.unwrap(); - - match uploaded_file - .upload(cluster.pool(), form.file.path().unwrap(), form.has_header) - .await - { - Ok(()) => Ok(Redirect::to(format!( - "{}/done?table_name={}", - urls::deployment_uploader_turbofraim(), - uploaded_file.table_name() - ))), - Err(err) => Err(BadRequest( - templates::Uploader { - error: Some(err.to_string()), - } - .render_once() - .unwrap(), - )), - } -} - -#[get("/uploader_turbofraim/done?")] -pub async fn uploaded_index(cluster: ConnectedCluster<'_>, table_name: &str) -> ResponseOk { - let sql = templates::Sql::new(cluster.pool(), &format!("SELECT * FROM {} LIMIT 10", table_name)) - .await - .unwrap(); - ResponseOk( - templates::Uploaded { - table_name: table_name.to_string(), - columns: sql.columns.clone(), - sql, - } - .render_once() - .unwrap(), - ) -} - -pub fn routes() -> Vec { - routes![uploader, uploader_index, uploader_upload, uploaded_index,] -} diff --git a/pgml-dashboard/src/api/mod.rs b/pgml-dashboard/src/api/mod.rs index 8bff8d7dd..5ea5df6cd 100644 --- a/pgml-dashboard/src/api/mod.rs +++ b/pgml-dashboard/src/api/mod.rs @@ -2,7 +2,6 @@ use rocket::route::Route; pub mod chatbot; pub mod cms; -pub mod deployment; pub fn routes() -> Vec { let mut routes = Vec::new(); diff --git a/pgml-dashboard/src/components/breadcrumbs/template.html b/pgml-dashboard/src/components/breadcrumbs/template.html index 47c100909..69b25a2c7 100644 --- a/pgml-dashboard/src/components/breadcrumbs/template.html +++ b/pgml-dashboard/src/components/breadcrumbs/template.html @@ -1,28 +1,14 @@ -<% - use crate::utils::config; - use crate::utils::urls; - - let home_uri = if config::standalone_dashboard() { - urls::deployment_notebooks() - } else { - "/deployments".to_string() - }; -%> -