Skip to content

feat(ui): Explore redesign - stacking browse+filter query bar, chips, cards#28892

Open
harshach wants to merge 1 commit into
mainfrom
harshach/explore-page-redesign
Open

feat(ui): Explore redesign - stacking browse+filter query bar, chips, cards#28892
harshach wants to merge 1 commit into
mainfrom
harshach/explore-page-redesign

Conversation

@harshach

Copy link
Copy Markdown
Collaborator

Describe your changes:

This PR redesigns the Explore page around one idea: browsing and filtering compose into a single, visible, removable query. The tree's browse location now lives in its own browsePath URL param and ANDs with the dropdown quickFilter, so clicking a service never clears your Type filter (and vice versa); everything you pick shows in a persistent QUERY bar as removable chips. Filter dropdowns apply immediately (no Update button), show facet options that exclude their own field, and use human-readable labels; incompatible tree categories gray out and collapse when an asset type is selected. Result cards get a compact white layout (5–6 per viewport), single-line middle-ellipsized breadcrumbs, a border-only selected state, and a stroke icon set scoped to explore surfaces.

Type of change:

  • Improvement

High-level design:

  • Composable query model: query = browsePath (tree location) AND quickFilter (facets) AND queryFilter (advanced). browsePath serializes the exact ExploreQuickFilterField[] shape the tree already builds per level; it is combined at a single injection point in ExplorePageV1.performFetch (also export modal + facet fetches + the SWR cache key), keeping quickFilter 100% backward compatible for deep links.
  • Tree selection split (ExploreTree): hierarchical levels (category/serviceType/service/database/schema) emit the browse path; entity-type leaves emit path prefix + a Type upsert into the Data Assets slot — both land in ONE navigation. Highlight follows the chips (deepest-loaded-ancestor fallback), disabled categories collapse via controlled expandedKeys, counts render at every level.
  • QUERY bar (ExploreQueryFilterChips): persistent; tinted browse chips with hierarchical removal (truncateBrowsePath), filter chips, right-aligned Clear, empty-state placeholder.
  • Facets (SearchDropdown/ExploreQuickFilters): opt-in immediateApply (default off — 14 other consumers unchanged); per-facet filter excludes the facet's own field (design's facetOptions semantics); canonical entity-type casing resolver bridges lowercase aggregation keys vs camelCase enum.
  • Alternatives considered: merging tree state into the shared quickFilter param — rejected because a flat ES bool query loses level provenance/ordering, making browse chips and hierarchical removal unrecoverable, and DB/schema terms aren't dropdown items so they'd be silently dropped on the next facet apply.
  • No backend changes needed: existing /v1/search/query + /v1/search/aggregate cover everything (verified against SearchResourceIT coverage).

Tests:

Use cases covered

  • Apply Data Assets → Table, then click a service in the tree: both stack as chips; results scope to tables in that service; removing the Service chip falls back to the category; Clear All resets everything.
  • Selecting an asset type grays out and collapses categories that cannot contain it (a Table can only live under Database services).
  • With a service selected, the Data Assets facet lists every type available in that scope and keeps the list stable while selecting/unselecting.
  • Deep links / reloads with an active browsePath highlight the deepest loaded ancestor; legacy quickFilter-only URLs behave unchanged.

Unit tests

  • Added unit tests for the new/changed logic.
  • Files: ExplorePureUtils.test.ts (browsePath parse/build/truncate, canonical casing, node-by-path, graying), ExploreQueryFilterChips.test.tsx, AdvancedSearchPureUtils.test.ts, extended SearchDropdown.test.tsx, ExploreTree.test.tsx, ExploreSearchCard.test.tsx, ExploreQuickFilters.test.tsx — 124 tests green across 11 suites.

Backend integration tests

  • Not applicable (no backend API changes; existing SearchResourceIT already covers the aggregate/query_filter paths used).

Ingestion integration tests

  • Not applicable (no ingestion changes).

Playwright (UI) tests

  • Added playwright/e2e/Features/ExploreQueryBar.spec.ts (persistent bar, filter-survives-tree-click with chip removal + Clear, asset-type graying — 3/3 green locally). Updated explore helpers/specs for the immediate-apply UX and testid-based tree locators (count badges broke exact-text matching).

Manual testing performed

  1. Ran the dockerized backend with sample data and the UI via yarn start; verified the full hero flow end-to-end in Chromium (scripted + interactive): persistent QUERY bar, no Update button, chip stacking/removal, graying + collapse, facet refresh scoped to the selected service, card density/breadcrumb ellipsis, icons.
  2. Verified URL round-trips: browsePath + quickFilter coexist; reload restores chips, results, and tree highlight.

UI screen recording / screenshots:

Will attach before/after screenshots and a short recording as a PR comment.

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation> (no issue opened yet)
  • My PR is linked to a GitHub issue via Fixes #<issue-number> above (pending issue)
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: not applicable (no schema changes).
  • For UI changes: I attached a screen recording and/or screenshots above (to follow as comment).
  • I have added tests (unit / Playwright) and listed them above.

🤖 Generated with Claude Code

Browse location and quick filters now stack into one removable query:
- New browsePath URL param holds the tree location (category/serviceType/
  service/database/schema); it ANDs with the dropdown quickFilter so browsing
  never clears filters and vice versa (single combine point in performFetch;
  export + facet fetches included).
- Persistent QUERY bar (ExploreQueryFilterChips): tinted browse chips +
  filter chips, each removable (browse removal truncates deeper levels),
  right-aligned Clear, empty-state placeholder.
- Filter dropdowns apply immediately (no Update button) with helper text,
  compact menu, "+" selected state, and facet options that exclude their own
  field so unselecting a type reveals the other available types in scope.
- Tree: categories that cannot contain the selected asset types gray out and
  collapse; counts render at every level; selection highlight follows the
  browse chips (deepest-loaded-ancestor fallback for deep links/reloads).
- Cards: compact white layout (5-6 per viewport), single-line breadcrumb with
  middle-ellipsis click-to-expand, border-only selected state, stroke icon
  set (ExploreIconUtils) scoped to explore surfaces.
- Human-readable entity-type labels via canonical-casing resolver
  (aggregations return lowercase keys, EntityType enum is camelCase).
- Defensive aggregation access so malformed search responses degrade to
  empty lists instead of error toasts.
- Tests: new ExploreQueryBar.spec (persistent bar, filter-survives-tree-click,
  graying); explore spec helpers switched to testid locators (count badges
  broke exact-text matching); 124 unit tests green across 11 suites.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@harshach harshach requested a review from a team as a code owner June 10, 2026 04:53
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Jun 10, 2026
Comment on lines +472 to +486
const selectedEntityTypes = useMemo(() => {
const entityTypeField = selectedQuickFilters.find(
(field) =>
field.key === EntityFields.ENTITY_TYPE_KEYWORD ||
field.key === EntityFields.ENTITY_TYPE
);
const browseEntityTypeField = browseFields.find(
(field) => field.key === EntityFields.ENTITY_TYPE
);

return [
...(entityTypeField?.value ?? []),
...(browseEntityTypeField?.value ?? []),
].map((option) => option.key);
}, [selectedQuickFilters, browseFields]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Edge Case: Browsing a category root grays out & collapses sibling categories

selectedEntityTypes (ExploreV1.component.tsx:472-486) is the union of the Data Assets quick-filter value AND the entityType browse field value. When the user clicks a category root in the tree (e.g. "Databases"), onNodeSelect builds a browse field whose value is the category's full childEntities list (database, databaseSchema, storedProcedure, table, tableColumn). That entire set then flows into selectedEntityTypes, so getDisabledExploreTreeKeys disables — and visibleExpandedKeys collapses — every sibling category that contains none of those types.

The result is that merely browsing into a category (not selecting a specific asset type) grays out and collapses all other top-level categories. The PR description scopes the gray-out/collapse behavior to "when an asset type is selected," so triggering it on a category-level browse click — including auto-collapsing an already-expanded sibling subtree — may be surprising. Please confirm this is intended; if not, exclude the browse-field category value (or only the multi-type category roots) from selectedEntityTypes.

Was this helpful? React with 👍 / 👎

Comment on lines +418 to +432
export const parseBrowsePathFields = (
browsePath?: unknown
): ExploreQuickFilterField[] => {
let result: ExploreQuickFilterField[] = [];
if (isString(browsePath) && !isEmpty(browsePath)) {
try {
const parsed = JSON.parse(browsePath);
if (Array.isArray(parsed)) {
result = parsed as ExploreQuickFilterField[];
}
} catch {
result = [];
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Quality: parseBrowsePathFields accepts any JSON array without shape validation

parseBrowsePathFields (ExplorePureUtils.ts:418-434) only checks Array.isArray(parsed) before casting the parsed JSON to ExploreQuickFilterField[]. A crafted/legacy browsePath URL param such as [1,2,3] or [{}] would be accepted and propagated into chip rendering and query building. I verified the downstream consumers (getExploreQueryFilterMust, getBrowsePathSignature, the chips component) are defensive (field.value ?? [], isEmpty(filter.value) guards) so this does not currently crash, but the cast silently trusts untrusted URL input. Consider validating that each element has at least a string key (and array/undefined value) and dropping the param otherwise, so malformed deep links degrade to an empty browse path rather than rendering empty/garbage chips.

Validate each element's shape before treating the array as a browse path.:

if (Array.isArray(parsed)) {
  result = parsed.filter(
    (field) =>
      field &&
      typeof field.key === 'string' &&
      (field.value === undefined || Array.isArray(field.value))
  ) as ExploreQuickFilterField[];
}
  • Apply fix

Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎

@gitar-bot

gitar-bot Bot commented Jun 10, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 0 resolved / 2 findings

Redesigns the Explore page with a composable query experience using stacked chips and immediate-apply filters. Consider implementing shape validation for parseBrowsePathFields and refining the tree-collapse logic for category roots to avoid unexpected UI states.

💡 Edge Case: Browsing a category root grays out & collapses sibling categories

📄 openmetadata-ui/src/main/resources/ui/src/components/ExploreV1/ExploreV1.component.tsx:472-486 📄 openmetadata-ui/src/main/resources/ui/src/components/Explore/ExploreTree/ExploreTree.tsx:303-315 📄 openmetadata-ui/src/main/resources/ui/src/components/Explore/ExploreTree/ExploreTree.tsx:382-396

selectedEntityTypes (ExploreV1.component.tsx:472-486) is the union of the Data Assets quick-filter value AND the entityType browse field value. When the user clicks a category root in the tree (e.g. "Databases"), onNodeSelect builds a browse field whose value is the category's full childEntities list (database, databaseSchema, storedProcedure, table, tableColumn). That entire set then flows into selectedEntityTypes, so getDisabledExploreTreeKeys disables — and visibleExpandedKeys collapses — every sibling category that contains none of those types.

The result is that merely browsing into a category (not selecting a specific asset type) grays out and collapses all other top-level categories. The PR description scopes the gray-out/collapse behavior to "when an asset type is selected," so triggering it on a category-level browse click — including auto-collapsing an already-expanded sibling subtree — may be surprising. Please confirm this is intended; if not, exclude the browse-field category value (or only the multi-type category roots) from selectedEntityTypes.

💡 Quality: parseBrowsePathFields accepts any JSON array without shape validation

📄 openmetadata-ui/src/main/resources/ui/src/utils/ExplorePureUtils.ts:418-432

parseBrowsePathFields (ExplorePureUtils.ts:418-434) only checks Array.isArray(parsed) before casting the parsed JSON to ExploreQuickFilterField[]. A crafted/legacy browsePath URL param such as [1,2,3] or [{}] would be accepted and propagated into chip rendering and query building. I verified the downstream consumers (getExploreQueryFilterMust, getBrowsePathSignature, the chips component) are defensive (field.value ?? [], isEmpty(filter.value) guards) so this does not currently crash, but the cast silently trusts untrusted URL input. Consider validating that each element has at least a string key (and array/undefined value) and dropping the param otherwise, so malformed deep links degrade to an empty browse path rather than rendering empty/garbage chips.

Validate each element's shape before treating the array as a browse path.
if (Array.isArray(parsed)) {
  result = parsed.filter(
    (field) =>
      field &&
      typeof field.key === 'string' &&
      (field.value === undefined || Array.isArray(field.value))
  ) as ExploreQuickFilterField[];
}
🤖 Prompt for agents
Code Review: Redesigns the Explore page with a composable query experience using stacked chips and immediate-apply filters. Consider implementing shape validation for `parseBrowsePathFields` and refining the tree-collapse logic for category roots to avoid unexpected UI states.

1. 💡 Edge Case: Browsing a category root grays out & collapses sibling categories
   Files: openmetadata-ui/src/main/resources/ui/src/components/ExploreV1/ExploreV1.component.tsx:472-486, openmetadata-ui/src/main/resources/ui/src/components/Explore/ExploreTree/ExploreTree.tsx:303-315, openmetadata-ui/src/main/resources/ui/src/components/Explore/ExploreTree/ExploreTree.tsx:382-396

   `selectedEntityTypes` (ExploreV1.component.tsx:472-486) is the union of the Data Assets quick-filter value AND the `entityType` browse field value. When the user clicks a *category root* in the tree (e.g. "Databases"), `onNodeSelect` builds a browse field whose `value` is the category's full `childEntities` list (database, databaseSchema, storedProcedure, table, tableColumn). That entire set then flows into `selectedEntityTypes`, so `getDisabledExploreTreeKeys` disables — and `visibleExpandedKeys` collapses — every sibling category that contains none of those types.
   
   The result is that merely *browsing into* a category (not selecting a specific asset type) grays out and collapses all other top-level categories. The PR description scopes the gray-out/collapse behavior to "when an asset type is selected," so triggering it on a category-level browse click — including auto-collapsing an already-expanded sibling subtree — may be surprising. Please confirm this is intended; if not, exclude the browse-field category value (or only the multi-type category roots) from `selectedEntityTypes`.

2. 💡 Quality: parseBrowsePathFields accepts any JSON array without shape validation
   Files: openmetadata-ui/src/main/resources/ui/src/utils/ExplorePureUtils.ts:418-432

   `parseBrowsePathFields` (ExplorePureUtils.ts:418-434) only checks `Array.isArray(parsed)` before casting the parsed JSON to `ExploreQuickFilterField[]`. A crafted/legacy `browsePath` URL param such as `[1,2,3]` or `[{}]` would be accepted and propagated into chip rendering and query building. I verified the downstream consumers (`getExploreQueryFilterMust`, `getBrowsePathSignature`, the chips component) are defensive (`field.value ?? []`, `isEmpty(filter.value)` guards) so this does not currently crash, but the cast silently trusts untrusted URL input. Consider validating that each element has at least a string `key` (and array/undefined `value`) and dropping the param otherwise, so malformed deep links degrade to an empty browse path rather than rendering empty/garbage chips.

   Fix (Validate each element's shape before treating the array as a browse path.):
   if (Array.isArray(parsed)) {
     result = parsed.filter(
       (field) =>
         field &&
         typeof field.key === 'string' &&
         (field.value === undefined || Array.isArray(field.value))
     ) as ExploreQuickFilterField[];
   }

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@github-actions

Copy link
Copy Markdown
Contributor

🔴 Playwright Results — 108 failure(s), 20 flaky

✅ 4148 passed · ❌ 108 failed · 🟡 20 flaky · ⏭️ 99 skipped

Shard Passed Failed Flaky Skipped
🔴 Shard 1 281 17 3 4
🔴 Shard 2 794 6 6 9
🔴 Shard 3 776 18 2 19
🔴 Shard 4 833 12 2 12
🔴 Shard 5 669 52 0 47
🔴 Shard 6 795 3 7 8

Genuine Failures (failed on all attempts)

Features/ExploreSortOrderFilter.spec.ts › Table (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Column (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Database (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Database Schema (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Dashboard (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Dashboard Data Model (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Pipeline (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Topic (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › ML Model (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Container (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Search Index (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › API Endpoint (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › API Collection (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Stored Procedure (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Glossary Term (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Tags (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreSortOrderFilter.spec.ts › Metrics (shard 1)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/DomainFilterQueryFilter.spec.ts › Quick filters should persist when domain filter is applied and cleared (shard 2)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreQuickFilters.spec.ts › should search for multiple values along with null filters (shard 2)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/ExploreQuickFilters.spec.ts › search dropdown should work properly for quick filters (shard 2)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/ExploreQuickFilters.spec.ts › explore tree sidebar selection is not cleared when a top dropdown filter is applied (shard 2)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/ExploreQuickFilters.spec.ts › sort order is preserved in URL when explore tree node is clicked after applying a top dropdown filter (shard 2)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/Glossary/GlossaryWorkflow.spec.ts › should display correct status badge color and icon (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator:  locator('[data-row-key*="StatusBadgeTerm1781073950099"]').locator('.status-badge')
Expected: �[32m"In Review"�[39m
Received: �[31m"Draft"�[39m
Timeout:  15000ms

Call log:
�[2m  - Expect "toHaveText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-row-key*="StatusBadgeTerm1781073950099"]').locator('.status-badge')�[22m
�[2m    19 × locator resolved to <div class="status-badge pending" data-testid=""PW%'4d682d97.Clever60f221aa".StatusBadgeTerm1781073950099-status">…</div>�[22m
�[2m       - unexpected value "Draft"�[22m

Features/LandingPageWidgets/DataAssetsWidget.spec.ts › Check Data Asset and Service Filtration (shard 3)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/LandingPageWidgets/DataAssetsWidget.spec.ts › Check Data Asset and Service Filtration (shard 3)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/LandingPageWidgets/DataAssetsWidget.spec.ts › Check Data Asset and Service Filtration (shard 3)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/NestedColumnsExpandCollapse.spec.ts › should not duplicate rows when expanding and collapsing nested columns with same names in Explore Summary Panel (shard 3)
�[31mTest timeout of 60000ms exceeded.�[39m
Features/SearchExport.spec.ts › Filtered search visible export downloads CSV with the filtered record count (shard 3)
�[31mTest timeout of 180000ms exceeded.�[39m
Features/SearchSeparation/SearchSeparationSuite.ts › live indexing produces searchable separation for all four facets (shard 3)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"
Features/SearchSeparation/SearchSeparationSuite.ts › live indexing produces searchable separation for all four facets (shard 3)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"

... and 78 more failures

🟡 20 flaky test(s) (passed on retry)
  • Features/MetricCustomUnitFlow.spec.ts › Should create metric and test unit of measurement updates (shard 1, 1 retry)
  • Features/NavigationBlocker.spec.ts › should not show navigation blocker after saving changes (shard 1, 1 retry)
  • Flow/Collect.spec.ts › Visit Insights page should trigger collect API (shard 1, 1 retry)
  • Features/CuratedAssets.spec.ts › Multiple entity types with AND conditions (shard 2, 1 retry)
  • Features/DataProductRename.spec.ts › should rename data product and verify assets are still associated (shard 2, 1 retry)
  • Features/DataQuality/BundleSuiteBulkOperations.spec.ts › Add test case to existing Bundle Suite (shard 2, 1 retry)
  • Features/DataQuality/TestCaseImportExportE2eFlow.spec.ts › EditAll User: Complete export-import-validate flow (shard 2, 1 retry)
  • Features/DataQuality/TestCaseResultPermissions.spec.ts › User with only VIEW cannot PATCH results (shard 2, 1 retry)
  • Features/ExploreQuickFilters.spec.ts › tier with assigned asset appears in dropdown, tier without asset does not (shard 2, 1 retry)
  • Features/KnowledgeCenter.spec.ts › Verify Left Panel hierarchy pagination functionality (shard 3, 1 retry)
  • Features/Table.spec.ts › Table pagination with sorting should works (shard 3, 1 retry)
  • Pages/CustomProperties.spec.ts › Time (shard 4, 1 retry)
  • Pages/CustomProperties.spec.ts › Number (shard 4, 1 retry)
  • Pages/Lineage/DataAssetLineage.spec.ts › Column lineage for mlModel -> dashboardDataModel (shard 6, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify lineage schema filter selection (shard 6, 1 retry)
  • Pages/Lineage/PlatformLineage.spec.ts › Verify domain platform view (shard 6, 1 retry)
  • Pages/LogsViewer.spec.ts › Logs page shows breadcrumb, summary, and log viewer or empty state after opening from bundle suite pipeline tab (shard 6, 2 retries)
  • Pages/ODCSImportExport.spec.ts › Multi-object ODCS contract - object selector shows all schema objects (shard 6, 1 retry)
  • Pages/ServiceEntity.spec.ts › Delete Database Schema (shard 6, 1 retry)
  • Pages/Users.spec.ts › Admin soft & hard delete and restore user (shard 6, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

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

Labels

backend safe to test Add this label to run secure Github workflows on PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant