Skip to content

Add adaptive guided tours to the new UI - #2506

Open
niemyjski wants to merge 75 commits into
mainfrom
feature/ui-guided-tours-review
Open

Add adaptive guided tours to the new UI#2506
niemyjski wants to merge 75 commits into
mainfrom
feature/ui-guided-tours-review

Conversation

@niemyjski

@niemyjski niemyjski commented Aug 20, 2026

Copy link
Copy Markdown
Member

What changed

Adds five optional guides to the Svelte UI, available from Help and the command palette. The overview takes about a minute; separate guides cover project setup, saved views, error investigation, and Exie.

  • Uses concise copy, arrows that stay beside their targets, and highlights suited to controls and forms. Completed guides show a green checkmark and remain restartable.
  • Keeps active steps in memory. Actual task actions advance or complete guides, and persistence failures do not block the user.
  • Stores UI-defined tour state in a generic JSON map. The self-only PUT /api/v2/users/me/product-tours/{tourName}/record endpoint preserves first timestamps and patches only the requested field, avoiding lost concurrent user updates. Adding a tour no longer requires a server catalog change. An atomic 100-entry limit bounds new keys while preserving existing state.
  • Includes the shared-filter hydration fix, Exie upgrade routing, and frontend lint cleanup. HTTP samples are curated workflow examples rather than mandatory per-endpoint artifacts.
  • Pins System.IO.Hashing 10.0.8 instead of the transitive 10.0.5 to satisfy the repository package’s runtime requirement. This fixes the API startup failure inherited from main; no package advisories were reported. CI startup probes now have time limits and capture failed resource logs.

Verification

  • Merged current main; frontend validation and 81 tour unit/component tests passed, including compatibility with earlier tour names.
  • API build and startup health checks passed with the corrected runtime dependency.
  • 36 backend endpoint, cache, serializer, and OpenAPI checks passed, including concurrent writes at the storage limit and out-of-order cache reads. The current-user endpoint reads saved preferences directly to avoid stale cache results.
  • All 18 tour browser cases passed locally, including desktop/mobile placement, completion, restart, form submission, and identity changes. One invitation reload case passed on retry after a Playwright response-body error during navigation.

Compatibility

Existing timestamp keys and legacy status/version objects are preserved. The UI recognizes earlier completed guides and dismissed invitations. No data migration is required.

@niemyjski
niemyjski marked this pull request as draft August 20, 2026 14:45
@niemyjski niemyjski self-assigned this Aug 25, 2026
@niemyjski
niemyjski force-pushed the feature/ui-guided-tours-review branch 7 times, most recently from b22a86a to db17534 Compare September 3, 2026 03:45
@niemyjski
niemyjski force-pushed the feature/ui-guided-tours-review branch from c3d3fb5 to 9546c7f Compare September 4, 2026 19:33
Comment thread src/Exceptionless.Core/Models/Data/ProductTourProgress.cs Outdated
Comment thread src/Exceptionless.Core/Models/Data/ProductTours.cs Outdated
Comment thread src/Exceptionless.Core/Models/User.cs Outdated
Comment thread src/Exceptionless.Core/Repositories/Interfaces/IEventRepository.cs Outdated
Comment thread src/Exceptionless.Core/Repositories/EventRepository.cs Outdated
Comment thread src/Exceptionless.Core/Repositories/ProductTourUsageResult.cs Outdated
Comment thread src/Exceptionless.Core/Repositories/UserRepository.cs Outdated
Comment thread src/Exceptionless.Web/Api/Endpoints/AdminEndpoints.cs Outdated
Comment thread src/Exceptionless.Web/Api/Endpoints/AdminEndpoints.cs Outdated
Comment thread src/Exceptionless.Web/Api/Endpoints/UserEndpoints.cs Outdated
@niemyjski
niemyjski force-pushed the feature/ui-guided-tours-review branch from 1233eba to 97a1a43 Compare September 5, 2026 16:19
Comment thread src/Exceptionless.Web/Api/Endpoints/UserEndpoints.cs Outdated
Comment thread src/Exceptionless.Web/Api/Handlers/AdminHandler.cs Outdated
Comment thread src/Exceptionless.Web/Api/Handlers/ProductTourActivityHandler.cs Outdated
Comment thread src/Exceptionless.Web/Api/Handlers/ProductTourActivityHandler.cs Outdated
Comment thread src/Exceptionless.Web/Api/Handlers/ProductTourActivityHandler.cs Outdated
Comment thread src/Exceptionless.Web/ClientApp/src/lib/features/product-tours/api.svelte.ts Outdated
Comment thread src/Exceptionless.Web/ClientApp/src/lib/features/product-tours/catalog.ts Outdated
@niemyjski
niemyjski force-pushed the feature/ui-guided-tours-review branch 2 times, most recently from 97c915f to 81599b4 Compare September 5, 2026 18:42
@niemyjski

niemyjski commented Sep 5, 2026

Copy link
Copy Markdown
Member Author

Guided-tour review update — September 8

Head: e58ee7774, based on main 5aeca2d89. All 58 inline review threads have replies and are resolved.

This pass

  • Fixed retained-history cutoff to UTC midnight, matching cleanup. A failing repository regression proved the prior query omitted valid events earlier on the first retained day.
  • Reused Exceptionless date comparison helpers and made the future-only empty-range check distinct from invalid input validation.
  • Added the chart slider's Up/Down behavior and boundary coverage. Invitation-only historical Started activity now correctly produces an empty state instead of an all-zero chart.
  • Reused the shared DateTime component for tooltip/table labels, with explicit UTC options and regression coverage preserving every existing default formatting option.
  • Deleted product-tour-usage.ts, its mode union, and browser calendar arithmetic. The picker passes a standard time expression through; the backend resolves dates with DateTimeRange and Elasticsearch selects buckets. Existing start/end callers remain supported. Added server-side rolling/month, February/leap-year, year-boundary, exact event-boundary, and invalid/mixed-filter tests. Updated the prior review reply, which had only moved the conversion rather than removing it.
  • Removed duplicated invitation visibility and successful-save handling from the host, reducing it by 24 lines without a new state layer. The existing identity, storage-denial, and retry guards remain.
  • Corrected the JSON fixture annotation to the existing /* language=json */ convention.
  • Corrected the cache response path: after reading fresh stored progress, refresh both user-ID and email cache entries through the existing repository cache writer. Removed the Cache(false) call and the earlier justification for bypassing refresh. A regression failed before this correction and now verifies two cache hits, no additional misses, and updated progress through both lookup paths.
  • Reproduced first-organization checkpoint loss during both organization refresh and project creation. The route-only timing change was insufficient: organization query updates can change context before the mutation returns. The host now binds the same user's unscoped setup checkpoint to their first organization on the setup route, preserving the current step and existing identity-switch clearing. Added deterministic browser coverage holding both requests. Ordinary setup submission and the shared organization mutation are unchanged.
  • Reproduced deserialization failure for legacy string-valued tour statuses from the earlier merged implementation. Added storage/cache-only compatibility decoding with numeric writes, preserving the strict numeric API input and unchanged OpenAPI schema. The atomic update recognizes legacy completed status and cannot downgrade it. New historical JSON and repository/API regressions cover decoding, current-user loading, numeric output, and precedence. Earlier coverage omitted historical string-valued records.

Reviewed suggestions intentionally not applied

  • Non-nullable request status: retained [Required] on the nullable input so explicit null reaches semantic validation and returns the requested 422 rather than changing binding to 400. Added separate omitted-status and explicit-null tests. Persisted status remains a non-nullable numeric enum; no storage or generated-contract changes were needed.

Verification

  • Release backend build: zero warnings/errors.
  • Full backend suite on the current head: 3,004 passed, three intentional skips, including legacy string progress, server date filtering, cache hits, concurrent progress updates, missing users, and omitted/null status validation. OpenAPI snapshot verified; generated client models remain unchanged.
  • Full frontend suite: 844 passed (four obsolete client date-calculation cases removed and covered server-side). Svelte check: zero errors/warnings. Formatting, ESLint, and production build passed.
  • Luna high independent final pass: 87 focused tests passed; zero type errors/warnings. Independently confirmed the host refactor's gating and successful-only activity behavior.
  • Final rendered browser pass: 15/15 passed against the updated localhost API, covering first-organization creation, all affected tour flows, real API range comparisons, keyboard chart controls/tooltips, mobile, reduced motion, storage denial, invitation retry, identity isolation, and light/dark layouts. Synthetic screenshots remain explicitly labeled. An intermediate run overlapped build-triggered Vite reloads and failed two invitation cases; the final run was sequenced after build completion and passed without changing timeouts or weakening assertions.
  • One initial browser comparison mismatched a period's response and displayed totals; a traced rerun passed. Strengthened response matching to require the selected range's parameters rather than accepting any usage response. The full affected suite then passed with traces; no application delay or relaxed count assertion was added.
  • Hosted checks are running on the current head. The PR remains ready for review as requested. No merge, release, or deployment performed.

The first-day retention and Up/Down failures were missing boundary cases in earlier tests, now covered. Existing dependency advisories on main remain unchanged; this pass adds no dependencies.

@niemyjski
niemyjski force-pushed the feature/ui-guided-tours-review branch 4 times, most recently from 57cb577 to bf2c3ea Compare September 6, 2026 03:01
@niemyjski
niemyjski marked this pull request as ready for review September 10, 2026 02:32

@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: b04f16d842

ℹ️ 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/Exceptionless.Web/Api/Handlers/UserHandler.cs Outdated

@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: b0bc4e913a

ℹ️ 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/Exceptionless.Web/Api/Handlers/UserHandler.cs

@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: 4d34ddf5e8

ℹ️ 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/Exceptionless.Web/Api/Endpoints/UserEndpoints.cs Outdated

@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: 36ad698501

ℹ️ 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/Exceptionless.Core/Repositories/UserRepository.cs Outdated

@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: bdc37b3deb

ℹ️ 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/Exceptionless.Web/ClientApp/src/lib/features/product-tours/eligibility.ts Outdated
Comment thread src/Exceptionless.Core/Repositories/UserRepository.cs

@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: 314c669529

ℹ️ 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".

@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: 46d4bb62d6

ℹ️ 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".

@ejsmith

ejsmith commented Sep 11, 2026

Copy link
Copy Markdown
Member

@codex review

@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: 569c0675b6

ℹ️ 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".

@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: 45e21f6b93

ℹ️ 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/Exceptionless.Web/ClientApp/src/lib/features/product-tours/catalog.ts Outdated
@github-actions

Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.Insulation 37% 35% 286
Exceptionless.Web 85% 70% 8127
Exceptionless.Core 76% 68% 10501
Exceptionless.AppHost 38% 41% 147
Summary 79% (26376 / 33391) 68% (12247 / 18029) 19061

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants