getProcessableEntities uses SELECT ... FOR UPDATE SKIP LOCKED to prevent concurrent processors from selecting the same rows, but it was called with a raw Knex instance instead of a transaxction. This meant the row locks were released immediately after the SELECT, before the subsequent UPDATE executed - making SKIP LOCKED ineffective and allowing multiple replicas to update overlapping rows, causing PostgreSQL deadlock (error 40P01). Wrapping the call in a transaction ensures the locks are held through the UPDATE, so concurrent replicas correctly skip already-claimed rows.
Signed-off-by: Michael Walsh <walshmichael310@gmail.com>
Localize the "More options" aria-label in OngoingTaskContextMenu via
the translation ref, and add a migration note to the changeset about
direct FormFieldBlueprint attachments no longer being consumed.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Adds a Header from @backstage/ui with a kebab menu to the individual task
sub-page in the new frontend system, restoring the ability to show/hide
logs and button bar, as well as start over, retry, and cancel actions.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Refactored the scaffolder plugin's new frontend system (NFS) definition
to use the SubPageBlueprint pattern with tabbed page layout, mirroring
the approach used by the Settings plugin.
The scaffolder page is now a parent PageBlueprint without a loader,
receiving sub-pages as inputs that render as tabs:
- Templates (with nested template wizard route)
- Tasks (with nested ongoing task detail route)
- Actions
- Template Editor (with nested editor/form/fields routes)
- Templating Extensions
Page components used in the NFS path no longer render their own
Page/Header chrome, relying on the framework's PageLayout instead.
Legacy frontend system compatibility is preserved.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Replace the imported PartialDeep type from type-fest with a local
equivalent helper type used only in tests, eliminating the external
dev dependency.
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Add `titleRouteRef` to `PageLayoutProps` so the plugin header title
links back to the plugin root. `PageBlueprint` resolves it from
`plugin.routes.root` with fallback to `params.routeRef`.
- PageLayout swap resolves the title link via a conditional child
component that calls `useRouteRef` only when a route ref exists
- Header actions get stable React keys via `cloneElement`
Signed-off-by: Johan Persson <johanopersson@gmail.com>
The entity page in the new frontend system already renders its own
header through the EntityHeader extension, so the default page layout
header from the PageBlueprint was redundant. This disables it by
passing noHeader: true to the page factory.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
* frontend-app-api: add `apis` to specialized app result types
Added `apis: ApiHolder` to both `BootstrapSpecializedApp` and
`FinalizedSpecializedApp` types, and included the APIs in the returned
objects from `getBootstrapApp()`, `finalizeFromSessionState()`, and
`finalizeFromBootstrapError()`.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
* Add .patches entry for PR #33445
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
---------
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
The unprocessed entities view is now provided as a DevTools sub-page
directly from the plugin, removing the need for manual wiring. The
standalone page is still available but disabled by default.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
All Node.js versions in Backstage's support matrix (v22 and v24 LTS)
include built-in proxy support via NODE_USE_ENV_PROXY, making the
legacy global-agent/undici workarounds unnecessary. Remove the legacy
proxy guide from contrib/ and all references to the legacy approach
across the docs.
Signed-off-by: Jon Koops <jonkoops@gmail.com>
Replace the defineParams + createExtensionBlueprintParams pattern with
inline param types on the factory, matching PageBlueprint, SubPageBlueprint,
and other blueprints. Update the app-visualizer usage accordingly.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
The Table component replaces all data rows with a loading spinner when
isLoading is true. This caused a flash of empty table between filter
changes. Now only show the loading state when there's no data to
display yet (initial load), keeping stale results visible during
filter transitions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
The EntityListProvider exposed entities from `outputState` (synced via
useEffect) but `loading` from `useAsyncFn`. When the async function
resolved, `loading` flipped to false one render before `outputState`
updated, causing a flash of stale data between the loading indicator
and the new results.
Use `resolvedValue` directly in the context value when available,
eliminating the extra render lag.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>