@shipfox/client-triggers 5.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +50 -0
- package/dist/components/events-filter-bar.d.ts +3 -4
- package/dist/components/events-filter-bar.d.ts.map +1 -1
- package/dist/components/events-filter-bar.js +8 -16
- package/dist/components/events-filter-bar.js.map +1 -1
- package/dist/components/events-list.d.ts.map +1 -1
- package/dist/components/events-list.js +2 -4
- package/dist/components/events-list.js.map +1 -1
- package/dist/components/events-list.stories.d.ts +1 -16
- package/dist/components/events-list.stories.d.ts.map +1 -1
- package/dist/components/events-list.stories.js +2 -1
- package/dist/components/events-list.stories.js.map +1 -1
- package/dist/components/trigger-event-detail.d.ts +2 -2
- package/dist/components/trigger-event-detail.d.ts.map +1 -1
- package/dist/components/trigger-event-detail.js +7 -7
- package/dist/components/trigger-event-detail.js.map +1 -1
- package/dist/components/trigger-event-detail.stories.d.ts +1 -36
- package/dist/components/trigger-event-detail.stories.d.ts.map +1 -1
- package/dist/components/trigger-event-detail.stories.js +6 -3
- package/dist/components/trigger-event-detail.stories.js.map +1 -1
- package/dist/components/trigger-event-result.d.ts +2 -2
- package/dist/components/trigger-event-result.d.ts.map +1 -1
- package/dist/components/trigger-event-result.js +8 -16
- package/dist/components/trigger-event-result.js.map +1 -1
- package/dist/components/trigger-event-row.d.ts +2 -2
- package/dist/components/trigger-event-row.d.ts.map +1 -1
- package/dist/components/trigger-event-row.js +1 -1
- package/dist/components/trigger-event-row.js.map +1 -1
- package/dist/components/trigger-source-icon.d.ts +8 -6
- package/dist/components/trigger-source-icon.d.ts.map +1 -1
- package/dist/components/trigger-source-icon.js +4 -3
- package/dist/components/trigger-source-icon.js.map +1 -1
- package/dist/components/types.d.ts +3 -4
- package/dist/components/types.d.ts.map +1 -1
- package/dist/components/types.js.map +1 -1
- package/dist/core/trigger-event.d.ts +78 -0
- package/dist/core/trigger-event.d.ts.map +1 -0
- package/dist/core/trigger-event.js +71 -0
- package/dist/core/trigger-event.js.map +1 -0
- package/dist/feature.d.ts +7 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +10 -9
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/trigger-event-mapper.d.ts +7 -0
- package/dist/hooks/api/trigger-event-mapper.d.ts.map +1 -0
- package/dist/hooks/api/trigger-event-mapper.js +57 -0
- package/dist/hooks/api/trigger-event-mapper.js.map +1 -0
- package/dist/hooks/api/trigger-events.d.ts +15 -138
- package/dist/hooks/api/trigger-events.d.ts.map +1 -1
- package/dist/hooks/api/trigger-events.js +44 -47
- package/dist/hooks/api/trigger-events.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pages/events-page.d.ts +1 -1
- package/dist/pages/events-page.d.ts.map +1 -1
- package/dist/pages/events-page.js +1 -1
- package/dist/pages/events-page.js.map +1 -1
- package/dist/routes/events-settings.js.map +1 -1
- package/dist/search.d.ts +3 -3
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +3 -4
- package/dist/search.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/components/events-filter-bar.tsx +16 -11
- package/src/components/events-list.stories.tsx +3 -2
- package/src/components/events-list.test.tsx +4 -3
- package/src/components/events-list.tsx +2 -12
- package/src/components/trigger-event-detail.stories.tsx +7 -3
- package/src/components/trigger-event-detail.test.tsx +6 -1
- package/src/components/trigger-event-detail.tsx +21 -18
- package/src/components/trigger-event-result.test.ts +6 -6
- package/src/components/trigger-event-result.ts +9 -13
- package/src/components/trigger-event-row.tsx +5 -5
- package/src/components/trigger-source-icon.tsx +9 -7
- package/src/components/types.ts +7 -7
- package/src/core/trigger-event.test.ts +40 -0
- package/src/core/trigger-event.ts +126 -0
- package/src/feature.ts +6 -4
- package/src/hooks/api/trigger-event-mapper.test.ts +88 -0
- package/src/hooks/api/trigger-event-mapper.ts +76 -0
- package/src/hooks/api/trigger-events.test.ts +49 -12
- package/src/hooks/api/trigger-events.ts +96 -56
- package/src/index.ts +1 -0
- package/src/pages/events-page.test.tsx +4 -4
- package/src/pages/events-page.tsx +3 -4
- package/src/routes/events-settings.tsx +1 -1
- package/src/search.ts +4 -5
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vercel.json +5 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled:
|
|
2
|
+
Successfully compiled: 18 files with swc (431.41ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,55 @@
|
|
|
1
1
|
# @shipfox/client-triggers
|
|
2
2
|
|
|
3
|
+
## 6.0.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [4b85404]
|
|
8
|
+
- Updated dependencies [102c5f4]
|
|
9
|
+
- @shipfox/api-triggers-dto@9.0.2
|
|
10
|
+
- @shipfox/react-ui@0.3.7
|
|
11
|
+
- @shipfox/client-ui@6.0.2
|
|
12
|
+
- @shipfox/client-shell@6.0.2
|
|
13
|
+
- @shipfox/integration-icons@0.2.2
|
|
14
|
+
|
|
15
|
+
## 6.0.1
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- 475ce59: Republishes all public packages after restoring release authorization.
|
|
20
|
+
- Updated dependencies [475ce59]
|
|
21
|
+
- Updated dependencies [3f8f1cb]
|
|
22
|
+
- @shipfox/api-triggers-dto@9.0.1
|
|
23
|
+
- @shipfox/client-api@6.0.1
|
|
24
|
+
- @shipfox/client-shell@6.0.1
|
|
25
|
+
- @shipfox/client-ui@6.0.1
|
|
26
|
+
- @shipfox/integration-icons@0.2.1
|
|
27
|
+
- @shipfox/react-ui@0.3.6
|
|
28
|
+
|
|
29
|
+
## 6.0.0
|
|
30
|
+
|
|
31
|
+
### Minor Changes
|
|
32
|
+
|
|
33
|
+
- 401b583: Exposes typed feature-owned navigation and settings contributions and enforces coordinator-owned client composition.
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
- f2d50a8: Extracts shared integration provider icons into a leaf package so client features can render them without depending on integration routing code.
|
|
38
|
+
- Updated dependencies [401b583]
|
|
39
|
+
- Updated dependencies [82eda45]
|
|
40
|
+
- Updated dependencies [f2d50a8]
|
|
41
|
+
- Updated dependencies [cd90c19]
|
|
42
|
+
- Updated dependencies [24be269]
|
|
43
|
+
- Updated dependencies [c56c124]
|
|
44
|
+
- Updated dependencies [4a6d124]
|
|
45
|
+
- Updated dependencies [c02ac42]
|
|
46
|
+
- @shipfox/client-shell@6.0.0
|
|
47
|
+
- @shipfox/integration-icons@0.2.0
|
|
48
|
+
- @shipfox/client-api@6.0.0
|
|
49
|
+
- @shipfox/api-triggers-dto@5.0.0
|
|
50
|
+
- @shipfox/client-ui@6.0.0
|
|
51
|
+
- @shipfox/react-ui@0.3.5
|
|
52
|
+
|
|
3
53
|
## 5.0.0
|
|
4
54
|
|
|
5
55
|
### Patch Changes
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type { TriggerEventFilters } from '#hooks/api/trigger-events.js';
|
|
1
|
+
import { type TriggerEventFacetItem, type TriggerEventFilters } from '#core/trigger-event.js';
|
|
3
2
|
interface EventsFilterBarProps {
|
|
4
3
|
filters: TriggerEventFilters;
|
|
5
4
|
onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;
|
|
6
|
-
sources:
|
|
7
|
-
events:
|
|
5
|
+
sources: TriggerEventFacetItem[] | undefined;
|
|
6
|
+
events: TriggerEventFacetItem[] | undefined;
|
|
8
7
|
hasActiveFilters: boolean;
|
|
9
8
|
onClear: () => void;
|
|
10
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-filter-bar.d.ts","sourceRoot":"","sources":["../../src/components/events-filter-bar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events-filter-bar.d.ts","sourceRoot":"","sources":["../../src/components/events-filter-bar.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EAIzB,MAAM,wBAAwB,CAAC;AAwBhC,UAAU,oBAAoB;IAC5B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;IAC/D,OAAO,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,eAAe,EACf,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,OAAO,GACR,EAAE,oBAAoB,+BA2HtB"}
|
|
@@ -6,36 +6,28 @@ import { DateRangePicker } from '@shipfox/react-ui/date-range-picker';
|
|
|
6
6
|
import { Text } from '@shipfox/react-ui/typography';
|
|
7
7
|
import { cn } from '@shipfox/react-ui/utils';
|
|
8
8
|
import { useState } from 'react';
|
|
9
|
+
import { triggerEventResultFilterOutcomes } from '#core/trigger-event.js';
|
|
9
10
|
// Filters expose the same plain-language results shown in the table. `failed`
|
|
10
11
|
// includes `errored` so the Failed filter does not hide rows rendered as failed.
|
|
11
12
|
const RESULT_FILTERS = [
|
|
12
13
|
{
|
|
13
|
-
value: '
|
|
14
|
-
selects:
|
|
15
|
-
'routed'
|
|
16
|
-
],
|
|
14
|
+
value: 'triggered',
|
|
15
|
+
selects: triggerEventResultFilterOutcomes.triggered,
|
|
17
16
|
label: 'Triggered'
|
|
18
17
|
},
|
|
19
18
|
{
|
|
20
|
-
value: '
|
|
21
|
-
selects: [
|
|
22
|
-
'discarded'
|
|
23
|
-
],
|
|
19
|
+
value: 'no-match',
|
|
20
|
+
selects: triggerEventResultFilterOutcomes['no-match'],
|
|
24
21
|
label: 'No match'
|
|
25
22
|
},
|
|
26
23
|
{
|
|
27
24
|
value: 'failed',
|
|
28
|
-
selects:
|
|
29
|
-
'failed',
|
|
30
|
-
'errored'
|
|
31
|
-
],
|
|
25
|
+
selects: triggerEventResultFilterOutcomes.failed,
|
|
32
26
|
label: 'Failed'
|
|
33
27
|
},
|
|
34
28
|
{
|
|
35
|
-
value: '
|
|
36
|
-
selects:
|
|
37
|
-
'received'
|
|
38
|
-
],
|
|
29
|
+
value: 'evaluating',
|
|
30
|
+
selects: triggerEventResultFilterOutcomes.evaluating,
|
|
39
31
|
label: 'Evaluating'
|
|
40
32
|
}
|
|
41
33
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/events-filter-bar.tsx"],"sourcesContent":["import type {TriggerEventFacetItemDto, TriggerEventOutcomeDto} from '@shipfox/api-triggers-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Collapsible, CollapsibleContent, CollapsibleTrigger} from '@shipfox/react-ui/collapsible';\nimport {Combobox, type ComboboxOption} from '@shipfox/react-ui/combobox';\nimport {type DateRange, DateRangePicker} from '@shipfox/react-ui/date-range-picker';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {type ReactNode, useState} from 'react';\nimport type {TriggerEventFilters} from '#hooks/api/trigger-events.js';\n\n// Filters expose the same plain-language results shown in the table. `failed`\n// includes `errored` so the Failed filter does not hide rows rendered as failed.\nconst RESULT_FILTERS: {\n value: TriggerEventOutcomeDto;\n selects: TriggerEventOutcomeDto[];\n label: string;\n}[] = [\n {value: 'routed', selects: ['routed'], label: 'Triggered'},\n {value: 'discarded', selects: ['discarded'], label: 'No match'},\n {value: 'failed', selects: ['failed', 'errored'], label: 'Failed'},\n {value: 'received', selects: ['received'], label: 'Evaluating'},\n];\n\nconst RESULT_OPTIONS: ComboboxOption[] = RESULT_FILTERS.map(({value, label}) => ({value, label}));\n\nfunction toOptions(facets: TriggerEventFacetItemDto[] | undefined): ComboboxOption[] {\n return (facets ?? []).map((facet) => ({\n value: facet.value,\n label: `${facet.value} (${facet.count})`,\n }));\n}\n\ninterface EventsFilterBarProps {\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n sources: TriggerEventFacetItemDto[] | undefined;\n events: TriggerEventFacetItemDto[] | undefined;\n hasActiveFilters: boolean;\n onClear: () => void;\n}\n\nexport function EventsFilterBar({\n filters,\n onFiltersChange,\n sources,\n events,\n hasActiveFilters,\n onClear,\n}: EventsFilterBarProps) {\n const [open, setOpen] = useState(false);\n\n const dateRange: DateRange | undefined =\n filters.from || filters.to\n ? {\n start: filters.from ? new Date(filters.from) : undefined,\n end: filters.to ? new Date(filters.to) : undefined,\n }\n : undefined;\n\n const selectedOutcomes = new Set(filters.outcome ?? []);\n const resultValue = RESULT_FILTERS.filter(({selects}) =>\n selects.some((outcome) => selectedOutcomes.has(outcome)),\n ).map(({value}) => value);\n\n // Count active dimensions, not selected options, so the badge stays stable as chips grow.\n const activeCount =\n (dateRange ? 1 : 0) +\n (filters.source?.length ? 1 : 0) +\n (filters.event?.length ? 1 : 0) +\n (resultValue.length > 0 ? 1 : 0);\n\n function handleResultValue(values: string[]) {\n const next = RESULT_FILTERS.filter(({value}) => values.includes(value)).flatMap(\n ({selects}) => selects,\n );\n onFiltersChange({outcome: next.length > 0 ? next : undefined});\n }\n\n function handleDateRange(range: DateRange | undefined) {\n const from = range?.start ? new Date(range.start).toISOString() : undefined;\n let to: string | undefined;\n if (range?.end) {\n // The backend filters received_at <= to; extend to end-of-day so the picked end\n // date is inclusive rather than cutting off at its midnight.\n const end = new Date(range.end);\n end.setHours(23, 59, 59, 999);\n to = end.toISOString();\n }\n onFiltersChange({from, to});\n }\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center justify-between gap-8 border-b border-border-neutral-base px-12 py-8\">\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n iconLeft=\"filter3Line\"\n iconRight={open ? 'arrowUpSLine' : 'arrowDownSLine'}\n >\n {activeCount > 0 ? `Filters (${activeCount})` : 'Filters'}\n </Button>\n </CollapsibleTrigger>\n {hasActiveFilters ? (\n <Button type=\"button\" size=\"2xs\" variant=\"transparentMuted\" onClick={onClear}>\n Clear filters\n </Button>\n ) : null}\n </div>\n <CollapsibleContent>\n <div className=\"grid grid-cols-1 gap-x-12 gap-y-10 border-b border-border-neutral-base px-12 py-12 min-[520px]:grid-cols-2\">\n <FilterField label=\"Date\" className=\"col-span-full\">\n <DateRangePicker\n size=\"small\"\n className=\"w-full\"\n {...(dateRange ? {dateRange} : {})}\n onDateRangeSelect={handleDateRange}\n onClear={() => onFiltersChange({from: undefined, to: undefined})}\n placeholder=\"Any date\"\n />\n </FilterField>\n <FilterField label=\"Result\">\n <Combobox\n multiple\n size=\"small\"\n aria-label=\"Filter by result\"\n options={RESULT_OPTIONS}\n value={resultValue}\n onValueChange={handleResultValue}\n placeholder=\"All results\"\n emptyState=\"No results\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Source\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(sources)}\n value={filters.source ?? []}\n onValueChange={(value) =>\n onFiltersChange({source: value.length > 0 ? value : undefined})\n }\n placeholder=\"All sources\"\n emptyState=\"No sources yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Event\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(events)}\n value={filters.event ?? []}\n onValueChange={(value) =>\n onFiltersChange({event: value.length > 0 ? value : undefined})\n }\n placeholder=\"All events\"\n emptyState=\"No events yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction FilterField({\n label,\n className,\n children,\n}: {\n label: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <div className={cn('flex min-w-0 flex-col gap-4', className)}>\n <Text size=\"xs\" className=\"font-medium text-foreground-neutral-muted\">\n {label}\n </Text>\n {children}\n </div>\n );\n}\n"],"names":["Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Combobox","DateRangePicker","Text","cn","useState","RESULT_FILTERS","value","selects","label","RESULT_OPTIONS","map","toOptions","facets","facet","count","EventsFilterBar","filters","onFiltersChange","sources","events","hasActiveFilters","onClear","open","setOpen","dateRange","from","to","start","Date","undefined","end","selectedOutcomes","Set","outcome","resultValue","filter","some","has","activeCount","source","length","event","handleResultValue","values","next","includes","flatMap","handleDateRange","range","toISOString","setHours","onOpenChange","div","className","asChild","type","variant","size","iconLeft","iconRight","onClick","FilterField","onDateRangeSelect","placeholder","multiple","aria-label","options","onValueChange","emptyState","maxVisibleChips","children"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/events-filter-bar.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Collapsible, CollapsibleContent, CollapsibleTrigger} from '@shipfox/react-ui/collapsible';\nimport {Combobox, type ComboboxOption} from '@shipfox/react-ui/combobox';\nimport {type DateRange, DateRangePicker} from '@shipfox/react-ui/date-range-picker';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {type ReactNode, useState} from 'react';\nimport {\n type TriggerEventFacetItem,\n type TriggerEventFilters,\n type TriggerEventOutcome,\n type TriggerEventResultKind,\n triggerEventResultFilterOutcomes,\n} from '#core/trigger-event.js';\n\n// Filters expose the same plain-language results shown in the table. `failed`\n// includes `errored` so the Failed filter does not hide rows rendered as failed.\nconst RESULT_FILTERS: {\n value: TriggerEventResultKind;\n selects: readonly TriggerEventOutcome[];\n label: string;\n}[] = [\n {value: 'triggered', selects: triggerEventResultFilterOutcomes.triggered, label: 'Triggered'},\n {value: 'no-match', selects: triggerEventResultFilterOutcomes['no-match'], label: 'No match'},\n {value: 'failed', selects: triggerEventResultFilterOutcomes.failed, label: 'Failed'},\n {value: 'evaluating', selects: triggerEventResultFilterOutcomes.evaluating, label: 'Evaluating'},\n];\n\nconst RESULT_OPTIONS: ComboboxOption[] = RESULT_FILTERS.map(({value, label}) => ({value, label}));\n\nfunction toOptions(facets: TriggerEventFacetItem[] | undefined): ComboboxOption[] {\n return (facets ?? []).map((facet) => ({\n value: facet.value,\n label: `${facet.value} (${facet.count})`,\n }));\n}\n\ninterface EventsFilterBarProps {\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n sources: TriggerEventFacetItem[] | undefined;\n events: TriggerEventFacetItem[] | undefined;\n hasActiveFilters: boolean;\n onClear: () => void;\n}\n\nexport function EventsFilterBar({\n filters,\n onFiltersChange,\n sources,\n events,\n hasActiveFilters,\n onClear,\n}: EventsFilterBarProps) {\n const [open, setOpen] = useState(false);\n\n const dateRange: DateRange | undefined =\n filters.from || filters.to\n ? {\n start: filters.from ? new Date(filters.from) : undefined,\n end: filters.to ? new Date(filters.to) : undefined,\n }\n : undefined;\n\n const selectedOutcomes = new Set(filters.outcome ?? []);\n const resultValue = RESULT_FILTERS.filter(({selects}) =>\n selects.some((outcome) => selectedOutcomes.has(outcome)),\n ).map(({value}) => value);\n\n // Count active dimensions, not selected options, so the badge stays stable as chips grow.\n const activeCount =\n (dateRange ? 1 : 0) +\n (filters.source?.length ? 1 : 0) +\n (filters.event?.length ? 1 : 0) +\n (resultValue.length > 0 ? 1 : 0);\n\n function handleResultValue(values: string[]) {\n const next = RESULT_FILTERS.filter(({value}) => values.includes(value)).flatMap(\n ({selects}) => selects,\n );\n onFiltersChange({outcome: next.length > 0 ? next : undefined});\n }\n\n function handleDateRange(range: DateRange | undefined) {\n const from = range?.start ? new Date(range.start).toISOString() : undefined;\n let to: string | undefined;\n if (range?.end) {\n // The backend filters received_at <= to; extend to end-of-day so the picked end\n // date is inclusive rather than cutting off at its midnight.\n const end = new Date(range.end);\n end.setHours(23, 59, 59, 999);\n to = end.toISOString();\n }\n onFiltersChange({from, to});\n }\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center justify-between gap-8 border-b border-border-neutral-base px-12 py-8\">\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n iconLeft=\"filter3Line\"\n iconRight={open ? 'arrowUpSLine' : 'arrowDownSLine'}\n >\n {activeCount > 0 ? `Filters (${activeCount})` : 'Filters'}\n </Button>\n </CollapsibleTrigger>\n {hasActiveFilters ? (\n <Button type=\"button\" size=\"2xs\" variant=\"transparentMuted\" onClick={onClear}>\n Clear filters\n </Button>\n ) : null}\n </div>\n <CollapsibleContent>\n <div className=\"grid grid-cols-1 gap-x-12 gap-y-10 border-b border-border-neutral-base px-12 py-12 min-[520px]:grid-cols-2\">\n <FilterField label=\"Date\" className=\"col-span-full\">\n <DateRangePicker\n size=\"small\"\n className=\"w-full\"\n {...(dateRange ? {dateRange} : {})}\n onDateRangeSelect={handleDateRange}\n onClear={() => onFiltersChange({from: undefined, to: undefined})}\n placeholder=\"Any date\"\n />\n </FilterField>\n <FilterField label=\"Result\">\n <Combobox\n multiple\n size=\"small\"\n aria-label=\"Filter by result\"\n options={RESULT_OPTIONS}\n value={resultValue}\n onValueChange={handleResultValue}\n placeholder=\"All results\"\n emptyState=\"No results\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Source\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(sources)}\n value={filters.source ?? []}\n onValueChange={(value) =>\n onFiltersChange({source: value.length > 0 ? value : undefined})\n }\n placeholder=\"All sources\"\n emptyState=\"No sources yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n <FilterField label=\"Event\">\n <Combobox\n multiple\n size=\"small\"\n options={toOptions(events)}\n value={filters.event ?? []}\n onValueChange={(value) =>\n onFiltersChange({event: value.length > 0 ? value : undefined})\n }\n placeholder=\"All events\"\n emptyState=\"No events yet\"\n className=\"w-full\"\n maxVisibleChips={2}\n />\n </FilterField>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction FilterField({\n label,\n className,\n children,\n}: {\n label: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <div className={cn('flex min-w-0 flex-col gap-4', className)}>\n <Text size=\"xs\" className=\"font-medium text-foreground-neutral-muted\">\n {label}\n </Text>\n {children}\n </div>\n );\n}\n"],"names":["Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Combobox","DateRangePicker","Text","cn","useState","triggerEventResultFilterOutcomes","RESULT_FILTERS","value","selects","triggered","label","failed","evaluating","RESULT_OPTIONS","map","toOptions","facets","facet","count","EventsFilterBar","filters","onFiltersChange","sources","events","hasActiveFilters","onClear","open","setOpen","dateRange","from","to","start","Date","undefined","end","selectedOutcomes","Set","outcome","resultValue","filter","some","has","activeCount","source","length","event","handleResultValue","values","next","includes","flatMap","handleDateRange","range","toISOString","setHours","onOpenChange","div","className","asChild","type","variant","size","iconLeft","iconRight","onClick","FilterField","onDateRangeSelect","placeholder","multiple","aria-label","options","onValueChange","emptyState","maxVisibleChips","children"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../src/components/events-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../src/components/events-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAEhD,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,aAAa,GACd,EAAE,eAAe,+BAsEjB"}
|
|
@@ -2,14 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { QueryLoadError } from '@shipfox/client-ui';
|
|
3
3
|
import { Button } from '@shipfox/react-ui/button';
|
|
4
4
|
import { Table, TableBody, TableHead, TableHeader, TableRow } from '@shipfox/react-ui/table';
|
|
5
|
+
import { hasTriggerEventFilters } from '#core/trigger-event.js';
|
|
5
6
|
import { EventsFilterBar } from './events-filter-bar.js';
|
|
6
7
|
import { EventsListEmpty, EventsListNoMatches, EventsListSkeleton, EventsListStaleError } from './events-list-states.js';
|
|
7
8
|
import { TriggerEventRow } from './trigger-event-row.js';
|
|
8
|
-
function hasAnyFilter(filters) {
|
|
9
|
-
return Boolean(filters.source && filters.source.length > 0 || filters.event && filters.event.length > 0 || filters.from || filters.to || filters.outcome && filters.outcome.length > 0);
|
|
10
|
-
}
|
|
11
9
|
export function EventsList({ events, query, facets, filters, onFiltersChange, workspaceId, hasNextPage, isFetchingNextPage, onLoadMore, selectedEventId, onSelectEvent }) {
|
|
12
|
-
const activeFilters =
|
|
10
|
+
const activeFilters = hasTriggerEventFilters(filters);
|
|
13
11
|
const refreshFailed = query.isError && query.data !== undefined;
|
|
14
12
|
const showEmptyState = !query.isPending && !query.isError && events.length === 0;
|
|
15
13
|
function clearFilters() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/events-list.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Table, TableBody, TableHead, TableHeader, TableRow} from '@shipfox/react-ui/table';\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/components/events-list.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Table, TableBody, TableHead, TableHeader, TableRow} from '@shipfox/react-ui/table';\nimport {hasTriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsFilterBar} from './events-filter-bar.js';\nimport {\n EventsListEmpty,\n EventsListNoMatches,\n EventsListSkeleton,\n EventsListStaleError,\n} from './events-list-states.js';\nimport {TriggerEventRow} from './trigger-event-row.js';\nimport type {EventsListProps} from './types.js';\n\nexport function EventsList({\n events,\n query,\n facets,\n filters,\n onFiltersChange,\n workspaceId,\n hasNextPage,\n isFetchingNextPage,\n onLoadMore,\n selectedEventId,\n onSelectEvent,\n}: EventsListProps) {\n const activeFilters = hasTriggerEventFilters(filters);\n const refreshFailed = query.isError && query.data !== undefined;\n const showEmptyState = !query.isPending && !query.isError && events.length === 0;\n\n function clearFilters() {\n onFiltersChange({\n source: undefined,\n event: undefined,\n outcome: undefined,\n from: undefined,\n to: undefined,\n });\n }\n\n return (\n <div className=\"flex min-h-0 flex-col overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base\">\n <EventsFilterBar\n filters={filters}\n onFiltersChange={onFiltersChange}\n sources={facets?.sources}\n events={facets?.events}\n hasActiveFilters={activeFilters}\n onClear={clearFilters}\n />\n\n {query.isPending ? <EventsListSkeleton /> : null}\n {!query.isPending ? <QueryLoadError query={query} subject=\"events\" icon=\"pulseLine\" /> : null}\n {!query.isPending && refreshFailed ? <EventsListStaleError query={query} /> : null}\n {showEmptyState && !activeFilters ? <EventsListEmpty workspaceId={workspaceId} /> : null}\n {showEmptyState && activeFilters ? <EventsListNoMatches onClear={clearFilters} /> : null}\n\n {events.length > 0 ? (\n <>\n <Table>\n <TableHeader className=\"sticky top-0 z-10\">\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Result</TableHead>\n <TableHead className=\"text-right\">Received</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {events.map((event) => (\n <TriggerEventRow\n key={event.id}\n event={event}\n selected={event.id === selectedEventId}\n onSelect={onSelectEvent}\n />\n ))}\n </TableBody>\n </Table>\n {hasNextPage ? (\n <div className=\"flex justify-center p-16\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n isLoading={isFetchingNextPage}\n onClick={onLoadMore}\n >\n Load more\n </Button>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Table","TableBody","TableHead","TableHeader","TableRow","hasTriggerEventFilters","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","EventsList","events","query","facets","filters","onFiltersChange","workspaceId","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","length","clearFilters","source","event","outcome","from","to","div","className","sources","hasActiveFilters","onClear","subject","icon","map","selected","id","onSelect","type","variant","size","isLoading","onClick"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,EAAEC,SAAS,EAAEC,SAAS,EAAEC,WAAW,EAAEC,QAAQ,QAAO,0BAA0B;AAC3F,SAAQC,sBAAsB,QAAO,yBAAyB;AAC9D,SAAQC,eAAe,QAAO,yBAAyB;AACvD,SACEC,eAAe,EACfC,mBAAmB,EACnBC,kBAAkB,EAClBC,oBAAoB,QACf,0BAA0B;AACjC,SAAQC,eAAe,QAAO,yBAAyB;AAGvD,OAAO,SAASC,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,OAAO,EACPC,eAAe,EACfC,WAAW,EACXC,WAAW,EACXC,kBAAkB,EAClBC,UAAU,EACVC,eAAe,EACfC,aAAa,EACG;IAChB,MAAMC,gBAAgBnB,uBAAuBW;IAC7C,MAAMS,gBAAgBX,MAAMY,OAAO,IAAIZ,MAAMa,IAAI,KAAKC;IACtD,MAAMC,iBAAiB,CAACf,MAAMgB,SAAS,IAAI,CAAChB,MAAMY,OAAO,IAAIb,OAAOkB,MAAM,KAAK;IAE/E,SAASC;QACPf,gBAAgB;YACdgB,QAAQL;YACRM,OAAON;YACPO,SAASP;YACTQ,MAAMR;YACNS,IAAIT;QACN;IACF;IAEA,qBACE,MAACU;QAAIC,WAAU;;0BACb,KAACjC;gBACCU,SAASA;gBACTC,iBAAiBA;gBACjBuB,SAASzB,QAAQyB;gBACjB3B,QAAQE,QAAQF;gBAChB4B,kBAAkBjB;gBAClBkB,SAASV;;YAGVlB,MAAMgB,SAAS,iBAAG,KAACrB,0BAAwB;YAC3C,CAACK,MAAMgB,SAAS,iBAAG,KAAChC;gBAAegB,OAAOA;gBAAO6B,SAAQ;gBAASC,MAAK;iBAAiB;YACxF,CAAC9B,MAAMgB,SAAS,IAAIL,8BAAgB,KAACf;gBAAqBI,OAAOA;iBAAY;YAC7Ee,kBAAkB,CAACL,8BAAgB,KAACjB;gBAAgBW,aAAaA;iBAAkB;YACnFW,kBAAkBL,8BAAgB,KAAChB;gBAAoBkC,SAASV;iBAAmB;YAEnFnB,OAAOkB,MAAM,GAAG,kBACf;;kCACE,MAAC/B;;0CACC,KAACG;gCAAYoC,WAAU;0CACrB,cAAA,MAACnC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUqC,WAAU;sDAAa;;;;;0CAGtC,KAACtC;0CACEY,OAAOgC,GAAG,CAAC,CAACX,sBACX,KAACvB;wCAECuB,OAAOA;wCACPY,UAAUZ,MAAMa,EAAE,KAAKzB;wCACvB0B,UAAUzB;uCAHLW,MAAMa,EAAE;;;;oBAQpB5B,4BACC,KAACmB;wBAAIC,WAAU;kCACb,cAAA,KAACxC;4BACCkD,MAAK;4BACLC,SAAQ;4BACRC,MAAK;4BACLC,WAAWhC;4BACXiC,SAAShC;sCACV;;yBAID;;iBAEJ;;;AAGV"}
|
|
@@ -9,22 +9,7 @@ declare const meta: {
|
|
|
9
9
|
};
|
|
10
10
|
decorators: Decorator[];
|
|
11
11
|
args: {
|
|
12
|
-
events:
|
|
13
|
-
id: string;
|
|
14
|
-
event_ref: string;
|
|
15
|
-
origin: "integration" | "manual" | "cron";
|
|
16
|
-
workspace_id: string;
|
|
17
|
-
provider: string | null;
|
|
18
|
-
source: string;
|
|
19
|
-
event: string;
|
|
20
|
-
delivery_id: string | null;
|
|
21
|
-
connection_id: string | null;
|
|
22
|
-
outcome: "received" | "routed" | "discarded" | "failed" | "errored";
|
|
23
|
-
matched_count: number;
|
|
24
|
-
received_at: string;
|
|
25
|
-
processed_at: string | null;
|
|
26
|
-
created_at: string;
|
|
27
|
-
}[];
|
|
12
|
+
events: import("../index.js").TriggerEventSummary[];
|
|
28
13
|
query: TriggerEventsListQuery;
|
|
29
14
|
facets: {
|
|
30
15
|
sources: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-list.stories.d.ts","sourceRoot":"","sources":["../../src/components/events-list.stories.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,SAAS,EAAQ,QAAQ,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"events-list.stories.d.ts","sourceRoot":"","sources":["../../src/components/events-list.stories.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,SAAS,EAAQ,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AA2EvD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkByB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAAU,CAAC;AAEpC,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { RelativeTimeProvider } from '@shipfox/react-ui/relative-time';
|
|
3
3
|
import { Code } from '@shipfox/react-ui/typography';
|
|
4
|
+
import { toTriggerEventSummary } from '#hooks/api/trigger-event-mapper.js';
|
|
4
5
|
import { EventsList } from './events-list.js';
|
|
5
6
|
const STORY_NOW = '2026-06-25T20:00:00.000Z';
|
|
6
7
|
const STORY_NOW_MS = Date.parse(STORY_NOW);
|
|
@@ -52,7 +53,7 @@ const SAMPLE_EVENTS = [
|
|
|
52
53
|
makeEvent('routed', 'gitea', 'gitea_acme', 'pull_request', 1, 12),
|
|
53
54
|
makeEvent('discarded', 'github', 'github_acme', 'issue_comment', 0, 38),
|
|
54
55
|
makeEvent('failed', 'gitlab', 'gitlab_acme', 'push', 1, 95)
|
|
55
|
-
];
|
|
56
|
+
].map(toTriggerEventSummary);
|
|
56
57
|
const SAMPLE_FACETS = {
|
|
57
58
|
sources: [
|
|
58
59
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/events-list.stories.tsx"],"sourcesContent":["import type {\n TriggerEventFacetsResponseDto,\n TriggerEventListItemDto,\n TriggerEventOutcomeDto,\n} from '@shipfox/api-triggers-dto';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Code} from '@shipfox/react-ui/typography';\nimport type {Decorator, Meta, StoryObj} from '@storybook/react';\nimport type {ReactNode} from 'react';\nimport {EventsList} from './events-list.js';\nimport type {TriggerEventsListQuery} from './types.js';\n\nconst STORY_NOW = '2026-06-25T20:00:00.000Z';\nconst STORY_NOW_MS = Date.parse(STORY_NOW);\n\n// Typed so meta's inferred type stays nameable (TS2883) under the package's tsconfig.\nconst withWidth: Decorator = (Story) => (\n <RelativeTimeProvider now={STORY_NOW}>\n <div className=\"w-[900px]\">\n <Story />\n </div>\n </RelativeTimeProvider>\n);\n\nfunction makeQuery(overrides: Partial<TriggerEventsListQuery> = {}): TriggerEventsListQuery {\n return {\n isPending: false,\n isError: false,\n isFetching: false,\n data: {pages: [], pageParams: []},\n error: null,\n refetch: () => undefined,\n ...overrides,\n };\n}\n\nlet seq = 0;\nfunction makeEvent(\n outcome: TriggerEventOutcomeDto,\n provider: string | null,\n source: string,\n event: string,\n matchedCount: number,\n minutesAgo: number,\n): TriggerEventListItemDto {\n seq += 1;\n return {\n id: `evt-${String(seq).padStart(8, '0')}`,\n event_ref: `ref-${seq}`,\n origin: 'integration',\n workspace_id: 'ws-demo',\n provider,\n source,\n event,\n delivery_id: `delivery-${String(seq).padStart(6, '0')}`,\n connection_id: 'conn-demo',\n outcome,\n matched_count: matchedCount,\n received_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n processed_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n created_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n };\n}\n\nconst SAMPLE_EVENTS
|
|
1
|
+
{"version":3,"sources":["../../src/components/events-list.stories.tsx"],"sourcesContent":["import type {\n TriggerEventFacetsResponseDto,\n TriggerEventListItemDto,\n TriggerEventOutcomeDto,\n} from '@shipfox/api-triggers-dto';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Code} from '@shipfox/react-ui/typography';\nimport type {Decorator, Meta, StoryObj} from '@storybook/react';\nimport type {ReactNode} from 'react';\nimport {toTriggerEventSummary} from '#hooks/api/trigger-event-mapper.js';\nimport {EventsList} from './events-list.js';\nimport type {TriggerEventsListQuery} from './types.js';\n\nconst STORY_NOW = '2026-06-25T20:00:00.000Z';\nconst STORY_NOW_MS = Date.parse(STORY_NOW);\n\n// Typed so meta's inferred type stays nameable (TS2883) under the package's tsconfig.\nconst withWidth: Decorator = (Story) => (\n <RelativeTimeProvider now={STORY_NOW}>\n <div className=\"w-[900px]\">\n <Story />\n </div>\n </RelativeTimeProvider>\n);\n\nfunction makeQuery(overrides: Partial<TriggerEventsListQuery> = {}): TriggerEventsListQuery {\n return {\n isPending: false,\n isError: false,\n isFetching: false,\n data: {pages: [], pageParams: []},\n error: null,\n refetch: () => undefined,\n ...overrides,\n };\n}\n\nlet seq = 0;\nfunction makeEvent(\n outcome: TriggerEventOutcomeDto,\n provider: string | null,\n source: string,\n event: string,\n matchedCount: number,\n minutesAgo: number,\n): TriggerEventListItemDto {\n seq += 1;\n return {\n id: `evt-${String(seq).padStart(8, '0')}`,\n event_ref: `ref-${seq}`,\n origin: 'integration',\n workspace_id: 'ws-demo',\n provider,\n source,\n event,\n delivery_id: `delivery-${String(seq).padStart(6, '0')}`,\n connection_id: 'conn-demo',\n outcome,\n matched_count: matchedCount,\n received_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n processed_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n created_at: new Date(STORY_NOW_MS - minutesAgo * 60_000).toISOString(),\n };\n}\n\nconst SAMPLE_EVENTS = [\n makeEvent('received', 'github', 'github_acme', 'push', 0, 0),\n makeEvent('routed', 'github', 'github_acme', 'push', 2, 3),\n makeEvent('routed', 'gitea', 'gitea_acme', 'pull_request', 1, 12),\n makeEvent('discarded', 'github', 'github_acme', 'issue_comment', 0, 38),\n makeEvent('failed', 'gitlab', 'gitlab_acme', 'push', 1, 95),\n].map(toTriggerEventSummary);\n\nconst SAMPLE_FACETS: TriggerEventFacetsResponseDto = {\n sources: [\n {value: 'github_acme', count: 3},\n {value: 'gitea_acme', count: 1},\n {value: 'gitlab_acme', count: 1},\n ],\n events: [\n {value: 'push', count: 3},\n {value: 'pull_request', count: 1},\n {value: 'issue_comment', count: 1},\n ],\n};\n\nconst meta = {\n title: 'Triggers/EventsList',\n component: EventsList,\n parameters: {layout: 'padded'},\n decorators: [withWidth],\n args: {\n events: SAMPLE_EVENTS,\n query: makeQuery(),\n facets: SAMPLE_FACETS,\n filters: {},\n onFiltersChange: () => undefined,\n workspaceId: 'ws-demo',\n hasNextPage: false,\n isFetchingNextPage: false,\n onLoadMore: () => undefined,\n selectedEventId: 'evt-00000002',\n onSelectEvent: () => undefined,\n },\n} satisfies Meta<typeof EventsList>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const DataStates: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n <StateExample label=\"Loading\">\n <EventsList {...args} events={[]} query={makeQuery({isPending: true, data: undefined})} />\n </StateExample>\n <StateExample label=\"Empty\">\n <EventsList {...args} events={[]} facets={{sources: [], events: []}} />\n </StateExample>\n <StateExample label=\"No matches\">\n <EventsList {...args} events={[]} filters={{outcome: ['failed']}} />\n </StateExample>\n <StateExample label=\"Load error\">\n <EventsList {...args} events={[]} query={makeQuery({isError: true, data: undefined})} />\n </StateExample>\n </div>\n ),\n};\n\nfunction StateExample({label, children}: {label: string; children: ReactNode}) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {label}\n </Code>\n <div className=\"min-h-280 rounded-8 border border-border-neutral-base bg-background-neutral-base p-12\">\n {children}\n </div>\n </div>\n );\n}\n"],"names":["RelativeTimeProvider","Code","toTriggerEventSummary","EventsList","STORY_NOW","STORY_NOW_MS","Date","parse","withWidth","Story","now","div","className","makeQuery","overrides","isPending","isError","isFetching","data","pages","pageParams","error","refetch","undefined","seq","makeEvent","outcome","provider","source","event","matchedCount","minutesAgo","id","String","padStart","event_ref","origin","workspace_id","delivery_id","connection_id","matched_count","received_at","toISOString","processed_at","created_at","SAMPLE_EVENTS","map","SAMPLE_FACETS","sources","value","count","events","meta","title","component","parameters","layout","decorators","args","query","facets","filters","onFiltersChange","workspaceId","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","Playground","DataStates","render","StateExample","label","children","variant"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TriggerEventDetail as TriggerEventDetailModel } from '#core/trigger-event.js';
|
|
2
2
|
export interface TriggerEventDetailProps {
|
|
3
3
|
workspaceId: string;
|
|
4
4
|
eventId?: string | undefined;
|
|
@@ -7,7 +7,7 @@ export interface TriggerEventDetailProps {
|
|
|
7
7
|
export declare function TriggerEventDetail({ workspaceId, eventId, onBack }: TriggerEventDetailProps): import("react").JSX.Element;
|
|
8
8
|
export declare function TriggerEventDetailView({ workspaceId, event, onBack, }: {
|
|
9
9
|
workspaceId: string;
|
|
10
|
-
event:
|
|
10
|
+
event: TriggerEventDetailModel;
|
|
11
11
|
onBack: () => void;
|
|
12
12
|
}): import("react").JSX.Element;
|
|
13
13
|
//# sourceMappingURL=trigger-event-detail.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-event-detail.d.ts","sourceRoot":"","sources":["../../src/components/trigger-event-detail.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trigger-event-detail.d.ts","sourceRoot":"","sources":["../../src/components/trigger-event-detail.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,kBAAkB,IAAI,uBAAuB,EAE9C,MAAM,wBAAwB,CAAC;AAQhC,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAC,EAAE,uBAAuB,+BAUzF;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,KAAK,EACL,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,uBAAuB,CAAC;IAC/B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,+BAmEA"}
|
|
@@ -101,7 +101,7 @@ export function TriggerEventDetailView({ workspaceId, event, onBack }) {
|
|
|
101
101
|
size: "xs",
|
|
102
102
|
className: "truncate text-foreground-neutral-muted",
|
|
103
103
|
children: /*#__PURE__*/ _jsx(RelativeTime, {
|
|
104
|
-
value: event.
|
|
104
|
+
value: event.receivedAt
|
|
105
105
|
})
|
|
106
106
|
})
|
|
107
107
|
]
|
|
@@ -253,7 +253,7 @@ function EventRuns({ workspaceId, event }) {
|
|
|
253
253
|
});
|
|
254
254
|
}
|
|
255
255
|
function DecisionRow({ workspaceId, decision }) {
|
|
256
|
-
if (decision.decision !== 'triggered' || !decision.
|
|
256
|
+
if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {
|
|
257
257
|
return /*#__PURE__*/ _jsxs("li", {
|
|
258
258
|
className: "flex min-w-0 items-start gap-8 rounded-6 px-8 py-6",
|
|
259
259
|
children: [
|
|
@@ -268,7 +268,7 @@ function DecisionRow({ workspaceId, decision }) {
|
|
|
268
268
|
/*#__PURE__*/ _jsx(Text, {
|
|
269
269
|
size: "sm",
|
|
270
270
|
className: "min-w-0 truncate text-foreground-neutral-base",
|
|
271
|
-
children: decision.
|
|
271
|
+
children: decision.subscriptionName
|
|
272
272
|
}),
|
|
273
273
|
decision.reason ? /*#__PURE__*/ _jsx(Text, {
|
|
274
274
|
size: "xs",
|
|
@@ -289,8 +289,8 @@ function DecisionRow({ workspaceId, decision }) {
|
|
|
289
289
|
to: "/workspaces/$wid/projects/$pid/runs/$workflowRunId",
|
|
290
290
|
params: {
|
|
291
291
|
wid: workspaceId,
|
|
292
|
-
pid: decision.
|
|
293
|
-
workflowRunId: decision.
|
|
292
|
+
pid: decision.projectId ?? '',
|
|
293
|
+
workflowRunId: decision.runId
|
|
294
294
|
},
|
|
295
295
|
className: "flex min-w-0 items-start gap-8 rounded-6 px-8 py-6 transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none",
|
|
296
296
|
children: [
|
|
@@ -306,13 +306,13 @@ function DecisionRow({ workspaceId, decision }) {
|
|
|
306
306
|
as: "span",
|
|
307
307
|
size: "sm",
|
|
308
308
|
className: "min-w-0 truncate text-foreground-neutral-base",
|
|
309
|
-
children: decision.
|
|
309
|
+
children: decision.subscriptionName
|
|
310
310
|
}),
|
|
311
311
|
/*#__PURE__*/ _jsx(Code, {
|
|
312
312
|
as: "span",
|
|
313
313
|
variant: "label",
|
|
314
314
|
className: "truncate text-foreground-neutral-muted",
|
|
315
|
-
children: decision.
|
|
315
|
+
children: decision.runName
|
|
316
316
|
})
|
|
317
317
|
]
|
|
318
318
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import type {TriggerDecisionDto, TriggerEventDetailResponseDto} from '@shipfox/api-triggers-dto';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst PANEL_CLASS =\n 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport interface TriggerEventDetailProps {\n workspaceId: string;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({workspaceId, eventId, onBack}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return <TriggerEventDetailView workspaceId={workspaceId} event={query.data} onBack={onBack} />;\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n event,\n onBack,\n}: {\n workspaceId: string;\n event: TriggerEventDetailResponseDto;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, 'flex min-h-0 flex-col overflow-hidden')}\n >\n <div className=\"flex shrink-0 flex-col gap-12 border-b border-border-neutral-base p-16\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-6 rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.received_at} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col gap-20 overflow-y-auto p-16 scrollbar\">\n <EventRuns workspaceId={workspaceId} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailResponseDto, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailResponseDto, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n 'hidden min-h-[240px] items-center justify-center p-24 min-[900px]:flex',\n )}\n >\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16')}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside aria-label=\"Event details\" className={cn(PANEL_CLASS, 'flex flex-col gap-16 p-16')}>\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </aside>\n );\n}\n\nfunction EventRuns({\n workspaceId,\n event,\n}: {\n workspaceId: string;\n event: TriggerEventDetailResponseDto;\n}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n );\n }\n return null;\n }\n\n return (\n <section aria-labelledby=\"trigger-event-runs-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-runs-heading\" size=\"sm\" bold>\n Matched workflows\n </Text>\n <ul className=\"-mx-8 flex flex-col gap-1\">\n {event.decisions.map((decision) => (\n <DecisionRow key={decision.id} workspaceId={workspaceId} decision={decision} />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction DecisionRow({workspaceId, decision}: {workspaceId: string; decision: TriggerDecisionDto}) {\n if (decision.decision !== 'triggered' || !decision.run_id || !decision.run_name) {\n return (\n <li className=\"flex min-w-0 items-start gap-8 rounded-6 px-8 py-6\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-2 size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscription_name}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </li>\n );\n }\n\n return (\n <li>\n <Link\n to=\"/workspaces/$wid/projects/$pid/runs/$workflowRunId\"\n params={{wid: workspaceId, pid: decision.project_id, workflowRunId: decision.run_id}}\n className=\"flex min-w-0 items-start gap-8 rounded-6 px-8 py-6 transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none\"\n >\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-3 size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-1\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscription_name}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.run_name}\n </Code>\n </span>\n </Link>\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <section aria-labelledby=\"trigger-event-payload-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-payload-heading\" size=\"sm\" bold>\n Payload\n </Text>\n <CodeBlock\n data={data}\n className=\"flex h-auto max-h-[min(360px,45vh)] flex-col rounded-8 bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"shrink-0 border-b border-border-contrast-base bg-background-contrast-base px-10 py-6\">\n <CodeBlockFiles>\n {(item) => <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 overflow-auto scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n );\n}\n"],"names":["Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","PANEL_CLASS","TriggerEventDetail","workspaceId","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","received_at","badge","label","EventRuns","EventPayload","filter","Boolean","join","icon","title","role","decisions","length","outcome","section","aria-labelledby","id","bold","ul","map","decision","DecisionRow","run_id","run_name","li","name","subscription_name","reason","to","params","wid","pid","project_id","workflowRunId","span","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":";AACA,SAAQA,KAAK,QAAO,0BAA0B;AAC9C,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SACEC,SAAS,EACTC,aAAa,EACbC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,aAAa,QACR,+BAA+B;AACtC,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,OAAO,EAAEC,cAAc,EAAEC,cAAc,QAAO,4BAA4B;AAClF,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,OAAO,QAAO,QAAQ;AAC9B,SAAQC,oBAAoB,QAAO,+BAA+B;AAClE,SAAQC,kBAAkB,QAAO,4BAA4B;AAC7D,SAAQC,iBAAiB,QAAO,2BAA2B;AAE3D,MAAMC,cACJ;AAQF,OAAO,SAASC,mBAAmB,EAACC,WAAW,EAAEC,OAAO,EAAEC,MAAM,EAA0B;IACxF,MAAMC,QAAQR,qBAAqBM;IAEnC,IAAI,CAACA,SAAS,qBAAO,KAACG;IACtB,IAAID,MAAME,IAAI,EAAE;QACd,qBAAO,KAACC;YAAuBN,aAAaA;YAAaO,OAAOJ,MAAME,IAAI;YAAEH,QAAQA;;IACtF;IACA,IAAIC,MAAMK,OAAO,EACf,qBAAO,KAACC;QAAwBP,QAAQA;QAAQQ,SAAS,IAAMP,MAAMQ,OAAO;;IAC9E,qBAAO,KAACC;QAA0BV,QAAQA;;AAC5C;AAEA,OAAO,SAASI,uBAAuB,EACrCN,WAAW,EACXO,KAAK,EACLL,MAAM,EAKP;IACC,MAAMW,SAASjB,mBAAmBW;IAClC,MAAMO,aAAaC,yBAAyBR;IAC5C,MAAMS,iBAAiBC,sBAAsBV;IAC7C,MAAMW,mBAAmBxB,QACvB,IAAMyB,KAAKC,SAAS,CAACb,MAAMc,OAAO,IAAI,MAAM,MAAM,MAAM,QACxD;QAACd,MAAMc,OAAO;KAAC;IAGjB,qBACE,MAACC;QACCC,cAAW;QACXC,WAAWhC,GAAGM,aAAa;;0BAE3B,MAAC2B;gBAAID,WAAU;;kCACb,KAACnD;wBACCqD,MAAK;wBACLC,SAAQ;wBACRC,MAAK;wBACLC,UAAS;wBACTL,WAAU;wBACVM,SAAS5B;kCACV;;kCAGD,MAACuB;wBAAID,WAAU;;0CACb,MAACC;gCAAID,WAAU;;kDACb,MAACrC;;0DACC,KAACE;gDAAe0C,OAAO;0DACrB,cAAA,MAACC;oDACCN,MAAK;oDACLH,cAAYP;oDACZQ,WAAU;;sEAEV,KAAC3B;4DACCoC,UAAU1B,MAAM0B,QAAQ;4DACxBC,QAAQ3B,MAAM2B,MAAM;4DACpBC,eAAY;4DACZX,WAAU;;sEAEZ,KAAClC;4DAAK8C,IAAG;4DAAOT,SAAQ;4DAAQH,WAAU;sEACvCV;;;;;0DAIP,KAAC1B;0DACC,cAAA,KAACE;oDAAK8C,IAAG;oDAAOT,SAAQ;oDAAQH,WAAU;8DACvCR;;;;;kDAIP,KAACzB;wCAAKqC,MAAK;wCAAKJ,WAAU;kDACxB,cAAA,KAACvC;4CAAaoD,OAAO9B,MAAM+B,WAAW;;;;;0CAG1C,KAAClE;gCAAMuD,SAASd,OAAO0B,KAAK;gCAAEX,MAAK;0CAChCf,OAAO2B,KAAK;;;;;;0BAKnB,MAACf;gBAAID,WAAU;;kCACb,KAACiB;wBAAUzC,aAAaA;wBAAaO,OAAOA;;kCAC5C,KAACmC;wBAAarB,SAASH;;;;;;AAI/B;AAEA,SAASH,yBAAyBR,KAA8D;IAC9F,OAAOA,MAAMA,KAAK,IAAIA,MAAM2B,MAAM;AACpC;AAEA,SAASjB,sBAAsBV,KAA8D;IAC3F,OAAO;QAACA,MAAM2B,MAAM;QAAE3B,MAAMA,KAAK;KAAC,CAACoC,MAAM,CAACC,SAASC,IAAI,CAAC;AAC1D;AAEA,SAASzC;IACP,qBACE,KAACkB;QACCC,cAAW;QACXC,WAAWhC,GACTM,aACA;kBAGF,cAAA,KAACf;YAAW+D,MAAK;YAAYnB,SAAQ;YAAUoB,OAAM;;;AAG3D;AAEA,SAASnC,0BAA0B,EAACV,MAAM,EAAuB;IAC/D,qBACE,MAACoB;QACCC,cAAW;QACXC,WAAWhC,GAAGM,aAAa;;0BAE3B,KAACzB;gBACCqD,MAAK;gBACLC,SAAQ;gBACRC,MAAK;gBACLC,UAAS;gBACTL,WAAU;gBACVM,SAAS5B;0BACV;;0BAGD,MAACuB;gBAAID,WAAU;;kCACb,KAACtC;wBAASsC,WAAU;;kCACpB,KAACtC;wBAASsC,WAAU;;;;0BAEtB,KAACtC;gBAASsC,WAAU;;0BACpB,KAACtC;gBAASsC,WAAU;;;;AAG1B;AAEA,SAASf,wBAAwB,EAACP,MAAM,EAAEQ,OAAO,EAA4C;IAC3F,qBACE,MAACY;QAAMC,cAAW;QAAgBC,WAAWhC,GAAGM,aAAa;;0BAC3D,KAACzB;gBACCqD,MAAK;gBACLC,SAAQ;gBACRC,MAAK;gBACLC,UAAS;gBACTL,WAAU;gBACVM,SAAS5B;0BACV;;0BAGD,KAAC5B;gBAAQ0E,MAAK;gBAAQtB,MAAK;0BACzB,cAAA,MAACD;oBAAID,WAAU;;sCACb,KAACjC;4BAAKqC,MAAK;sCAAK;;sCAChB,KAACvD;4BAAOqD,MAAK;4BAASC,SAAQ;4BAAYC,MAAK;4BAAKE,SAASpB;sCAAS;;;;;;;AAOhF;AAEA,SAAS+B,UAAU,EACjBzC,WAAW,EACXO,KAAK,EAIN;IACC,IAAIA,MAAM0C,SAAS,CAACC,MAAM,KAAK,GAAG;QAChC,IAAI3C,MAAM4C,OAAO,KAAK,aAAa;YACjC,qBACE,KAAC5D;gBAAKqC,MAAK;gBAAKJ,WAAU;0BAAgC;;QAI9D;QACA,OAAO;IACT;IAEA,qBACE,MAAC4B;QAAQC,mBAAgB;QAA6B7B,WAAU;;0BAC9D,KAACjC;gBAAK+D,IAAG;gBAA6B1B,MAAK;gBAAK2B,IAAI;0BAAC;;0BAGrD,KAACC;gBAAGhC,WAAU;0BACXjB,MAAM0C,SAAS,CAACQ,GAAG,CAAC,CAACC,yBACpB,KAACC;wBAA8B3D,aAAaA;wBAAa0D,UAAUA;uBAAjDA,SAASJ,EAAE;;;;AAKvC;AAEA,SAASK,YAAY,EAAC3D,WAAW,EAAE0D,QAAQ,EAAsD;IAC/F,IAAIA,SAASA,QAAQ,KAAK,eAAe,CAACA,SAASE,MAAM,IAAI,CAACF,SAASG,QAAQ,EAAE;QAC/E,qBACE,MAACC;YAAGtC,WAAU;;8BACZ,KAACxC;oBACC+E,MAAK;oBACLvC,WAAU;oBACVW,eAAY;;8BAEd,MAACV;oBAAID,WAAU;;sCACb,KAACjC;4BAAKqC,MAAK;4BAAKJ,WAAU;sCACvBkC,SAASM,iBAAiB;;wBAE5BN,SAASO,MAAM,iBACd,KAAC1E;4BAAKqC,MAAK;4BAAKJ,WAAU;sCACvBkC,SAASO,MAAM;2CAGlB,KAAC1E;4BAAKqC,MAAK;4BAAKJ,WAAU;sCAAmC;;;;;;IAOvE;IAEA,qBACE,KAACsC;kBACC,cAAA,MAACrE;YACCyE,IAAG;YACHC,QAAQ;gBAACC,KAAKpE;gBAAaqE,KAAKX,SAASY,UAAU;gBAAEC,eAAeb,SAASE,MAAM;YAAA;YACnFpC,WAAU;;8BAEV,KAACxC;oBACC+E,MAAK;oBACLvC,WAAU;oBACVW,eAAY;;8BAEd,MAACqC;oBAAKhD,WAAU;;sCACd,KAACjC;4BAAK6C,IAAG;4BAAOR,MAAK;4BAAKJ,WAAU;sCACjCkC,SAASM,iBAAiB;;sCAE7B,KAAC1E;4BAAK8C,IAAG;4BAAOT,SAAQ;4BAAQH,WAAU;sCACvCkC,SAASG,QAAQ;;;;;;;AAM9B;AAEA,SAASnB,aAAa,EAACrB,OAAO,EAAoB;IAChD,MAAMhB,OAAO;QAAC;YAACoE,UAAU;YAAQC,UAAU;YAAgBC,MAAMtD;QAAO;KAAE;IAE1E,qBACE,MAAC+B;QAAQC,mBAAgB;QAAgC7B,WAAU;;0BACjE,KAACjC;gBAAK+D,IAAG;gBAAgC1B,MAAK;gBAAK2B,IAAI;0BAAC;;0BAGxD,MAAChF;gBACC8B,MAAMA;gBACNmB,WAAU;;kCAEV,MAAC3C;wBAAgB2C,WAAU;;0CACzB,KAAC5C;0CACE,CAACgG,qBAAS,KAACjG;wCAAkB0D,OAAOuC,KAAKF,QAAQ;kDAAGE,KAAKF,QAAQ;;;0CAEpE,KAAChG;;;kCAEH,KAACF;wBAAcgD,WAAU;kCACtB,CAACoD,qBACA,KAAC9F;gCACCuD,OAAOuC,KAAKF,QAAQ;gCACpBG,aAAa;gCACbrD,WAAU;0CAEV,cAAA,KAAC/C;oCAAiBgG,UAAS;oCAAOK,oBAAoB;8CACnDF,KAAKD,IAAI;;;;;;;;AAQ1B"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport type {\n TriggerEventDetail as TriggerEventDetailModel,\n TriggerEventMatchedWorkflowResult,\n} from '#core/trigger-event.js';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst PANEL_CLASS =\n 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport interface TriggerEventDetailProps {\n workspaceId: string;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({workspaceId, eventId, onBack}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return <TriggerEventDetailView workspaceId={workspaceId} event={query.data} onBack={onBack} />;\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n event,\n onBack,\n}: {\n workspaceId: string;\n event: TriggerEventDetailModel;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, 'flex min-h-0 flex-col overflow-hidden')}\n >\n <div className=\"flex shrink-0 flex-col gap-12 border-b border-border-neutral-base p-16\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-6 rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col gap-20 overflow-y-auto p-16 scrollbar\">\n <EventRuns workspaceId={workspaceId} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n 'hidden min-h-[240px] items-center justify-center p-24 min-[900px]:flex',\n )}\n >\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, 'flex min-h-[320px] flex-col gap-16 p-16')}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside aria-label=\"Event details\" className={cn(PANEL_CLASS, 'flex flex-col gap-16 p-16')}>\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start min-[900px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </aside>\n );\n}\n\nfunction EventRuns({workspaceId, event}: {workspaceId: string; event: TriggerEventDetailModel}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n );\n }\n return null;\n }\n\n return (\n <section aria-labelledby=\"trigger-event-runs-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-runs-heading\" size=\"sm\" bold>\n Matched workflows\n </Text>\n <ul className=\"-mx-8 flex flex-col gap-1\">\n {event.decisions.map((decision) => (\n <DecisionRow key={decision.id} workspaceId={workspaceId} decision={decision} />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction DecisionRow({\n workspaceId,\n decision,\n}: {\n workspaceId: string;\n decision: TriggerEventMatchedWorkflowResult;\n}) {\n if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {\n return (\n <li className=\"flex min-w-0 items-start gap-8 rounded-6 px-8 py-6\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-2 size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </li>\n );\n }\n\n return (\n <li>\n <Link\n to=\"/workspaces/$wid/projects/$pid/runs/$workflowRunId\"\n params={{wid: workspaceId, pid: decision.projectId ?? '', workflowRunId: decision.runId}}\n className=\"flex min-w-0 items-start gap-8 rounded-6 px-8 py-6 transition-colors hover:bg-background-components-hover focus-visible:shadow-border-interactive-with-active focus-visible:outline-none\"\n >\n <Icon\n name=\"cornerDownRightLine\"\n className=\"mt-3 size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-1\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.runName}\n </Code>\n </span>\n </Link>\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <section aria-labelledby=\"trigger-event-payload-heading\" className=\"flex flex-col gap-6\">\n <Text id=\"trigger-event-payload-heading\" size=\"sm\" bold>\n Payload\n </Text>\n <CodeBlock\n data={data}\n className=\"flex h-auto max-h-[min(360px,45vh)] flex-col rounded-8 bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"shrink-0 border-b border-border-contrast-base bg-background-contrast-base px-10 py-6\">\n <CodeBlockFiles>\n {(item) => <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 overflow-auto scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n );\n}\n"],"names":["Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","PANEL_CLASS","TriggerEventDetail","workspaceId","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","receivedAt","badge","label","EventRuns","EventPayload","filter","Boolean","join","icon","title","role","decisions","length","outcome","section","aria-labelledby","id","bold","ul","map","decision","DecisionRow","runId","runName","li","name","subscriptionName","reason","to","params","wid","pid","projectId","workflowRunId","span","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":"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"}
|
|
@@ -19,42 +19,7 @@ declare const meta: {
|
|
|
19
19
|
decorators: Decorator[];
|
|
20
20
|
args: {
|
|
21
21
|
workspaceId: string;
|
|
22
|
-
event:
|
|
23
|
-
id: string;
|
|
24
|
-
event_ref: string;
|
|
25
|
-
origin: "integration" | "manual" | "cron";
|
|
26
|
-
workspace_id: string;
|
|
27
|
-
provider: string | null;
|
|
28
|
-
source: string;
|
|
29
|
-
event: string;
|
|
30
|
-
delivery_id: string | null;
|
|
31
|
-
connection_id: string | null;
|
|
32
|
-
outcome: "received" | "routed" | "discarded" | "failed" | "errored";
|
|
33
|
-
matched_count: number;
|
|
34
|
-
received_at: string;
|
|
35
|
-
processed_at: string | null;
|
|
36
|
-
created_at: string;
|
|
37
|
-
connection_name: string | null;
|
|
38
|
-
payload: Record<string, unknown> | null;
|
|
39
|
-
decisions: {
|
|
40
|
-
id: string;
|
|
41
|
-
received_event_id: string;
|
|
42
|
-
subscription_kind: "trigger" | "listener";
|
|
43
|
-
subscription_id: string;
|
|
44
|
-
subscription_name: string;
|
|
45
|
-
workflow_definition_id: string | null;
|
|
46
|
-
project_id: string | null;
|
|
47
|
-
workflow_run_id: string | null;
|
|
48
|
-
job_id: string | null;
|
|
49
|
-
matcher_kind: "on" | "until" | null;
|
|
50
|
-
matcher_ordinal: number | null;
|
|
51
|
-
decision: "triggered" | "filter-error" | "dispatch-error";
|
|
52
|
-
run_id: string | null;
|
|
53
|
-
run_name: string | null;
|
|
54
|
-
reason: string | null;
|
|
55
|
-
created_at: string;
|
|
56
|
-
}[];
|
|
57
|
-
};
|
|
22
|
+
event: import("../index.js").TriggerEventDetail;
|
|
58
23
|
onBack: () => undefined;
|
|
59
24
|
};
|
|
60
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-event-detail.stories.d.ts","sourceRoot":"","sources":["../../src/components/trigger-event-detail.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAQ,QAAQ,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"trigger-event-detail.stories.d.ts","sourceRoot":"","sources":["../../src/components/trigger-event-detail.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAQ,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAWhE,OAAO,EAAC,sBAAsB,EAAC,MAAM,2BAA2B,CAAC;AAuHjE,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;CAkBqC,CAAC;AAEhD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAOnC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAKvB,CAAC"}
|