Commit Graph

816 Commits

Author SHA1 Message Date
JingleManSweep 4dae1a2e0a Merge pull request #203 from ipnet-mesh/renovate/tailwindcss-monorepo
chore(deps): update tailwindcss monorepo to v4.3.0
2026-05-11 22:02:20 +01:00
renovate[bot] b234183ad3 chore(deps): update tailwindcss monorepo to v4.3.0 2026-05-11 20:34:36 +00:00
JingleManSweep 069afca74c Merge pull request #207 from ipnet-mesh/chore/member-operator-fixes
fix: member count badge and operator-only filter dropdowns
2026-05-11 21:33:47 +01:00
Louis King 6385f22ac3 fix: member count badge and operator-only filter dropdowns
- Fix Members page badge showing higher count than displayed profiles
  by counting operators + members instead of all profiles
- Filter dropdowns on Nodes, Advertisements, and Map pages to show
  only operators (since only operators can adopt nodes)
- Add roles field to /map/data profiles for client-side filtering
- Add all_operators and filter_operator_label i18n keys (en, nl)
- Fix flash banner test isolation from .env NETWORK_ANNOUNCEMENT
2026-05-11 21:30:59 +01:00
JingleManSweep 92f56fa24b Merge pull request #206 from ipnet-mesh/feat/flash-banner
feat: add network announcement flash banner
v0.10.2
2026-05-09 12:29:47 +01:00
Louis King dd36a240ba feat: add network announcement flash banner with Markdown support
Add NETWORK_ANNOUNCEMENT env var that displays a dismissible flash banner
on every page when set. Announcement text supports Markdown (bold, italic,
links, inline code) rendered to HTML server-side at startup.
2026-05-09 12:27:20 +01:00
JingleManSweep 46b9c37eb9 Merge pull request #205 from ipnet-mesh/chore/hide-test-users
feat: hide users with test OIDC role from public views
v0.10.1
2026-05-09 00:33:24 +01:00
Louis King cee487ef42 feat: hide users with test OIDC role from public views
Add OIDC_ROLE_TEST config var (default: 'test') to exclude test users
from dashboard stats, member counts, and the Members page. Uses
server-side filtering with exclude_test query param (default: true) and
client-side defense-in-depth filter in members.js.

- Add oidc_role_test to WebSettings in config.py
- Exclude test users from operator/member count queries in dashboard.py
- Add exclude_test param to GET /api/v1/user/profiles in user_profiles.py
- Filter test users client-side in members.js via role_names.test config
- Wire oidc_role_test into app.state and frontend config in web/app.py
- Document OIDC_ROLE_TEST in AGENTS.md and .env.example
2026-05-09 00:31:03 +01:00
JingleManSweep bbc51531b5 Merge pull request #204 from ipnet-mesh/fix/members-profile
fix: allow role-less OIDC users to save their own profile
2026-05-08 23:51:53 +01:00
Louis King 829971c174 fix: allow role-less OIDC users to save their own profile
The web proxy's endpoint access mapping previously required one of
(admin/operator/member) roles for PUT /api/v1/user/profile. This
blocked OIDC users with no assigned roles from saving their own profile.

Add an _AUTHENTICATED sentinel access level that grants access to any
logged-in user regardless of roles, and apply it to the profile PUT
endpoint. The API layer already enforces owner-only checks via
RequireUserOwner, so the proxy role gate was redundant.
2026-05-08 23:49:21 +01:00
JingleManSweep fbb2ebc9c6 Merge pull request #201 from ipnet-mesh/chore/prerelease-tidying
docs: sync documentation with source code before release
v0.10.0
2026-05-06 19:26:04 +01:00
Louis King e034dfe81d docs: sync documentation with source code before release
Remove stale members.yaml references (post-members-refactor), add
missing env vars to AGENTS.md (API_HOST, WEB_HOST, CORS_ORIGINS,
NETWORK_*), fix project structure tree, add backward-compat note for
MQTT_TOPIC_PREFIX, and update nl.json/i18n.md members section.
2026-05-06 19:23:35 +01:00
JingleManSweep 3c343eb2fe Merge pull request #200 from ipnet-mesh/chore/markdown-parsing-map-filters
feat: improve markdown prose styling, map popup overlay, and collapsible filters
2026-05-06 19:04:56 +01:00
Louis King 9a65018235 chore: update web dashboard screenshot 2026-05-06 19:02:34 +01:00
Louis King 2f4a388a4c feat: improve markdown prose styling, map popup overlay, and collapsible filters
- Add .prose > :first-child margin-top:0 to eliminate double-spacing before headings
- Add nested list CSS (circle/square bullets, lower-alpha/roman numbering)
- Replace map popup <p>/space-y-1 layout with CSS grid for aligned label-value pairs
- Convert map filter card to collapsible <details> with state persistence
- Add nested list HTML output tests and markdown features docs
2026-05-06 19:02:18 +01:00
JingleManSweep c43da6ddf1 Merge pull request #199 from ipnet-mesh/chore/fix-members-count-widget
fix: include operators in members count widget
2026-05-06 18:22:22 +01:00
Louis King 93b5558654 fix: include operators in members count on homepage widget 2026-05-06 18:06:28 +01:00
JingleManSweep 497cd8393e Merge pull request #198 from ipnet-mesh/feature/new-members-widget
feat: replace MeshCore card with Members widget and add footer branding
2026-05-06 15:14:59 +01:00
Louis King 981c49e7fa feat: replace MeshCore card with Members widget and add footer branding 2026-05-06 15:11:58 +01:00
JingleManSweep 8e577cdf40 Merge pull request #197 from ipnet-mesh/chore/update-radio-info-display
feat: replace flat radio config list with icon tile grid on homepage
2026-05-06 13:36:26 +01:00
Louis King 6167b24591 feat: replace flat radio config list with icon tile grid on homepage
Replace the label:value list in the Network Info panel with a 3×2 grid of
compact tiles, each showing a themed cyan icon, label, and value. Adds 5 new
SVG icon functions and a --color-radio CSS custom property with dark/light variants.
2026-05-06 13:33:24 +01:00
JingleManSweep 1efa3e1f7b Merge pull request #196 from ipnet-mesh/chore/fix-qr-code-z-index
fix: increase mobile dropdown z-index to render above QR code on node detail page
2026-05-06 12:37:30 +01:00
Louis King 2ea3e70ec7 fix: increase mobile dropdown z-index to render above QR code on node detail page 2026-05-06 12:35:18 +01:00
JingleManSweep 361d5f712a Merge pull request #195 from ipnet-mesh/chore/ui-feedback-20250505
feat: restructure mobile navbar and increase dropdown sizes
2026-05-05 22:27:01 +01:00
JingleManSweep a1f0b354b2 Merge branch 'main' into chore/ui-feedback-20250505 2026-05-05 22:25:11 +01:00
Louis King 9c3611059a feat: restructure mobile navbar — move hamburger to right, increase dropdown sizes
Move mobile hamburger menu from navbar-start to navbar-end so it stays
right-aligned regardless of logo width. Mobile nav items are now rendered
via JS (renderMobileNav) using icon functions instead of duplicated inline
SVGs. Increase dropdown widths (w-52→w-56), icon sizes (h-4→h-5), and add
larger mobile tap targets via CSS media query.
2026-05-05 22:23:16 +01:00
JingleManSweep 71493d3516 Merge pull request #193 from ipnet-mesh/feat/mobile-sort-time-default
feat: default nodes sort by last_seen + mobile sort controls
2026-05-05 19:30:44 +01:00
Louis King 8dc6ccdad0 feat: change default nodes sort to last_seen DESC and add mobile sort controls
- Change API and frontend default sort from name/asc to last_seen/desc
- Add mobileSortSelect() shared component for native select dropdown
- Add mobile sort select to nodes, advertisements, and messages pages
- Add i18n sort labels for all three list pages
- Update sort tests for new default with staggered timestamps
2026-05-05 19:28:28 +01:00
JingleManSweep 73469b714f Merge pull request #191 from ipnet-mesh/renovate/esbuild-0.x
chore(deps): update dependency esbuild to ^0.28.0
2026-05-05 18:43:41 +01:00
renovate[bot] 3bcf691a5a chore(deps): update dependency esbuild to ^0.28.0 2026-05-05 17:41:36 +00:00
JingleManSweep 8cb5253b68 Merge pull request #192 from ipnet-mesh/renovate/node-24.x
chore(deps): update node.js to v24
2026-05-05 18:40:56 +01:00
renovate[bot] a83a228a34 chore(deps): update node.js to v24 2026-05-05 17:32:29 +00:00
JingleManSweep 8b148d2d69 Merge pull request #190 from ipnet-mesh/chore/caching-and-bundling
feat: add esbuild bundling with content-hash cache busting
2026-05-05 18:31:44 +01:00
Louis King 3057a4841b feat: add esbuild bundling with content-hash cache busting
Bundle SPA JavaScript with esbuild for production builds, generating
content-hashed filenames for immutable caching. Vendor assets (Leaflet,
Chart.js, QRCode.js) get SHA256-based query params. Locale JSON files
get a combined hash version. Falls back to unbuiltsources when dist/
is absent.
2026-05-05 18:27:41 +01:00
JingleManSweep cdc4f1810f Merge pull request #189 from ipnet-mesh/chore/sort-nodes-alpha
feat: add clickable sort controls to list pages + alpha sort default for nodes
2026-05-05 17:25:28 +01:00
Louis King 160ba6d5bf feat: add clickable sort controls to list pages with alpha default for nodes
Add sort/order query parameters to Nodes, Advertisements, and Messages
API endpoints. Nodes default to alpha-by-name (via COALESCE of name tag,
node name, public key). Ads and Messages default to newest-first.

Frontend adds sortableTableHeader() component with asc/desc toggle
indicators. Sort state is preserved in URL params, surviving
auto-refresh and pagination.
2026-05-05 17:05:54 +01:00
JingleManSweep 2e41f182be Merge pull request #188 from ipnet-mesh/chore/docs-update-v0.10
fix: correct NODE_CLEANUP_DAYS default and add missing env vars to docs
2026-05-05 14:30:35 +01:00
Louis King 28255261fb fix: correct NODE_CLEANUP_DAYS default from 7 to 30 and add missing env vars to docs
NODE_CLEANUP_DAYS source of truth in Pydantic Settings is 30, not 7. Fixed in README, .env.example, docker-compose.yml, and docker-source-guide.md. Also added missing OIDC_POST_LOGOUT_REDIRECT_URI, WEB_AUTO_REFRESH_SECONDS, NETWORK_DOMAIN to docker-compose.yml web service. Added WEB_LOCALE and WEB_DATETIME_LOCALE to AGENTS.md env vars list.
2026-05-05 14:27:52 +01:00
JingleManSweep 800c67bb1f Merge pull request #187 from ipnet-mesh/chore/ui-fixes-and-daisycss-build
fix: migrate form classes to DaisyUI v5 and redesign home hero buttons
2026-05-05 13:22:29 +01:00
Louis King 9718df3f97 fix: migrate form classes to DaisyUI v5 and redesign home hero buttons
- Replace removed form-control/label-text/label-text-alt with DaisyUI v5
  fieldset/fieldset-label equivalents in node-detail.js and map.js
- Switch JS error display from innerHTML+label-text-alt to
  textContent+classList hidden toggling
- Redesign home hero navigation buttons as square cards with section
  colors, border hover animation, and centered icons
- Move custom page links to a separate row with compact btn-outline style
- Remove deprecated btn-outline CSS overrides from app.css
2026-05-05 13:19:44 +01:00
JingleManSweep d994047203 Merge pull request #186 from ipnet-mesh/chore/improve-filter-options
feat: add observer multi-select and collapsible filters to list pages
2026-05-05 12:25:21 +01:00
Louis King 9af90efee4 feat: add observer multi-select and collapsible filters to list pages
- Add observer multi-select (<select multiple size=2>) to Advertisements and
  Messages filter bars, populated from /api/v1/nodes?observer=true
- Make all filter sections collapsible via <details> on Nodes, Advertisements,
  and Messages pages; collapsed by default, auto-expands when active filters
  exist, preserves open state across auto-refresh ticks
- Add backend observer=true|false query param to GET /api/v1/nodes for
  observer-only or non-observer-only node filtering via subquery
- Change observed_by in Advertisements/Messages API from single public_key
  to list[str] with .in_() for multi-select support
- Fix router.js and api.js to handle array query params (duplicate keys
  promoted to arrays, .append() per element)
- Fix createFilterHandler to use FormData.getAll() for multi-value support
- Replace DaisyUI form-control/label/label-text classes with Tailwind-native
  equivalents (flex flex-col gap-1, flex items-center py-1, opacity-80 text-sm)
  since DaisyUI CSS is tree-shaken from the build output
- Thicker collapsible border (border-2 border-base-content/25) visible in
  both light and dark themes
- Bottom-align Filter/Clear buttons via two-row form layout
- Move Observer filter to last position on Advertisements page
- Add filter_observer_label i18n key
- Add tests for observer=true node filtering and multi observer params
2026-05-05 12:22:52 +01:00
JingleManSweep 98efc9dd06 Merge pull request #185 from ipnet-mesh/chore/ui-fixes
fix: resolve mobile UI issues on members page and node detail
2026-05-04 11:02:35 +01:00
Louis King b84cc8894f fix: resolve mobile UI issues on members page and node detail
- Replace nested <a> tags in member cards with @click handlers to fix
  invalid HTML causing missing badge styles and double-navigation
  race conditions (NS_BINDING_ABORT) on mobile
- Add e.preventDefault() to @click handlers to prevent parent <a>
  activation
- Bump mobile dropdown z-index from z-[1] to z-50 so menu items
  render above QR code wrapper (z-20) on node detail hero section
- Blur active element after SPA navigation to dismiss DaisyUI
  :focus-within dropdown state
- Fix dashboard channel messages to show short date+time format
- Add overflow-x-auto to custom pages and node detail panels for
  mobile overflow
- Fix tag editor: hide type column on mobile, truncate key/value
  cells, show key in modal title instead of disabled input field
- Fix delete tag dialog using innerHTML for <strong> in i18n strings
- Fix tag add form not resetting after successful submit
- Add break-word and overflow-x-auto to prose tables in app.css
2026-05-04 11:00:04 +01:00
JingleManSweep ddbbe05e54 Merge pull request #184 from ipnet-mesh/feature/inline-node-tag-editor
feat: replace admin tag page with inline node tag editor
2026-05-03 21:28:29 +01:00
Louis King 27b9ec21f2 feat: replace admin tag page with inline editor on node detail
Replace the dedicated admin tag management page with inline tag editing
on the node detail page. Operators can now edit tags directly on nodes
they've adopted; admins retain unrestricted access.

Key changes:
- Remove admin SPA page (admin/index.js, admin/node-tags.js)
- Add inline tag editor to node-detail.js with add/edit/delete modals
- Replace RequireAdmin with RequireOperatorOrAdmin for tag API routes
- Add ownership check: operators restricted to adopted nodes only
- Add validate_and_coerce_tag_value for number/boolean coercion
- Remove unused bulk endpoints (copy, move, replace all)
- Use AbortController for event listeners to prevent accumulation
  on lit-html DOM reuse across re-renders
- Track Leaflet map instance at module scope for defensive cleanup
- Fix checkAuthResponse to only redirect on 401 (not 403)
- Update tests for new OIDC-based auth model
- Update en.json locale, i18n.md, upgrading.md, AGENTS.md
2026-05-03 21:25:53 +01:00
JingleManSweep 3b99aa1daf Merge pull request #183 from ipnet-mesh/chore/refactor-infra-node-handling
feat: replace role=infra tag with adoption-based infrastructure detection
2026-05-03 19:05:17 +01:00
Louis King 560eb0796a feat: replace role=infra tag with adoption-based infrastructure detection
Replace the role=infra NodeTag convention with UserProfileNode adoption
as the canonical infrastructure indicator across map, Prometheus metrics,
and alerting. Renames is_infra to is_adopted, infra_center to
adopted_center. Map icons change to blue (adopted) / green (normal),
with all adoption UI gated on OIDC_ENABLED. Adds meshcore_nodes_adopted
gauge and Alembic migration to clean up obsolete tags.
2026-05-03 19:02:05 +01:00
JingleManSweep c05518c7b9 Merge pull request #182 from ipnet-mesh/chore/ui-tweaks
feat: user profile description/url + members hero link + profile layout fix
2026-05-03 00:08:49 +01:00
Louis King 2309428ce7 fix: remove btn-bg override so members hero button hover matches border color 2026-05-03 00:04:04 +01:00