@shipfox/client-triggers 21.0.0 → 22.0.0

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.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 18 files with swc (96.81ms)
2
+ Successfully compiled: 18 files with swc (286ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @shipfox/client-triggers
2
2
 
3
+ ## 22.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 7693eb3: Render empty and load-error states inside bordered panel bodies and keep loading placeholders aligned with their data regions.
8
+ - 00c1cb8: Panels across these surfaces share one hover, focus, and elevation treatment. Grids of openable things, including the integration gallery, the available providers grid, and the harness picker, render as cells inside a single panel divided by hairlines instead of separate bordered tiles.
9
+ - Updated dependencies [50b3867]
10
+ - Updated dependencies [00c1cb8]
11
+ - Updated dependencies [7693eb3]
12
+ - Updated dependencies [00c1cb8]
13
+ - Updated dependencies [00c1cb8]
14
+ - Updated dependencies [00c1cb8]
15
+ - Updated dependencies [56f4526]
16
+ - @shipfox/client-shell@22.0.0
17
+ - @shipfox/react-ui@2.1.0
18
+ - @shipfox/client-ui@22.0.0
19
+ - @shipfox/client-projects@22.0.0
20
+ - @shipfox/integration-icons@0.3.5
21
+
3
22
  ## 21.0.0
4
23
 
5
24
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"events-list-states.d.ts","sourceRoot":"","sources":["../../src/components/events-list-states.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAQ5D,wBAAgB,kBAAkB,gCAiBjC;AAED,wBAAgB,eAAe,CAAC,EAAC,aAAa,EAAC,EAAE;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,+BAmBpF;AAED,wBAAgB,mBAAmB,CAAC,EAAC,OAAO,EAAC,EAAE;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAC,+BAenE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAC,KAAK,EAAC,EAAE;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAC,+BAqBzE"}
1
+ {"version":3,"file":"events-list-states.d.ts","sourceRoot":"","sources":["../../src/components/events-list-states.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAQ5D,wBAAgB,kBAAkB,gCAqBjC;AAED,wBAAgB,eAAe,CAAC,EAAC,aAAa,EAAC,EAAE;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,+BAkBpF;AAED,wBAAgB,mBAAmB,CAAC,EAAC,OAAO,EAAC,EAAE;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAC,+BAcnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAC,KAAK,EAAC,EAAE;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAC,+BAqBzE"}
@@ -7,13 +7,13 @@ import { Text } from '@shipfox/react-ui/typography';
7
7
  import { Link } from '@tanstack/react-router';
8
8
  export function EventsListSkeleton() {
9
9
  return /*#__PURE__*/ _jsx("div", {
10
- className: "flex flex-col gap-inline p-tight",
10
+ className: "flex flex-col divide-y divide-border-neutral-base",
11
11
  role: "status",
12
12
  "aria-label": "Loading events",
13
13
  children: Array.from({
14
14
  length: 8
15
15
  }).map((_, index)=>/*#__PURE__*/ _jsxs("div", {
16
- className: "flex h-20 items-center gap-cluster",
16
+ className: "flex min-h-44 items-center gap-cluster px-row py-row",
17
17
  children: [
18
18
  /*#__PURE__*/ _jsx(Skeleton, {
19
19
  className: "size-6 shrink-0 rounded-full"
@@ -32,42 +32,38 @@ export function EventsListSkeleton() {
32
32
  });
33
33
  }
34
34
  export function EventsListEmpty({ workspaceSlug }) {
35
- return /*#__PURE__*/ _jsx("div", {
36
- className: "p-panel-compact",
37
- children: /*#__PURE__*/ _jsx(EmptyState, {
38
- icon: "pulseLine",
39
- title: "No events yet",
40
- description: "Events appear here once a connected integration delivers one or you fire a trigger.",
41
- action: workspaceSlug ? /*#__PURE__*/ _jsx(Button, {
42
- asChild: true,
43
- size: "sm",
44
- variant: "secondary",
45
- children: /*#__PURE__*/ _jsx(Link, {
46
- to: "/w/$workspaceSlug/settings/integrations",
47
- params: {
48
- workspaceSlug
49
- },
50
- children: "Configure integrations"
51
- })
52
- }) : undefined
53
- })
35
+ return /*#__PURE__*/ _jsx(EmptyState, {
36
+ icon: "pulseLine",
37
+ title: "No events yet",
38
+ description: "Events appear here once a connected integration delivers one or you fire a trigger.",
39
+ action: workspaceSlug ? /*#__PURE__*/ _jsx(Button, {
40
+ asChild: true,
41
+ size: "sm",
42
+ variant: "secondary",
43
+ children: /*#__PURE__*/ _jsx(Link, {
44
+ to: "/w/$workspaceSlug/settings/integrations",
45
+ params: {
46
+ workspaceSlug
47
+ },
48
+ children: "Configure integrations"
49
+ })
50
+ }) : undefined,
51
+ variant: "panel"
54
52
  });
55
53
  }
56
54
  export function EventsListNoMatches({ onClear }) {
57
- return /*#__PURE__*/ _jsx("div", {
58
- className: "p-panel-compact",
59
- children: /*#__PURE__*/ _jsx(EmptyState, {
60
- icon: "filterOffLine",
61
- title: "No matching events",
62
- description: "No events match your current filters.",
63
- action: /*#__PURE__*/ _jsx(Button, {
64
- type: "button",
65
- size: "sm",
66
- variant: "secondary",
67
- onClick: onClear,
68
- children: "Clear filters"
69
- })
70
- })
55
+ return /*#__PURE__*/ _jsx(EmptyState, {
56
+ icon: "filterOffLine",
57
+ title: "No matching events",
58
+ description: "No events match your current filters.",
59
+ action: /*#__PURE__*/ _jsx(Button, {
60
+ type: "button",
61
+ size: "sm",
62
+ variant: "secondary",
63
+ onClick: onClear,
64
+ children: "Clear filters"
65
+ }),
66
+ variant: "panel"
71
67
  });
72
68
  }
73
69
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/events-list-states.tsx"],"sourcesContent":["import type {QueryLoadErrorQuery} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\n\nexport function EventsListSkeleton() {\n return (\n <div className=\"flex flex-col gap-inline p-tight\" role=\"status\" aria-label=\"Loading events\">\n {Array.from({length: 8}).map((_, index) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: skeleton row, stable position\n key={index}\n className=\"flex h-20 items-center gap-cluster\"\n >\n <Skeleton className=\"size-6 shrink-0 rounded-full\" />\n <Skeleton className=\"h-12 w-1/4\" />\n <Skeleton className=\"h-12 w-20\" />\n <Skeleton className=\"ml-auto h-12 w-40\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function EventsListEmpty({workspaceSlug}: {workspaceSlug?: string | undefined}) {\n return (\n <div className=\"p-panel-compact\">\n <EmptyState\n icon=\"pulseLine\"\n title=\"No events yet\"\n description=\"Events appear here once a connected integration delivers one or you fire a trigger.\"\n action={\n workspaceSlug ? (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/w/$workspaceSlug/settings/integrations\" params={{workspaceSlug}}>\n Configure integrations\n </Link>\n </Button>\n ) : undefined\n }\n />\n </div>\n );\n}\n\nexport function EventsListNoMatches({onClear}: {onClear: () => void}) {\n return (\n <div className=\"p-panel-compact\">\n <EmptyState\n icon=\"filterOffLine\"\n title=\"No matching events\"\n description=\"No events match your current filters.\"\n action={\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear filters\n </Button>\n }\n />\n </div>\n );\n}\n\n/**\n * Slim banner shown when a background refetch fails after a prior success, so the loaded\n * rows stay on screen with the retry inline rather than being wiped by a full placeholder.\n */\nexport function EventsListStaleError({query}: {query: QueryLoadErrorQuery}) {\n return (\n <div className=\"p-tight\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-inline\">\n <Text size=\"xs\">Could not refresh events.</Text>\n <Button\n type=\"button\"\n size=\"2xs\"\n variant=\"secondary\"\n isLoading={query.isFetching}\n onClick={() => {\n void query.refetch();\n }}\n >\n Retry\n </Button>\n </div>\n </Callout>\n </div>\n );\n}\n"],"names":["Button","Callout","EmptyState","Skeleton","Text","Link","EventsListSkeleton","div","className","role","aria-label","Array","from","length","map","_","index","EventsListEmpty","workspaceSlug","icon","title","description","action","asChild","size","variant","to","params","undefined","EventsListNoMatches","onClear","type","onClick","EventsListStaleError","query","isLoading","isFetching","refetch"],"mappings":";AACA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAE5C,OAAO,SAASC;IACd,qBACE,KAACC;QAAIC,WAAU;QAAmCC,MAAK;QAASC,cAAW;kBACxEC,MAAMC,IAAI,CAAC;YAACC,QAAQ;QAAC,GAAGC,GAAG,CAAC,CAACC,GAAGC,sBAC/B,MAACT;gBAGCC,WAAU;;kCAEV,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;;eANfQ;;AAWf;AAEA,OAAO,SAASC,gBAAgB,EAACC,aAAa,EAAuC;IACnF,qBACE,KAACX;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,QACEJ,8BACE,KAAClB;gBAAOuB,OAAO;gBAACC,MAAK;gBAAKC,SAAQ;0BAChC,cAAA,KAACpB;oBAAKqB,IAAG;oBAA0CC,QAAQ;wBAACT;oBAAa;8BAAG;;iBAI5EU;;;AAKd;AAEA,OAAO,SAASC,oBAAoB,EAACC,OAAO,EAAwB;IAClE,qBACE,KAACvB;QAAIC,WAAU;kBACb,cAAA,KAACN;YACCiB,MAAK;YACLC,OAAM;YACNC,aAAY;YACZC,sBACE,KAACtB;gBAAO+B,MAAK;gBAASP,MAAK;gBAAKC,SAAQ;gBAAYO,SAASF;0BAAS;;;;AAOhF;AAEA;;;CAGC,GACD,OAAO,SAASG,qBAAqB,EAACC,KAAK,EAA+B;IACxE,qBACE,KAAC3B;QAAIC,WAAU;kBACb,cAAA,KAACP;YAAQQ,MAAK;YAAQsB,MAAK;sBACzB,cAAA,MAACxB;gBAAIC,WAAU;;kCACb,KAACJ;wBAAKoB,MAAK;kCAAK;;kCAChB,KAACxB;wBACC+B,MAAK;wBACLP,MAAK;wBACLC,SAAQ;wBACRU,WAAWD,MAAME,UAAU;wBAC3BJ,SAAS;4BACP,KAAKE,MAAMG,OAAO;wBACpB;kCACD;;;;;;AAOX"}
1
+ {"version":3,"sources":["../../src/components/events-list-states.tsx"],"sourcesContent":["import type {QueryLoadErrorQuery} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\n\nexport function EventsListSkeleton() {\n return (\n <div\n className=\"flex flex-col divide-y divide-border-neutral-base\"\n role=\"status\"\n aria-label=\"Loading events\"\n >\n {Array.from({length: 8}).map((_, index) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: skeleton row, stable position\n key={index}\n className=\"flex min-h-44 items-center gap-cluster px-row py-row\"\n >\n <Skeleton className=\"size-6 shrink-0 rounded-full\" />\n <Skeleton className=\"h-12 w-1/4\" />\n <Skeleton className=\"h-12 w-20\" />\n <Skeleton className=\"ml-auto h-12 w-40\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function EventsListEmpty({workspaceSlug}: {workspaceSlug?: string | undefined}) {\n return (\n <EmptyState\n icon=\"pulseLine\"\n title=\"No events yet\"\n description=\"Events appear here once a connected integration delivers one or you fire a trigger.\"\n action={\n workspaceSlug ? (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/w/$workspaceSlug/settings/integrations\" params={{workspaceSlug}}>\n Configure integrations\n </Link>\n </Button>\n ) : undefined\n }\n variant=\"panel\"\n />\n );\n}\n\nexport function EventsListNoMatches({onClear}: {onClear: () => void}) {\n return (\n <EmptyState\n icon=\"filterOffLine\"\n title=\"No matching events\"\n description=\"No events match your current filters.\"\n action={\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={onClear}>\n Clear filters\n </Button>\n }\n variant=\"panel\"\n />\n );\n}\n\n/**\n * Slim banner shown when a background refetch fails after a prior success, so the loaded\n * rows stay on screen with the retry inline rather than being wiped by a full placeholder.\n */\nexport function EventsListStaleError({query}: {query: QueryLoadErrorQuery}) {\n return (\n <div className=\"p-tight\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-inline\">\n <Text size=\"xs\">Could not refresh events.</Text>\n <Button\n type=\"button\"\n size=\"2xs\"\n variant=\"secondary\"\n isLoading={query.isFetching}\n onClick={() => {\n void query.refetch();\n }}\n >\n Retry\n </Button>\n </div>\n </Callout>\n </div>\n );\n}\n"],"names":["Button","Callout","EmptyState","Skeleton","Text","Link","EventsListSkeleton","div","className","role","aria-label","Array","from","length","map","_","index","EventsListEmpty","workspaceSlug","icon","title","description","action","asChild","size","variant","to","params","undefined","EventsListNoMatches","onClear","type","onClick","EventsListStaleError","query","isLoading","isFetching","refetch"],"mappings":";AACA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAE5C,OAAO,SAASC;IACd,qBACE,KAACC;QACCC,WAAU;QACVC,MAAK;QACLC,cAAW;kBAEVC,MAAMC,IAAI,CAAC;YAACC,QAAQ;QAAC,GAAGC,GAAG,CAAC,CAACC,GAAGC,sBAC/B,MAACT;gBAGCC,WAAU;;kCAEV,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;kCACpB,KAACL;wBAASK,WAAU;;;eANfQ;;AAWf;AAEA,OAAO,SAASC,gBAAgB,EAACC,aAAa,EAAuC;IACnF,qBACE,KAAChB;QACCiB,MAAK;QACLC,OAAM;QACNC,aAAY;QACZC,QACEJ,8BACE,KAAClB;YAAOuB,OAAO;YAACC,MAAK;YAAKC,SAAQ;sBAChC,cAAA,KAACpB;gBAAKqB,IAAG;gBAA0CC,QAAQ;oBAACT;gBAAa;0BAAG;;aAI5EU;QAENH,SAAQ;;AAGd;AAEA,OAAO,SAASI,oBAAoB,EAACC,OAAO,EAAwB;IAClE,qBACE,KAAC5B;QACCiB,MAAK;QACLC,OAAM;QACNC,aAAY;QACZC,sBACE,KAACtB;YAAO+B,MAAK;YAASP,MAAK;YAAKC,SAAQ;YAAYO,SAASF;sBAAS;;QAIxEL,SAAQ;;AAGd;AAEA;;;CAGC,GACD,OAAO,SAASQ,qBAAqB,EAACC,KAAK,EAA+B;IACxE,qBACE,KAAC3B;QAAIC,WAAU;kBACb,cAAA,KAACP;YAAQQ,MAAK;YAAQsB,MAAK;sBACzB,cAAA,MAACxB;gBAAIC,WAAU;;kCACb,KAACJ;wBAAKoB,MAAK;kCAAK;;kCAChB,KAACxB;wBACC+B,MAAK;wBACLP,MAAK;wBACLC,SAAQ;wBACRU,WAAWD,MAAME,UAAU;wBAC3BJ,SAAS;4BACP,KAAKE,MAAMG,OAAO;wBACpB;kCACD;;;;;;AAOX"}
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../src/components/events-list.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAEhD,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,aAAa,EACb,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":"AAaA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAEhD,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,aAAa,GACd,EAAE,eAAe,+BAwEjB"}
@@ -35,7 +35,8 @@ export function EventsList({ events, query, facets, filters, onFiltersChange, wo
35
35
  !query.isPending ? /*#__PURE__*/ _jsx(QueryLoadError, {
36
36
  query: query,
37
37
  subject: "events",
38
- icon: "pulseLine"
38
+ icon: "pulseLine",
39
+ variant: "panel"
39
40
  }) : null,
40
41
  !query.isPending && refreshFailed ? /*#__PURE__*/ _jsx(EventsListStaleError, {
41
42
  query: query
@@ -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 {Panel} from '@shipfox/react-ui/panel';\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 workspaceSlug,\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 <Panel className=\"min-h-0 overflow-hidden p-0\">\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 workspaceSlug={workspaceSlug} /> : 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-panel-compact\">\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 </Panel>\n );\n}\n"],"names":["QueryLoadError","Button","Panel","Table","TableBody","TableHead","TableHeader","TableRow","hasTriggerEventFilters","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","EventsList","events","query","facets","filters","onFiltersChange","workspaceSlug","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","length","clearFilters","source","event","outcome","from","to","className","sources","hasActiveFilters","onClear","subject","icon","map","selected","id","onSelect","div","type","variant","size","isLoading","onClick"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,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,aAAa,EACbC,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,MAAC7B;QAAMuC,WAAU;;0BACf,KAAChC;gBACCU,SAASA;gBACTC,iBAAiBA;gBACjBsB,SAASxB,QAAQwB;gBACjB1B,QAAQE,QAAQF;gBAChB2B,kBAAkBhB;gBAClBiB,SAAST;;YAGVlB,MAAMgB,SAAS,iBAAG,KAACrB,0BAAwB;YAC3C,CAACK,MAAMgB,SAAS,iBAAG,KAACjC;gBAAeiB,OAAOA;gBAAO4B,SAAQ;gBAASC,MAAK;iBAAiB;YACxF,CAAC7B,MAAMgB,SAAS,IAAIL,8BAAgB,KAACf;gBAAqBI,OAAOA;iBAAY;YAC7Ee,kBAAkB,CAACL,8BAAgB,KAACjB;gBAAgBW,eAAeA;iBAAoB;YACvFW,kBAAkBL,8BAAgB,KAAChB;gBAAoBiC,SAAST;iBAAmB;YAEnFnB,OAAOkB,MAAM,GAAG,kBACf;;kCACE,MAAC/B;;0CACC,KAACG;gCAAYmC,WAAU;0CACrB,cAAA,MAAClC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUoC,WAAU;sDAAa;;;;;0CAGtC,KAACrC;0CACEY,OAAO+B,GAAG,CAAC,CAACV,sBACX,KAACvB;wCAECuB,OAAOA;wCACPW,UAAUX,MAAMY,EAAE,KAAKxB;wCACvByB,UAAUxB;uCAHLW,MAAMY,EAAE;;;;oBAQpB3B,4BACC,KAAC6B;wBAAIV,WAAU;kCACb,cAAA,KAACxC;4BACCmD,MAAK;4BACLC,SAAQ;4BACRC,MAAK;4BACLC,WAAWhC;4BACXiC,SAAShC;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 {Panel} from '@shipfox/react-ui/panel';\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 workspaceSlug,\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 <Panel className=\"min-h-0 overflow-hidden p-0\">\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 ? (\n <QueryLoadError query={query} subject=\"events\" icon=\"pulseLine\" variant=\"panel\" />\n ) : null}\n {!query.isPending && refreshFailed ? <EventsListStaleError query={query} /> : null}\n {showEmptyState && !activeFilters ? <EventsListEmpty workspaceSlug={workspaceSlug} /> : 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-panel-compact\">\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 </Panel>\n );\n}\n"],"names":["QueryLoadError","Button","Panel","Table","TableBody","TableHead","TableHeader","TableRow","hasTriggerEventFilters","EventsFilterBar","EventsListEmpty","EventsListNoMatches","EventsListSkeleton","EventsListStaleError","TriggerEventRow","EventsList","events","query","facets","filters","onFiltersChange","workspaceSlug","hasNextPage","isFetchingNextPage","onLoadMore","selectedEventId","onSelectEvent","activeFilters","refreshFailed","isError","data","undefined","showEmptyState","isPending","length","clearFilters","source","event","outcome","from","to","className","sources","hasActiveFilters","onClear","subject","icon","variant","map","selected","id","onSelect","div","type","size","isLoading","onClick"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,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,aAAa,EACbC,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,MAAC7B;QAAMuC,WAAU;;0BACf,KAAChC;gBACCU,SAASA;gBACTC,iBAAiBA;gBACjBsB,SAASxB,QAAQwB;gBACjB1B,QAAQE,QAAQF;gBAChB2B,kBAAkBhB;gBAClBiB,SAAST;;YAGVlB,MAAMgB,SAAS,iBAAG,KAACrB,0BAAwB;YAC3C,CAACK,MAAMgB,SAAS,iBACf,KAACjC;gBAAeiB,OAAOA;gBAAO4B,SAAQ;gBAASC,MAAK;gBAAYC,SAAQ;iBACtE;YACH,CAAC9B,MAAMgB,SAAS,IAAIL,8BAAgB,KAACf;gBAAqBI,OAAOA;iBAAY;YAC7Ee,kBAAkB,CAACL,8BAAgB,KAACjB;gBAAgBW,eAAeA;iBAAoB;YACvFW,kBAAkBL,8BAAgB,KAAChB;gBAAoBiC,SAAST;iBAAmB;YAEnFnB,OAAOkB,MAAM,GAAG,kBACf;;kCACE,MAAC/B;;0CACC,KAACG;gCAAYmC,WAAU;0CACrB,cAAA,MAAClC;;sDACC,KAACF;sDAAU;;sDACX,KAACA;sDAAU;;sDACX,KAACA;4CAAUoC,WAAU;sDAAa;;;;;0CAGtC,KAACrC;0CACEY,OAAOgC,GAAG,CAAC,CAACX,sBACX,KAACvB;wCAECuB,OAAOA;wCACPY,UAAUZ,MAAMa,EAAE,KAAKzB;wCACvB0B,UAAUzB;uCAHLW,MAAMa,EAAE;;;;oBAQpB5B,4BACC,KAAC8B;wBAAIX,WAAU;kCACb,cAAA,KAACxC;4BACCoD,MAAK;4BACLN,SAAQ;4BACRO,MAAK;4BACLC,WAAWhC;4BACXiC,SAAShC;sCACV;;yBAID;;iBAEJ;;;AAGV"}