Upgrading Umami Version to v3#5
Open
bansalankit92 wants to merge 1960 commits into
Open
Conversation
# Conflicts: # db/clickhouse/schema.sql
fix: declare prop-types and react-aria-components as direct dependencies
fix: include url_query in pages report display
Bumps [icu-minify](https://github.com/amannn/next-intl) from 4.8.4 to 4.11.0. - [Release notes](https://github.com/amannn/next-intl/releases) - [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md) - [Commits](amannn/next-intl@v4.8.4...v4.11.0) --- updated-dependencies: - dependency-name: icu-minify dependency-version: 4.11.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
perf(tracker): defer INP percentile computation to flush time
Colors in the events-tab chart were assigned by the dataset index from Object.keys(map), so changing the date range or reloading the page reshuffled keys and produced a different color for the same event each time. Pick the palette slot deterministically from a hash of the label (hex6 / FNV-1a), and walk the palette greedily in hash-sorted order so the assignment is independent of the API response order. When two labels prefer the same slot, the later one steps to the next free slot, so the visible set of up to 12 events all get distinct colors. The right shift on the hash sidesteps the FNV-1a low-bit bias mod 12 (FNV prime is close to 2^24).
Bumps [hono](https://github.com/honojs/hono) from 4.12.9 to 4.12.18. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](honojs/hono@v4.12.9...v4.12.18) --- updated-dependencies: - dependency-name: hono dependency-version: 4.12.18 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
Clicking a legend item on the events chart toggled hidden via chart.current.getDatasetMeta(idx).hidden, which lives on Chart.js's per-dataset meta object. Each time chartData changed (date-range switch, refetch, focusLabel update) the second useEffect in Chart.tsx replaces datasets wholesale, Chart.js regenerates the meta, and the hidden flags vanish, so previously-toggled-off events came back on their own. Lift the hidden state into React. EventsChart owns a Set<string> of hidden labels and passes it down via a new optional hiddenLabels prop on Chart, plus an onLegendClick callback for controlled toggling. Chart re-applies hidden after the existing focusLabel pass so the set survives every data refresh, and falls back to the original meta-based behaviour when no callback is provided so other charts (website overview, revenue) keep their existing semantics. Verified with the seeded Demo SaaS data: hide signup_started in the Last 24 hours view, switch to Last 7 days then Last 30 days, the label stays greyed in the legend and absent from the bars; clicking again restores it. State is component-scoped, so it intentionally resets on reload or navigation away from the events page.
Address Greptile review on PR #4257: hex6(key) was parsed twice per label, once in the sort comparator and once when deriving the preferred palette slot. Cache the parsed integer in a local hashOf map so the sort comparator and the slot lookup share one computation per label, no behaviour change.
Address Greptile P1 review on PR #4259. The hiddenLabels loop only wrote ds.hidden = true and never reset to false when a label was removed from the set. Toggle-off worked today only because the focusLabel block above ran first and unconditionally cleared all ds.hidden when focusLabel was falsy. That block is guarded by chartData.focusLabel !== null, so any caller passing focusLabel={null} would skip the reset and leave a stale true on reused dataset objects across effect re-runs, making un-hide silently fail. Add an else-if branch to the hiddenLabels loop that resets ds.hidden to false when the label is not in the set and no focusLabel is active. Behavior is unchanged for EventsChart (which never passes a null focusLabel) and the contract of the new props is now independent of execution order.
Address Greptile P2 review on PR #4259. willBeHidden was derived from !ds.hidden, but ds.hidden can be set by the focusLabel pass too, so the dataset flag is not a faithful read of the controlled hidden state. In a chart that uses both focusLabel and hiddenLabels at once, the callback could fire with a misleading toggle direction. Read directly from hiddenLabels instead, with optional chaining so the new path is a no-op when hiddenLabels is not provided. Behavior is unchanged for EventsChart (which does not use focusLabel today) but the controlled state is now the single source of truth.
The chart canvas in src/components/charts/Chart.tsx was rendered directly inside the Box wrapper. Chart.js writes inline pixel sizes onto the canvas, and while the canvas lives in the normal flow that pixel width propagates up as min and max content through every flex parent and into the surrounding CSS Grid track on the Tabs panel. The track therefore stayed at whatever width the canvas had when the page first loaded, and the chart could only grow on resize, never shrink, until the user reloaded. Wrap the canvas in a position-relative div and position the canvas absolutely. Out-of-flow elements do not contribute to ancestor intrinsic sizing, so the wrapper now takes its size purely from the parent layout. Chart.js' ResizeObserver picks up the wrapper size and resizes the canvas to fit, in both directions, without a reload. Verified in playwright with resize 1280 to 800 (canvas 925 to 699) and 800 to 1400 (canvas 699 to 1117), both without reload, and that the click-to-toggle legend, the focusLabel hover behaviour, and the website overview / revenue charts that share this component all still render and update normally.
DataGrid was already injecting displayMode='cards' on small viewports via useMobile() and leaving it undefined (default 'table') everywhere else. The user had no way to override either side: someone on a wide screen who preferred a denser card list could not get there, and someone on a tablet with a tall narrow window could not force the table view to keep their layout consistent. Add a small icon toggle in the DataGrid header row that flips between table and cards, and persist the choice in localStorage under umami.datagrid.displayMode. The user choice wins; if there is none, the existing useMobile-driven default applies. Every DataGrid consumer (sessions, websites, links, pixels, boards, team admin, etc.) gets the toggle automatically with no caller-side change. Verified in playwright on the sessions page: at 1400 viewport the default is table; clicking the toggle switches to cards and a reload keeps cards. At 800 viewport the default is cards; clicking the toggle switches to table even though useMobile would otherwise force cards. Round trip in both directions works and the choice survives navigation away and back.
…card The react-zen DataTable lays its columns out on a CSS Grid with fixed pixel widths, so the sum of column widths becomes the table's max-content. Without an overflow boundary that width propagates up through the surrounding flex chain into the Tabs panel grid track, forcing every ancestor wider than the viewport. Dropping in overflow-x: auto alone is not enough because the wrapper still stretches to its parent's width, and the parent's width is still driven by max-content from the table. Wrap the rendered DataTable in DataGrid in a single-column CSS Grid sized as minmax(0, 1fr) with overflow-x: auto. The minmax explicitly caps the wrapper's track at the available 1fr space (instead of following content's max-content), so the wrapper takes its size from the layout and overflow-x: auto produces a horizontal scrollbar when the table is wider than the viewport. No prop changes; every DataGrid consumer (sessions, websites, links, pixels, boards, team admin, etc.) gets the behaviour without any caller-side change. Verified in playwright on the sessions table at 1024 viewport: the table stays inside the card and exposes a horizontal scrollbar so all 9 columns are reachable. At 1600 viewport the table fits naturally and no scrollbar appears.
Address Greptile review on PR #4262. P2 (line 62): the value read back from localStorage was typed as any and trusted blindly, so a value written by an extension or a manual edit could end up as the chart's displayMode. Read it once, keep only 'table' or 'cards', otherwise fall back to null and let the existing useMobile-driven default decide. Self-correcting on the next click is no longer necessary because the next render is already clean. P2 (line 114): the empty <span /> was a flex placeholder that existed only to make justify-content: space-between push the toggle button to the right when allowSearch was false. Drop the span, drop space-between, and put marginLeft: auto on the inner Row holding the actions and the toggle. The toggle now hugs the right edge whether search is rendered or not, with no extra DOM node. style={{}} is used because the react-zen Row marginLeft prop only accepts spacing tokens, not auto. Verified in Playwright at 1400 viewport: the toggle is now flush with the right edge of the action row, the toggle still flips between table and cards on click, and a deliberately invalid localStorage value ({"malicious":true}) is rejected on reload so the page falls back to the table default.
Address Greptile P2 review on PR #4260. Before Chart.js' first ResizeObserver callback fires the canvas keeps its HTML5 default size of 300x150. With position: absolute that no longer pushes any ancestor's intrinsic size, but on a wrapper narrower than 300px the canvas can still poke past the wrapper for one frame before Chart.js catches up. Adding overflow: hidden to the relative wrapper clips that transient overflow and is the pattern Chart.js' own docs recommend for responsive charts inside flex / grid layouts. No steady-state behaviour change because the canvas is already sized to the wrapper once Chart.js takes over; the React tooltip lives outside this wrapper so it remains visible.
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](fastify/fast-uri@v3.1.0...v3.1.2) --- updated-dependencies: - dependency-name: fast-uri dependency-version: 3.1.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
…ed in API Response
…losure-returned-in-response fix: Information Disclosure: Internal Prisma & Database Errors Return…
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
fix: wrap long distinct ids in session info
… password fingerprint.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.