A little app to serve my photography from my personal website

header links

ericwood.org 618594ff da51a768

Waiting for spindle ...
+59 -24
+2 -2
src/db.rs
··· 97 97 Ok((count, photos)) 98 98 } 99 99 100 - fn build_photo_query(pq: &PhotoQuery) -> QueryBuilder<Sqlite> { 100 + fn build_photo_query(pq: &PhotoQuery) -> QueryBuilder<'_, Sqlite> { 101 101 let offset = pq.pagination.limit * (pq.pagination.page - 1); 102 102 103 103 let mut query = QueryBuilder::new("SELECT photos.* FROM photos"); ··· 127 127 query 128 128 } 129 129 130 - fn build_photo_count_query(pq: &PhotoQuery) -> QueryBuilder<Sqlite> { 130 + fn build_photo_count_query(pq: &PhotoQuery) -> QueryBuilder<'_, Sqlite> { 131 131 if pq.tags.is_empty() { 132 132 return QueryBuilder::new("SELECT COUNT(*) FROM photos"); 133 133 }
+32 -15
src/templates.rs
··· 1 - use minijinja::{Environment, Error, ErrorKind}; 1 + use minijinja::{Environment, Error, ErrorKind, Value}; 2 2 use minijinja_autoreload::AutoReloader; 3 3 use serde::Serialize; 4 4 use std::{env, fs::read_to_string, path::Path}; 5 5 6 - //#[derive(Serialize)] 7 - //struct NavLink<'a> { 8 - // id: &'a str, 9 - // label: &'a str, 10 - // href: &'a str, 11 - //} 6 + #[derive(Serialize)] 7 + struct NavLink<'a> { 8 + id: &'a str, 9 + label: &'a str, 10 + href: &'a str, 11 + } 12 12 13 13 pub fn load_templates_dyn() -> AutoReloader { 14 14 AutoReloader::new(move |notifier| { ··· 23 23 notifier.watch_path(template_path, true); 24 24 } 25 25 env.add_function("url_escape", url_escape); 26 - //env.add_global( 27 - // "nav_links", 28 - // [NavLink { 29 - // id: "photos", 30 - // label: "Photos", 31 - // href: "/photos", 32 - // }], 33 - //); 26 + env.add_global( 27 + "nav_links", 28 + Value::from_serialize([ 29 + NavLink { 30 + id: "photos", 31 + label: "Photos", 32 + href: "/photos", 33 + }, 34 + NavLink { 35 + id: "music", 36 + label: "Music", 37 + href: "/music", 38 + }, 39 + NavLink { 40 + id: "blog", 41 + label: "Blog", 42 + href: "/blog", 43 + }, 44 + NavLink { 45 + id: "projects", 46 + label: "Projects", 47 + href: "/projects", 48 + }, 49 + ]), 50 + ); 34 51 Ok(env) 35 52 }) 36 53 }
+23 -7
templates/layout.jinja
··· 36 36 37 37 header { 38 38 display: flex; 39 - align-items: center; 40 - gap: 30px; 41 39 font-size: 16pt; 42 40 width: 100%; 43 41 border-bottom: solid black 3px; ··· 54 52 55 53 header nav ul { 56 54 display: flex; 57 - gap: 30px; 55 + height: 100%; 58 56 list-style-type: none; 59 57 margin: 0; 60 58 padding: 0; 61 59 } 62 60 63 61 header nav ul a { 62 + display: flex; 63 + align-items: center; 64 + height: 100%; 64 65 text-decoration: none; 65 66 color: black; 67 + padding: 0 30px; 68 + } 69 + 70 + header nav ul a.active, header nav ul a:hover { 71 + background-color: black; 72 + color: white; 66 73 } 67 74 </style> 68 75 <title> ··· 73 80 <body> 74 81 <div class="container"> 75 82 <header> 83 + <div> 76 84 <h1>Eric Wood</h1> 85 + </div> 77 86 <nav> 78 87 <ul> 79 - <li><a href="/photos">Photos</a></li> 80 - <li><a href="">Music</a></li> 81 - <li><a href="">Blog</a></li> 82 - <li><a href="">Projects</a></li> 88 + {% set active_page = active_page|default('') %} 89 + {% for link in nav_links %} 90 + <li> 91 + <a 92 + href="{{ link.href }}" 93 + {% if active_page == link.id %} 94 + class="active" 95 + {% endif %} 96 + >{{ link.label }}</a> 97 + </li> 98 + {% endfor %} 83 99 </ul> 84 100 </nav> 85 101 </header>
+1
templates/photos/index.jinja
··· 1 1 {% extends "layout" %} 2 + {% set active_page = 'photos' %} 2 3 {% block title %}Photos{% endblock %} 3 4 {% block head %}<link rel="stylesheet" href="/photos/assets/photos/index.css" />{% endblock %} 4 5 {% block body %}
+1
templates/photos/show.jinja
··· 1 1 {% extends "layout" %} 2 + {% set active_page = 'photos' %} 2 3 {% block title %}Photos / View{% endblock %} 3 4 {% block head %}<link rel="stylesheet" href="/photos/assets/photos/show.css" />{% endblock %} 4 5 {% block body %}