Dashboard

Overview of all configured map layers.

LayerTypePopup FieldsSearchableEdit

Layer Manager

Pick a layer to edit its webmap display settings — name, visibility, zoom range and tile source.

Loading…

Layer Display

Configure how each map layer looks and behaves on the webmap. Pick a layer, then switch tabs — symbology, popup fields, search, or filters. (Edit Fields is now its own tab in the sidebar.)

Layer:

Symbology

Base colour/opacity, data-driven colour rules (by value or range), and line type rules.

Loading…

Popup Fields

Choose which fields appear in the map popup. Fields loaded from the actual database table.

Edit Fields

Per-layer field metadata used by BOTH the QGIS attribute forms and the webmap edit panel. Backed by config.layer_edit_fields. Pick a layer below, then edit its fields (add, reorder, toggle editable/required, set widget hints).

Loading…

Basemaps & Overlays

Manage basemaps and reference overlays (parcel maps, ortho imagery, custom tile services). Saved here are read by the web map at startup.

Configured Basemaps

Loading...

Loading…

Add Basemap

Filter Setup

Configure system filters (silent, always applied) and user filters (shown in the web map filter panel) per layer.

Loading…

Add Web Layer

Register a new pg-tileserv layer on the map.

Loading…

Map Views

Save map location bookmarks that appear in the web map's Views dropdown for quick navigation.

Saved Map Views

Loading...

Loading...

New View

Loading layers...

Views are stored in config.system_settings (key = mapviews).

Viewer Presets

Presets shown in tfm-viewer.html, the read-only map viewer. Each preset is a named map view with its own layers and filters. Separate from Map Views above (which serves the editor webmap and portal cards).

Viewer Presets

Loading...

Loading...

New Preset

Loading layers...

Presets are stored in config.system_settings (key = viewer_presets). Read by tfm-viewer.html.

Schema Tools

Audit view sync state and add columns to editable tables.

Schema sync audit

For each editable tfm.<table>, compares the base table to all three downstream surfaces: the *_v mirror view (webmap MVT tiles), the v_* overlay-merge view (QGIS reads), and the fn_view_dml_* trigger function (QGIS writes). A green pill means in sync; yellow means the surface is missing one or more columns the base table has.

Add a column to a table

Adding a column runs ALTER TABLE on the base table. The matching _v view (used by the webmap) is updated automatically by the existing trg_auto_sync_views event trigger. If you set a column to NOT NULL without a default, the operation will fail on tables that already contain rows; allow NULL for new columns on populated tables.
ℹ Heads-up: the audit above reports drift on the v_* and fn_view_dml_* surfaces (used by QGIS). Phase B6 keeps the *_v webmap view synced automatically, but the QGIS surfaces still need a manual regenerator pass — shipping in Phase B7b. New columns added here are usable in the webmap immediately; QGIS picks them up after B7b runs.

Style Drift

Visual comparison of how each spatial layer is styled on the webmap (left, JSON in config.web_display_config) vs. QGIS (right, QML XML in public.layer_styles). Read-only — the two surfaces are intentionally independent (see CLAUDE.md §26a + §26b). A red border / ⚠ icon flags a top-level mismatch.

QGIS Layers

Controls which layers the QGIS desktop plugin loads, and how. Each row is one layer. Edit a layer's settings inline; layer_name and source_view are read-only.

What this tab does: defines the layers the QGIS plugin loads at startup (from config.qgis_layer_config). The webmap is configured separately under Layer Manager / Add Web Layer.

Loading…

How to use this tab (step by step)
  1. Find the layer row you want to change (use the column toggles / view switch in the toolbar).
  2. Edit a cell inline — e.g. display name, group, sort order, min/max zoom, editable-by-role.
  3. Changes save per row; watch for the save confirmation on each row.
  4. layer_name and source_view are read-only (they key the layer) — adding/removing layers is done elsewhere.
  5. Reload the QGIS plugin (reconnect) to pick up changes the next time layers load.

Registry

Read-only view of config.tfm_table_registry (35 rows). Drift badges sourced from public.fn_admin_audit_registry_artifacts(). Convention reference: §27 of CLAUDE.md.

Loading…

New Editable Table

Create a new editable TFM table. The backend auto-generates the base table, overlay view, audit triggers, auto-numbering, and registry entries. After clicking Create, restart QGIS to see the new layer. Backed by public.fn_admin_create_editable_table. Standard convention documented in §27.14 of CLAUDE.md.

snake_case lowercase, starts with a letter (e.g. manholes).
Human-readable label shown in QGIS and the webmap.
Choose None for attribute-only tables (no geometry column).
2–5 uppercase letters. Auto-numbers will be MNH-0001, MNH-0002, …
snake_case singular noun. Becomes the ID column name (manhole_id) and naming-config key.
QGIS layer group. Populated from existing config.qgis_layer_config groups.
Editable: edits flow through the Draft/approve/merge job workflow (like fiber cables). Reference: static lookup data — admins edit directly, no job needed. Both are protected so only authorized users can access them.
Integer ≥ 0. Controls position in QGIS layer list within its group.

Add columns specific to this entity (e.g. depth_m, material). Standard system columns (fid, global_id, geom, audit columns, version) are added automatically.

Webmap Settings

Configure the webmap URL used by the "Show on Map" buttons.

System Settings
Used by "Show on Map" buttons. Falls back to webmap-ol-edit.html if blank.

User Management

TFM logins are managed in Keycloak. A role change takes effect on the user's next sign-in.

Users
UsernameNameRoleStatusActions