From 8ce18e53d5eaed85358da5abae0f321fedb2f73f Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Fri, 23 Aug 2024 18:45:43 +0200 Subject: [PATCH] feat: Rewrite routes, pages and components to be more HATEOAS --- crates/app/askama.toml | 6 +++ crates/app/old_templates/index.html | 34 ------------- .../components}/base.html | 6 +-- .../app/src/components/navbar/menu-item.html | 14 ++++++ crates/app/src/components/navbar/navbar.html | 50 +++++++++++++++++++ crates/app/src/lib.rs | 6 ++- crates/app/src/main.rs | 15 ++++-- crates/app/src/menu.rs | 20 ++++++++ crates/app/src/old_pages/mod.rs | 10 ---- crates/app/src/pages/cps.html | 44 ++++++++++++++++ crates/app/src/{old_pages => pages}/cps.rs | 2 +- crates/app/src/pages/index.html | 44 ++++++++++++++++ crates/app/src/pages/mod.rs | 7 +++ 13 files changed, 201 insertions(+), 57 deletions(-) create mode 100644 crates/app/askama.toml delete mode 100644 crates/app/old_templates/index.html rename crates/app/{old_templates => src/components}/base.html (82%) create mode 100644 crates/app/src/components/navbar/menu-item.html create mode 100644 crates/app/src/components/navbar/navbar.html create mode 100644 crates/app/src/menu.rs delete mode 100644 crates/app/src/old_pages/mod.rs create mode 100644 crates/app/src/pages/cps.html rename crates/app/src/{old_pages => pages}/cps.rs (95%) create mode 100644 crates/app/src/pages/index.html create mode 100644 crates/app/src/pages/mod.rs diff --git a/crates/app/askama.toml b/crates/app/askama.toml new file mode 100644 index 0000000..e00fe7b --- /dev/null +++ b/crates/app/askama.toml @@ -0,0 +1,6 @@ +[general] +# Directories to search for templates, relative to the crate root. +dirs = [ + "src/pages", + "src/components", +] diff --git a/crates/app/old_templates/index.html b/crates/app/old_templates/index.html deleted file mode 100644 index 9d69e52..0000000 --- a/crates/app/old_templates/index.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Pharma Libre{% endblock %} - -{% block body %} -
-
-
-

- {% include "skeletons/page-title.html" %} -

-
-
-
-
- -
- {% include "skeletons/card.html" %} -
-
-
-
-{% endblock %} diff --git a/crates/app/old_templates/base.html b/crates/app/src/components/base.html similarity index 82% rename from crates/app/old_templates/base.html rename to crates/app/src/components/base.html index 3013631..651fb67 100644 --- a/crates/app/old_templates/base.html +++ b/crates/app/src/components/base.html @@ -9,14 +9,10 @@ - {% block head %}{% endblock %} + {% block headx %}{% endblock %}
- {% block nav %} - {% include "layout/nav.html" %} - {% endblock %} - {% block body %}{% endblock %}
diff --git a/crates/app/src/components/navbar/menu-item.html b/crates/app/src/components/navbar/menu-item.html new file mode 100644 index 0000000..b002e0c --- /dev/null +++ b/crates/app/src/components/navbar/menu-item.html @@ -0,0 +1,14 @@ +{% set selected = item.id == current %} +
  • + + {{ item.label }} + +
  • diff --git a/crates/app/src/components/navbar/navbar.html b/crates/app/src/components/navbar/navbar.html new file mode 100644 index 0000000..24a8af6 --- /dev/null +++ b/crates/app/src/components/navbar/navbar.html @@ -0,0 +1,50 @@ +{% macro navbar(current) %} + +{% let items=crate::menu::get_menu_items() %} + + +{% endmacro %} diff --git a/crates/app/src/lib.rs b/crates/app/src/lib.rs index e84842f..29c75dc 100644 --- a/crates/app/src/lib.rs +++ b/crates/app/src/lib.rs @@ -4,6 +4,9 @@ use askama_axum::Template; use axum::http::{StatusCode, Uri}; use tower_http::services::ServeDir; +mod menu; +mod pages; + async fn fallback(uri: Uri) -> (StatusCode, String) { (StatusCode::NOT_FOUND, format!("No route for {uri}")) } @@ -20,7 +23,6 @@ pub fn get_router(assets_path: &Path) -> axum::Router { axum::Router::new() .nest_service("/assets", ServeDir::new(assets_path)) .route("/", axum::routing::get(root)) - // .nest("/pages", old_pages::get_routes()) - // .merge(old_templates::get_routes()) + .merge(pages::get_routes()) .fallback(fallback) } diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index ebd3b56..67f59ab 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; use std::{env, io}; use axum::body::Body; @@ -48,12 +48,14 @@ async fn get_tcp_listener() -> Result { } fn get_livereload_layer( - templates_path: &Path, + templates_paths: Vec, ) -> Result, notify::Error> { let livereload = LiveReloadLayer::new(); let reloader = livereload.reloader(); let mut watcher = notify::recommended_watcher(move |_| reloader.reload())?; - watcher.watch(templates_path, notify::RecursiveMode::Recursive)?; + for templates_path in templates_paths { + watcher.watch(templates_path.as_path(), notify::RecursiveMode::Recursive)?; + } Ok(livereload.request_predicate::(NotHtmxPredicate)) } @@ -63,10 +65,13 @@ async fn main() -> Result<(), AppError> { var: "CARGO_MANIFEST_DIR", })?; let assets_path = Path::new(&manifest_dir).join("assets"); - let templates_path = Path::new(&manifest_dir).join("templates"); + let templates_paths = vec![ + Path::new(&manifest_dir).join("src/pages"), + Path::new(&manifest_dir).join("src/components"), + ]; let livereload_layer = - get_livereload_layer(&templates_path).map_err(AppError::NotifyWatcher)?; + get_livereload_layer(templates_paths).map_err(AppError::NotifyWatcher)?; let router = get_router(assets_path.as_path()).layer(livereload_layer); let listener: TcpListener = get_tcp_listener().await.map_err(AppError::TCPListener)?; diff --git a/crates/app/src/menu.rs b/crates/app/src/menu.rs new file mode 100644 index 0000000..a3d51ac --- /dev/null +++ b/crates/app/src/menu.rs @@ -0,0 +1,20 @@ +pub struct MenuItem { + pub id: String, + pub label: String, + pub href: String, +} + +pub fn get_menu_items() -> Vec { + vec![ + MenuItem { + id: "home".to_string(), + label: "Accueil".to_string(), + href: "/".to_string(), + }, + MenuItem { + id: "cps".to_string(), + label: "CPS".to_string(), + href: "/cps".to_string(), + }, + ] +} diff --git a/crates/app/src/old_pages/mod.rs b/crates/app/src/old_pages/mod.rs deleted file mode 100644 index 0580595..0000000 --- a/crates/app/src/old_pages/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -use axum::{routing, Router}; - -mod cps; -mod home; - -pub fn get_routes() -> Router { - Router::new() - .route("/home", routing::get(home::home)) - .route("/cps", routing::get(cps::cps)) -} diff --git a/crates/app/src/pages/cps.html b/crates/app/src/pages/cps.html new file mode 100644 index 0000000..52b6e99 --- /dev/null +++ b/crates/app/src/pages/cps.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% import "navbar/navbar.html" as navbar -%} + +{% block title %}Pharma Libre - CPS{% endblock %} + +{% block body %} +{% call navbar::navbar(current="cps") %} +
    +
    +
    +

    + CPS +

    +
    +
    +
    +
    +
    +
    A
    +
    B
    +
    C
    +
    D
    +
    +
    E
    +
    +
    +
    +{% endblock %} diff --git a/crates/app/src/old_pages/cps.rs b/crates/app/src/pages/cps.rs similarity index 95% rename from crates/app/src/old_pages/cps.rs rename to crates/app/src/pages/cps.rs index 7927e7b..67c1de4 100644 --- a/crates/app/src/old_pages/cps.rs +++ b/crates/app/src/pages/cps.rs @@ -6,7 +6,7 @@ use axum::{ }; #[derive(Template)] -#[template(path = "pages/cps.html")] +#[template(path = "cps.html")] pub struct CpsTemplate; pub struct ExtractHxRequest(bool); diff --git a/crates/app/src/pages/index.html b/crates/app/src/pages/index.html new file mode 100644 index 0000000..58f0599 --- /dev/null +++ b/crates/app/src/pages/index.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% import "navbar/navbar.html" as navbar -%} + +{% block title %}Pharma Libre - Accueil{% endblock %} + +{% block body %} +{% call navbar::navbar(current="home") %} +
    +
    +
    +

    + Accueil +

    +
    +
    +
    +
    +
    +
    A
    +
    B
    +
    C
    +
    D
    +
    +
    E
    +
    +
    +
    +{% endblock %} diff --git a/crates/app/src/pages/mod.rs b/crates/app/src/pages/mod.rs new file mode 100644 index 0000000..2c52f70 --- /dev/null +++ b/crates/app/src/pages/mod.rs @@ -0,0 +1,7 @@ +use axum::{routing, Router}; + +mod cps; + +pub fn get_routes() -> Router { + Router::new().route("/cps", routing::get(cps::cps)) +}