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
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
Rather than using an input redirect on the templates sub-page, keep the
formFields input on the page extension itself. The form fields are all
shared via the formFieldsApi anyway, so the sub-page only needs to read
from the API.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Add a replaces directive to the formFields input on the templates
sub-page so that extensions previously attached to page:scaffolder's
formFields input are automatically redirected. This ensures the
migration to SubPageBlueprint is not a breaking change.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Revert the over-aggressive commenting-out of all Lighthouse CI URLs.
Only the scaffolder pages need to be disabled due to the SubPageBlueprint
page layout switch — the other pages were unaffected by this change.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Use `calc(100dvh - var(--bui-header-height, 0px))` to give the template
editor and form previewer a definite height so that their grid-based
layouts fill the available viewport space within the new frontend system
page layout.
Also comment out the remaining lighthouse accessibility check URLs that
are broken by the BUI header switch.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
The scaffolder pages now use the SubPageBlueprint page layout with
PluginHeader tabs, which causes Lighthouse to produce NaN accessibility
scores. This is the same known issue affecting the settings pages.
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