Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 34 additions & 18 deletions products/logs/frontend/LogsScene.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { Sparkline } from 'lib/components/Sparkline'
import { TZLabel, TZLabelProps } from 'lib/components/TZLabel'
import { ListHog } from 'lib/components/hedgehogs'
import { LemonField } from 'lib/lemon-ui/LemonField'
import { humanFriendlyNumber } from 'lib/utils'
import { cn } from 'lib/utils/css-classes'
import { Scene, SceneExport } from 'scenes/sceneTypes'
import { sceneConfigurations } from 'scenes/scenes'
Expand Down Expand Up @@ -67,6 +68,8 @@ export function LogsScene(): JSX.Element {
isPinned,
hasMoreLogsToLoad,
logsPageSize,
totalLogsMatchingFilters,
logsRemainingToLoad,
} = useValues(logsLogic)
const { runQuery, setDateRangeFromSparkline, loadMoreLogs } = useActions(logsLogic)

Expand Down Expand Up @@ -172,10 +175,10 @@ export function LogsScene(): JSX.Element {
disabled={!hasMoreLogsToLoad || logsLoading}
>
{logsLoading
? `Loading up to ${logsPageSize} more logs...`
? 'Loading more logs...'
: hasMoreLogsToLoad
? `Showing first ${parsedLogs.length} ${parsedLogs.length === 1 ? 'entry' : 'entries'} – load up to ${logsPageSize} more`
: `Showing all ${parsedLogs.length} ${parsedLogs.length === 1 ? 'entry' : 'entries'}`}
? `Showing ${humanFriendlyNumber(parsedLogs.length)} of ${humanFriendlyNumber(totalLogsMatchingFilters)} logs – click to load ${humanFriendlyNumber(Math.min(logsPageSize, logsRemainingToLoad))} more`
: `Showing all ${humanFriendlyNumber(parsedLogs.length)} logs`}
</LemonButton>
</div>
)}
Expand Down Expand Up @@ -449,7 +452,15 @@ const Filters = (): JSX.Element => {
}

const DisplayOptions = (): JSX.Element => {
const { orderBy, wrapBody, prettifyJson, timestampFormat, logsPageSize } = useValues(logsLogic)
const {
orderBy,
wrapBody,
prettifyJson,
timestampFormat,
logsPageSize,
totalLogsMatchingFilters,
sparklineLoading,
} = useValues(logsLogic)
const { setOrderBy, setWrapBody, setPrettifyJson, setTimestampFormat, setLogsPageSize } = useActions(logsLogic)

return (
Expand Down Expand Up @@ -490,20 +501,25 @@ const DisplayOptions = (): JSX.Element => {
]}
/>
</div>
<LemonField.Pure label="Page Size" inline className="items-center gap-2">
<LemonSelect
value={logsPageSize}
onChange={(value: number) => setLogsPageSize(value)}
size="small"
type="secondary"
options={[
{ value: 100, label: '100' },
{ value: 200, label: '200' },
{ value: 500, label: '500' },
{ value: 1000, label: '1000' },
]}
/>
</LemonField.Pure>
<div className="flex items-center gap-4">
{!sparklineLoading && totalLogsMatchingFilters > 0 && (
<span className="text-muted text-xs">{humanFriendlyNumber(totalLogsMatchingFilters)} logs</span>
)}
<LemonField.Pure label="Page size" inline className="items-center gap-2">
<LemonSelect
value={logsPageSize}
onChange={(value: number) => setLogsPageSize(value)}
size="small"
type="secondary"
options={[
{ value: 100, label: '100' },
{ value: 200, label: '200' },
{ value: 500, label: '500' },
{ value: 1000, label: '1000' },
]}
/>
</LemonField.Pure>
</div>
</div>
)
}
8 changes: 8 additions & 0 deletions products/logs/frontend/logsLogic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,14 @@ export const logsLogic = kea<logsLogicType>([
return newest
},
],
totalLogsMatchingFilters: [
(s) => [s.sparkline],
(sparkline): number => sparkline.reduce((sum, item) => sum + item.count, 0),
],
logsRemainingToLoad: [
(s) => [s.totalLogsMatchingFilters, s.logs],
(totalLogsMatchingFilters, logs): number => Math.max(0, totalLogsMatchingFilters - logs.length),
],
})),

listeners(({ values, actions }) => ({
Expand Down