Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
ff8c8fc
Well list: lead with name, site name, monitoring, created; column hints
jeremyzilar Apr 27, 2026
a74c0c3
Wells list: show Created At as date only without time
jeremyzilar Apr 27, 2026
5fe0f68
Add displayWellSiteName helper for well list and contacts card
jeremyzilar Apr 27, 2026
d90ea07
Merge branch 'staging' into feature/wells-list-columns-reorder
jeremyzilar Apr 28, 2026
d93489d
Align wells and contacts grids with API virtual sorts and document fi…
jeremyzilar Apr 28, 2026
daffbc1
Restore filter debounce on server-side DataGrids so filter inputs kee…
jeremyzilar Apr 28, 2026
d0e9943
update to 700
jeremyzilar Apr 28, 2026
a0a604a
Merge pull request #266 from DataIntegrationGroup/BDMS-774
jeremyzilar Apr 28, 2026
23f1f13
Log well details API payload to the console in all environments
jeremyzilar Apr 28, 2026
f5fbd04
refactor(components/WellShow): Update names from Accordion to Card
TylerAdamMartinez Apr 28, 2026
a12db0e
chore(WellPhysicalProperties): Rm unused component
TylerAdamMartinez Apr 28, 2026
ffb53d7
Merge pull request #264 from DataIntegrationGroup/feature/wells-list-…
jeremyzilar Apr 28, 2026
c7ab6de
test(pages/well-show): Fix vi.mock imports
TylerAdamMartinez Apr 28, 2026
dd87584
feat(WellShow/OwnerPermissions): Add 'Owner acknowledged public data …
TylerAdamMartinez Apr 28, 2026
206e69f
Merge pull request #269 from DataIntegrationGroup/TAM-BDMS-723
TylerAdamMartinez Apr 28, 2026
d165278
Merge pull request #267 from DataIntegrationGroup/TAM-BDMS-722
TylerAdamMartinez Apr 28, 2026
0f5ee62
Add shared well list column titles for the grid and map CSV.
jeremyzilar Apr 28, 2026
37a0a9a
Add helpers for absolute well show URLs used in map CSV export.
jeremyzilar Apr 28, 2026
89afe7a
Add well map CSV export labels and row builder aligned with the wells…
jeremyzilar Apr 28, 2026
de510a7
Support preferred property column order when building layer CSV output.
jeremyzilar Apr 28, 2026
d3cd967
Merge fetched well details into map features for enriched CSV export.
jeremyzilar Apr 28, 2026
b9dcaa6
Use well list column label constants for Ocotillo water well grid hea…
jeremyzilar Apr 28, 2026
8985b0c
Use map CSV column order and well detail enrichment for visible layer…
jeremyzilar Apr 28, 2026
668900a
Use plain text captions for contact name, email, and phone on well de…
jeremyzilar Apr 28, 2026
e67a9cc
Document optional VITE_OCOTILLO_PUBLIC_APP_URL for well links in map …
jeremyzilar Apr 28, 2026
5b4b78a
feat(pages/content): Update content manager to accept ENVs & code ele…
TylerAdamMartinez Apr 28, 2026
0bf4134
Append local date stamp to map layer CSV download filenames.
jeremyzilar Apr 28, 2026
c0fbff1
Fix map export TypeScript: CustomParams for data provider and narrow …
jeremyzilar Apr 28, 2026
b30b4d5
Merge pull request #270 from DataIntegrationGroup/BDMS-783
jeremyzilar Apr 28, 2026
cfe6b7a
feat(public/content/ogcapi): Recreate the ocotillo/help pg in markdown
TylerAdamMartinez Apr 28, 2026
87c2cd4
chore(ocotillo/help): Rm old help page
TylerAdamMartinez Apr 28, 2026
5893f56
chore(layout/sider): Update sider for update pg links
TylerAdamMartinez Apr 28, 2026
5bc194d
doc(ogcapi): Update content based on https://nmbgmr.atlassian.net/bro…
TylerAdamMartinez Apr 28, 2026
a1491bb
Break authentik-provider utils barrel cycle that hung Vitest access-c…
jeremyzilar Apr 28, 2026
1f9a739
Merge pull request #271 from DataIntegrationGroup/TAM-BDMS-769
TylerAdamMartinez Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .env.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ VITE_POSTHOG_HOST=https://us.i.posthog.com
VITE_APP_ENV=production
VITE_APP_TIMEZONE=America/Denver

# Optional: base URL for well detail links in map CSV export (defaults to https://ocotillo.newmexicowaterdata.org)
# VITE_OCOTILLO_PUBLIC_APP_URL=https://ocotillo.newmexicowaterdata.org

VITE_AUTHENTIK_CLIENT_ID=
VITE_AUTHENTIK_URL=
VITE_AUTHENTIK_REDIRECT_URI=
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,7 @@ npm run start

## Deployment

Deploy the contents of the `dist/` folder to any static hosting provider (e.g., Netlify, Vercel, AWS S3, GitHub Pages,
GCP). Ensure environment variables are configured on the hosting platform.
Deploy the contents of the `dist/` folder to any static hosting provider (e.g. GCP). Ensure environment variables are configured on the hosting platform.

## License

Expand Down
17 changes: 11 additions & 6 deletions docs/data-tables.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@ Limitation: it does not search your entire database. If the record you are looki

### Column filters (server-side filters)

The **Filters** button opens a panel where you can add one or more conditions to narrow down results across the entire dataset. This sends a request to the server and returns only the matching records.
The **Filters** button opens a panel where you set conditions that narrow results across the **entire** dataset. Each change sends a request to the server.

Currently supported filter operators:
**Important:** The app uses **MUI X Data Grid (Community)**. In this edition, the filter panel only supports **one active column filter at a time**. If you add a filter on a second column, it **replaces** the previous one rather than stacking. The Ocotillo API and Refine can in principle accept **multiple** filter parameters in one request, but the current grid UI does not let you combine several column filters without upgrading to a commercial Data Grid tier or building a custom filter UI.

Currently supported filter operators (when the API implements them for that column):

- **contains** -- finds records where the field includes the search text
- **equals** -- finds records where the field exactly matches
Expand All @@ -45,9 +47,11 @@ Other operators shown in the dropdown (such as "does not contain" or "does not e

### Sorting

Clicking any column header sorts the table by that column. Clicking again reverses the sort order. Sorting is applied server-side, so it sorts across all records, not just the current page.
Clicking any column header sorts the table by that column when the column is sortable. Clicking again reverses the sort order. Sorting is applied server-side, so it sorts across all records, not just the current page.

For columns that aggregate multiple links (for example **Aquifers**, **Contacts** on wells, or **Associated Sites** on contacts), the server uses a fixed rule such as ordering by the alphabetically first linked value. That order may not match how labels are joined with commas in the cell.

Columns marked as not sortable (such as Aquifers and Associated Sites) cannot be sorted because they contain computed or multi-value data that doesn't translate well to a single sort order.
Some columns stay non-sortable by design (for example **Primary Phone** and **Primary Email** on Contacts), usually because sorting would require extra API work or privacy rules.

### Column visibility

Expand Down Expand Up @@ -79,6 +83,7 @@ The following improvements would require changes to the OcotilloAPI server in ad
- **Additional filter operators** -- "does not contain," "does not equal," and "is any of" would need to be implemented in the API filter logic.
- **Additional columns** -- several useful fields (owner name, county, latitude/longitude, site name) exist in the database but are not currently returned by the API in the list endpoints. Adding them requires API and potentially database changes.
- **Saved views or presets** -- letting users save a filter configuration and return to it later would need storage on the server or in user preferences.
- **Multiple column filters visible at once in the filter panel** -- the Ocotillo API can accept more than one `filter` query parameter, but **MUI X Data Grid (Community)** only allows **one** active column filter in the built-in panel. Offering several simultaneous column filters in that panel would need a **custom filter UI** (or a different table stack), not only an API change.

## Column reference by page

Expand All @@ -89,7 +94,7 @@ The following improvements would require changes to the OcotilloAPI server in ad
| Name | Well identifier (e.g. WELL-0001) | Yes |
| Well Status | Current operational status | Yes |
| Monitoring | Whether the well is actively monitored | Yes |
| Aquifers | Aquifer systems the well is associated with | No |
| Aquifers | Aquifer systems the well is associated with | Yes (first aquifer name alphabetically) |
| Release Status | Whether the record is public | Yes |
| Well Depth (ft) | Total depth of the well casing | Yes |
| Hole Depth (ft) | Total drilled depth | Yes |
Expand Down Expand Up @@ -124,5 +129,5 @@ The following improvements would require changes to the OcotilloAPI server in ad
| Contact Type | Classification of the contact | Yes |
| Primary Phone | First phone number on file | No |
| Primary Email | First email address on file | No |
| Associated Sites | Wells or springs linked to this contact | No |
| Associated Sites | Wells or springs linked to this contact | Yes (first site name alphabetically) |
| Created At | When the record was added to the system | Yes |
70 changes: 70 additions & 0 deletions public/content/ogcapi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
title: Connect the Ocotillo OGC API to desktop GIS
deck: Use the Ocotillo OGC API Features endpoint to browse collections in ArcGIS Desktop and in QGIS.
---

> [!WARNING]
> OGC API layers are read-only in desktop GIS. Use them for discovery, map display, querying, and export.

##### Ocotillo OGC landing page URL

```text
{{ ocotillo_api_url }}/ogcapi
```

## ArcGIS Pro / Desktop

1. On the **Insert** tab, in the **Project** group, click **Connections > Server > New OGC API Server**. The **Add OGC API Server Connection** dialog box appears.
2. Enter this URL ([{{ ocotillo_api_url }}/ogcapi]({{ ocotillo_api_url }}/ogcapi)) in the **Server URL** text box.
3. Leave the rest of the options as-is and click OK.
4. In the Catalog pane, expand the “Servers” folder. You should see the Ocotillo OGC API connection. Expand the connection, then expand “Features”. Drag the datasets you want into your map area.
5. When adding a layer, a dialog box will appear with spatial extent options. Click OK to add the entire contents. You can also check the “Use Spatial Extent” box and spatially filter via options in the “Get extent from:” box - e.g. spatially filter by existing layers, selected polygon extents, visible extent, etc.

**Official documentation:**
[How to add OGC API datasets to ArcGIS Pro](https://pro.arcgis.com/en/pro-app/latest/help/data/services/add-ogc-api-services.htm)
[https://pro.arcgis.com/en/pro-app/latest/help/data/services/use-ogc-api-services.htm](https://pro.arcgis.com/en/pro-app/latest/help/data/services/use-ogc-api-services.htm)

---

## QGIS

1. Open **Data Source Manager**.
2. Choose the WFS / OGC API - Features connection tab.
3. Create a new connection using the Ocotillo landing page URL.
4. Connect to the server, select one or more collections, and add them to the map.
5. For large layers, set paging or feature limits in the connection and layer options.

> [!INFO]
> QGIS expects the OGC API landing page, not a single collection items URL, when you create the server connection.

**Official documentation:**
[https://docs.qgis.org/latest/en/docs/user_manual/working_with_ogc/ogc_client_support.html](https://docs.qgis.org/latest/en/docs/user_manual/working_with_ogc/ogc_client_support.html)

---

## Useful Ocotillo endpoints

### Landing page

[{{ ocotillo_api_url }}/ogcapi]({{ ocotillo_api_url }}/ogcapi)

Use this as the server URL when creating the connection.

### Collections

[{{ ocotillo_api_url }}/ogcapi/collections]({{ ocotillo_api_url }}/ogcapi/collections)

Review available collections before connecting from desktop GIS.

---

## Common collections to look for

- [!CHIPS]
- Water Wells
- Springs
- Latest Depth to Water
- Average TDS
- Latest TDS

Collection names can change by deployment. If you do not see one of these, open the [collections endpoint]({{ ocotillo_api_url }}/ogcapi/collections) and use the names published there.
4 changes: 4 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ const App: React.FC = () => (
path="/report-a-bug"
element={<ContentPage src="/content/report-a-bug.md" />}
/>
<Route
path="/ogcapi"
element={<ContentPage src="/content/ogcapi.md" />}
/>
<Route path="/amp/*" element={<AMPRoutes />} />
<Route path="/ocotillo/*" element={<OcotilloRoutes />} />
<Route path="/st2/*" element={<ST2Routes />} />
Expand Down
6 changes: 6 additions & 0 deletions src/components/ListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,15 @@ export const ListPage: React.FC<ListPageProps> = ({
)}
</Box>

{/* Refine sets filterDebounceMs to 0 for server-side grids; restore MUI debounce so toolbar column filters keep input focus while typing. */}
<DataGrid
{...restDataGridProps}
rows={filteredRows}
filterDebounceMs={
restDataGridProps.filterMode === 'server'
? 700
: restDataGridProps.filterDebounceMs
}
showToolbar
slots={{ toolbar: ListPageToolbar }}
slotProps={{
Expand Down
8 changes: 5 additions & 3 deletions src/components/WellShow/AlternateIds.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { useMemo } from 'react'
import { Box, Paper, Stack, Typography } from '@mui/material'
import { Box, Paper, Typography } from '@mui/material'
import type { UseDataGridReturnType } from '@refinedev/mui'
import { MoreVertOutlined } from '@mui/icons-material'
import { DataGrid, GridColDef } from '@mui/x-data-grid'
import { settings } from '@/settings'

export const AlternateIdsAccordion = ({
export const AlternateIdsCard = ({
dataGridProps,
}: {
dataGridProps: UseDataGridReturnType['dataGridProps']
Expand All @@ -25,7 +25,9 @@ export const AlternateIdsAccordion = ({

return (
<Paper elevation={2} sx={{ borderRadius: 2, overflow: 'hidden' }}>
<Box sx={{ px: 2, py: 1.5, display: 'flex', alignItems: 'center', gap: 1 }}>
<Box
sx={{ px: 2, py: 1.5, display: 'flex', alignItems: 'center', gap: 1 }}
>
<MoreVertOutlined color="primary" />
<Typography variant="body1" fontWeight="bold">
Alternate IDs
Expand Down
2 changes: 1 addition & 1 deletion src/components/WellShow/Attachments.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import type { IAsset } from '@/interfaces/ocotillo'

type ImageViewMode = 'grid' | 'slideshow'

export const AttachmentsAccordion = ({
export const AttachmentsCard = ({
assets,
isLoading,
}: {
Expand Down
Loading
Loading