Map Search — ArcGIS SDK 4.31 & UX Improvements
- Migrated Map Search from ArcGIS Maps SDK 5.0 ES modules to the stable 4.31 AMD CDN — eliminates all Calcite icon 404 errors and external asset dependencies
- Added
dojoConfig = { async: true } before ArcGIS script load to prevent Dojo/jQuery AMD conflict
- Replaced
picture-marker SVG data URIs with simple-marker style:"path" symbols — resolves CSP connect-src violations (no Fetch API calls)
- Moved all inline
<style> CSS to Css/MapSearch.css — eliminates ASPX parser false-positive CS1525 errors
- Removed all
<%= %> server expressions from the require() script block; map data now written to a hidden field (hdnMarkers) server-side
- Map now opens zoomed to show all of Washington State (center
[-120.5, 47.5], zoom 7); radius-matched zoom applied after a search
- Red teardrop search pin: placed on address select or map click; persists after permit pin redraw; hover popup shows address label
- Clicking empty map places or moves the red search pin and updates Latitude/Longitude fields — no blue pin
- Permit circle popups on hover and click via
view.hitTest() with correct geometry fallback for popup location
- Added Inactive & Draft checkbox — unchecked by default; filters both map pins and search results grid; postback refreshes both without re-querying the database
- Search results grid now shows only Active permits by default; toggling the checkbox redraws map and rebinds grid via session data
- ArcGIS Search widget styled to match site buttons (ebb blue, square aspect ratio, 3px gap)
- Fixed
Sys is not defined error in Document.js — added typeof Sys !== 'undefined' guard around PageRequestManager call
- GPS geolocation: mobile-only visibility,
watchPosition with live accuracy display, 20 m accuracy target, 20 s hard timeout
- All permit IDs with unique PermitIds get their own map pin — deduplication removed; permits with no facility name excluded
- Black outline on permit circles; overlapping pins staggered by 16 px
Security Hardening
- Tightened Content Security Policy to remove unnecessary permissions.
- Upgraded map components to a current version, removing a legacy dependency that required relaxed script execution permissions.
- Improved automated security scanning coverage and accuracy; reduced false positives. Known security findings tracked and addressed as part of ongoing remediation.
Look and Feel / Responsive Design
- Redesigned site layout to match WQStyle Portal pattern with agency look and feel (ebb blue frame, Lato font, ecology.wa.gov styling)
- Responsive mobile layout — hamburger navigation menu, stacking content, compact grids with landscape rotation prompt
- Added loading overlay with context-aware messages and 500ms display delay
- All grids now sortable with white sort indicators
- Restyled all popup windows (Feedback, Region Map, Permit Types, Document Types, Water Body, Help, CNE Application, Violation Trigger, Enforcement Details) with applicationbox pattern
- Restyled Permit Inspection Documents, Permit Enforcement Documents, and Permit Version Documents pages with applicationbox pattern
- Fixed document search filter on Permit Inspection, Enforcement, and Version Documents pages — search now correctly filters results by document name
- Added scroll-to-results on search postback
- Moved "Download Checked" into grid header for Document Search
- Restyled maintenance pages with applicationbox pattern
- Fixed maintenance mode stale cache — config now reloads from disk on every access
- Fixed shareable link email truncation issue
- Fixed CNE Application popup — changed from RadWindow to window.open for reliable rendering
- Fixed Help popup appearing behind browser window
- Maps wrapped in applicationbox containers
- RadGrid filter row hidden (filtering via RadFilter controls only)
- Image map resizer scripts for responsive map popups
- Facility Summary page responsive layout fix — single column at mobile widths
- Search box moved outside WAI-ARIA menubar into sibling element to satisfy
aria-required-children constraint
- Navigation menu responsive layout refined — two-row grid at medium widths (1025–1350px), single row at wide widths
WCAG 2.2 AA — Automated Scanner Fixes
- Resolved all 94 automated accessibility violations across 34 pages (0 remaining after initial release)
- Standardised all font sizes to 1rem (16px) site-wide — fixed sub-WCAG font-size declarations site-wide
- Replaced ASP.NET
Font-Size="Small" attributes in footer markup with CSS to ensure consistent 1rem sizing
- Added global override for
style="font-size:small" inline style injected by ASP.NET server controls
- Fixed footer link color contrast on gale-blue background — changed from
#0000ee (~2.8:1) to #00005a (~7.8:1) to meet WCAG AA 4.5:1 minimum
- Added
aria-label="Open the calendar" and role="button" to date picker calendar popup buttons which rendered as empty links
- Added
lang="en" to all popup pages
- Added
<main> landmark and <h1> heading to all popup pages
- Fixed color contrast across footer, grid messages, and links using Ecology-approved palette
- Added labels to all form inputs (date pickers, search boxes, dropdowns)
- Fixed heading hierarchy on 6 pages
- Removed restrictive viewport scaling on 3 pages
- Added alt text to all status images
- Increased touch target sizes for checkboxes and radio buttons to 24×24px minimum
Keyboard Navigation
- Added "Skip to main content" link — visible on first Tab press, bypasses entire navigation
- Added visible focus indicators (ebb blue outline) on all interactive elements
- Restored focus rings on checkboxes, radio buttons, RadComboBox, image buttons, and grid pager controls
- Navigation menu now uses WAI-ARIA Menubar pattern with full arrow key support:
Left/Right arrows move between top-level menu items,
Down/Up arrows open and navigate submenus,
Home/End jump to first/last item,
Escape closes submenus and returns focus to parent item
- Roving tabindex — only the current menu item is in the Tab order; Tab exits the menu entirely
- Added Escape key to close all submenus, hamburger menu, and all 6 popup windows
- Added
aria-expanded toggle on hamburger button and all menu triggers
- Fixed feedback footer link keyboard accessibility
- Added
UseAccessibleHeader to all 11 GridView controls
- Added captions to key data grids
Screen Reader Support
- Navigation landmark with
aria-label="Main menu"
- ARIA roles on all menu markup (
menubar, menu, menuitem) for proper screen reader announcement
- Descriptive Ecology logo — full description on link, decorative image hidden from screen readers
- Environment label reads "Development Environment" / "Test Environment" / "Production Environment"
- Loading spinner announces "Loading, please wait..." with repeat announcements every 3 seconds via
aria-live
- Search results auto-focused and announced with record count on all 18 search pages
- Added
aria-label to document search checkboxes, search inputs, and Go buttons
- Search results regions marked with
role="region" and aria-label="Search Results"
- Footer decorative dividers hidden from screen readers
- External links announce "opens in new window"
- Added
.sr-only CSS utility class for screen-reader-only content
Developer Tools
- In-app accessibility scanner (Help → Accessibility Scan) — runs automated accessibility checks across site pages; visible only in local development environments.
- Automated WCAG font-size validation added to the developer test suite.
- Created end-to-end testing guide for business testers (keyboard, screen reader, responsive) — accessible via Help menu with Print and Download options.
Security Scanner
- Introduced automated security scanning for the site, covering a range of common web security categories. The scanner is a developer tool only, not visible to public users.
- Scan results include severity ratings and remediation guidance for the development team.
Security Hardening
- Applied web security best-practice hardening including HTTP security headers, content security policies, subresource integrity for third-party resources, and access restrictions on sensitive directories and file types.
Document Downloads
- Friendly "Document Not Available" error page shown when a document cannot be retrieved — replaces silent blank download or Acrobat "unsupported file" error
- Error page uses native HTML
<dialog> with showModal() — blocks background interaction, styled with agency blue backdrop
- Error dialog includes a pre-filled mailto link to the support team with page URL, document ID, and timestamp
- Email address is environment-driven: individual address in non-production environments, group address in Production
- Close button and Escape key both dismiss the dialog and navigate back to the referring page
- CROMERR production fallback — when dev/test CROMERR returns no data, automatically retries against the production CROMERR service
- Proper MIME type detection by file extension (PDF, Word, Excel, ZIP, images) — fixes Acrobat "unsupported file type" for PDFs served without correct Content-Type
- PDF magic byte validation — detects and rejects corrupt or misidentified PDF files before streaming to the browser
- Content-Length header set when stream length is known — prevents browser truncation of large downloads
- Empty stream detection — documents with no file content now show the error dialog instead of delivering a 0-byte file
- Warning logged when document record exists but file content is missing from all storage locations
Screen Reader Version for Scanned Documents
- Scanned permit documents (PDFs, TIFFs, and images) can now be read aloud by screen readers — previously these documents contained no readable text and were inaccessible to users with visual impairments
- A “Screen Reader Version” link now appears next to eligible documents on the Document Search, Permit Document Search, Permit Version Documents, Permit Inspection Documents, and Permit Enforcement Documents pages
- Clicking the link opens a plain, readable version of the document that works with Windows Narrator, NVDA, JAWS, and the Edge Read Aloud feature (Ctrl+Shift+U)
- Each page of the document shows a confidence rating (High, Medium, or Low) so users know how reliably the text was read from the scan
- A notice is displayed when a document’s scan quality may affect the accuracy of the readable version
- The link only appears for file types that require this conversion — documents with existing text (such as electronically generated PDFs) are not affected
Deployment Fix
- Fixed Ecology logo not appearing correctly on some server environments — a site image asset was missing from the deployment package
AI Assistance Disclosure: Development of these accessibility features was assisted by GitHub Copilot (AI pair programming tool).
All AI-generated code was reviewed, tested, and validated by the development team before inclusion.