Skip to content

feat: UX polish — ListResult<T>, DataTable upgrades, all 8 panels#651

Merged
joshsmithxrm merged 22 commits intomainfrom
feature/ux-polish
Mar 23, 2026
Merged

feat: UX polish — ListResult<T>, DataTable upgrades, all 8 panels#651
joshsmithxrm merged 22 commits intomainfrom
feature/ux-polish

Conversation

@joshsmithxrm
Copy link
Copy Markdown
Owner

Summary

Comprehensive UX polish pass across the entire extension, driven by a three-phase audit (code review, interactive CDP testing, owner review) comparing legacy v0.3.4 against the new extension.

Infrastructure

  • ListResult<T> — new return type for all 9 services with Items, TotalCount, WasTruncated, FiltersApplied (Constitution I4 compliance)
  • DataTable shared component — virtual scrolling, cell selection + Ctrl+A/C TSV copy, sortValue for correct date/number sorting, row striping, cell tooltips, header styling
  • All panelsretainContextWhenHidden: true, enableFindWidget: true, box-sizing: border-box, button loading states, standardized date formatting, search placeholders

Per-Panel

  • Solutions — display name first, Visible/All toggle, managed/unmanaged badges, secondary date line
  • Import Jobs — paging (251 records, was 50), import log opens in editor tab with XML syntax highlighting, status badges
  • Plugin Traces — side-by-side detail split, timeline overhaul (depth colors, shimmer, click nav, legend), advanced query builder (3-tab filter with condition builder), all 9 missing detail fields, Overview tab
  • Data Explorer — transpilation warnings, hover copy button, Top N / DISTINCT overflow menu
  • Metadata Browser — Global Choices tree section, Properties detail panel, 3 separate relationship tabs with correct N:N columns, per-tab search, entity breadcrumb, navigation links, copy schema name
  • Connection References — flow count column, health-aware status, per-flow Maker deep links, Default Solution default, Sync Deployment Settings wired
  • Environment Variables — Sync Deployment Settings wired to backend, date+time format, includeInactive toggle
  • Web Resources — progressive background loading (20K+ records), server-side search fallback, solution cache

Constitution

  • I4 added — "Never silently hide, truncate, or filter data" with visibility + reversibility requirements
  • All services return total counts, all panels show "X of Y" when filtered/truncated
  • includeInactive, includeInternal, includeIntersect, includeClassic params added where silent filters existed

Test plan

  • .NET build: 0 errors
  • .NET tests: 4,852 passed (all TFMs)
  • TS compile + typecheck: 0 errors
  • TS lint: 0 errors
  • CSS lint: 0 errors
  • TS tests: 335 passed
  • Extension verification: all 8 panels load with real data (CDP screenshots)
  • QA: 3-agent blind verification (functional, consistency, UX)
  • Code review: 0 critical, 2 important fixed (D2 violation, dead code)
  • Owner walkthrough pending

🤖 Generated with Claude Code

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request delivers a comprehensive UX polish across the entire extension, focusing on improving data presentation, interactivity, and transparency. It introduces a new ListResult<T> pattern for all data services to ensure compliance with the new I4 data transparency principle, and significantly upgrades the shared DataTable component to provide features like virtual scrolling and advanced selection. Panel-specific enhancements address critical usability gaps and introduce new functionalities, particularly in the Plugin Traces and Metadata Browser panels, to provide a more robust and user-friendly experience.

Highlights

  • ListResult Adoption: Implemented a new ListResult<T> return type across all 9 data services, encapsulating items, total count, truncation status, and applied filters to ensure compliance with the new I4 data transparency principle.
  • DataTable Component Upgrade: Significantly enhanced the shared DataTable component with virtual scrolling for performance, Excel-style cell selection and Ctrl+A/C TSV copy, improved date/number sorting via sortValue, row striping, and cell tooltips.
  • Standardized Panel UX: Applied consistent UX improvements across all 8 panels, including setting retainContextWhenHidden: true and enableFindWidget: true, standardizing box-sizing: border-box, implementing button loading states, and uniform date formatting.
  • Plugin Traces Panel Overhaul: Introduced a side-by-side detail split, a comprehensive timeline visualization with depth colors and click navigation, and a new advanced query builder with multi-tab filtering capabilities.
  • Metadata Browser Enhancements: Added a dedicated Global Choices tree section, a detailed Properties panel for attributes, and restored the correct 3-tab structure for relationships (1:N, N:1, N:N) with accurate column displays for each type.
  • Connection References Data Model: Enhanced the Connection References panel to display flow counts and relationship-aware status at the table level, alongside per-flow Maker Portal deep links.
  • Environment Variables Sync: Wired the Sync Deployment Settings functionality to the backend, allowing for smart merging of environment variables and connection references into a deployment settings file.
  • Web Resources Progressive Loading: Implemented progressive background loading for web resources, ensuring faster initial rendering for large datasets, and added server-side search fallback.
  • Constitution I4 Compliance: A new constitutional amendment (I4) was added, mandating that data hiding, truncation, or filtering must always be visible and reversible, with services returning total counts and applied filters.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request implements the UX Polish project, which aims to improve the user experience of the Power Platform Dataverse extension. The changes include adding a new ListResult<T> type to service return types, upgrading the DataTable shared component, and implementing quick wins across all panels. It also addresses I4 compliance by ensuring data transparency and reversibility. The implementation plan involves multiple steps, including service return type foundation, DataTable shared component upgrades, quick wins, and per-panel fixes. The changes also include updating RPC handlers and MCP tools to align with the new service return types.

joshsmithxrm and others added 22 commits March 23, 2026 18:30
… type foundation

Implement Constitution I4 (never silently hide/truncate data):

- Add ListResult<T> with Items, TotalCount, WasTruncated, FiltersApplied
- Update all 9 service interfaces + implementations to return ListResult<T>
- Add paging cookie progressive loading to ImportJob, WebResource, User services
  (removes silent $top=50/5000/100 truncation)
- Add includeInternal param to SolutionService (isvisible filter)
- Add includeIntersect param to MetadataService (66 junction tables)
- Track FiltersApplied on ConnectionReference, EnvironmentVariable, Flow, Role services
- Wire totalCount through all RPC handlers and MCP tools
- Update all callers: CLI commands, TUI screens, tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…, sort, styling

CC-01: Add sortValue option for correct date/number sorting (3-state toggle)
CC-02: Virtual scrolling — render only visible rows + buffer (~60 rows)
CC-03: Cell selection + Ctrl+A/C TSV copy via shared SelectionManager
CC-06: Header styling — 12px, foreground color, 2px border, column separators
CC-07: Row striping via nth-child(even)
CC-08: Cell tooltips via title attribute on every td
CC-09: matchesSearch() utility for full-row text matching
I4: formatStatusCount() utility for "X of Y" status display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… states, bugs

CC-04: retainContextWhenHidden: true on all 8 panels
CC-05: enableFindWidget: true on all 8 panels
CC-11: box-sizing: border-box global reset
CC-12: user-select: none with text element whitelist
CC-13: Button loading states on all panels with Refresh
WR-10: Fix search input CSS class (search-input → toolbar-search)
EV-41: Fix filter count element not appended to DOM

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ggle, badges

S-02: friendlyName first, uniqueName in parentheses
S-03: Secondary line with Installed/Modified dates, Visible, API Managed
S-05: Visible | All segmented control with totalCount display
S-09: Date format includes time (toLocaleString)
S-10: createdOn added to detail view
S-11: managed/unmanaged badge on all solutions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…otalCount

IJ-01: Solution name clickable, opens import log
IJ-02: Row click opens prettified XML in VS Code editor tab
IJ-15: Status badges for Cancelled, Queued, Completed with Errors
IJ-43: Removed inline detail pane
IJ-45: Aligned status string matching
P2-IJ-01: Show totalCount from paged service results

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ery builder

6a: Side-by-side detail split with resize handle + X close button
6b: All 9 missing detail fields (Stage, Created By, Plugin Step ID, etc.)
6c: Overview tab as default landing (status + exception + message)
6d: Operation Type + Correlation ID table columns
6e: Timeline overhaul — depth colors, shimmer, click nav, legend, hover
6f: Advanced query builder — 3-tab filter (Quick/Advanced/Preview),
    condition builder with type-aware operators, AND/OR logic
6g: PT-43 selection zones, PT-49 keyboard protection, PT-59 close button,
    PT-20 persist width, V-21 formatStatusCount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DE-06: Inline transpilation warning banner for SQL→FetchXML issues
DE-15: Hover copy button on record link cells
DE-31: Top N and DISTINCT options in overflow menu

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…relationship tabs

8a: Global Choices tree section as peer of Entities (MB-01)
8b: Collapsible tree headers with count badges (MB-02)
8c: Three relationship tabs with correct per-type columns (MB-03)
8d: Properties detail panel with type-specific SDK metadata (MB-05)
8e: Per-tab search with debounce (MB-04)
8f: Entity breadcrumb (MB-06), legacy icons (MB-07), entity navigation
    (MB-09), displayName first (MB-10), copy schema name (MB-22),
    includeIntersect toggle (V-03)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…t solution

CR-01/02: Flow count column at table level
CR-03/30: Per-flow Maker Portal deep links (make.powerautomate.com)
CR-05: Relationship health-aware status
CR-09: Default to Default Solution GUID, persist per env
CR-11: AbortController on solution change
CR-17: Search placeholder
V-16: includeInactive toggle with "X of Y" display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e, inactive toggle

EV-09/10/37: Wire Sync Deployment Settings to existing backend service
EV-22: Date format includes time (toLocaleString)
V-17: includeInactive toggle with "X of Y" display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
WR-03: Server-side search fallback when client filter insufficient
WR-04: Progressive background loading (250-record pages, streamed)
WR-20: Publish prompt already implemented (verified)
WR-23: Cache by solution ID, invalidate on refresh

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… MCP totalCount

V-15: FlowService includeClassic param (cloud flows only filter visible)
V-18: DeploymentSettings logs "N secrets excluded" count
V-14: PluginsListTool returns totalCount
All MCP list tools verified returning totalCount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d JSDoc

CC-14: Delete QueryPanel.updateTitle(), use base class updatePanelTitle()
All 8 panels now use single format: profileName · envName — PanelLabel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ce.ListAsync

FakeXrmEasy can't handle enum filters in FetchXML aggregate queries.
Fall back to items.Count when CountAsync fails so ListAsync stays usable.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… declarations

Fix stylelint: break-word→overflow-wrap, tl-fadeIn→tl-fade-in,
expand single-line declarations, shorten hex colors.
Remove unused matchesSearch function.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… stub)

Replace "coming soon" notification with actual sync implementation
matching the Environment Variables panel pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…r hint

- Standardize all date formatting to shared formatDateTime (no seconds)
- Search placeholders: "Filter..." → "Search..." across all panels
- Data Explorer: add placeholder comment in Monaco editor

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…cleanup

Review #1: Release pooled client before calling CountAsync (D2 compliance)
Review #2: Remove dead 'meta' element in plugin-traces Overview tab

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… CDP panel targeting

Implementation plan from 2026-03-23 retrospective covering:
- P0 drift fixes (CLAUDE.md, spec-audit, verify, co-author)
- /implement enhancements (findings reconciliation, shared-infra scan, model selection)
- CDP panel targeting (data-ppds-panel + --panel flag)
- /design handoff, retro skill fix, hook improvements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Revised Task 1: delete the 42-line workflow section entirely instead of
patching individual lines. Skills and hooks already enforce the workflow;
CLAUDE.md was a redundant drift-prone copy.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…o-actions)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d by this branch)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@joshsmithxrm joshsmithxrm merged commit f809c0e into main Mar 23, 2026
15 checks passed
@joshsmithxrm joshsmithxrm deleted the feature/ux-polish branch March 23, 2026 23:45
@github-project-automation github-project-automation bot moved this from Todo to Done in PPDS Roadmap Mar 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant