Skip to content

Commit c3c79a4

Browse files
committed
New time period filter (permanently displayed)
1 parent be02439 commit c3c79a4

8 files changed

Lines changed: 244 additions & 315 deletions

File tree

apps/webapp/app/components/primitives/AppliedFilter.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,14 @@ export function AppliedFilter({
3434
}: AppliedFilterProps) {
3535
const variantClassName = variants[variant];
3636
return (
37-
<div className={cn("flex items-center transition", variantClassName.box, className)}>
37+
<div
38+
className={cn(
39+
"flex items-center transition",
40+
variantClassName.box,
41+
!removable && "pr-2",
42+
className
43+
)}
44+
>
3845
<div className="flex items-center gap-0.5">
3946
<div className="text-text-dimmed">
4047
<span>{label}</span>:

apps/webapp/app/components/primitives/DateField.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import { Button } from "./Buttons";
1010

1111
const variants = {
1212
small: {
13-
fieldStyles: "h-5 text-sm rounded-sm px-0.5",
13+
fieldStyles: "h-5 text-xs rounded-sm px-0.5",
1414
nowButtonVariant: "tertiary/small" as const,
1515
clearButtonVariant: "tertiary/small" as const,
1616
},
1717
medium: {
18-
fieldStyles: "h-7 text-base rounded px-1",
18+
fieldStyles: "h-7 text-sm rounded px-1",
1919
nowButtonVariant: "tertiary/medium" as const,
2020
clearButtonVariant: "minimal/medium" as const,
2121
},

apps/webapp/app/components/primitives/Select.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import * as Ariakit from "@ariakit/react";
2-
import { SelectProps as AriaSelectProps } from "@ariakit/react";
2+
import { type SelectProps as AriaSelectProps } from "@ariakit/react";
33
import { SelectValue } from "@ariakit/react-core/select/select-value";
44
import { Link } from "@remix-run/react";
55
import * as React from "react";
66
import { Fragment, useMemo, useState } from "react";
7-
import { ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys";
7+
import { type ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys";
88
import { cn } from "~/utils/cn";
99
import { ShortcutKey } from "./ShortcutKey";
1010
import { ChevronDown } from "lucide-react";
11-
import { MatchSorterOptions, matchSorter } from "match-sorter";
11+
import { type MatchSorterOptions, matchSorter } from "match-sorter";
1212

1313
const sizes = {
1414
small: {

apps/webapp/app/components/primitives/Switch.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33
import * as React from "react";
44
import * as SwitchPrimitives from "@radix-ui/react-switch";
55
import { cn } from "~/utils/cn";
6-
import { ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys";
6+
import { type ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys";
7+
8+
const small = {
9+
container:
10+
"flex items-center h-[1.5rem] gap-x-1.5 rounded hover:bg-tertiary disabled:hover:bg-transparent pr-1 py-[0.1rem] pl-1.5 transition focus-custom disabled:hover:text-charcoal-400 disabled:opacity-50 text-charcoal-400 hover:text-charcoal-200 disabled:hover:cursor-not-allowed hover:cursor-pointer",
11+
root: "h-3 w-6",
12+
thumb: "size-2.5 data-[state=checked]:translate-x-2.5 data-[state=unchecked]:translate-x-0",
13+
text: "text-xs text-text-dimmed",
14+
};
715

816
const variations = {
917
large: {
@@ -12,12 +20,15 @@ const variations = {
1220
thumb: "size-5 data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",
1321
text: "text-sm text-text-dimmed",
1422
},
15-
small: {
16-
container:
17-
"flex items-center h-[1.5rem] gap-x-1.5 rounded hover:bg-tertiary disabled:hover:bg-transparent pr-1 py-[0.1rem] pl-1.5 transition focus-custom disabled:hover:text-charcoal-400 disabled:opacity-50 text-charcoal-400 hover:text-charcoal-200 disabled:hover:cursor-not-allowed hover:cursor-pointer",
18-
root: "h-3 w-6",
19-
thumb: "size-2.5 data-[state=checked]:translate-x-2.5 data-[state=unchecked]:translate-x-0",
20-
text: "text-xs text-text-dimmed",
23+
small,
24+
"tertiary/small": {
25+
container: small.container,
26+
root: cn(
27+
small.root,
28+
"group-data-[state=unchecked]:bg-charcoal-600 group-data-[state=unchecked]:group-hover:bg-charcoal-500/50"
29+
),
30+
thumb: small.thumb,
31+
text: cn(small.text, "transition group-hover:text-text-bright"),
2132
},
2233
};
2334

apps/webapp/app/components/runs/v3/BatchFilters.tsx

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,7 @@ import {
3636
batchStatusTitle,
3737
descriptionForBatchStatus,
3838
} from "./BatchStatus";
39-
import {
40-
AppliedCustomDateRangeFilter,
41-
AppliedPeriodFilter,
42-
appliedSummary,
43-
CreatedAtDropdown,
44-
CustomDateRangeDropdown,
45-
FilterMenuProvider,
46-
} from "./SharedFilters";
39+
import { TimeFilter, appliedSummary, FilterMenuProvider } from "./SharedFilters";
4740

4841
export const BatchStatus = z.enum(allBatchStatuses);
4942

@@ -54,10 +47,7 @@ export const BatchListFilters = z.object({
5447
(value) => (typeof value === "string" ? [value] : value),
5548
BatchStatus.array().optional()
5649
),
57-
period: z.preprocess((value) => (value === "all" ? undefined : value), z.string().optional()),
5850
id: z.string().optional(),
59-
from: z.coerce.number().optional(),
60-
to: z.coerce.number().optional(),
6151
});
6252

6353
export type BatchListFilters = z.infer<typeof BatchListFilters>;
@@ -69,16 +59,12 @@ type BatchFiltersProps = {
6959
export function BatchFilters(props: BatchFiltersProps) {
7060
const location = useOptimisticLocation();
7161
const searchParams = new URLSearchParams(location.search);
72-
const hasFilters =
73-
searchParams.has("statuses") ||
74-
searchParams.has("id") ||
75-
searchParams.has("period") ||
76-
searchParams.has("from") ||
77-
searchParams.has("to");
62+
const hasFilters = searchParams.has("statuses") || searchParams.has("id");
7863

7964
return (
8065
<div className="flex flex-row flex-wrap items-center gap-1">
8166
<FilterMenu {...props} />
67+
<TimeFilter />
8268
<AppliedFilters />
8369
{hasFilters && (
8470
<Form className="h-6">
@@ -101,8 +87,6 @@ const filterTypes = [
10187
</div>
10288
),
10389
},
104-
{ name: "created", title: "Created", icon: <CalendarIcon className="size-4" /> },
105-
{ name: "daterange", title: "Custom date range", icon: <CalendarIcon className="size-4" /> },
10690
{ name: "batch", title: "Batch ID", icon: <Squares2X2Icon className="size-4" /> },
10791
] as const;
10892

@@ -148,8 +132,6 @@ function AppliedFilters() {
148132
return (
149133
<>
150134
<AppliedStatusFilter />
151-
<AppliedPeriodFilter />
152-
<AppliedCustomDateRangeFilter />
153135
<AppliedBatchIdFilter />
154136
</>
155137
);
@@ -169,10 +151,6 @@ function Menu(props: MenuProps) {
169151
return <MainMenu {...props} />;
170152
case "statuses":
171153
return <StatusDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
172-
case "created":
173-
return <CreatedAtDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
174-
case "daterange":
175-
return <CustomDateRangeDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
176154
case "batch":
177155
return <BatchIdDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
178156
}
@@ -181,7 +159,6 @@ function Menu(props: MenuProps) {
181159
function MainMenu({ searchValue, trigger, clearSearchValue, setFilterType }: MenuProps) {
182160
const filtered = useMemo(() => {
183161
return filterTypes.filter((item) => {
184-
if (item.name === "daterange") return false;
185162
return item.title.toLowerCase().includes(searchValue.toLowerCase());
186163
});
187164
}, [searchValue]);

apps/webapp/app/components/runs/v3/RunFilters.tsx

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import * as Ariakit from "@ariakit/react";
22
import {
3-
CalendarIcon,
43
ClockIcon,
5-
CpuChipIcon,
64
FingerPrintIcon,
75
Squares2X2Icon,
86
TagIcon,
@@ -14,6 +12,7 @@ import { ListChecks, ListFilterIcon } from "lucide-react";
1412
import { matchSorter } from "match-sorter";
1513
import { type ReactNode, useCallback, useEffect, useMemo, useState } from "react";
1614
import { z } from "zod";
15+
import { StatusIcon } from "~/assets/icons/StatusIcon";
1716
import { TaskIcon } from "~/assets/icons/TaskIcon";
1817
import { AppliedFilter } from "~/components/primitives/AppliedFilter";
1918
import { DateTime } from "~/components/primitives/DateTime";
@@ -45,14 +44,7 @@ import { useSearchParams } from "~/hooks/useSearchParam";
4544
import { type loader as tagsLoader } from "~/routes/resources.projects.$projectParam.runs.tags";
4645
import { Button } from "../../primitives/Buttons";
4746
import { BulkActionStatusCombo } from "./BulkAction";
48-
import {
49-
AppliedCustomDateRangeFilter,
50-
AppliedPeriodFilter,
51-
appliedSummary,
52-
CreatedAtDropdown,
53-
CustomDateRangeDropdown,
54-
FilterMenuProvider,
55-
} from "./SharedFilters";
47+
import { appliedSummary, FilterMenuProvider, TimeFilter } from "./SharedFilters";
5648
import {
5749
allTaskRunStatuses,
5850
descriptionForTaskRunStatus,
@@ -61,7 +53,6 @@ import {
6153
TaskRunStatusCombo,
6254
} from "./TaskRunStatus";
6355
import { TaskTriggerSourceIcon } from "./TaskTriggerSource";
64-
import { StatusIcon } from "~/assets/icons/StatusIcon";
6556

6657
export const TaskAttemptStatus = z.enum(allTaskRunStatuses);
6758

@@ -117,11 +108,8 @@ export function RunsFilters(props: RunFiltersProps) {
117108
const hasFilters =
118109
searchParams.has("statuses") ||
119110
searchParams.has("tasks") ||
120-
searchParams.has("period") ||
121111
searchParams.has("bulkId") ||
122112
searchParams.has("tags") ||
123-
searchParams.has("from") ||
124-
searchParams.has("to") ||
125113
searchParams.has("batchId") ||
126114
searchParams.has("runId") ||
127115
searchParams.has("scheduleId");
@@ -130,6 +118,7 @@ export function RunsFilters(props: RunFiltersProps) {
130118
<div className="flex flex-row flex-wrap items-center gap-1">
131119
<FilterMenu {...props} />
132120
<RootOnlyToggle defaultValue={props.rootOnlyDefault} />
121+
<TimeFilter />
133122
<AppliedFilters {...props} />
134123
{hasFilters && (
135124
<Form className="h-6">
@@ -153,8 +142,6 @@ const filterTypes = [
153142
},
154143
{ name: "tasks", title: "Tasks", icon: <TaskIcon className="size-4" /> },
155144
{ name: "tags", title: "Tags", icon: <TagIcon className="size-4" /> },
156-
{ name: "created", title: "Created", icon: <CalendarIcon className="size-4" /> },
157-
{ name: "daterange", title: "Custom date range", icon: <CalendarIcon className="size-4" /> },
158145
{ name: "run", title: "Run ID", icon: <FingerPrintIcon className="size-4" /> },
159146
{ name: "batch", title: "Batch ID", icon: <Squares2X2Icon className="size-4" /> },
160147
{ name: "schedule", title: "Schedule ID", icon: <ClockIcon className="size-4" /> },
@@ -175,7 +162,7 @@ function FilterMenu(props: RunFiltersProps) {
175162
<ListFilterIcon className="size-3.5" />
176163
</div>
177164
}
178-
variant={"minimal/small"}
165+
variant={"tertiary/small"}
179166
shortcut={shortcut}
180167
tooltipTitle={"Filter runs"}
181168
>
@@ -205,8 +192,6 @@ function AppliedFilters({ possibleTasks, bulkActions }: RunFiltersProps) {
205192
<AppliedStatusFilter />
206193
<AppliedTaskFilter possibleTasks={possibleTasks} />
207194
<AppliedTagsFilter />
208-
<AppliedPeriodFilter />
209-
<AppliedCustomDateRangeFilter />
210195
<AppliedRunIdFilter />
211196
<AppliedBatchIdFilter />
212197
<AppliedScheduleIdFilter />
@@ -229,13 +214,8 @@ function Menu(props: MenuProps) {
229214
return <MainMenu {...props} />;
230215
case "statuses":
231216
return <StatusDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
232-
233217
case "tasks":
234218
return <TasksDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
235-
case "created":
236-
return <CreatedAtDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
237-
case "daterange":
238-
return <CustomDateRangeDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
239219
case "bulk":
240220
return <BulkActionsDropdown onClose={() => props.setFilterType(undefined)} {...props} />;
241221
case "tags":
@@ -252,7 +232,6 @@ function Menu(props: MenuProps) {
252232
function MainMenu({ searchValue, trigger, clearSearchValue, setFilterType }: MenuProps) {
253233
const filtered = useMemo(() => {
254234
return filterTypes.filter((item) => {
255-
if (item.name === "daterange") return false;
256235
return item.title.toLowerCase().includes(searchValue.toLowerCase());
257236
});
258237
}, [searchValue]);
@@ -699,9 +678,10 @@ function RootOnlyToggle({ defaultValue }: { defaultValue: boolean }) {
699678
return (
700679
<Switch
701680
disabled={disabled}
702-
variant="small"
681+
variant="tertiary/small"
703682
label="Root only"
704683
checked={disabled ? false : rootOnly}
684+
className="bg-tertiary transition hover:bg-charcoal-600"
705685
onCheckedChange={(checked) => {
706686
replace({
707687
rootOnly: checked ? "true" : "false",

0 commit comments

Comments
 (0)