---
title: "Launch Log: Row headers for screen readers, smarter conditional logic, and multi-View fixes"
date: 2026-07-17
author: "Casey Burridge"
link: "https://www.gravitykit.com/launch-log-row-headers-for-screen-readers-smarter-conditional-logic-and-multi-view-fixes/"
---

This week's releases focus on accessibility, reliability, and performance. GravityView gains a screen-reader-friendly row header setting along with a long list of fixes, GravityCalendar gets enhanced conditional logic, the DataTables Layout sees faster rendering and fixes for multiple Views on one page, the Maps Layout gets fixes for several map display issues, and Gravity Forms Dynamic Lookup gains a developer API for working with Lookup choices.

## Gravity Forms Dynamic Lookup v1.8.0

This update to [Gravity Forms Dynamic Lookup](https://www.gravitykit.com/products/gravity-forms-dynamic-lookup/) adds a developer API that lets other GravityKit products search, paginate, and count [Lookup field choices](https://www.gravitykit.com/docs/gravity-forms-dynamic-lookup/getting-started-with-dynamic-lookup/) on demand. It also hardens security by escaping the Lookup field's displayed value on output.

A few fixes are included as well: Post Lookup choices now respect the configured sort order on sites with sticky posts, the form editor's "maximum results" notice for user-based Lookup fields no longer loads every matching user ID into memory (and its count now matches the visible choices), and searching Lookup choices from the [Advanced Filter Extension's](https://www.gravitykit.com/products/advanced-filter/) condition picker no longer treats `%` and `_` as wildcards for Gravity Forms sources.

### Developer updates

- Added a choice API on Lookup fields for searchable, paginated, and counted choices: `search_lookup_choices()`, `count_lookup_choices()`, `resolve_lookup_choices()`, and `get_lookup_display_selector()`. Counts honor the search term, and paginated results stay contiguous and duplicate-free.
- Added the `gk/lookup/choice-query/bypass-filter` filter to control whether the choice API bypasses "Filter by Field".
- Added the `gk/lookup/choice-query/bypass-user-limit` filter to allow capability-checked callers to resolve labels for entries created by other users.

## GravityCalendar v2.18.0

This update to [GravityCalendar](https://www.gravitykit.com/products/gravitycalendar/) improves navigation between calendars and Views. Calendar events that link to a single entry now remember the page the calendar is on, so the **Go Back** button returns you to that calendar instead of the View's Multiple Entries page, including after editing the entry.

Conditional logic has also been enhanced. Choice-based filters now offer a searchable dropdown that loads results as you scroll, keeping fields with large option lists fast and usable. This covers the standard choice fields (Drop Down, Checkbox, Radio, and Multi Select) as well as [Dynamic Lookup](https://www.gravitykit.com/products/gravity-forms-dynamic-lookup/) and Populate Anything (Gravity Wiz) fields, which draw their options from large external data sets.

![](https://www.gravitykit.com/wp-content/uploads/2026/07/CleanShot-2026-07-17-at-13.59.26@2x-1024x531.png)You can also use a field merge tag (e.g. `{Threshold:2}`)
as a filter value to compare two fields of an entry instead of a static value, or compare against a field on a joined form using a `form:` modifier (e.g. `{Reorder threshold:1:form:123}`) with[Multiple Forms](https://www.gravitykit.com/products/multiple-forms/).

![](https://www.gravitykit.com/wp-content/uploads/2026/07/CleanShot-2026-07-17-at-14.47.25@2x-1024x442.png)Two conditional logic fixes round this out: the "has ALL of" operator on checkbox and other multi-value fields now matches only entries containing all the selected values, and switching a condition between single-value and multi-value operators no longer saves a mismatched value.

We also cleared several PHP notices that could appear when rendering calendars, including a translation loading notice on WordPress 6.7 and newer, and removed internal Ajax parameters (like the nonce and date range) from single entry links generated by calendars that load events dynamically.

## GravityView v3.1.0

This update to [GravityView](https://www.gravitykit.com/products/gravityview/) adds a Table layout setting for better screen reader support. Enable ["Use this field as a row header"](https://www.gravitykit.com/docs/gravityview/customizing-your-views/table-row-headers-screen-reader-accessibility/) on a field and that column's cells render as row headers, so screen readers announce the identifying cell (like a name or title) as context for the other cells in the row.

![GravityView field settings showing the Display options, with a red arrow pointing to the enabled "Use this field as a row header" checkbox](https://www.gravitykit.com/wp-content/uploads/2026/07/CleanShot-2026-07-17-at-12.23.10@2x-1024x426.png)
*This release also hardens the*["Enhanced Security" embed secret](https://www.gravitykit.com/docs/gravityview/getting-started-gravityview/enable-enhanced-security-the-secret-attribute-for-shortcodes/) for embedded Views. Existing embeds keep working, but if one ever stops rendering, you can re-copy its embed code from the View editor. In addition, the View editor now warns you when the [Edit Entries bulk action](https://www.gravitykit.com/docs/gravityview/getting-started-gravityview/frontend-bulk-actions/) can't run on the frontend because the View's form uses conditional logic, and Phone field compatibility with Gravity Forms 3.0+ has been improved.

Searches are now scoped to the View they were performed on. Previously, when multiple Views were embedded on the same page, a search on one View also filtered the others, which could cause a View set to hide when empty to show "This search returned no results." instead. We also restored the GravityView integration on the [LifterLMS](https://lifterlms.com/) Integrations settings screen (and the "My Forms" student dashboard tab with it), which had been missing since the 3.0 update.

This release also includes a long list of fixes:

- [Entries opened in a lightbox](https://www.gravitykit.com/docs/gravityview/getting-started-gravityview/opening-and-editing-entry-details-in-a-lightbox-modal-popup/) no longer show "The requested entry could not be found." when the View's filtering depends on a URL parameter, such as with the [Advanced Filter Extension](https://www.gravitykit.com/products/advanced-filter/).
- The lightbox now shows the normal access-controlled response instead of a raw error when a visitor's session has expired: a public entry displays, and a restricted one shows a friendly message.
- The [`[gv_entry_link]` shortcode](https://www.gravitykit.com/docs/gravityview/shortcodes/gv-entry-link/) with `lightbox="true"` now opens the lightbox instead of a full page when the View's entries load over AJAX, such as on the [DataTables Layout](https://www.gravitykit.com/products/datatables/).
- The confirmation message displays again after duplicating or deleting an entry from the front end.
- Entries whose status was saved with different capitalization (e.g., `Active` instead of `active`, which can happen with imports) no longer show ["You are not allowed to view this content."](https://www.gravitykit.com/docs/gravityview/common-problems/you-are-not-allowed-to-view-this-content/) when opened or edited.
- [Search Bar](https://www.gravitykit.com/docs/gravityview/search/configuring-the-search-bar/) fixes: the Date Range field no longer overflows its column, the Search button sits below the search fields again, and the Clear/Reset button is back on pages without an active search.
- Removing the last widget from a widget-area row no longer removes the row itself from the editor.
- Activating GravityView no longer prevents a site from loading when its theme or another plugin includes the same email-obfuscation library.
- Heading markup placed in the List layout's Listing Title or Subtitle zones no longer leaves an empty heading that accessibility checkers like WAVE flag as an error.
- A DataTables View using the Vantage theme no longer renders a narrow table pushed to one side when FixedHeader or FixedColumns is enabled.
- Single entry pages load correctly when custom entry slugs are enabled and an entry link is built for an entry that can't be resolved, such as by the [WPML](https://wpml.org/) language switcher.
- A Time field's "Override Date Format" box can now be left empty. The default format shows as a placeholder hint instead of being baked in when the View is saved.
- Duplicating an entry no longer fails when the request has no user agent, such as from WP-CLI or other server-side requests.
- Cleared PHP notices, including a translation loading notice on WordPress 6.7 and newer and deprecation warnings that incorrectly blamed add-ons like Gravity Flow.

### Developer updates

- Entry approval checks now accept the lowercase `approved` value in the `is_approved` entry meta, matching the already-accepted `Approved` and `1` values.
- Edit Entry now uses `GFAPI::get_entry()` and `GF_Field::get_value_save_input()` instead of methods deprecated in Gravity Forms 3.0.
- GravityView no longer listens to its own deprecated hooks, clearing deprecated-hook entries from debugging tools like Query Monitor. The deprecated hooks still fire for third-party code.
- Added the `gk/gravityview/template/options/pre-context` filter to modify typed field options before they are filtered by context.
- Added the `gk/gravityview/deprecated-hook-notices/product-dirs` filter to register additional directories as GravityKit products for deprecated-hook classification.
- Added the `gk/gravityview/field-output/fix-heading-wrapper` filter to disable the automatic demotion and suppression of heading wrappers in field output.
- Added the `gk/gravityview/search/scope-to-view` filter (default `true`) to control whether a front-end search is scoped to the View it was performed on. Return `false` to restore the legacy behavior where one search bar filters every View on the page.
- Added the `gk/gravityview/view/secret/allow-legacy` filter to control whether a View accepts the embed secret it used before this release.

## GravityView - DataTables Layout v3.10.0

This update to the [GravityView DataTables Layout](https://www.gravitykit.com/products/datatables/) improves rendering performance. The table configuration is now built once per View and shared across DataTables features instead of being rebuilt by each feature, and client-side search is faster when multiple Views are displayed on the same page.

Several fixes address Views interfering with each other when embedded together on one page: tables now display when the same View is embedded more than once, the Responsive, FixedHeader, and FixedColumns settings apply to the correct table, and a View using client-side processing no longer conflicts with other tables on the page that use the DataTables library.

We also fixed the table information text, which did not report the total number of entries when results were filtered by a search, and an issue where a View using [URL-based Filter & Sort conditions](https://www.gravitykit.com/docs/gravityview/merge-tags/the-get-merge-tag/) (e.g. `{get:city}`) could return no entries after a refresh when the page was served from a full-page cache. The AJAX request now carries the live URL query, so the filters resolve regardless of the cached markup.

### Developer updates

- DataTables now uses current GravityView hooks instead of ones deprecated in GravityView 2.55.
- The `gk.datatables.options` JavaScript filter now receives a per-table copy of the configuration. Mutating the filtered object no longer modifies the shared `window.gvDTglobals` entries; return the modified object instead.

## GravityView - Maps Layout v3.10.1

This update to the [GravityView Maps Layout](https://www.gravitykit.com/products/maps/) resolves map display issues on [DataTables](https://www.gravitykit.com/products/datatables/) Views and in background browser tabs, and restores the Entry Map field settings for sites running GravityView versions older than 2.57 (a regression introduced in 3.9.0).

On DataTables Views, the [Multiple Entries Map widget](https://www.gravitykit.com/docs/gravityview-pro/maps-premium-view/getting-started-with-maps/) now keeps a single map instance across table refreshes instead of rebuilding its map each time, which previously left an extra, invisible map layered on the canvas and broke custom code that reads the map object. Maps that initialize while their page loads in a background browser tab no longer come up broken, since map creation now waits until the tab is visible. The map also centers itself on its known marker positions instead of remaining a blank gray box, and when a search returns no results, the map is hidden and the "No entries match your request" message is shown instead.

Finally, [marker info windows](https://www.gravitykit.com/docs/gravityview-pro/maps-premium-view/how-to-configure-info-boxes/) and viewport marker loading now work on Views filtered by URL parameters. Those requests carry the page's query, so the View's filters resolve the same way they do for the page itself.

### Developer updates

- GravityView Maps now uses current GravityView hooks instead of ones deprecated in GravityView 2.55.

## In summary

Gravity Forms Dynamic Lookup gains a choice API for developers, GravityCalendar gets smarter conditional logic and better navigation back to the calendar, GravityView sees a new row header accessibility setting alongside a long list of fixes, the DataTables Layout gets faster rendering and fixes for multiple Views on one page, and the Maps Layout receives fixes for several map display issues.

As always, we recommend updating to the latest versions to benefit from these improvements and to ensure compatibility across the GravityKit suite!