@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.
Files changed (93) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +50 -0
  3. package/dist/components/events-filter-bar.d.ts +3 -4
  4. package/dist/components/events-filter-bar.d.ts.map +1 -1
  5. package/dist/components/events-filter-bar.js +8 -16
  6. package/dist/components/events-filter-bar.js.map +1 -1
  7. package/dist/components/events-list.d.ts.map +1 -1
  8. package/dist/components/events-list.js +2 -4
  9. package/dist/components/events-list.js.map +1 -1
  10. package/dist/components/events-list.stories.d.ts +1 -16
  11. package/dist/components/events-list.stories.d.ts.map +1 -1
  12. package/dist/components/events-list.stories.js +2 -1
  13. package/dist/components/events-list.stories.js.map +1 -1
  14. package/dist/components/trigger-event-detail.d.ts +2 -2
  15. package/dist/components/trigger-event-detail.d.ts.map +1 -1
  16. package/dist/components/trigger-event-detail.js +7 -7
  17. package/dist/components/trigger-event-detail.js.map +1 -1
  18. package/dist/components/trigger-event-detail.stories.d.ts +1 -36
  19. package/dist/components/trigger-event-detail.stories.d.ts.map +1 -1
  20. package/dist/components/trigger-event-detail.stories.js +6 -3
  21. package/dist/components/trigger-event-detail.stories.js.map +1 -1
  22. package/dist/components/trigger-event-result.d.ts +2 -2
  23. package/dist/components/trigger-event-result.d.ts.map +1 -1
  24. package/dist/components/trigger-event-result.js +8 -16
  25. package/dist/components/trigger-event-result.js.map +1 -1
  26. package/dist/components/trigger-event-row.d.ts +2 -2
  27. package/dist/components/trigger-event-row.d.ts.map +1 -1
  28. package/dist/components/trigger-event-row.js +1 -1
  29. package/dist/components/trigger-event-row.js.map +1 -1
  30. package/dist/components/trigger-source-icon.d.ts +8 -6
  31. package/dist/components/trigger-source-icon.d.ts.map +1 -1
  32. package/dist/components/trigger-source-icon.js +4 -3
  33. package/dist/components/trigger-source-icon.js.map +1 -1
  34. package/dist/components/types.d.ts +3 -4
  35. package/dist/components/types.d.ts.map +1 -1
  36. package/dist/components/types.js.map +1 -1
  37. package/dist/core/trigger-event.d.ts +78 -0
  38. package/dist/core/trigger-event.d.ts.map +1 -0
  39. package/dist/core/trigger-event.js +71 -0
  40. package/dist/core/trigger-event.js.map +1 -0
  41. package/dist/feature.d.ts +7 -0
  42. package/dist/feature.d.ts.map +1 -1
  43. package/dist/feature.js +10 -9
  44. package/dist/feature.js.map +1 -1
  45. package/dist/hooks/api/trigger-event-mapper.d.ts +7 -0
  46. package/dist/hooks/api/trigger-event-mapper.d.ts.map +1 -0
  47. package/dist/hooks/api/trigger-event-mapper.js +57 -0
  48. package/dist/hooks/api/trigger-event-mapper.js.map +1 -0
  49. package/dist/hooks/api/trigger-events.d.ts +15 -138
  50. package/dist/hooks/api/trigger-events.d.ts.map +1 -1
  51. package/dist/hooks/api/trigger-events.js +44 -47
  52. package/dist/hooks/api/trigger-events.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/pages/events-page.d.ts +1 -1
  58. package/dist/pages/events-page.d.ts.map +1 -1
  59. package/dist/pages/events-page.js +1 -1
  60. package/dist/pages/events-page.js.map +1 -1
  61. package/dist/routes/events-settings.js.map +1 -1
  62. package/dist/search.d.ts +3 -3
  63. package/dist/search.d.ts.map +1 -1
  64. package/dist/search.js +3 -4
  65. package/dist/search.js.map +1 -1
  66. package/dist/tsconfig.test.tsbuildinfo +1 -1
  67. package/package.json +10 -10
  68. package/src/components/events-filter-bar.tsx +16 -11
  69. package/src/components/events-list.stories.tsx +3 -2
  70. package/src/components/events-list.test.tsx +4 -3
  71. package/src/components/events-list.tsx +2 -12
  72. package/src/components/trigger-event-detail.stories.tsx +7 -3
  73. package/src/components/trigger-event-detail.test.tsx +6 -1
  74. package/src/components/trigger-event-detail.tsx +21 -18
  75. package/src/components/trigger-event-result.test.ts +6 -6
  76. package/src/components/trigger-event-result.ts +9 -13
  77. package/src/components/trigger-event-row.tsx +5 -5
  78. package/src/components/trigger-source-icon.tsx +9 -7
  79. package/src/components/types.ts +7 -7
  80. package/src/core/trigger-event.test.ts +40 -0
  81. package/src/core/trigger-event.ts +126 -0
  82. package/src/feature.ts +6 -4
  83. package/src/hooks/api/trigger-event-mapper.test.ts +88 -0
  84. package/src/hooks/api/trigger-event-mapper.ts +76 -0
  85. package/src/hooks/api/trigger-events.test.ts +49 -12
  86. package/src/hooks/api/trigger-events.ts +96 -56
  87. package/src/index.ts +1 -0
  88. package/src/pages/events-page.test.tsx +4 -4
  89. package/src/pages/events-page.tsx +3 -4
  90. package/src/routes/events-settings.tsx +1 -1
  91. package/src/search.ts +4 -5
  92. package/tsconfig.build.tsbuildinfo +1 -1
  93. package/vercel.json +5 -0
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 16 files with swc (469.63ms)
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 { TriggerEventFacetItemDto } from '@shipfox/api-triggers-dto';
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: TriggerEventFacetItemDto[] | undefined;
7
- events: TriggerEventFacetItemDto[] | undefined;
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":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAyB,MAAM,2BAA2B,CAAC;AAQhG,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAC;AAwBtE,UAAU,oBAAoB;IAC5B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;IAC/D,OAAO,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAC/C,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"}
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: 'routed',
14
- selects: [
15
- 'routed'
16
- ],
14
+ value: 'triggered',
15
+ selects: triggerEventResultFilterOutcomes.triggered,
17
16
  label: 'Triggered'
18
17
  },
19
18
  {
20
- value: 'discarded',
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: 'received',
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;AAYhD,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"}
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 = hasAnyFilter(filters);
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 type {TriggerEventFilters} from '#hooks/api/trigger-events.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\nfunction hasAnyFilter(filters: TriggerEventFilters): boolean {\n return Boolean(\n (filters.source && filters.source.length > 0) ||\n (filters.event && filters.event.length > 0) ||\n filters.from ||\n filters.to ||\n (filters.outcome && filters.outcome.length > 0),\n );\n}\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 = hasAnyFilter(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","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","hasAnyFilter","filters","Boolean","source","length","event","from","to","outcome","EventsList","events","query","facets","onFiltersChange","workspaceId","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","clearFilters","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;AAE3F,SAAQC,eAAe,QAAO,yBAAyB;AACvD,SACEC,eAAe,EACfC,mBAAmB,EACnBC,kBAAkB,EAClBC,oBAAoB,QACf,0BAA0B;AACjC,SAAQC,eAAe,QAAO,yBAAyB;AAGvD,SAASC,aAAaC,OAA4B;IAChD,OAAOC,QACL,AAACD,QAAQE,MAAM,IAAIF,QAAQE,MAAM,CAACC,MAAM,GAAG,KACxCH,QAAQI,KAAK,IAAIJ,QAAQI,KAAK,CAACD,MAAM,GAAG,KACzCH,QAAQK,IAAI,IACZL,QAAQM,EAAE,IACTN,QAAQO,OAAO,IAAIP,QAAQO,OAAO,CAACJ,MAAM,GAAG;AAEnD;AAEA,OAAO,SAASK,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNX,OAAO,EACPY,eAAe,EACfC,WAAW,EACXC,WAAW,EACXC,kBAAkB,EAClBC,UAAU,EACVC,eAAe,EACfC,aAAa,EACG;IAChB,MAAMC,gBAAgBpB,aAAaC;IACnC,MAAMoB,gBAAgBV,MAAMW,OAAO,IAAIX,MAAMY,IAAI,KAAKC;IACtD,MAAMC,iBAAiB,CAACd,MAAMe,SAAS,IAAI,CAACf,MAAMW,OAAO,IAAIZ,OAAON,MAAM,KAAK;IAE/E,SAASuB;QACPd,gBAAgB;YACdV,QAAQqB;YACRnB,OAAOmB;YACPhB,SAASgB;YACTlB,MAAMkB;YACNjB,IAAIiB;QACN;IACF;IAEA,qBACE,MAACI;QAAIC,WAAU;;0BACb,KAACnC;gBACCO,SAASA;gBACTY,iBAAiBA;gBACjBiB,SAASlB,QAAQkB;gBACjBpB,QAAQE,QAAQF;gBAChBqB,kBAAkBX;gBAClBY,SAASL;;YAGVhB,MAAMe,SAAS,iBAAG,KAAC7B,0BAAwB;YAC3C,CAACc,MAAMe,SAAS,iBAAG,KAACvC;gBAAewB,OAAOA;gBAAOsB,SAAQ;gBAASC,MAAK;iBAAiB;YACxF,CAACvB,MAAMe,SAAS,IAAIL,8BAAgB,KAACvB;gBAAqBa,OAAOA;iBAAY;YAC7Ec,kBAAkB,CAACL,8BAAgB,KAACzB;gBAAgBmB,aAAaA;iBAAkB;YACnFW,kBAAkBL,8BAAgB,KAACxB;gBAAoBoC,SAASL;iBAAmB;YAEnFjB,OAAON,MAAM,GAAG,kBACf;;kCACE,MAACf;;0CACC,KAACG;gCAAYqC,WAAU;0CACrB,cAAA,MAACpC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUsC,WAAU;sDAAa;;;;;0CAGtC,KAACvC;0CACEoB,OAAOyB,GAAG,CAAC,CAAC9B,sBACX,KAACN;wCAECM,OAAOA;wCACP+B,UAAU/B,MAAMgC,EAAE,KAAKnB;wCACvBoB,UAAUnB;uCAHLd,MAAMgC,EAAE;;;;oBAQpBtB,4BACC,KAACa;wBAAIC,WAAU;kCACb,cAAA,KAACzC;4BACCmD,MAAK;4BACLC,SAAQ;4BACRC,MAAK;4BACLC,WAAW1B;4BACX2B,SAAS1B;sCACV;;yBAID;;iBAEJ;;;AAGV"}
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;AAEhE,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
+ {"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: TriggerEventListItemDto[] = [\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];\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","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","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
+ {"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 { TriggerEventDetailResponseDto } from '@shipfox/api-triggers-dto';
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: TriggerEventDetailResponseDto;
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":"AAAA,OAAO,KAAK,EAAqB,6BAA6B,EAAC,MAAM,2BAA2B,CAAC;AA8BjG,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,6BAA6B,CAAC;IACrC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,+BAmEA"}
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.received_at
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.run_id || !decision.run_name) {
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.subscription_name
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.project_id,
293
- workflowRunId: decision.run_id
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.subscription_name
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.run_name
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":"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"}
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;AAUhE,OAAO,EAAC,sBAAsB,EAAC,MAAM,2BAA2B,CAAC;AAoHjE,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"}
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"}