Skip to content

Bring the V2 admin Help group to parity with the classic page - #1679

Merged
Paul Lizer (paullizer) merged 5 commits into
paullizer-react-v2-uifrom
paullizer-admin-v2-support-parity
Oct 7, 2026
Merged

Paul Lizer (paullizer) merged 5 commits into
paullizer-react-v2-uifrom
paullizer-admin-v2-support-parity

Conversation

@paullizer

Copy link
Copy Markdown
Contributor

Summary

V2 Admin Settings declared only three Help switches, so most of the classic Help group was missing from V2:

  • no Support menu name or feedback recipient;
  • no Send Feedback forms;
  • no per-announcement Latest Features choices;
  • nothing at all for Admin Latest Features.

The Send Feedback switch was also guessed onto the wrong card by the enable_* fallback scan. This PR brings V2 to parity using the V2 card, status, nesting, and search patterns rather than porting the classic markup.

  • Support declares Menu Name, the Send Feedback destination, and the Support Recipient Email, nested under the menu switch. While Send Feedback has no recipient, the card reads Needs configuration and the empty field shows a Required pill.
  • Send Feedback gets its Overview plus the Report a Bug and Request a Feature forms. They post to the existing /api/admin/settings/send_feedback_email endpoint and open the mailto draft. They never touch the settings draft or the save bar.
  • User-Facing Latest Features lists all 79 announcements by release.
    • Each has a share checkbox and a preview of exactly what users see.
    • Each release has Share all / Hide all.
    • A Publication notice says whether users can reach the page and links back to Support.
  • Admin Latest Features renders as a catalog card marked New, served by a new admin-only GET /api/v2/admin/latest-features.
    • The Help category carries the same New marker.
    • Shortcuts jump to the matching V2 card, or fall back to the classic tab when V2 doesn't show it yet.
    • The version banner gains the Registered / Unregistered release notifications badge and dialog.

This also fixes a bug in both interfaces: an app title containing "SimpleChat" (for example "SimpleChat Contoso") was substituted twice in Latest Features copy.

Intentional differences from the classic page:

  • A missing recipient saves with a warning instead of silently switching Send Feedback off. A malformed address is a field error instead of being cleared.
  • User-facing announcements stay editable while the menu or destination is off, so they can be prepared before publishing.
  • The classic read-only preview of older user releases is folded into the User-Facing list. Admin Latest Features shows only the admin catalog, with a New badge and no per-user hide.
  • On save, the visibility map is merged over the stored one, so a partial payload can never re-share a hidden announcement.

Before merging: paullizer-react-v2-ui has moved 58 commits ahead and is now at 0.261.271.

  • A dry-run merge (git merge-tree) reports conflicts in:
    • admin_settings_fields.py
    • config.py
    • SettingsSection.tsx
    • fields.tsx
    • AdminSettingsPage.tsx
    • release_notes.md
    • test_v2_admin_capability_placement.py
    • test_v2_admin_settings_schema.py
    • ui_tests/fixtures/v2_admin_settings.py
  • The version needs renumbering to the next free patch.
  • The PR workflows will not run until the conflicts are resolved, so their checks were run locally (see Testing).
Screenshots (UI test fixture data, which is why the version reads 0.261.093)

Before

Before: V2 Help group with only three switches

After: Support needs a recipient, the Send Feedback overview, and the New marker on Help

After: Support card and Send Feedback overview

After: User-Facing Latest Features with a preview open

After: User-Facing Latest Features

After: Admin Latest Features with an entry open

After: Admin Latest Features

After: Report a Bug

After: Report a Bug form

After: Release notifications registration

After: Release notifications registration dialog

Linked issue

N/A - no tracking issue for this change.

Release Notes & Latest Features

  • New Feature
  • Bug Fix
  • UI Enhancement
  • Breaking Change
  • Internal only

Is this visible to end users?

  • Yes
  • No

Only the Latest Features app-title fix reaches end users. Everything else is in V2 Admin Settings.

Is this admin-facing (Admin Settings, governance, deployment, config)?

  • Yes
  • No

Should this become a Latest Feature card?

  • Yes
  • No
  • Already added

Screenshot needed for the card?

  • Yes
  • No
  • Attached

Version bump

  • application/single_app/config.py VERSION third segment bumped, or not needed because this is docs-only
  • deployers/version.txt bumped, or not needed because deployers/ was not changed

Bumped 0.261.259 -> 0.261.260. The base is now at 0.261.271, so this needs renumbering to the next free patch version when paullizer-react-v2-ui is merged in.

Testing / validation

  • npx tsc -b --noEmit (in application/v2_ui): passed

  • npm --prefix application/v2_ui run build: passed

  • python functional_tests/test_v2_admin_help_parity.py: passed, 9/9

  • python functional_tests/test_v2_admin_help_settings_normalization.py: passed, 7/7

  • python functional_tests/test_v2_admin_latest_features_api.py: passed, 8/8

  • python functional_tests/test_v2_admin_help_logic.py: passed, 16/16 TypeScript checks

  • Functional sweep: 317 passed, 3 failed. Command:

    python -m pytest -q -p no:cacheprovider -W ignore functional_tests/test_v2_admin_*.py functional_tests/route_tests/test_route_blueprint_policy_inventory.py functional_tests/route_tests/test_route_unauthenticated_policy_contract.py functional_tests/route_tests/test_route_policy_test_coverage.py functional_tests/test_support_app_title_personalization.py functional_tests/test_support_menu_user_feature.py functional_tests/test_latest_features_release_group_integrity.py functional_tests/test_latest_feature_action_targets.py functional_tests/test_latest_features_action_links.py functional_tests/test_support_menu_config_dead_metadata_removal.py functional_tests/test_docs_app_surface_coverage.py functional_tests/test_docs_site_quality.py functional_tests/test_admin_latest_features_tab.py
    

    The 3 failures are unrelated. All three fail identically on the unmodified base commit 1b8d4c47b:

    • test_v2_admin_security_parity::test_every_v1_security_field_is_claimed: missing content-screening pane
    • test_admin_latest_features_tab::test_admin_settings_tab_uniqueness: missing content-screening pane
    • test_v2_admin_settings_schema::test_defaults_match_their_field_type: m365_trusted_download_hosts default
  • UI tests: passed, 76/76, run with local Chromium against the built SPA. Command:

    python -m pytest -q -p no:cacheprovider ui_tests/test_v2_admin_help_settings.py ui_tests/test_v2_admin_settings_wide_layout.py ui_tests/test_v2_admin_agents_visual_hierarchy.py ui_tests/test_v2_admin_model_catalog_workbench.py ui_tests/test_v2_admin_version_status.py ui_tests/test_v2_m365_transport_settings.py ui_tests/test_v2_orchestration_actions.py
    
  • PR workflow checks, run locally with --base-sha 1b8d4c47b (merge base), --head-sha 5922cd1c3, and the changed files each workflow would pass:

    • python scripts/check_xss_sinks.py: passed, 21 files
    • python scripts/check_broken_access_control.py: passed, 6 files
    • python scripts/check_swagger_routes.py: passed, 1 changed route file
    • python -m py_compile on the 14 changed .py files: passed
    • python scripts/check_malicious_pr_security_review.py --verify-release-age: passed, exit 0 with no blocker findings. Its "Needs investigation" verdict comes from advisory keyword matches, such as docstrings mentioning "Security".
    • CodeQL was not run locally.
  • Manual: reviewed the Help cards at 390, 1440 and 1920px in light and dark (screenshots above).

Documentation

  • Release notes updated, or not needed

  • Feature documentation updated, or not needed

  • Fix documentation updated, or not needed

  • docs/explanation/release_notes.md: v0.261.260 entry.

  • docs/explanation/features/V2_ADMIN_HELP_SETTINGS.md: new.

  • docs/admin/help.md: rewritten for both interfaces, plus its row in docs/admin/index.md.

The app-title fix is covered in the release notes and the feature doc rather than a separate fix doc.

Security checklist

  • New Flask routes include @swagger_route(security=get_auth_security())

  • Settings sent to non-admin frontends use sanitize_settings_for_user()

  • Browser JavaScript is served from local SimpleChat static assets only; no CDN-hosted JS

  • No secrets, keys, connection strings, or local-only artifacts are included

  • GET /api/v2/admin/latest-features is on the admin blueprint with @login_required and @admin_required. It returns release copy and links only, no settings values.

  • No settings payloads for non-admin frontends changed.

  • Shortcut and screenshot URLs are restricted to same-origin paths or http(s), and mailto drafts to a single plain address.

Paul Lizer (paullizer) and others added 5 commits October 6, 2026 22:51
Support now declares the menu name, the Send Feedback destination and its
recipient, nested under the menu switch. The card reads Needs configuration
while Send Feedback has no recipient, the empty field is marked Required, and
a malformed address is refused in place instead of silently cleared.

Send Feedback gains its overview and the bug report and feature request forms,
posting to the existing endpoint and opening the mailto draft without touching
the settings draft.

User-Facing Latest Features lists every announcement by release with share
checkboxes, bulk actions and a preview of what users see, and stays editable
before publishing with a publication notice that jumps to Support. The
visibility map merges over the stored one so partial saves cannot re-share.

Admin Latest Features renders as a catalogue card marked New, served by the
new admin-only GET /api/v2/admin/latest-features. Shortcuts jump to V2 cards or
fall back to the classic tab through a Python mirror of LEGACY_TAB_REDIRECTS.
The version banner gains the release notifications registration badge.

Also fixes the application title being substituted twice in Latest Features
copy when it contains "SimpleChat". Version 0.261.260.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…61.273

Brings in the base through the data-lifecycle parity merge and resolves the
nine conflicts by keeping both sides:

- admin_settings_fields.py: Help declarations, validators and legacy maps sit
  beside the new Data Lifecycle, Operations and on_enable work. Health Check
  now lives with Operations, as the base moved it.
- related_section: the base shipped the same descriptor as
  {section_id, label, classic_only}, drawn by RelatedSectionLink.tsx. The
  Latest Features destination now uses that shape and renderer, and the
  duplicate {id, label} link and onNavigate plumbing in fields.tsx and
  adminFields.ts are removed. The schema test accepts the base's shape.
- SettingsSection.tsx: the header badge joins the guide button and status
  chip; the status context wraps the base's new grouped body.
- fields.tsx: the Required flag reads the section status before the
  timezone branch, so the hook runs on every render.
- AdminSettingsPage.tsx: catalogue fetch, search and Help cases sit beside
  the section guides, retention and operations cases. In the collapsible
  rail the Help New pill becomes a dot, keeping "New" in the accessible name.
- Tests and fixture headers keep both histories. FULLY_DESCRIBED_GROUP_IDS
  now includes data-lifecycle, operations and help.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…61.274

Brings in the Governance group (#1680), which took 0.261.273, so this
branch moves to 0.261.274. Four conflicts, each resolved by keeping both
sides:

- SettingsSection.tsx: the section-status provider still wraps the body,
  and requirement notices now pass the base's onNavigate through.
- AdminSettingsPage.tsx: the Help catalogue helpers sit beside the base's
  navigateToSetting and effectiveSettings.
- test_v2_admin_capability_placement.py and test_v2_admin_settings_schema.py:
  both history lines are kept, and invariant 1 lists Governance and Help.

The schema docstring now lists Governance among the fully described
groups. This branch's own version references move to 0.261.274; the base's
0.261.273 governance lines are left as they are.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…61.275

Brings in the Scale group (#1681), which took 0.261.274, so this branch
moves to 0.261.275. Six conflicts, each resolved by keeping both sides:

- admin_settings_fields.py: the related_section docstring stays, and the
  fully described groups list both Scale and Help. The Help constants sit
  beside the Scale groups and Cosmos limits. The recipient and visibility
  validators sit beside the Redis port and container-policy checks.
- SettingsSection.tsx: the section-status provider wraps the base's new
  "Used by" dependents line as well as the requirement notices.
- AdminSettingsPage.tsx: one adminSections import with buildSectionDependents
  and readSectionValue, plus the base's cosmosThroughput import.
- release_notes.md: this branch's entries move to a v0.261.275 section,
  above the base's v0.261.274 Scale section.
- test_v2_admin_capability_placement.py: both history lines and narratives
  are kept, FULLY_DESCRIBED_GROUP_IDS includes scale and help, and
  invariant 1 now names Scale, which the base's tuple already held.
- ui_tests/fixtures/v2_admin_settings.py: both history lines are kept, and
  the built-in Help stubs run before the base's test-supplied extra_routes.

This branch's own version references move to 0.261.275. The base's
0.261.274 Scale lines are left as they are.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…61.276

Brings in Backup & Recovery (#1682), which took 0.261.275, so this branch
moves to 0.261.276. Four conflicts, each resolved by keeping both sides:

- admin_settings_fields.py: the related_section docstring stays. The
  fully described groups list Governance, Help and Scale, followed by the
  base's note that Backup & Recovery is described one component per
  section.
- AdminSettingsPage.tsx: the Help component cases sit beside the base's
  nine data-management cases.
- release_notes.md: this branch's entries move to a v0.261.276 section,
  above the base's v0.261.275 Backup & Recovery section.
- test_v2_admin_capability_placement.py: both history lines are kept, and
  invariant 1 names Backup & Recovery and Help, matching the tuple, which
  auto-merged with both ids.

The nav redirect block auto-merged beside the base's "Backup Inventory &
Restore" label fix. Regenerating docs/_data/app_surface.yml leaves it
unchanged. This branch's own version references move to 0.261.276; the
base's 0.261.275 Backup & Recovery lines are left as they are.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@paullizer
Paul Lizer (paullizer) merged commit 705774d into paullizer-react-v2-ui Oct 7, 2026
11 checks passed
Paul Lizer (paullizer) added a commit to paullizer/simplechat that referenced this pull request Oct 7, 2026
Brings in V2 at 705774d (microsoft#1679, VERSION 0.261.276).

Conflicts:
- docs/explanation/release_notes.md: V2's file byte-for-byte, with this
  branch's own (v0.261.277) section inserted at the very top, above V2's
  first section, (v0.261.276). Every V2 section is unchanged.
- application/single_app/config.py: kept this branch's VERSION
  0.261.277, which is above V2's 0.261.276. The two files differed only
  on the VERSION line.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant