mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2026-09-03 05:10:16 +03:00
e4cb26be43dd5e340af201a4c0ea9b45d9f26dcc
5963
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e4cb26be43 |
refactor(files): Local in the tree sets the source filter
It was a pseudo-tab with a view of its own: its own predicate for which files count, its own empty state, and a carve-out anywhere folders are involved - folder visibility, the New folder button, the heading. All of it to say "files with no server copy", which the source filter already says. Clicking it now sets that filter and nothing else, so it narrows whichever view you are in instead of taking you somewhere. The tab value goes with the machinery, and the strings only its empty state read. |
||
|
|
6fc1a39970 |
perf(files): render a window of a long folder, and drop the 500-file cap
A mounted directory listed at most 500 files. The cap was there because the grid rendered a card for every entry, so a big Downloads folder was slow whether or not the user scrolled that far - it traded away the rest of the folder to stay usable. The grid and the list now render only the rows in view plus a spacer at each end, so DOM size tracks the viewport instead of the folder. Spacers rather than absolute positioning, so the grid keeps its own auto-fill layout and the list its row flow; the column count is read off the computed style, leaving the CSS the one place that decides it. With no measurable scrolling ancestor - a short list, the first paint, a test environment with no geometry - every item renders, as before. The cap goes with it: listDirectory returns what the directory holds. What this does not change is the IPC cost of listing. Each entry is a stat over the bridge, batched, so a 10k-file directory still pays for 10k stats before the first card appears. |
||
|
|
5be8c72172 |
Merge branch 'folder-kinds' into files-grid-perf
Both sides restructured FileGrid: folder kinds added disk-listed cards and kind-aware folder menus, this branch made every item memoized behind one stable actions dispatcher and took the folder context back out of the items. The dispatcher stays, and the new behaviour moves onto it. Folder menus keep their kind gating, deriving editsDisabled from the serverReachable prop rather than subscribing to the folder context - a subscription inside a memoized item undoes what the memo buys. Opening a disk-listed file becomes actions.openDiskFile, so DiskFileCard and DiskFileRow take the dispatcher instead of a closure rebuilt every render, and are memoized like every other item. |
||
|
|
da77a7c099 |
docs(folders): fix the eight clunky ones
Two deleted outright: an upload branch and a folder lookup whose comments said what the condition below them said. The rest kept their fact and lost the rest of the sentence. DiskFileCard gets back the constraint that makes it unusual - no stub, so no selection or move. The "Local" tab keeps only the both-halves rule, not the predicate beside it. The disk-subfolder state says it is never persisted rather than restating its type. FolderRecord.kind pointed at folderKind twice over; now the accessor holds the rule and the field points at it. |
||
|
|
67e4f4b301 |
docs(folders): delete the comments that say what the line below says
Nine that carried nothing: four sat above a throw whose message was the comment, the rest restated the name or type they documented. Two were wrong rather than redundant. One counted two systems of record where three stores are loaded. The other explained local-file membership above the branch that reports server files being left behind. |
||
|
|
8afc769f05 |
test(files): count card re-renders so the memoization cannot rot
The restructure's whole claim is that selecting a file redraws the cards whose selection changed rather than the folder. Nothing enforced it: one inline object or closure at a call site undoes every bit of it, with no visible symptom until a folder is large enough to feel it. Counts the badge row each card renders exactly once, selects one of four, and expects one card's worth of redraw. With React.memo stripped from FileCard the same test reports four. |
||
|
|
218a8400ca |
perf(files): big file lists render only what changed and only what shows
Three compounding costs made a full folder feel sticky: - Every card and row re-rendered on ANY page state change, because item components weren't memoized and got fresh closures each render. Items now take a single stable actions dispatcher (latest-ref backed, so behavior stays current while identity stays fixed) and are React.memo — a selection click re-renders the two cards whose selection changed, not all 500. Selection-aware behavior (drag payloads, multi-move) moved into the dispatcher so items no longer hold the selection Set, whose identity changes on every click. - Each lazily generated thumbnail updated the shared stub immediately, re-rendering every file-list consumer once per thumbnail — hundreds of times as a folder fills in. Updates now flush in windows; the card itself paints instantly from local state. - Offscreen cards still paid layout and paint. content-visibility lets the browser skip them; the intrinsic size keeps the scrollbar honest. |
||
|
|
bfb48c88de |
docs(folders): put back the halves that carried the reason
Cutting each block to its first sentence sometimes kept the what and dropped the why, which leaves a comment saying what the signature already says. Those are deleted where the name covers them, and where the second sentence was the point it is back: the OS error codes behind isAlreadyExists, why a virtual folder cannot hang off a server one, the effect that snaps folder selection back to root. |
||
|
|
b6139d1cd0 |
docs(folders): one line each
Every multi-line aside cut to its first sentence. What went was the second and third sentences qualifying it. |
||
|
|
056de6d9ee |
docs(folders): cut the comments back
Same facts, a third of the words. Mostly three- and four-line asides saying one thing, and rhetorical framing around explanations that stand up on their own. |
||
|
|
90b6762869 |
docs(folders): trim the comments this branch adds
The same three lines explaining which folder kinds can go offline sat above both the grid card and the list row; one copy carries the reasoning and the other points at it. The rest is the module docs on the new stores, saying the same things with less around them. |
||
|
|
c7fc306605 | style(folders): oxfmt after banner removal | ||
|
|
539b933ce8 |
style(folders): drop two decorative section banners
main's comment gate blocks banner comments on added lines (CMT002): decoration carries nothing a reader could not get from the code below it. |
||
|
|
c0de945f32 | Merge branch 'main' into folder-kinds | ||
|
|
f6661a8f87 |
Failure action slots, resolve transition, and the bell that renders them (Review Flow PR 5a) (#7761)
Review Flow PR 5a — the first half of #7479, which stays open for reference until both halves land. This PR is the ranking and the bookkeeping; #7762 adds the retry handlers. Merging both reproduces #7479's diff byte-for-byte. ## What's added **The action slot model (backend).** `FailureActionSlot` ranks each of a kind's offers as its `RESOLUTION`, `SECONDARY` or `OVERFLOW`. `FailureKind` now declares placement per offer — the password-protected kind names `DECRYPT_AND_RETRY` as its resolution, `UNKNOWN` leads with a plain `RETRY` — and `FailureActionId` gains those two ids. The declarations are data; their client handlers arrive in the follow-up, so this build withholds them with a reason rather than rendering unwired buttons (the same forward-compatibility #7478 relied on). **A resolve transition.** `POST /api/v1/notifications/{id}/resolved` lets a client report a failure fixed. `NotificationSource.parse` turns a qualified notification id back into the source that owns it, and `FileRunEventService` folds the resolution into the incident rather than deleting it. **`viewerReviewsTeam` on the list response.** A member sees only rows whose document this browser holds — they can neither open nor fix anything else — while a team reviewer keeps every row. **The bell renders the ranking** (`promoteActions`): one primary button, at most one secondary, the rest in an overflow menu beside **Copy log**. The row's body is the kind's own sentence; the raw failure message moves into the menu. **Read state is a timestamp, not a row id.** `readThroughAt` replaces `lastSeenId`: when a resolved or dismissed row leaves the list, the rows below it stay read instead of re-lighting the badge. ## How to test Needs a proprietary or SaaS build with login enabled (`task dev:all`, sign in). 1. **Create a failure.** Add a password-protected PDF to the editor and choose **Skip for now**; the upload's policy run fails on it. 2. **Open the bell.** The row reads the kind's sentence, not a stack trace. Its primary button is **View file** — the server offers Decrypt and retry as the resolution, but this build withholds it (handler lands in the follow-up), so the best renderable offer is promoted instead. 3. **Open the row's ⋯ menu.** View in processor and Dismiss sit there, along with **Copy log**, which copies the raw message. 4. **Check the read marker survives a departure.** With two failures, open the bell (badge clears), dismiss the newer row, and refresh: the badge stays dark. On main, the marker held the departed row's id and the older row re-read as unread. 5. **Member visibility.** As a plain member, a failure recorded from another browser does not appear in the bell; as a team reviewer it does. 6. **Resolve endpoint.** `POST /api/v1/notifications/failure-{eventId}/resolved` as the owner removes the row on the next poll; `NotificationResolveTest` pins refusal for a non-owner, an unknown id, and a foreign prefix. ## Migration None. |
||
|
|
ceeec53df4 |
Let a pipeline run on the editor, on upload or export (#7581)
Redesigns the policies system so that the backend has an understanding of policies running over the Editor. The Editor is not set up as a source for the backend because the backend can't actively get files from it, they come in via the frontend sending them to the backend, so instead pipelines have a specific editor key in them to encode whether the pipeline is triggered on file upload/export in the editor. Also make a big effort in the frontend code towards genericising policy running. Previously, there was specific support in the main policy executor for each policy that it had to run, which was not going to be appropriate long-term, especially when users can run any pipeline in the editor. There's more work needed here for me to really be happy with it but this PR is plenty large on its own and moves it in the right direction. All of the above was required to allow arbitrary user pipelines to run in the editor. This PR makes it so that the user can select Editor as a source in the pipeline creator, along with whether it should run on upload or export. <img width="1437" height="506" alt="image" src="https://github.com/user-attachments/assets/b2d176a1-185c-480b-9916-abdd1447d8e1" /> --------- Co-authored-by: James Brunton <james@stirlingpdf.com> |
||
|
|
4ef2e3811c |
ci(preview): give PR previews the Stirling account config they need to link (#7728)
Add CI steps to enable PR deploy servers to link to prod saas. This will allow pr testing of payment flows, usage of real credits etc |
||
|
|
da5edb2d3a |
feat(folders): folder kinds — server folders everywhere, disk mounts on desktop
Folders now carry a kind, and each kind has its own system of record:
- "server": the backend owns them, as before. The only kind the web
offers — the root New-folder button goes straight to the server dialog
and greys out with the reason (sign in / storage off / unreachable)
when the server can't take one.
- "local": a directory on the machine, mounted read-through on desktop
via the native picker ("Add local folder"). The directory is the source
of truth: the listing is taken fresh from disk (stats batched — a
directory's open time is IPC latency, so the calls overlap), opening a
file loads its bytes into the workbench, and moving, dropping, or
uploading files into the mount writes them to the directory itself —
the app copy is retired only after the bytes verifiably land, taking
superseded versions with it. Names are reduced to a safe basename
before writing; collisions take the OS's " (n)" suffix convention.
Mount records dedupe through a lexical directory key (case-folded for
Windows-style paths, separators unified) and refuse nested or
containing directories — one directory, one row.
- "virtual": browser-owned IndexedDB folders. Dormant by decision:
nothing creates one at the root any more, but existing rows still
render, take subfolders, and hold files.
One kind per subtree, always — each kind has its own store and a mixed
chain would mean an ancestry no single store can vouch for.
Placement is part of creation: a file uploaded while standing in a
folder is born with that folderId, set atomically with the stub — for a
server folder the save-to-server is the sync step, and a failed sync
leaves the file visibly in its folder rather than stranded. moveFilesTo
falls back to storage for ids newer than its render-time snapshot, so
just-born files never silently drop out of a move.
Platform gating goes through build seams (@app): the directory picker,
the disk listing/read/write, and the server-folder blocker — desktop's
blocker speaks in connection modes ("Sign in to Stirling Cloud or
connect a self-hosted server"), seeded from the service's cache so first
paint answers correctly. The one-click New-folder surfaces (sidebar
rail, empty-state CTA) share one flow: the native picker on desktop, a
server folder on the web, disabled with the reason when neither applies.
|
||
|
|
31d52d4c32 |
Connect flow for self-hosted account linking, and the triggers that drive it (#7415)
Replaces the bare account-link login box with a guided Connect flow, and wires up the triggers that actually put it in front of someone. ## Top bar <img width="1580" height="422" alt="image" src="https://github.com/user-attachments/assets/719e12fc-121a-4caa-bc72-124c5167b011" /> ## The modal Three steps on the portal's own `FlowModal` + `StepModalHeader`, the shells procurement and prepay already wear: 1. **What you unlock** — six benefits as a plain list. <img width="817" height="503" alt="image" src="https://github.com/user-attachments/assets/4644ddd2-6181-44e1-9be9-7a961972195d" /> 2. **Sign in** — the existing `SupabaseLoginForm`, reseated. <img width="880" height="930" alt="image" src="https://github.com/user-attachments/assets/fc66cbbb-9f98-40a4-9daa-4f2447713f39" /> 3. **Connected** — confirms, then deep links into Users, Pipelines and Policies. <img width="876" height="752" alt="image" src="https://github.com/user-attachments/assets/28358e4d-a44f-4118-a8ae-8275984ebd00" /> Re-auth stays a single step with no pitch and no success screen. ## The triggers **`LinkGate` stops being dead code.** It was built as the drop-anywhere "link to unlock" wrapper and was imported by nothing. It is now a blocking empty state that replaces the feature it guards, wired into Pipelines, Policies, Users, Sources and Integrations. **Scoped to creating and editing, never viewing.** Existing pipelines, policies, sources and connections keep listing and running, so upgrading an unlinked instance cannot take away something that already works. The clicks that would open a builder or a create modal ask for the connection first, which is the moment an admin has already declared intent. ## Capability signal `accountLinkAvailable` on `/api/v1/config/app-config`. Gating needs two facts: whether the instance is linked (`LinkContext`) and whether it *could* be (this flag). The account-link endpoints 404 when the feature flag is off, which the client cannot distinguish from "not linked yet" — so gating on link state alone would lock all five views on every default install with no way out. `useConnectGate` holds that decision in one place and shares the app-config query key, so it costs no extra request. Read from the environment rather than `AccountLinkProperties` because `:core` cannot depend on `:proprietary`. |
||
|
|
d55d8acbfa |
fix(portal): keep the processor's cache across a trip to the editor (#7729)
# Description of Changes
## The problem
The portal's query client was created per mount:
```ts
const [queryClient] = useState(createPortalQueryClient);
```
The portal is a route (`/processor/*`, a lazy element), and the switch
to the editor is a client-side `navigate()`. So leaving the processor
unmounts `PortalApp`, the client goes with the component, and the cache
goes with the client. Coming back refetches everything, whether or not
anything changed: four requests for the Users page alone (roster,
grants, teams, auth config), and 21 `useQuery` sites across the portal.
The editor's client sits above the router in `AppProviders` and survives
the same trip. The round trip only ever cost in one direction.
## The fix
The module already kept the instance in a module-level slot so
`tryGetPortalQueryClient()` could find it. It just replaced it on every
mount instead of reusing it, so the change is to create it lazily and
hand out the same one:
```ts
export function getPortalQueryClient(): QueryClient {
current ??= new QueryClient({ defaultOptions: { queries: baseQueryOptions } });
return current;
}
```
Still a separate instance from the editor's. The two namespace their
keys apart (`["portal", ...]` against `["editor", ...]`) and invalidate
independently, which this does not change.
## What this does not do
`gcTime` is 5 minutes, from the shared `baseQueryOptions`. An entry with
no observer is still collected on that timer, so this warms a quick trip
to the editor and back, not a return after a long editing session.
Raising the portal's `gcTime` is a separate decision and is not made
here.
## Why it is safe
**Signing out.** A cache that outlives a mount must not outlive a
session, because the portal's holds the admin roster, emails and roles.
Logout goes through `window.location.assign`, a full page load, so the
whole JS context is discarded and no cache can survive it. Nothing in
the codebase calls `queryClient.clear()` on sign-out, and nothing needs
to. If logout ever becomes a client-side navigation, this needs an
explicit reset, and `resetPortalQueryClient()` is the hook for it.
**The one caller of the null check.** `resolveTeam` in
`saas/portal/usersBackend.ts` uses `tryGetPortalQueryClient()` and falls
back to a direct fetch when there is no client, which its comment
describes as the unit-test path; the cache path is preferred because it
honours both `staleTime` and invalidation. A longer-lived client means
the preferred path is taken more often, not less.
## Testing
Three tests in `queryClient.test.tsx`, and the first two fail if the
client goes back to being created per call:
| | |
|---|---|
| A remount is served from cache rather than refetching | the behaviour
this changes |
| Every caller gets the same instance | the mechanism |
| No client is reported until the portal first mounts | the contract
`resolveTeam` reads |
The three existing portal caching suites called the factory expecting a
fresh client per case. They now call `resetPortalQueryClient()` in a
`beforeEach`, which is what keeps `sharing.test.tsx`'s "a later screen
refetches nothing" case honest rather than passing on a leaked cache.
`task frontend:check` passes typecheck, lint and oxfmt, and 2402 of 2404
editor tests. The two failures, `workbenchSession.test.ts` and
`notificationActions.test.tsx`, are untouched here and fail the same way
on `main`.
|
||
|
|
af97e1b27b |
Update Backend 3rd Party Licenses (#7713)
Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com> |
||
|
|
01c908e95d |
build(deps-dev): bump openai from 2.53.0 to 3.3.1 in /engine (#7700)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
0920ea9493 |
build(deps): bump go-task/setup-task from 2.1.0 to 2.2.0 (#7532)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
96207a7304 |
build(deps): bump @tanstack/react-query from 5.101.4 to 5.102.0 in /frontend in the tanstack group across 1 directory (#7749)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
d93049db9f |
build(deps): bump log from 0.4.33 to 0.4.34 in /frontend/editor/src-tauri (#7747)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
54e839ae65 |
build(deps-dev): bump reportlab from 5.0.0 to 5.0.1 in /engine (#7699)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
3aca7a26f6 |
build(deps-dev): bump python-dotenv from 1.2.2 to 1.2.3 in /engine (#7702)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
5fe7df3933 |
build(deps): bump jackson2Version from 2.22.1 to 2.22.2 (#7703)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
b1e857fd01 |
build(deps): bump com.tngtech.archunit:archunit-junit5 from 1.4.2 to 1.5.0 (#7704)
Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
b92f88361e |
build(deps): bump docker/setup-buildx-action from 4.2.0 to 4.3.0 (#7711)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 4.2.0 to 4.3.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/setup-buildx-action/releases">docker/setup-buildx-action's releases</a>.</em></p> <blockquote> <h2>v4.3.0</h2> <ul> <li>Bump <code>@docker/actions-toolkit</code> from 0.92.0 to 0.95.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/595">docker/setup-buildx-action#595</a></li> <li>Bump brace-expansion from 1.1.13 to 1.1.18 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/600">docker/setup-buildx-action#600</a></li> <li>Bump js-yaml from 5.2.0 to 5.3.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/585">docker/setup-buildx-action#585</a></li> <li>Bump postcss from 8.5.10 to 8.5.25 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/598">docker/setup-buildx-action#598</a></li> <li>Bump undici from 6.27.0 to 6.28.0 in <a href="https://redirect.github.com/docker/setup-buildx-action/pull/601">docker/setup-buildx-action#601</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/setup-buildx-action/compare/v4.2.0...v4.3.0">https://github.com/docker/setup-buildx-action/compare/v4.2.0...v4.3.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/setup-buildx-action/commit/37fe631027851001ddb9b187196cc803df7f5f0e"><code>37fe631</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/595">#595</a> from docker/dependabot/npm_and_yarn/docker/actions-to...</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/b5c4f91922681cc7c58d15ab7838986951f09d19"><code>b5c4f91</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/3e93b637c6430ba8fa896fad44d3aa6821899d63"><code>3e93b63</code></a> build(deps): bump <code>@docker/actions-toolkit</code> from 0.92.0 to 0.95.0</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/e527031b32c86649307d5d492506855f90470604"><code>e527031</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/600">#600</a> from docker/dependabot/npm_and_yarn/brace-expansion-1...</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/c68814b33cb66f1f7538e546190d410ae557a640"><code>c68814b</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/3f891b01bd5012a434f582800366972569aa1886"><code>3f891b0</code></a> build(deps): bump brace-expansion from 1.1.13 to 1.1.18</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/787db26fcde8ddcabd49a81472318028f7113962"><code>787db26</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/585">#585</a> from docker/dependabot/npm_and_yarn/js-yaml-5.2.1</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/f7793687c711790ca336bd4934f1b1bf5f778e17"><code>f779368</code></a> [dependabot skip] chore: update generated content</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/7d5e60413489a33d28077e11d71c668580cfaf8d"><code>7d5e604</code></a> build(deps): bump js-yaml from 5.2.0 to 5.3.0</li> <li><a href="https://github.com/docker/setup-buildx-action/commit/292c2fb3837a12d3ac2d1e47bbc5c00712bad939"><code>292c2fb</code></a> Merge pull request <a href="https://redirect.github.com/docker/setup-buildx-action/issues/590">#590</a> from docker/dependabot/github_actions/actions/setup-n...</li> <li>Additional commits viewable in <a href="https://github.com/docker/setup-buildx-action/compare/bb05f3f5519dd87d3ba754cc423b652a5edd6d2c...37fe631027851001ddb9b187196cc803df7f5f0e">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
f6124223e4 |
build(deps): bump github/codeql-action/upload-sarif from 4.37.7 to 4.37.8 (#7750)
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.7 to 4.37.8. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/upload-sarif's releases</a>.</em></p> <blockquote> <h2>v4.37.8</h2> <p>No user facing changes.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/upload-sarif's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.37.9 - 26 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.4">2.26.4</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4106">#4106</a></li> </ul> <h2>4.37.8 - 21 Aug 2026</h2> <p>No user facing changes.</p> <h2>4.37.7 - 13 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.3">2.26.3</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4085">#4085</a></li> </ul> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <h2>4.37.5 - 03 Aug 2026</h2> <ul> <li>Fixed a bug where a network error while streaming the download of the CodeQL bundle could terminate the <code>init</code> Action instead of falling back to downloading the bundle before extracting it. <a href="https://redirect.github.com/github/codeql-action/pull/4061">#4061</a></li> </ul> <h2>4.37.4 - 29 Jul 2026</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> <h2>4.37.3 - 22 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.37.2 - 21 Jul 2026</h2> <ul> <li>The new address format for the <code>config-file</code> input that was introduced in CodeQL Action 4.37.0 is now enabled by default. In addition to the format described there, the <code>remote=</code> prefix can now be used to explicitly indicate that the input refers to a remote file. All previous input formats continue to be accepted as well. <a href="https://redirect.github.com/github/codeql-action/pull/4023">#4023</a></li> <li>The CodeQL Action can now make use of <a href="https://docs.github.com/en/code-security/how-tos/secure-at-scale/configure-organization-security/manage-usage-and-access/giving-org-access-private-registries">configured private registries</a> in Default Setup to retrieve CodeQL configuration files from remote repositories that require authentication. This will allow customers to store their CodeQL configuration in a single repository that can then be referenced by Default Setup workflows in other repositories. We expect to roll this and other, related changes out to everyone in July. <a href="https://redirect.github.com/github/codeql-action/pull/4007">#4007</a></li> </ul> <h2>4.37.1 - 16 Jul 2026</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.20.6 and earlier. These versions of CodeQL were discontinued on 1 July 2026 alongside GitHub Enterprise Server 3.16, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3956">#3956</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.1">2.26.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4019">#4019</a></li> </ul> <h2>4.37.0 - 08 Jul 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.0">2.26.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3995">#3995</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28"><code>db488dd</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4102">#4102</a> from github/update-v4.37.8-9ee088e13</li> <li><a href="https://github.com/github/codeql-action/commit/1845f5ba8b4057590f49ee8e246c95ef2ba4b53f"><code>1845f5b</code></a> Update changelog for v4.37.8</li> <li><a href="https://github.com/github/codeql-action/commit/9ee088e13615f8d1eaef4766f9dde95d3356a8f6"><code>9ee088e</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4080">#4080</a> from github/henrymercer/studious-giggle</li> <li><a href="https://github.com/github/codeql-action/commit/1aef003397c876c0ab5bd118e1b1f34c175622e9"><code>1aef003</code></a> Address review feedback on overlay disk flags</li> <li><a href="https://github.com/github/codeql-action/commit/508b83bc415e8df76ce8ea08c0cf42c2529ebc63"><code>508b83b</code></a> Merge main into overlay minimum disk feature branch</li> <li><a href="https://github.com/github/codeql-action/commit/d97b3428e8eebbb1810cf454d6397886d136b4ba"><code>d97b342</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4098">#4098</a> from github/mbg/permission-error-as-configuration-error</li> <li><a href="https://github.com/github/codeql-action/commit/47fa6222231b12097f83215dd7a6b4a0915841fd"><code>47fa622</code></a> Make <code>EACCES</code> a <code>ConfigurationError</code></li> <li><a href="https://github.com/github/codeql-action/commit/45693cc6882bb175b58a06818c91876e201037c7"><code>45693cc</code></a> Refactor <code>ENOSPC</code> check into <code>isDiskConfigurationError</code> function</li> <li><a href="https://github.com/github/codeql-action/commit/c2fd8f54d19fa46c94ed79cb92e6dd6606d61762"><code>c2fd8f5</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4081">#4081</a> from github/mario-campos/version-cache-to-disk</li> <li><a href="https://github.com/github/codeql-action/commit/c56f48e9bd458a387eb68a68534459e503e56b17"><code>c56f48e</code></a> Log unexpected conditions during caching CLI output</li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd...db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
3235645203 |
build(deps): bump step-security/harden-runner from 2.20.0 to 2.21.0 (#7746)
Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.20.0 to 2.21.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/step-security/harden-runner/releases">step-security/harden-runner's releases</a>.</em></p> <blockquote> <h2>v2.21.0</h2> <h2>What's Changed</h2> <ul> <li>Support for denied endpoints in block mode. This is included in the enterprise tier. Customers can deny outbound calls, for example, to public package registries.</li> <li>Improved Support for AWS CodeBuild GitHub Actions Runners.</li> <li>Bug fixes.</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/step-security/harden-runner/compare/v2.20.1...v2.21.0">https://github.com/step-security/harden-runner/compare/v2.20.1...v2.21.0</a></p> <h2>v2.20.1</h2> <h2>What's Changed</h2> <ul> <li>AWS CodeBuild-hosted runner support</li> <li>Implicitly allow single-labeled (internal) domains in block-mode</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/step-security/harden-runner/compare/v2.20.0...v2.20.1">https://github.com/step-security/harden-runner/compare/v2.20.0...v2.20.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/step-security/harden-runner/commit/05e31511f85b41b11d1cf0ef85d0992719546e2c"><code>05e3151</code></a> Merge pull request <a href="https://redirect.github.com/step-security/harden-runner/issues/684">#684</a> from step-security/rc-42</li> <li><a href="https://github.com/step-security/harden-runner/commit/0f37afa338f57c61ee3dfc274daca8834963d83e"><code>0f37afa</code></a> fix: ignore denied-endpoints on non-enterprise tier</li> <li><a href="https://github.com/step-security/harden-runner/commit/93b58ee491c5b6cf3a5324966fca2908f8d447f3"><code>93b58ee</code></a> fix: resolve cache host read-first and never downgrade egress policy</li> <li><a href="https://github.com/step-security/harden-runner/commit/e7399dd3e93d6c159d314af54b4704bc48abf6bc"><code>e7399dd</code></a> fix: align deny-list mode detection with agent and log when both endpoint inp...</li> <li><a href="https://github.com/step-security/harden-runner/commit/c16689f716a10cdfd9cfe22e63938b8c6c0657de"><code>c16689f</code></a> test: add denied_endpoints to Configuration fixtures and cover deny-list merge</li> <li><a href="https://github.com/step-security/harden-runner/commit/40b99cf0c7161e4dcdc6c5508927188b65028df9"><code>40b99cf</code></a> Merge pull request <a href="https://redirect.github.com/step-security/harden-runner/issues/682">#682</a> from rohan-stepsecurity/rp/feat/codebuild-self-v2</li> <li><a href="https://github.com/step-security/harden-runner/commit/fedec027a205365a7d64001a81931e4c36a1af6e"><code>fedec02</code></a> Merge branch 'rc-42' into rp/feat/codebuild-self-v2</li> <li><a href="https://github.com/step-security/harden-runner/commit/5361fb178b926b2be6df52e11ee257823821567b"><code>5361fb1</code></a> feat: add build artifacts</li> <li><a href="https://github.com/step-security/harden-runner/commit/286474fffe0b8fe7c9db855f132d04a9b48ab564"><code>286474f</code></a> feat: Support Bravo agent install on CodeBuild runners</li> <li><a href="https://github.com/step-security/harden-runner/commit/051ec05283d064bd82f41279db4f70f0717bf778"><code>051ec05</code></a> Merge pull request <a href="https://redirect.github.com/step-security/harden-runner/issues/683">#683</a> from h0x0er/jatin/deny-list</li> <li>Additional commits viewable in <a href="https://github.com/step-security/harden-runner/compare/v2.20.0...05e31511f85b41b11d1cf0ef85d0992719546e2c">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
1f4cc2612d |
build(deps): bump the eclipse-temurin group across 3 directories with 1 update (#7740)
> [!WARNING] > Cooldown could not be applied because no publication date was available from the registry. > Bumps the eclipse-temurin group with 1 update in the /docker/backend directory: eclipse-temurin. Bumps the eclipse-temurin group with 1 update in the /docker/base directory: eclipse-temurin. Bumps the eclipse-temurin group with 1 update in the /docker/embedded directory: eclipse-temurin. Updates `eclipse-temurin` from `fbcf915` to `b4c93a5` Updates `eclipse-temurin` from `fbcf915` to `b4c93a5` Updates `eclipse-temurin` from `fbcf915` to `b4c93a5` Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
e539eb1ab1 |
build(deps): bump the ubuntu group across 2 directories with 1 update (#7698)
> [!WARNING] > Cooldown could not be applied because no publication date was available from the registry. > Bumps the ubuntu group with 1 update in the /docker/base directory: ubuntu. Bumps the ubuntu group with 1 update in the /docker/unoserver directory: ubuntu. Updates `ubuntu` from `561618e` to `33ceb71` Updates `ubuntu` from `561618e` to `33ceb71` Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
1bb6961414 |
Update Frontend 3rd Party Licenses (#7738)
Auto-generated by stirlingbot[bot] This PR updates the frontend license report based on changes to package.json dependencies. Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com> Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> |
||
|
|
34694c6f5e |
refactor(api): standardize syntax and simplify type declarations across security, workflow, and controller modules (#7127)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
0b7b4e02c2 |
chore(crop): Remove invalid crop area message and related validation logic (#7160)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
74be5bf0ad |
fix(forms): Fix checkbox export values and wide dropdown options (#7288)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
8c00fffe18 |
refactor(api): replace com.fasterxml.jackson with tools.jackson (Jackson 2 to Jackson 3 namespace.) (#7444)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
c5da4177c4 |
refactor(ui): improve button layouts and modal sizing of formFill (#7509)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
ddc0ac0ced | fix(api): fix endpoint set concurrency and in-memory leaks (#7505) | ||
|
|
8bdd00b2fa |
build(deps): bump @tanstack/react-virtual from 3.13.23 to 3.14.10 in /frontend in the tanstack group across 1 directory (#7605)
Bumps the tanstack group with 1 update in the /frontend directory: [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual). Updates `@tanstack/react-virtual` from 3.13.23 to 3.14.10 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/TanStack/virtual/releases">@tanstack/react-virtual's releases</a>.</em></p> <blockquote> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.10</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/a0a411e06f7334a063422de35d59b12b264b3573"><code>a0a411e</code></a>, <a href="https://github.com/TanStack/virtual/commit/d2cf98beea1696c7187c06b57c9e724d1957963c"><code>d2cf98b</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.8</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.9</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/a5417b4b0d3c82876747bb9635db7239c28d3e44"><code>a5417b4</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.7</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/TanStack/virtual/pull/1237">#1237</a> <a href="https://github.com/TanStack/virtual/commit/aa536e7746a88d9f55ca8a4b50d2f548a888fea6"><code>aa536e7</code></a> - Fix a gap at the top of the list after an end-anchored prepend in <code>directDomUpdates</code> mode. The prepend grows the total size and bumps <code>scrollOffset</code> to the new bottom in the same pass, but the size container's height was written <em>after</em> <code>_willUpdate</code> synced the scroll position — so the browser clamped the <code>scrollTop</code> write to the stale (shorter) <code>scrollHeight</code>, leaving whitespace at the top until the next scroll. The container is now grown before the scroll sync. Only affected <code>directDomUpdates</code> mode (React-rendered sizers receive their height during render).</p> </li> <li> <p>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/7ae32b55887fd044a48c788546cd940279b338e0"><code>7ae32b5</code></a>]:</p> <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.6</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.7</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/1e3b908705e04e45be2615f2277580cb09f5cdef"><code>1e3b908</code></a>, <a href="https://github.com/TanStack/virtual/commit/7dcfc07b877479697124157d3124c09537b87a75"><code>7dcfc07</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.5</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.6</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/6cbecd887df56faaee3b6a81a1aae8049de0671e"><code>6cbecd8</code></a>, <a href="https://github.com/TanStack/virtual/commit/d49cc526fe248be7b5ad97ec6ac814db8271b0d0"><code>d49cc52</code></a>, <a href="https://github.com/TanStack/virtual/commit/cf7834daade953fea5dfd2ab5685c15771ca300a"><code>cf7834d</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.4</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.5</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/767ead46e4fab761fd6e15bcf281486042723152"><code>767ead4</code></a>, <a href="https://github.com/TanStack/virtual/commit/bc8643b7579e10e512654f58269de13d98b48781"><code>bc8643b</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.3</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.4</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/b04f9ee48f0812e89156c1dac1fa58277cc32464"><code>b04f9ee</code></a>, <a href="https://github.com/TanStack/virtual/commit/37be28427ba52399ce8884e0006933e83f2645e9"><code>37be284</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.2</li> </ul> </li> </ul> <h2><code>@tanstack/react-virtual</code><a href="https://github.com/3"><code>@3</code></a>.14.3</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/TanStack/virtual/pull/1201">#1201</a> <a href="https://github.com/TanStack/virtual/commit/2ba5eb60f108f4ba9b2bd9570bbd41f9ce618438"><code>2ba5eb6</code></a> - Make <code>directDomUpdates</code> a no-op for direct DOM writes when <code>containerRef</code> is omitted. Previously the virtualizer still wrote item positions while never sizing the container (a broken half-state). Now omitting <code>containerRef</code> skips all direct writes while still skipping re-renders, letting consumers own the DOM updates themselves (e.g. in <code>onChange</code>).</p> </li> <li> <p>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/ef69ea31738caa2819142e922efa03d3c408e25c"><code>ef69ea3</code></a>]:</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/TanStack/virtual/blob/main/packages/react-virtual/CHANGELOG.md">@tanstack/react-virtual's changelog</a>.</em></p> <blockquote> <h2>3.14.10</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/a0a411e06f7334a063422de35d59b12b264b3573"><code>a0a411e</code></a>, <a href="https://github.com/TanStack/virtual/commit/d2cf98beea1696c7187c06b57c9e724d1957963c"><code>d2cf98b</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.8</li> </ul> </li> </ul> <h2>3.14.9</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/a5417b4b0d3c82876747bb9635db7239c28d3e44"><code>a5417b4</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.7</li> </ul> </li> </ul> <h2>3.14.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/TanStack/virtual/pull/1237">#1237</a> <a href="https://github.com/TanStack/virtual/commit/aa536e7746a88d9f55ca8a4b50d2f548a888fea6"><code>aa536e7</code></a> - Fix a gap at the top of the list after an end-anchored prepend in <code>directDomUpdates</code> mode. The prepend grows the total size and bumps <code>scrollOffset</code> to the new bottom in the same pass, but the size container's height was written <em>after</em> <code>_willUpdate</code> synced the scroll position — so the browser clamped the <code>scrollTop</code> write to the stale (shorter) <code>scrollHeight</code>, leaving whitespace at the top until the next scroll. The container is now grown before the scroll sync. Only affected <code>directDomUpdates</code> mode (React-rendered sizers receive their height during render).</p> </li> <li> <p>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/7ae32b55887fd044a48c788546cd940279b338e0"><code>7ae32b5</code></a>]:</p> <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.6</li> </ul> </li> </ul> <h2>3.14.7</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/1e3b908705e04e45be2615f2277580cb09f5cdef"><code>1e3b908</code></a>, <a href="https://github.com/TanStack/virtual/commit/7dcfc07b877479697124157d3124c09537b87a75"><code>7dcfc07</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.5</li> </ul> </li> </ul> <h2>3.14.6</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/6cbecd887df56faaee3b6a81a1aae8049de0671e"><code>6cbecd8</code></a>, <a href="https://github.com/TanStack/virtual/commit/d49cc526fe248be7b5ad97ec6ac814db8271b0d0"><code>d49cc52</code></a>, <a href="https://github.com/TanStack/virtual/commit/cf7834daade953fea5dfd2ab5685c15771ca300a"><code>cf7834d</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.4</li> </ul> </li> </ul> <h2>3.14.5</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/767ead46e4fab761fd6e15bcf281486042723152"><code>767ead4</code></a>, <a href="https://github.com/TanStack/virtual/commit/bc8643b7579e10e512654f58269de13d98b48781"><code>bc8643b</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.3</li> </ul> </li> </ul> <h2>3.14.4</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/TanStack/virtual/commit/b04f9ee48f0812e89156c1dac1fa58277cc32464"><code>b04f9ee</code></a>, <a href="https://github.com/TanStack/virtual/commit/37be28427ba52399ce8884e0006933e83f2645e9"><code>37be284</code></a>]: <ul> <li><code>@tanstack/virtual-core</code><a href="https://github.com/3"><code>@3</code></a>.17.2</li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/TanStack/virtual/commit/e9874f033c74afd3251eeb9f3e60b2530cc7ae88"><code>e9874f0</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1247">#1247</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/b4a76cac25ef7e334c180ceb8c0d859b7c91ab09"><code>b4a76ca</code></a> fix(marko-virtual): consolidate Marko e2e into one in-package app, fix test (...</li> <li><a href="https://github.com/TanStack/virtual/commit/deca524a9b2ed29a8a23001389580de10f8002db"><code>deca524</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1240">#1240</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/32b2f2b412739015a47da1463fe2749456cdc4e9"><code>32b2f2b</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1238">#1238</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/aa536e7746a88d9f55ca8a4b50d2f548a888fea6"><code>aa536e7</code></a> fix(react-virtual): grow size container before scroll sync on end-anchored pr...</li> <li><a href="https://github.com/TanStack/virtual/commit/87f689a5c67ee1ed8db1e6754021a6b6b41c8550"><code>87f689a</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1231">#1231</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/ba5c47a93f597f8370bc9e0119d505551c962a09"><code>ba5c47a</code></a> feat(angular-virtual): add chat example and require Angular 20 (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1228">#1228</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/e2cb096862f5b74aa586957eae207b39999cb654"><code>e2cb096</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1225">#1225</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/d49cc526fe248be7b5ad97ec6ac814db8271b0d0"><code>d49cc52</code></a> fix(virtual-core): invalidate measurements when gap option changes (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1223">#1223</a>)</li> <li><a href="https://github.com/TanStack/virtual/commit/151e9f47abd4ef2d3b11936c04be8908e6bd0607"><code>151e9f4</code></a> ci: Version Packages (<a href="https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual/issues/1213">#1213</a>)</li> <li>Additional commits viewable in <a href="https://github.com/TanStack/virtual/commits/@tanstack/react-virtual@3.14.10/packages/react-virtual">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
3718af45ff |
build(deps): bump the mui group across 1 directory with 2 updates (#7602)
Bumps the mui group with 1 update in the /frontend directory: [@mui/icons-material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material). Updates `@mui/icons-material` from 9.2.0 to 9.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/mui/material-ui/releases">@mui/icons-material's releases</a>.</em></p> <blockquote> <h2>v9.3.1</h2> <p>A big thanks to the 4 contributors who made this release possible.</p> <h3><code>@mui/material@9.3.1</code></h3> <ul> <li>[transitions] Prevent exit transitions from getting stuck (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48881">#48881</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> </ul> <h3><code>@mui/codemod@9.3.1</code></h3> <ul> <li>Include transforms in published package (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48934">#48934</a>) <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a></li> </ul> <h3>Core</h3> <ul> <li>[blog] Clarify early bird renewal discount scope (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48906">#48906</a>) <a href="https://github.com/DanailH"><code>@DanailH</code></a></li> <li>[test][pagination] Add more unit tests (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48927">#48927</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <p>All contributors of this release in alphabetical order: <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a>, <a href="https://github.com/DanailH"><code>@DanailH</code></a>, <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a>, <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></p> <h2>v9.3.0</h2> <p>A big thanks to the 18 contributors who made this release possible. Here are some highlights ✨:</p> <ul> <li>♿️ Keyboard navigation in the <a href="https://mui.com/material-ui/react-toggle-button/">Toggle Button Group</a> now follows the roving tabindex pattern.</li> <li>♿️ The <a href="https://mui.com/material-ui/react-autocomplete/">Autocomplete</a> announces its loading and no options messages through a new <code>status</code> slot.</li> </ul> <h3><code>@mui/material@9.3.0</code></h3> <ul> <li>[autocomplete] Wrap the no results and loading messages in an aria live region (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48690">#48690</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[buttongroup] Respect global disableRipple / disableFocusRipple in grouped buttons (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48762">#48762</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[checkbox][radio] Respect global disableRipple from MuiButtonBase defaultProps (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48795">#48795</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[formcontrollabel] Add missing <code>labelPlacementEnd</code> class (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48843">#48843</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[listitembutton] Fix typos in component code (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48868">#48868</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[menuitem] Add <code>aria-checked</code> for checkbox and radio menu items (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48651">#48651</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[modal] Replace custom findIndexOf with findIndex (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48827">#48827</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[modal][dialog] Fix scrollbar compensation in Shadow DOM (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48826">#48826</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[select] Fix endAdornment overlapping the open indicator (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48723">#48723</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[tablepagination] Add focus style to default InputBase used in Select (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48871">#48871</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[togglebuttongroup] Add roving tabindex keyboard navigation (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48849">#48849</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <h3><code>@mui/system@9.3.0</code></h3> <ul> <li>Prevent prototype pollution in cssVarsParser (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48822">#48822</a>) <a href="https://github.com/Janpot"><code>@Janpot</code></a></li> </ul> <h3><code>@mui/codemod@9.3.0</code></h3> <ul> <li>Don't leak state between files in v5.0.0/path-imports (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48797">#48797</a>) <a href="https://github.com/manbearwiz"><code>@manbearwiz</code></a></li> <li>Remove use of eval() (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48701">#48701</a>) <a href="https://github.com/oliviertassinari"><code>@oliviertassinari</code></a></li> <li>Transform all style exports in <code>v5.0.0/path-imports</code> codemod (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48800">#48800</a>) <a href="https://github.com/manbearwiz"><code>@manbearwiz</code></a></li> </ul> <h3>Docs</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/mui/material-ui/blob/master/CHANGELOG.md">@mui/icons-material's changelog</a>.</em></p> <blockquote> <h2>9.3.1</h2> <!-- raw HTML omitted --> <p><em>Aug 6, 2026</em></p> <p>A big thanks to the 4 contributors who made this release possible.</p> <h3><code>@mui/material@9.3.1</code></h3> <ul> <li>[transitions] Prevent exit transitions from getting stuck (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48881">#48881</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> </ul> <h3><code>@mui/codemod@9.3.1</code></h3> <ul> <li>Include transforms in published package (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48934">#48934</a>) <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a></li> </ul> <h3>Core</h3> <ul> <li>[blog] Clarify early bird renewal discount scope (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48906">#48906</a>) <a href="https://github.com/DanailH"><code>@DanailH</code></a></li> <li>[test][pagination] Add more unit tests (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48927">#48927</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <p>All contributors of this release in alphabetical order: <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a>, <a href="https://github.com/DanailH"><code>@DanailH</code></a>, <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a>, <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></p> <h2>9.3.0</h2> <!-- raw HTML omitted --> <p><em>Aug 4, 2026</em></p> <p>A big thanks to the 18 contributors who made this release possible. Here are some highlights ✨:</p> <ul> <li>♿️ Keyboard navigation in the <a href="https://mui.com/material-ui/react-toggle-button/">Toggle Button Group</a> now follows the roving tabindex pattern.</li> <li>♿️ The <a href="https://mui.com/material-ui/react-autocomplete/">Autocomplete</a> announces its loading and no options messages through a new <code>status</code> slot.</li> </ul> <h3><code>@mui/material@9.3.0</code></h3> <ul> <li>[autocomplete] Wrap the no results and loading messages in an aria live region (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48690">#48690</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[buttongroup] Respect global disableRipple / disableFocusRipple in grouped buttons (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48762">#48762</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[checkbox][radio] Respect global disableRipple from MuiButtonBase defaultProps (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48795">#48795</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[formcontrollabel] Add missing <code>labelPlacementEnd</code> class (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48843">#48843</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[listitembutton] Fix typos in component code (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48868">#48868</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[menuitem] Add <code>aria-checked</code> for checkbox and radio menu items (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48651">#48651</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[modal] Replace custom findIndexOf with findIndex (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48827">#48827</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[modal][dialog] Fix scrollbar compensation in Shadow DOM (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48826">#48826</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[select] Fix endAdornment overlapping the open indicator (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48723">#48723</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[tablepagination] Add focus style to default InputBase used in Select (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48871">#48871</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[togglebuttongroup] Add roving tabindex keyboard navigation (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48849">#48849</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <h3><code>@mui/system@9.3.0</code></h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mui/material-ui/commit/5b91ac75008dbd43286a20ef87847042cc7a44ca"><code>5b91ac7</code></a> [release] v9.3.1 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48935">#48935</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/da37c088786eead9c7ddaffe0798ec692ece0a11"><code>da37c08</code></a> v9.3.0 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48909">#48909</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/2e38eb7f8f77152f4bb4047169cce332da420cb9"><code>2e38eb7</code></a> Bump chalk to 6.0.0 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48902">#48902</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/20fe2b6aa86965e3f1e2e5b0a82e2ed38f753ffd"><code>20fe2b6</code></a> Bump code-infra:devDependencies (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48891">#48891</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/a900cd7d7e66e37248ec0ae8da44d588d0577aa3"><code>a900cd7</code></a> Bump react monorepo to 19.2.8 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48858">#48858</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/8cbc3ce36fb59cd6f4e3a3e925fb247b6c4b971b"><code>8cbc3ce</code></a> Bump code-infra:devDependencies (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48830">#48830</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/a5faab53e647b92b5efb8ea26ce1ae758778736e"><code>a5faab5</code></a> Bump react monorepo (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48770">#48770</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/ca10194ad116e97fa4ecfc95ca09421bbbb6e2a7"><code>ca10194</code></a> Bump code-infra:devDependencies (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48767">#48767</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/620c9e95e8e57d99d91524f6f60de00d194184f1"><code>620c9e9</code></a> Bump babel monorepo to ^7.29.7 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material/issues/48766">#48766</a>)</li> <li>See full diff in <a href="https://github.com/mui/material-ui/commits/v9.3.1/packages/mui-icons-material">compare view</a></li> </ul> </details> <br /> Updates `@mui/material` from 9.2.0 to 9.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/mui/material-ui/releases">@mui/material's releases</a>.</em></p> <blockquote> <h2>v9.3.1</h2> <p>A big thanks to the 4 contributors who made this release possible.</p> <h3><code>@mui/material@9.3.1</code></h3> <ul> <li>[transitions] Prevent exit transitions from getting stuck (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48881">#48881</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> </ul> <h3><code>@mui/codemod@9.3.1</code></h3> <ul> <li>Include transforms in published package (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48934">#48934</a>) <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a></li> </ul> <h3>Core</h3> <ul> <li>[blog] Clarify early bird renewal discount scope (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48906">#48906</a>) <a href="https://github.com/DanailH"><code>@DanailH</code></a></li> <li>[test][pagination] Add more unit tests (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48927">#48927</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <p>All contributors of this release in alphabetical order: <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a>, <a href="https://github.com/DanailH"><code>@DanailH</code></a>, <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a>, <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></p> <h2>v9.3.0</h2> <p>A big thanks to the 18 contributors who made this release possible. Here are some highlights ✨:</p> <ul> <li>♿️ Keyboard navigation in the <a href="https://mui.com/material-ui/react-toggle-button/">Toggle Button Group</a> now follows the roving tabindex pattern.</li> <li>♿️ The <a href="https://mui.com/material-ui/react-autocomplete/">Autocomplete</a> announces its loading and no options messages through a new <code>status</code> slot.</li> </ul> <h3><code>@mui/material@9.3.0</code></h3> <ul> <li>[autocomplete] Wrap the no results and loading messages in an aria live region (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48690">#48690</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[buttongroup] Respect global disableRipple / disableFocusRipple in grouped buttons (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48762">#48762</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[checkbox][radio] Respect global disableRipple from MuiButtonBase defaultProps (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48795">#48795</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[formcontrollabel] Add missing <code>labelPlacementEnd</code> class (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48843">#48843</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[listitembutton] Fix typos in component code (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48868">#48868</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[menuitem] Add <code>aria-checked</code> for checkbox and radio menu items (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48651">#48651</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[modal] Replace custom findIndexOf with findIndex (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48827">#48827</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[modal][dialog] Fix scrollbar compensation in Shadow DOM (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48826">#48826</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[select] Fix endAdornment overlapping the open indicator (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48723">#48723</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[tablepagination] Add focus style to default InputBase used in Select (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48871">#48871</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[togglebuttongroup] Add roving tabindex keyboard navigation (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48849">#48849</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <h3><code>@mui/system@9.3.0</code></h3> <ul> <li>Prevent prototype pollution in cssVarsParser (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48822">#48822</a>) <a href="https://github.com/Janpot"><code>@Janpot</code></a></li> </ul> <h3><code>@mui/codemod@9.3.0</code></h3> <ul> <li>Don't leak state between files in v5.0.0/path-imports (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48797">#48797</a>) <a href="https://github.com/manbearwiz"><code>@manbearwiz</code></a></li> <li>Remove use of eval() (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48701">#48701</a>) <a href="https://github.com/oliviertassinari"><code>@oliviertassinari</code></a></li> <li>Transform all style exports in <code>v5.0.0/path-imports</code> codemod (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48800">#48800</a>) <a href="https://github.com/manbearwiz"><code>@manbearwiz</code></a></li> </ul> <h3>Docs</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/mui/material-ui/blob/master/CHANGELOG.md">@mui/material's changelog</a>.</em></p> <blockquote> <h2>9.3.1</h2> <!-- raw HTML omitted --> <p><em>Aug 6, 2026</em></p> <p>A big thanks to the 4 contributors who made this release possible.</p> <h3><code>@mui/material@9.3.1</code></h3> <ul> <li>[transitions] Prevent exit transitions from getting stuck (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48881">#48881</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> </ul> <h3><code>@mui/codemod@9.3.1</code></h3> <ul> <li>Include transforms in published package (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48934">#48934</a>) <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a></li> </ul> <h3>Core</h3> <ul> <li>[blog] Clarify early bird renewal discount scope (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48906">#48906</a>) <a href="https://github.com/DanailH"><code>@DanailH</code></a></li> <li>[test][pagination] Add more unit tests (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48927">#48927</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <p>All contributors of this release in alphabetical order: <a href="https://github.com/brijeshb42"><code>@brijeshb42</code></a>, <a href="https://github.com/DanailH"><code>@DanailH</code></a>, <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a>, <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></p> <h2>9.3.0</h2> <!-- raw HTML omitted --> <p><em>Aug 4, 2026</em></p> <p>A big thanks to the 18 contributors who made this release possible. Here are some highlights ✨:</p> <ul> <li>♿️ Keyboard navigation in the <a href="https://mui.com/material-ui/react-toggle-button/">Toggle Button Group</a> now follows the roving tabindex pattern.</li> <li>♿️ The <a href="https://mui.com/material-ui/react-autocomplete/">Autocomplete</a> announces its loading and no options messages through a new <code>status</code> slot.</li> </ul> <h3><code>@mui/material@9.3.0</code></h3> <ul> <li>[autocomplete] Wrap the no results and loading messages in an aria live region (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48690">#48690</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[buttongroup] Respect global disableRipple / disableFocusRipple in grouped buttons (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48762">#48762</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[checkbox][radio] Respect global disableRipple from MuiButtonBase defaultProps (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48795">#48795</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[formcontrollabel] Add missing <code>labelPlacementEnd</code> class (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48843">#48843</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[listitembutton] Fix typos in component code (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48868">#48868</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[menuitem] Add <code>aria-checked</code> for checkbox and radio menu items (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48651">#48651</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[modal] Replace custom findIndexOf with findIndex (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48827">#48827</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[modal][dialog] Fix scrollbar compensation in Shadow DOM (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48826">#48826</a>) <a href="https://github.com/ZeeshanTamboli"><code>@ZeeshanTamboli</code></a></li> <li>[select] Fix endAdornment overlapping the open indicator (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48723">#48723</a>) <a href="https://github.com/siriwatknp"><code>@siriwatknp</code></a></li> <li>[tablepagination] Add focus style to default InputBase used in Select (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48871">#48871</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> <li>[togglebuttongroup] Add roving tabindex keyboard navigation (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48849">#48849</a>) <a href="https://github.com/silviuaavram"><code>@silviuaavram</code></a></li> </ul> <h3><code>@mui/system@9.3.0</code></h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mui/material-ui/commit/5b91ac75008dbd43286a20ef87847042cc7a44ca"><code>5b91ac7</code></a> [release] v9.3.1 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48935">#48935</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/a13824f0bae9214534d2a35740802d15d711a373"><code>a13824f</code></a> [transitions] Prevent exit transitions from getting stuck (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48881">#48881</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/54e1993311bbc3e61fe1684dfcf3fed784bfdcd8"><code>54e1993</code></a> [test][pagination] Add more unit tests (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48927">#48927</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/da37c088786eead9c7ddaffe0798ec692ece0a11"><code>da37c08</code></a> v9.3.0 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48909">#48909</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/0bb025974d5eca56f626121cd14a21b77e71e982"><code>0bb0259</code></a> [tablepagination] Add focus style to default InputBase used in Select (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48871">#48871</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/20fe2b6aa86965e3f1e2e5b0a82e2ed38f753ffd"><code>20fe2b6</code></a> Bump code-infra:devDependencies (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48891">#48891</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/7fb01101f45fb72fdbeb3d826984030583e71ea9"><code>7fb0110</code></a> [togglebuttongroup] Add roving tabindex keyboard navigation (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48849">#48849</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/3dfeb20bb65e598f90200ef1fc1429d02fa8c4b7"><code>3dfeb20</code></a> [internal] Fix typos in ListItemButton component code (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48868">#48868</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/27f46fa1acabd6d70898b40544f20000bea0149d"><code>27f46fa</code></a> Bump <code>@types/sinon</code> to 22.0.0 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48865">#48865</a>)</li> <li><a href="https://github.com/mui/material-ui/commit/a900cd7d7e66e37248ec0ae8da44d588d0577aa3"><code>a900cd7</code></a> Bump react monorepo to 19.2.8 (<a href="https://github.com/mui/material-ui/tree/HEAD/packages/mui-material/issues/48858">#48858</a>)</li> <li>Additional commits viewable in <a href="https://github.com/mui/material-ui/commits/v9.3.1/packages/mui-material">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
41cbd97b48 |
ci: reuse shared Python dependency cache across workflows (#7693)
# Description of Changes This PR removes workflow-specific cache suffixes from Python dependency caching in several CI workflows. Previously, the following workflows appended their own `cache-suffix` even though they use the same Python dependency files: - `ai-engine.yml` - `check-generated-models.yml` - `pre_commit.yml` - `sync_files_v2.yml` All of these workflows use the same cache dependency inputs: - `engine/pyproject.toml` - `engine/uv.lock` The workflow-specific suffixes caused separate cache entries to be created for effectively identical dependency sets. This resulted in unnecessary cache duplication and reduced cache reuse between workflows. By removing the suffixes, these workflows can now share the same cache when their dependency inputs and other cache key components match. This change reduces redundant cache storage, improves cache hit potential across CI workflows, and avoids repeatedly creating equivalent caches under different names. No functional application behavior is changed. The modification only affects CI cache key generation and reuse. --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have run `task check` to verify linters, typechecks, and tests pass - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#7-testing) for more details. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
993adaa3cd |
build(deps-dev): bump @iconify-json/material-symbols from 1.2.83 to 1.2.89 in /frontend in the iconify group across 1 directory (#7641)
Bumps the iconify group with 1 update in the /frontend directory: [@iconify-json/material-symbols](https://github.com/iconify/icon-sets). Updates `@iconify-json/material-symbols` from 1.2.83 to 1.2.89 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/iconify/icon-sets/commits">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
ead8a536d2 |
feat(editor): move signing sessions onto TanStack Query (#7436)
# Description of Changes Step 4 of the TanStack Query rollout, and the first of the polling hooks. Follows #7264, #7283, #7285. ## The problem `useSigningSessions` hand-rolled its own fetch, loading state and `setInterval`. Two consequences: - **A raw `setInterval` keeps polling a hidden tab.** Browsers throttle background timers, they do not stop them, so a backgrounded editor with Shared Sign open keeps hitting both endpoints for as long as it is open. - **No tests.** The hook had none, and its quietest behaviour (below) is the easiest thing to break without noticing. ## End state One query behind `qk.signingSessions()`, with the polling lifecycle handed to the library: - Polling stops while the tab is hidden, and refetches on return rather than leaving data up to a full interval stale. - Mounts render from cache while they revalidate, so moving between the tool picker and the signing tool no longer flashes an empty list. - 12 tests where there were none. Same return shape, so no consumer files change. ### What this is not This is not a deduplication win. The three consumers are never mounted at the same time: `ToolPanel` renders the tool picker or the active tool and never both, so the badge cannot be on screen with either of the others, and `SharedSigningLauncher` and `useSigningSessionController` sit inside two different tools. The shared key earns its keep on cache reuse across those transitions, not on concurrent fetches. ## The bit worth reviewing The hand-rolled `{ silent: true }` flag encoded three states, and no single Query flag reproduces them: | | Spinner | Toast on failure | |---|---|---| | First load | yes | yes | | Background poll | no | no | | Explicit refetch | **yes** | **yes** | `isLoading` is false during an explicit refetch when data is already on screen; `isFetching` is true during a background poll. Neither matches, so the user-initiated case is tracked with a small flag and the failure toast is gated on `isLoadingError` plus the explicit path. ## Testing Twelve tests. Rather than trust them, each claim was checked by breaking the implementation and confirming the relevant test fails: | Mutation | Caught by | |---|---| | `refetchIntervalInBackground: true` | hidden-tab test | | Drop `refetchOnWindowFocus` | returns-to-view test | | Drop the user-initiated spinner flag | manual-refresh test | | Toast on every error | background-failure-is-silent test | | Give each observer its own key | dedupe test | Three things worth knowing for the next conversion: - **`waitFor` flushes renders.** Recording an index *after* `waitFor(callCount === 2)` skips past the in-flight render, so a "did the spinner flip on" assertion passes vacuously. The marker has to go before the poll. - **Fake timers hide in-flight state.** The fetch settles inside the same `act()`, so the intermediate render never happens. That test uses real timers and a held-open promise. - **`visibilitychange` has to bubble.** query-core listens for it on `window`, and the real event bubbles from `document`. A test helper dispatching a non-bubbling event never reaches the focus manager, and the pause behaviour still appears to work because `refetchInterval` reads `document.visibilityState` directly at tick time rather than through the event. **One claim is deliberately unguarded.** `isLoading` vs `isFetching` for a background poll produces no re-render at all, so there is nothing observable for a test to assert and no user-visible difference to protect. ## Pre-existing failures `task frontend:check` passes typecheck, lint and oxfmt, and 2363 of 2365 editor tests. The two failures, `workbenchSession.test.ts` and `notificationActions.test.tsx`, fail identically with this branch's changes reverted and are untouched by it. ## Scope This is one of five pollers. The remaining four, `useLocalFolderPoller`, `WatchedFolderWorkbenchView`, `SessionDetailPanel` and cloud `TeamSection`, are separate files with their own consumers and follow separately, now that the silent-refresh pattern has a worked example. --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> |
||
|
|
c22d9ecf58 |
feat(editor): move the admin directory onto TanStack Query (#7726)
# Description of Changes Step 5 of the TanStack Query rollout, covering the admin People, Teams and Team details screens. Follows #7264, #7283, #7285. ## The problem Two separate ones, in the same three files. **Reads.** Each section fetched and held its own copy of the same resources: People read the roster and the team list, Teams read the team list plus the roster again when its add-member modal opened, Team details read all three. Cost scaled with how many screens you visited rather than with how much data exists. **Writes.** Thirteen handlers each did the same five things by hand: set a processing flag, call the service, toast the outcome, dig a message out of an axios error, and reload their own slice. Refreshing was a convention, not a mechanism, and one handler had already forgotten it. ## The fix Three shared query keys (`adminUsers`, `teams`, `teamDetails`), and one `useAdminMutation` helper that every write is declared against: ```ts const createTeam = useAdminMutation({ write: (name: string) => teamService.createTeam(name), invalidates: ["teams"], success: t("workspace.teams.createTeam.success"), errorFallback: t("workspace.teams.createTeam.error"), onDone: () => { setNewTeamName(""); setCreateModalOpened(false); }, }); ``` Each write names the slices it disturbs, which is the part that only works when reads and writes are designed together: `createTeam` invalidates the team list, while a membership move invalidates the list, both teams' detail rows and the roster, because it genuinely changes all three. Invalidation refetches only mounted queries, so this costs nothing extra. The blanket "invalidate everything" helper survives in exactly one role: child components (invite, password change, seat update) that write through their own services, where the affected scopes are not visible from the call site. ## Why it is better, measured Request counts come from one harness driving `teams -> team details -> back -> people`, run against the branch point and against this branch. The assertion is committed, so it cannot silently regress. | | Before | After | |---|---|---| | Requests | 7 | **3** | | `getTeams` | 4 | **1** | | `getUsers` | 2 | **1** | | `getTeamDetails` | 1 | 1 | | Committed renders | 17 | **15** | Three is one per distinct resource, the floor for that sequence. The four `getTeams` were the Teams table, Team details fetching the same list for its "move to team" dropdown, the explicit refresh on the back button, and People. Renders barely move, which is expected: this changes where data lives, not how often React draws. It is reported because a caching change can quietly cost renders, and this one does not. On the code itself, across the three sections: | | | |---|---| | Net lines | **-216** | | `useState`/`useEffect` removed | **11**, none added | | Duplicated `isAxiosError` blocks | 13 to **1** | | `setProcessing` calls | 19 to **0** | `isAxiosError` is no longer imported by any of the three files. ## Bug fixed `disableMfaByAdmin` showed a success toast and never refreshed. The menu item renders only when `user.mfaEnabled` is true, so an admin disabled MFA, was told it worked, and watched the option stay on screen until a manual reload. It is covered by a test that fails if the invalidation is removed. ## Behaviour worth checking in review - A write no longer blocks its handler before closing the modal. The dialog closes when the write succeeds and the table updates when the refetch lands, rather than the button spinning through both. - Modal submit buttons now track their own mutation rather than one shared flag. Team details still derives a single busy flag, now from its five mutations rather than a `useState`, so its row actions disable together as before. - The per-handler `console.error` is kept, once, in the shared error path. ## Testing Five tests, each verified by breaking the implementation and confirming that one test, and only that one, fails: | Mutation | Caught by | |---|---| | Drop the shared stale window (`staleTime: 0`) | request-count test | | Make invalidation a no-op | write-visibility test | | Ignore the login-enabled gate | login-disabled test | | Stop invalidating after the MFA write | MFA-refresh test | | Fall back to the generic error message | server-message test | The write tests drive the real flows through their modals and menus rather than calling hooks directly. `task frontend:check` passes typecheck, lint and oxfmt, and 2383 of 2385 editor tests. The two failures, `workbenchSession.test.ts` and `notificationActions.test.tsx`, are untouched here and fail identically with this branch's changes reverted. ## Scope The three services keep their current shape; nothing outside these three sections and the new hook module changes. Child modals that write through their own services still refresh via the blanket helper, and converting those is separate work. |
||
|
|
d3708c1e63 | Highlight the rail entry whose tool is open (#7723) | ||
|
|
1c055f3d18 |
Centre modals in the viewport instead of pinning them near the top (#7715)
## What Every dialog in the processor is the shared `.sui-modal` shell, and its backdrop was top-aligning the panel: ```css align-items: flex-start; padding: 5rem 1.5rem 1.5rem; /* 80px above, 24px below */ ``` On a 900px-tall viewport that started every dialog at `y=80` with ~350px of dead space beneath it. Phones already had an `align-items: center` override; desktop never got one. ## Change `frontend/editor/src/core/ui/Modal.css` only: - Symmetric block inset, `align-items: center`. - The inset is published as `--modal-inset-block`, and `.sui-modal`'s `max-height` derives from it. That coupling is the point: if the two drift apart, a tall modal overflows a centre-aligned backdrop and loses its header off the top of the screen, unreachable. - The phone breakpoint now only moves the variable. Measured at 375x812 it resolves to exactly the previous values (`16px 12px`, `max-height: 780px`), so mobile behaviour is unchanged. One shared file, so this covers flow modals, source / user / pipeline / API-key modals, billing and procurement. ## Before / After <img width="2104" height="2284" alt="image" src="https://github.com/user-attachments/assets/bcb50145-f75e-449e-92c6-a0b085cc091c" /> ## Testing - `task frontend:check` passes (lint + typecheck + 2356 tests). - Phone breakpoint measured directly in the browser, values match the previous behaviour. |
||
|
|
4ab2505a6c |
Comment-quality standard, and the gate that enforces it (#7663)
## The problem AI PRs write comments that restate the line below them, mark sections with box drawing, and narrate the diff. Nothing in the repo said not to, and nothing checked. `AGENTS.md` had one line about comments and it was buried in the Python section. Banners and `Step N:` narration have zero occurrences in the 15 months before Aug 2025, so this is new. ## The fix A written standard, plus a linter that enforces the mechanical part of it on added lines only. - [devGuide/CODE_COMMENTS.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/devGuide/CODE_COMMENTS.md) holds the reasoning and worked examples; a section in [AGENTS.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/AGENTS.md) holds the operative rules, kept short so they stay in an agent's context. The two are split by kind rather than duplicated, because the same prose in two places drifts. - Rules in [comment-rules.mjs](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs), shared by both engines. - Two engines. `.ts` / `.tsx` / `.mjs` go to an [oxlint JS plugin](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-lint-oxlint-plugin.mjs) so comments come from the parser rather than a line scan; `.java` / `.py` go to a [line scanner](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-lint.mjs). Neither reads the other's files, so they cannot disagree about one file. - Between them they read every comment form the repo writes: `//` and `/* */`, Javadoc and JSDoc, JSX comments, `#`, and Python docstrings. - Runs in `task pre-commit`, so the git hook and the `pre_commit.yml` CI job both get it, and as a Claude Code [`Stop` hook](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-lint-hook.mjs) so an agent fixes the comment inside the turn that wrote it. ## The rules The part worth arguing about. **Every rule blocks.** A rule that only warns is a rule nobody acts on, so a finding you believe is wrong is a bug in the rule: narrow it, or mark the line and say why. | | Fires on | | --- | --- | | [CMT001](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L71) | Every word in the comment already appears in the code below it. Max 6 words, skipped for prose punctuation and for a bare Arrange/Act/Assert marker | | [CMT002](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L92) | 4+ rule or box-drawing characters, or a bare section label from [a fixed list](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L84) (`Types`, `Helpers`, `State`, `Handlers`, ...) | | [CMT003](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L110) | `Step N:` with a separator, or `Then,` / `Next,` / `Finally,`. Suppressed in test files | | [CMT004](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L129) | A comment about the code's own past: `this used to`, `renamed from`, `was previously called`. Suppressed in test files | | [CMT005](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L154) | 3+ consecutive comment lines where 2/3 [parse as code](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L143) | | [CMT006](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L31) | A run of implementation comment over 12 lines, outside the first 5 lines of a file. Doc blocks are exempt, because the standard asks for thorough contracts | | [CMT007](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L180) | A parameter or return description that adds no word its name lacks. Reads Javadoc/JSDoc `@param`, Sphinx `:param name:` and Google `name: description` | | [CMT008](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L239) | An allow directive naming a rule that does not exist, or one that silenced nothing | | [CMT009](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L219) | A `TODO` / `FIXME` / `HACK` naming no issue or link. An owner is not accepted: a username goes stale, an issue outlives it | Each rule carries the readings it deliberately excludes, next to the rule. Those exclusions came from running the rules over this repo, not from taste: `CMT004` does not match a bare "no longer needed" because that is as often about runtime lifecycle as about history, and `CMT003` needs a separator after the number so a wrapped line beginning "step 2 unmounts + remounts the panel" reads as the prose it is. A comment sharing a line with code is judged by the rules that do not depend on the code below it, so a trailing `// TODO fix this` or `/* this used to run before the flush */` still reports, while `50L * 1024 * 1024 // 50 MB` does not. `CMT001` would have been wrong about six in seven trailing comments here, so it stays out of them. If a finding is wrong, `// comment-lint-allow: CMT002` on the line above. Rule-specific, [no blanket disable](https://github.com/Stirling-Tools/Stirling-PDF/blob/claude/ai-pr-comment-quality-dd970e/scripts/lint/comment-rules.mjs#L229). A directive naming a rule that does not exist, or silencing nothing, is itself a `CMT008` failure, so a typo cannot quietly disable a rule and a stale one gets deleted rather than accumulating. No native linter covers `CMT007`. `eslint-plugin-jsdoc`'s `require-param-description`, Checkstyle's `NonEmptyAtclauseDescription` and ruff's D-rules all check that a description exists, not whether it says anything. ## Scoping Added comment **text** only, not lines git calls new. Reindenting a file or moving a block makes git mark untouched comments as added; findings are matched against the comment text at the base, so only genuinely new content reports. The whole file is read and every comment in it evaluated. Only the *reporting* is filtered, so a rule still sees the code a comment introduces, the full run it belongs to, and the base version of the file. Existing tree is untouched. `task pre-commit:comment-lint:all` reports it and always exits 0: | | java | ts/js | py | | --- | --- | --- | --- | | findings | 1,218 | 741 | 204 | 2,163 across 542 files, mostly `CMT002` banners (1,482) and `CMT001` restatements (456). Clearing it is separate work, by directory. Not in this PR: an advisory LLM review layer for the things no pattern can judge. ## Verification Run against [#7494](https://github.com/Stirling-Tools/Stirling-PDF/pull/7494) as CI would, in a throwaway worktree: **two findings on a 78 file, +4,512 line change, both genuine banners, in 952ms**. A whole-file scan of those same files gives 11; the other 9 were withheld because that PR's author did not write them, and they are the `@param teamId the team ID` shape this standard exists to stop. Both scanners blank string and character literals before looking for comment markers, because a partial lex desynchronises everything after it: one apostrophe in a Java comment, or one Python template whose closing quotes start a line, is enough to read dozens of lines of code as a single comment. Two fixtures carry canaries that stop being reported if either engine ever desynchronises again. The [fixture corpus](https://github.com/Stirling-Tools/Stirling-PDF/tree/claude/ai-pr-comment-quality-dd970e/scripts/lint/fixtures) pins all 9 rules against both engines, and `--selftest` fails if the two disagree about the same file. ## Two things reviewers should know **The oxlint JS plugin API is alpha.** oxlint itself is stable and already this repo's frontend linter; the plugin API is the new dependency. Its documented failure mode ([oxc#25203](https://github.com/oxc-project/oxc/issues/25203)) is being skipped silently while oxlint still reports success. That affects the standalone release binary rather than the npm package this invokes, but the class of failure reads exactly like clean code, so the run asserts `number_of_rules >= 1` from oxlint's own report and a broken engine exits 2 rather than passing. If the API ever breaks, the fallback is folding these rules into the line scanner, which already implements all nine for Java and Python. **`.claude/settings.json` is now committed**, carrying the hook and nothing else: 19 lines, no `permissions`, nothing machine-specific. That partly reverts `c35546a212` ("Ignore claude dir"), which existed because this file had twice been committed by accident with a personal `permissions` allowlist, once with absolute machine paths. Personal config still belongs in `.claude/settings.local.json`, which the new pattern keeps ignored, and hook entries merge across the two so nobody's own hooks are lost. If you already hand-wrote a `.claude/settings.json`, copy it somewhere first: that path used to be git-ignored, and git overwrites an ignored file without warning when a commit starts tracking it. Across 19 local checkouts here, 13 have `settings.local.json` and none has a hand-written `settings.json`. To turn the hook off, `{ "env": { "COMMENT_LINT_HOOK": "0" } }` in local settings. Claude Code can only disable all hooks at once, hence the switch. The commit-time gate still applies. ## How to test ```bash task pre-commit:comment-lint:ci ``` The fixture corpus, then the diff. The corpus checks the rules themselves rather than the code under review, so it runs on CI and before a rule change, not on every local commit. ```bash task comment-lint:branch ``` `clean (34 files in scope)`. `task comment-lint` is the same thing scoped to uncommitted work, which is what the git hook and CI run. To watch it bite, add `// Is banner` above `export function isBanner` in `scripts/lint/comment-rules.mjs` and run `task comment-lint`: one `CMT001`, exit 1. The gate covers its own source, which is why these scripts have no section dividers. ```bash task pre-commit:comment-lint:all ``` The standing backlog, report-only. Verified on the pinned oxlint 1.77.0, not only the 1.79 the plugin was prototyped against. |