Commit Graph

73342 Commits

Author SHA1 Message Date
Fredrik Adelöw ffb749e4b6 docs(swappable-components): fix missing backticks and small typos
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 16:21:03 +02:00
Patrik Oldsberg 957be583cd Merge pull request #34017 from drodil/home_fix_patch
chore: add patch file for #33721
2026-04-21 11:56:07 +02:00
Hellgren Heikki 81f8d5f7de chore: add patch file for #33721
Signed-off-by: Hellgren Heikki <heikki.hellgren@op.fi>
2026-04-21 12:42:00 +03:00
Fredrik Adelöw e5e7700c7b Merge pull request #34001 from backstage/freben/facets-perf
catalog-backend: fix facets endpoint performance regression
2026-04-21 09:59:56 +02:00
Patrik Oldsberg 94e941867b Merge pull request #34011 from backstage/rugvip/remove-unused-integration-exports
integration: remove unnecessary exports from internal helpers
2026-04-20 19:59:42 +02:00
Patrik Oldsberg 05eca714b6 Merge pull request #34008 from backstage/rugvip/remove-unused-addunprocessedentitiesresult
catalog-backend: 🧹
2026-04-20 19:59:20 +02:00
Andre Wanlin 391ef097e9 Merge pull request #34002 from awanlin/blog/bc-kc-amsterdam-2026
Backstage in Amsterdam: Highlights from BackstageCon and KubeCon + CloudNativeCon Europe 2026
2026-04-20 10:59:53 -05:00
Andre Wanlin 54b58d0fed Prettier
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-04-20 10:47:47 -05:00
Johan Persson e8a1a35714 feat(ui): add isPending prop and deprecate loading
Add `isPending` prop to Alert, Button, ButtonIcon, Table, and
TableRoot, aligning with React Aria naming conventions. The
`loading` prop is deprecated but remains functional as an alias.

CSS selectors now target `data-ispending` instead of `data-loading`
for pending state styling. The `data-loading` attribute is still
emitted for backward compatibility.

Internal Table hooks (`PaginationResult`, `UsePageCacheResult`)
renamed `loading` to `isPending`. The `useTable` hook returns both
`isPending` and `loading` on `tableProps` to preserve backward
compatibility.

Updated docs-ui documentation and stories accordingly.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-20 17:36:21 +02:00
Fredrik Adelöw 0ecb700add Remove NOT IN unstitched guard from facets no-filter path
The NOT IN guard against null final_entity rows was preventing the
query planner from using parallel workers and (with a future covering
index) index-only scans. Without the covering index it caused a 2.6x
regression on the no-filter path (7s -> 18.4s).

The filtered path already excludes unstitched entities via the
whereNotNull('final_entities.final_entity') in the inner
entityIdSubquery, so no guard is needed there.

The no-filter path now matches 1.49.x behavior. A followup migration
adding a covering index can re-introduce the guard efficiently.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 17:31:00 +02:00
Patrik Oldsberg 191b41a0b3 integration: remove unnecessary exports from internal helpers
Remove `export` from five internal helper functions that are not part of
the published API and are only used within their own files. The `sleep`
function in GitLabIntegration is kept exported for test access but marked
as `@internal`.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-20 16:49:21 +02:00
Patrik Oldsberg 6316dc66d3 catalog-backend: remove unused AddUnprocessedEntitiesResult type
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-20 16:40:38 +02:00
Fredrik Adelöw f32d334034 Exclude unstitched entities from facets via NOT IN null set
Instead of checking IS NOT NULL against ~520k rows (which adds a
2.6x regression on the no-filter path), exclude the tiny set of
entities where final_entity IS NULL (~3,700 rows). The anti-join
is nearly free and allows the guard to be applied unconditionally,
so facets results consistently exclude not-yet-stitched (or future
tombstoned) entities regardless of whether filters are present.

Also addresses review feedback:
- Add regression test for unstitched entity exclusion
- Extract setupFacetsCatalog helper to reduce test boilerplate
- Tighten assertions: use exact arrays instead of arrayContaining

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 16:14:03 +02:00
Fredrik Adelöw 88409600ba Revert to conditional final_entities constraint for facets
Benchmarking on a production-like database shows that always applying
the final_entities subquery (even without filters) causes a 2.6x
regression on the no-filter path (5.2s -> 13.5s) due to ~530k
memoized index lookups against final_entities. The FK cascade from
search -> final_entities already guarantees search rows only exist
for entities with a final_entities row, so the constraint is only
needed when filters route through final_entities.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 15:46:37 +02:00
Fredrik Adelöw d7c6ad8e14 Remove unnecessary whereNotNull guard from facets subquery
The whereNotNull('final_entities.final_entity') was copied from other
code paths that select the final_entity column, but the facets subquery
only needs entity_id. Removing it preserves exact v1.49 semantics
(search rows only exist for stitched entities anyway, due to the FK
cascade from search -> final_entities) and avoids an inconsistency
where the no-filter path did not exclude unstitched entities while the
with-filter path did.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:43:22 +02:00
Fredrik Adelöw 9ae08d07e2 Add thorough facets tests for predicate queries and compound filters
Adds standalone test coverage for the facets method in
DefaultEntitiesCatalog to ensure it works correctly with:
- Predicate query filtering (simple key match)
- Predicate query filtering using $in operator
- Compound allOf filters
- Compound anyOf filters
- Both filter and query combined

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:21:57 +02:00
Andre Wanlin 0d14cb6acf Clean up
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-04-20 07:03:42 -05:00
Fredrik Adelöw 673587dd4f Add patch release file for PR #34001
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:03:19 +02:00
Fredrik Adelöw cf195de72c catalog-backend: fix facets endpoint performance regression
Route the EXISTS-based filters through final_entities (one row per
entity) instead of correlating against the search table directly.
This avoids the pathological case where correlated subqueries scan
the much larger search table for every row in the outer facets query.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:02:02 +02:00
MT Lewis 7192e84cad Merge pull request #33948 from backstage/flex-item-props
ui: add support for flex-item props to generic layout components
2026-04-20 09:54:14 +01:00
Fredrik Adelöw e6f30e028a Merge pull request #33993 from backstage/freben/fix-scheduler-sleep
fix(scheduler): handle setTimeout overflow for long sleep durations
2026-04-20 09:47:11 +02:00
Fredrik Adelöw 1688bdc19d Merge pull request #33996 from backstage/freben/owner-column-cleanup
Simplify OwnerEntityColumn to use EntityRefLink directly
2026-04-20 09:46:34 +02:00
Andre Wanlin 60d785e5c9 Edits
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-04-19 15:25:15 -05:00
Fredrik Adelöw 83ac69be86 Fix ListTaskPage test to match simplified OwnerEntityColumn
Update assertions to expect the entity presentation short ref (e.g.
'foo') instead of the old catalog-resolved display name (e.g.
'BackUser'), and remove now-unused entity fixtures and catalog API
mocking.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:50:30 +02:00
Fredrik Adelöw 415e30b489 Add changeset
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:33:41 +02:00
Fredrik Adelöw 8341f98940 Simplify OwnerEntityColumn to use EntityRefLink directly
Remove the catalog API lookup and manual title resolution. The
EntityRefLink already uses the entity presentation API to resolve
display names, so the component only needs the entity ref string.

This removes unused imports of useApi, useAsync, catalogApiRef,
parseEntityRef, and UserEntity.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:32:54 +02:00
Fredrik Adelöw 89d324840c fix(scheduler): handle setTimeout overflow for long sleep durations
Node.js setTimeout uses a 32-bit signed integer for the delay, so
values larger than 2^31-1 ms (~24.8 days) cause the callback to fire
immediately. Fix by chunking the wait into segments of at most 2^30 ms.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 15:30:07 +02:00
MT Lewis 0912de3a25 ui: transform number to px in basis utility prop
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 17:52:23 +01:00
MT Lewis 68d1725113 ui: style overrides take higher precedence than utility styles in Box
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 17:47:46 +01:00
MT Lewis ea220e9a9d ui: document FlexItemProps
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 17:47:29 +01:00
MT Lewis 62cc936894 ui: fix organization of .changeset/funny-areas-rescue.md
Co-authored-by: Johan Persson <johanopersson@gmail.com>
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 17:46:04 +01:00
Johan Persson c3ca20c864 patches: add entry for #33984
Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 14:18:22 +02:00
Johan Persson c6fc76f532 fix(ui): prevent hidden Tabs tree from stomping active indicator opacity
React Aria's `CollectionBuilder` renders `TabList`'s children into both a
hidden collection-building tree and the real DOM. The hidden instance of
`TabsIndicators` sits outside the `TabListStateContext` provider, so its
`state` is `null` — causing its `updateCSSVariables` effect to hit the
`else` branch and write `--active-tab-opacity: 0` to the `tabsRef` DOM
element that the real instance also writes to. Under the right render
ordering, this hidden write lands after the real instance's `opacity: 1`
and makes the active indicator disappear on uncontrolled Tabs.

Guard `updateCSSVariables` with an early return when `state == null` so
the hidden instance never writes to the shared DOM element.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 14:18:22 +02:00
Patrik Oldsberg 64b186f465 Merge pull request #33962 from backstage/rugvip/remove-unused-getgithubintegrationconfig
catalog-import: 🧹
2026-04-17 13:07:27 +02:00
Patrik Oldsberg 4247ab84e1 Merge pull request #33961 from backstage/remove-unused-task-settings-v1
backend-defaults: 🧹
2026-04-17 13:07:16 +02:00
Patrik Oldsberg 49401e530a Merge pull request #33960 from backstage/rugvip/remove-unused-signin-type-aliases
core-components: remove unused onSignInFailure and onSignInStarted type aliases
2026-04-17 13:07:07 +02:00
Patrik Oldsberg b645fc7c41 Merge pull request #33959 from backstage/rugvip/remove-orphan-mock-auth-connector
core-app-api: 🧹
2026-04-17 13:06:57 +02:00
Fredrik Adelöw ab0460715b Merge pull request #33982 from backstage/freben/preee
enter prerelease mode
2026-04-17 12:59:00 +02:00
Patrik Oldsberg 4ce14da5b9 Merge pull request #33981 from backstage/rugvip/add-patches-entry-33975
patches: add entry for #33975
2026-04-17 12:58:08 +02:00
Fredrik Adelöw f9bfb91778 enter prerelease mode
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-17 12:45:55 +02:00
Patrik Oldsberg eee19e9c2f Add patch entry for PR #33975
Adds a .patches entry to include the React Aria dependency range
clamping fix in the next patch release.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-17 12:29:36 +02:00
Johan Persson e2d9831352 fix: clamp React Aria dependency ranges to patch-only updates
Changed version ranges for react-aria, react-aria-components, and
react-stately from `^` (minor) to `~` (patch) across all consuming
packages to prevent unintended minor version upgrades.

Also aligned app-visualizer's react-aria-components from 1.14 to 1.17.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 11:49:34 +02:00
MT Lewis 8bb33cd674 ui: add affected components to changeset
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 10:25:56 +01:00
MT Lewis 7ea79b2ad4 ui: add style to CardOwnProps
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 10:07:00 +01:00
MT Lewis 76759067a2 ui: use type import for CSSProperties in shared types
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 10:06:23 +01:00
Patrik Oldsberg e383430a11 Merge pull request #33958 from backstage/rugvip/changeset-no-internal-details
docs: clarify that changesets should not reference internal code details
2026-04-17 11:05:45 +02:00
Patrik Oldsberg 2852a58e21 Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
2026-04-17 10:46:44 +02:00
MT Lewis 7f9b3b7aee ui: allow all valid flex-basis values for basis prop
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 09:46:17 +01:00
Patrik Oldsberg 45da25f948 Merge pull request #33957 from backstage/rugvip/delegate-attach-mock-api-factory
frontend-test-utils: remove internal mockWithApiFactory in favor of attachMockApiFactory
2026-04-17 10:43:41 +02:00
Patrik Oldsberg b16ae3cea7 Merge pull request #33955 from backstage/rugvip/deduplicate-joinpaths-in-frontend-app-api-routing
frontend-app-api: deduplicate joinPaths utility in routing
2026-04-17 10:43:26 +02:00