Skip to content

V1.0.1#279

Merged
jirhiker merged 67 commits into
productionfrom
staging
Jun 10, 2026
Merged

V1.0.1#279
jirhiker merged 67 commits into
productionfrom
staging

Conversation

@jirhiker

@jirhiker jirhiker commented May 20, 2026

Copy link
Copy Markdown
Member

Ocotillo Release - v1.0.1
Release Date: June 10, 2026

Overview

A focused release addressing map stability, wells list usability, PDF access, and several bug fixes.

Improvements

  • Wells List
    • Filters on the wells list now match the filters available in search, providing a consistent experience across the application.
    • Export page size increased to 500 records per export.
  • Contacts without a personal name now display their organization name.
  • Map
    • Fixed a jitter issue in the map view caused by a layout mismatch. The map now loads more smoothly with improved debounce behavior and a polished loading skeleton.
  • PDF
    • PDF preview now only requires view-level access, making previews available to a broader set of users.

Bug Fixes

  • Fixed a broken link on the home page.
  • Resolved an issue where the application would silently refetch all data when switching back to the browser tab.
  • Fixed issue where users cannot see the expected OSEPOD Information or USGS Information for a particular well.

TylerAdamMartinez and others added 16 commits April 29, 2026 09:44
BDMS-777:  Update the PDF preview and download button so that they only require view access.
Parse Ocotillo and AMP well show URLs so $pageview includes well_id, page_template, and well_detail_area for breakdowns. Extend feature_used on Ocotillo WellShow with well_detail_area.
…n replay.

Emit global_search after API and docs searches with query, result_count, has_results, and had_error. Mask other inputs in replay but show the palette field via data-posthog-unmask-search and maskInputFn.
BDMS-562: PostHog well detail routing and command palette search analytics
Contacts that represent companies rather than individuals have no name
value, causing blank labels across the UI and in search results. Add a
getContactDisplayName utility that falls back to organization when name
is absent, and apply it to the wells list, contacts list, contact show
page, and the well detail contacts card. Document the logic and deferred
follow-up work in feature_files/contact-display-name.md.
BDMS-775: Remove DataGrid Export and Type Contact Link Click Handler
…ntact-Name

Show organization name for contacts without a personal name
BDMS-776:  Increased the export hook pageSize from 20 to 500 on well list page
BDMS-788 Patch broken link  in home page
@github-actions

Copy link
Copy Markdown

Preview Deployment

Preview URL: https://preview-staging-auejgdbofq-uc.a.run.app

Note: This preview uses the staging API endpoints.

@TylerAdamMartinez

TylerAdamMartinez commented May 20, 2026

Copy link
Copy Markdown
Contributor

@jirhiker, is this release only for bug fixes? I ask because I'm wondering whether this release depends on

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6e9d2970d7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

import { FieldCompilationNotesPdf } from '@/components/pdf/FieldCompilationNotesPdf'
import type { IContact, IWell } from '@/interfaces/ocotillo'
import { formatContactPhones } from '@/components/pdf/fieldCompilationPhoneFormatter'
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.mjs'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use a PDF parser compatible with Node 20 CI

The new pdfjs-dist import runs in Vitest’s Node environment, but this commit pins pdfjs-dist@^5.7.284, whose package metadata requires Node >=22.13.0; our Vitest workflow still runs on Node 20.x (.github/workflows/CI_vitest.yml, line 17). In that CI context, loading this module causes the test suite to fail before assertions run, so this change breaks the default test pipeline unless CI is upgraded to Node 22+ or the parser/version is downgraded.

Useful? React with 👍 / 👎.

@jirhiker jirhiker marked this pull request as draft May 20, 2026 17:37
@jirhiker

Copy link
Copy Markdown
Member Author

@TylerAdamMartinez it is intended for only prioritized bug fixes. I changed this pr to draft as we currently don't have a time set for a new production hot fix release

jirhiker and others added 8 commits May 20, 2026 11:46
Switching tabs was triggering a full refetch of OGC layer data, causing
useThingLayers references to churn and re-run the queryRenderedFeatures
effect unnecessarily. OGC layer data changes infrequently so this is safe.
The layers object was rebuilt on every render even when no data changed,
causing the queryRenderedFeatures effect in MapView to re-run unnecessarily.
Wrapping the construction in useMemo with all layer objects as deps means
it only rebuilds when OGC data actually changes.
The results panel was triggering a scrollbar oscillation loop when panning
to feature-dense areas. The outer Box had gap:1 and mt:-1 which made the
content ~8px taller than its scroll container, giving the loop a threshold
to cross. Removed both.

Wired in the existing useViewportBbox hook (350ms debounce, fires on
moveend not onMove) to replace the raw setState that was running
queryRenderedFeatures at 60fps during a drag.

Added a loading skeleton to the features-in-view count panel that only
appears on initial load, not during recalculation, to avoid a flash.
Tracks all meaningful user interactions on the map page:
- map_layer_toggled: dataset turned on/off (layer_key, label, enabled, total active)
- map_color_mapping_toggled: color scale toggle per layer
- map_layer_group_toggled: dataset panel group expand/collapse
- map_export: CSV/GeoJSON download with scope, layer count, feature count
- map_export_error: catches and reports export failures
- map_point_clicked: navigation from map point to well/spring detail page
- map_piper_diagram_opened: Piper diagram panel opened with chemistry feature count
- map_selection_drawn: draw-to-select polygon completed
- map_basemap_changed: basemap switched
Tracks all meaningful interactions on the Wells list:
- wells_searched: fires when the debounced search value changes (query_length only, no text)
- wells_filter_applied: replaces vague feature_used/wells_filter; now includes operators
- wells_column_visibility_changed: fires when columns are shown/hidden (hidden_columns, hidden_count)
- wells_density_changed: fires when the density selector changes (compact/standard/comfortable)
- wells_sorted: fires when a column sort is applied (field, direction)
- wells_exported: fires on CSV export with search_active flag
- wells_batch_field_sheets: fires when Batch Field Sheets is clicked
- wells_row_clicked: fires when a well row is opened (well_id)

Also adds an optional onRowClick callback prop to ListPage so consumers
can hook into row navigation for analytics without changing shared logic.
queryRenderedFeatures is synchronous so featuresLoading was only true
for a single paint before being cleared. In areas with no features,
this caused a rapid skeleton-to-text flash on every map pan.

Removed the featuresLoading state entirely. The count text now updates
directly with no intermediate loading state.
Moved nav items out of AppShell into src/config/navigation.ts so
permissions are visible in one place. Each item declares its Refine
resource name (used for CanAccess) and an adminOnly flag for the three
Admin-only items (Locations, Lexicon, Hydrograph Correction).

AppShell now wraps every resource nav item in CanAccess so non-admins
never see restricted items. Admin-only items show a small lock icon.
Search nav item opens the existing search modal instead of being a
placeholder. Import Log removed from the nav.
@jirhiker jirhiker marked this pull request as ready for review June 9, 2026 21:01
@jirhiker jirhiker marked this pull request as draft June 9, 2026 21:02

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d73540124e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}
>
{contact.name}
{getContactDisplayName(contact)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Sanitize well contacts before organization fallback

When a non-confidential viewer loads wells whose contacts include a private org-only contact, this raw fallback can display contact.organization instead of the sanitized "Confidential Contact"; this component does not call sanitizeContacts before using getContactDisplayName, even though the new feature spec says the helper must run after sanitization. Please sanitize the well contacts (as the contact list does) before applying the name/organization fallback.

Useful? React with 👍 / 👎.

jirhiker and others added 6 commits June 9, 2026 15:07
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…GS info cards to match existing app patterns
…ove sorting of URL rows in OSEPOD and USGS info cards
…ard-errors

BDMS-863: OSE and USGS card errors
jeremyzilar and others added 8 commits June 10, 2026 12:05
…rolling

- Renamed SidebarProvider to AppLayout and SidebarInset to AppContent in sidebar.tsx
  so the component names reflect what they actually wrap (the whole app layout
  and the main content area, not sidebar-specific concepts)
- Fixed Well Detail page scrolling by replacing the flex column main element
  with a plain div — flex children were shrinking instead of overflowing,
  which prevented overflow-y-auto from triggering
- Fixed map right panel (visible features list) not scrolling by adding
  MuiCollapse-wrapper and MuiCollapse-wrapperInner flex overrides, the same
  fix already applied to the left datasets panel
- Added hamburger button to header on mobile by updating ExpandButton
  to check isMobile — previously it only showed on desktop when the
  sidebar was collapsed, so there was no way to open the nav on mobile
- Made ShellHeader responsive: search bar hidden on mobile with a
  compact search icon button replacing it, user menu shows initials
  avatar on mobile instead of the full name, ReportBugButton hides
  its label on mobile (icon only)
- Exported SupportPanelContext so ReportBugButton can import it
- Rewrote ReportBugButton in shadcn (was still using the old MUI
  version that pointed at a Google Form); now opens the support panel
- Removed @fontsource-variable/geist — installed but never imported
  anywhere; Public Sans and Outfit are the fonts in use
Both buttons were using raw <button> elements with hand-written classes
that duplicated what Button variant="ghost" size="icon" already provides
(flex, centering, rounded corners, hover bg, transitions). Switched both
to the Button primitive to keep things consistent with the rest of the UI.

SidebarTrigger was not used because it is hardcoded to PanelLeftIcon and
does not support swapping icons based on sidebar state. The distinct
collapse and expand icons (plus hamburger on mobile) are intentional.
- Added AmpRole const object to navigation.ts using the correct role strings
  ('AMP.Viewer', 'AMP.Editor', 'AMP.Admin') that match the existing PortalRole
  type in accessControl.ts — avoids duplicating the type and keeps values in sync
- Every nav item now declares its roles explicitly: viewerAndAbove for Wells,
  Field Sheets, Contacts, and Datasets; adminOnly for Locations, Lexicon, and
  Hydrograph Correction; no roles for Home, Search, and Map (available to all)
- AppShell reads the current user's roles via useAccessCapabilities and filters
  nav items before rendering — restricted items are not mounted at all rather
  than relying solely on CanAccess async resolution
- CanAccess stays in place as a second enforcement layer for page-level access
- Removed the adminOnly boolean from NavItem — it was redundant once roles is
  the explicit source of truth; the lock icon now derives from roles directly
App frame: shadcn Sidebar, Tailwind v4, single-shell layout
@jirhiker jirhiker marked this pull request as ready for review June 10, 2026 20:17

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4635809b79

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/config/navigation.ts
href: '/ocotillo/location',
icon: MapPin,
resource: 'ocotillo.location',
roles: adminOnly,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include Geothermal admins in Locations nav gate

When a user only has Geothermal.Admin, the new sidebar filters this item out before CanAccess runs (AppShell returns null when roles does not include a user role), even though the access policy still allows Geothermal.Admin to list/show/manage ocotillo.location in src/utils/accessControl.ts. This makes the Locations page disappear from navigation for an authorized admin role; use a roles set that matches the resource policy or rely on CanAccess for this item.

Useful? React with 👍 / 👎.

Comment thread src/components/Button/ReportBugButton.tsx
@jirhiker jirhiker merged commit 867fe71 into production Jun 10, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants