@shipfox/client-triggers 21.0.0 → 22.0.1

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 (111.19ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @shipfox/client-triggers
2
2
 
3
+ ## 22.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - e92517f: Reorganizes workspace settings into a compact sidebar rail with section panels and relocates Events settings into the new workspace layout.
8
+ - Updated dependencies [e92517f]
9
+ - @shipfox/client-shell@22.0.1
10
+ - @shipfox/client-projects@22.0.1
11
+
12
+ ## 22.0.0
13
+
14
+ ### Patch Changes
15
+
16
+ - 7693eb3: Render empty and load-error states inside bordered panel bodies and keep loading placeholders aligned with their data regions.
17
+ - 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.
18
+ - Updated dependencies [50b3867]
19
+ - Updated dependencies [00c1cb8]
20
+ - Updated dependencies [7693eb3]
21
+ - Updated dependencies [00c1cb8]
22
+ - Updated dependencies [00c1cb8]
23
+ - Updated dependencies [00c1cb8]
24
+ - Updated dependencies [56f4526]
25
+ - @shipfox/client-shell@22.0.0
26
+ - @shipfox/react-ui@2.1.0
27
+ - @shipfox/client-ui@22.0.0
28
+ - @shipfox/client-projects@22.0.0
29
+ - @shipfox/integration-icons@0.3.5
30
+
3
31
  ## 21.0.0
4
32
 
5
33
  ### 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"}
@@ -2,7 +2,7 @@ import { type TriggerEventsSearch } from '#search.js';
2
2
  declare function validateSearch(search: Record<string, unknown>): TriggerEventsSearch;
3
3
  declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
4
4
  readonly staticData: {
5
- readonly frame: "data";
5
+ readonly frame: "content";
6
6
  };
7
7
  readonly validateSearch: typeof validateSearch;
8
8
  readonly component: () => import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"events-settings.d.ts","sourceRoot":"","sources":["../../src/routes/events-settings.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,KAAK,mBAAmB,EAA8B,MAAM,YAAY,CAAC;AAQjF,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAE5E"}
1
+ {"version":3,"file":"events-settings.d.ts","sourceRoot":"","sources":["../../src/routes/events-settings.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAC,KAAK,mBAAmB,EAA8B,MAAM,YAAY,CAAC;AAQjF,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAE5E"}
@@ -1,5 +1,6 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { defineRoute, useActiveWorkspace } from '@shipfox/client-shell/runtime';
3
+ import { Header } from '@shipfox/react-ui/typography';
3
4
  import { getRouteApi } from '@tanstack/react-router';
4
5
  import { EventsPage } from '#pages/events-page.js';
5
6
  import { validateTriggerEventsSearch } from '#search.js';
@@ -13,7 +14,7 @@ function validateSearch(search) {
13
14
  }
14
15
  export default defineRoute({
15
16
  staticData: {
16
- frame: 'data'
17
+ frame: 'content'
17
18
  },
18
19
  validateSearch,
19
20
  component: ()=>{
@@ -29,11 +30,20 @@ export default defineRoute({
29
30
  replace: true
30
31
  });
31
32
  };
32
- return /*#__PURE__*/ _jsx(EventsPage, {
33
- workspaceId: workspace.id,
34
- workspaceSlug: workspace.slug,
35
- filters: search,
36
- onFiltersChange: onFiltersChange
33
+ return /*#__PURE__*/ _jsxs("div", {
34
+ className: "flex min-w-0 flex-col gap-section",
35
+ children: [
36
+ /*#__PURE__*/ _jsx(Header, {
37
+ variant: "h1",
38
+ children: "Events"
39
+ }),
40
+ /*#__PURE__*/ _jsx(EventsPage, {
41
+ workspaceId: workspace.id,
42
+ workspaceSlug: workspace.slug,
43
+ filters: search,
44
+ onFiltersChange: onFiltersChange
45
+ })
46
+ ]
37
47
  });
38
48
  }
39
49
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/events-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {getRouteApi} from '@tanstack/react-router';\nimport type {TriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsPage} from '#pages/events-page.js';\nimport {type TriggerEventsSearch, validateTriggerEventsSearch} from '#search.js';\n\nconst routeApi = getRouteApi('/w/$workspaceSlug/settings/events');\n\n// Wrapped (not just re-typed) so the search validator's own type is portable outside this\n// package: TanStack Router's `const` generics capture the exact declared function, and a\n// route module consumed from another package (apps/client's composed router) can't print a\n// type that only resolves through this package's internal `#search.js` path.\nfunction validateSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return validateTriggerEventsSearch(search);\n}\n\nexport default defineRoute({\n staticData: {frame: 'data'},\n validateSearch,\n component: () => {\n const workspace = useActiveWorkspace();\n const search = routeApi.useSearch();\n const navigate = routeApi.useNavigate();\n const onFiltersChange = (patch: Partial<TriggerEventFilters>) => {\n void navigate({search: {...search, ...patch}, replace: true});\n };\n return (\n <EventsPage\n workspaceId={workspace.id}\n workspaceSlug={workspace.slug}\n filters={search}\n onFiltersChange={onFiltersChange}\n />\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","getRouteApi","EventsPage","validateTriggerEventsSearch","routeApi","validateSearch","search","staticData","frame","component","workspace","useSearch","navigate","useNavigate","onFiltersChange","patch","replace","workspaceId","id","workspaceSlug","slug","filters"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,WAAW,QAAO,yBAAyB;AAEnD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAkCC,2BAA2B,QAAO,aAAa;AAEjF,MAAMC,WAAWH,YAAY;AAE7B,0FAA0F;AAC1F,yFAAyF;AACzF,2FAA2F;AAC3F,6EAA6E;AAC7E,SAASI,eAAeC,MAA+B;IACrD,OAAOH,4BAA4BG;AACrC;AAEA,eAAeP,YAAY;IACzBQ,YAAY;QAACC,OAAO;IAAM;IAC1BH;IACAI,WAAW;QACT,MAAMC,YAAYV;QAClB,MAAMM,SAASF,SAASO,SAAS;QACjC,MAAMC,WAAWR,SAASS,WAAW;QACrC,MAAMC,kBAAkB,CAACC;YACvB,KAAKH,SAAS;gBAACN,QAAQ;oBAAC,GAAGA,MAAM;oBAAE,GAAGS,KAAK;gBAAA;gBAAGC,SAAS;YAAI;QAC7D;QACA,qBACE,KAACd;YACCe,aAAaP,UAAUQ,EAAE;YACzBC,eAAeT,UAAUU,IAAI;YAC7BC,SAASf;YACTQ,iBAAiBA;;IAGvB;AACF,GAAG"}
1
+ {"version":3,"sources":["../../src/routes/events-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {Header} from '@shipfox/react-ui/typography';\nimport {getRouteApi} from '@tanstack/react-router';\nimport type {TriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsPage} from '#pages/events-page.js';\nimport {type TriggerEventsSearch, validateTriggerEventsSearch} from '#search.js';\n\nconst routeApi = getRouteApi('/w/$workspaceSlug/settings/events');\n\n// Wrapped (not just re-typed) so the search validator's own type is portable outside this\n// package: TanStack Router's `const` generics capture the exact declared function, and a\n// route module consumed from another package (apps/client's composed router) can't print a\n// type that only resolves through this package's internal `#search.js` path.\nfunction validateSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return validateTriggerEventsSearch(search);\n}\n\nexport default defineRoute({\n staticData: {frame: 'content'},\n validateSearch,\n component: () => {\n const workspace = useActiveWorkspace();\n const search = routeApi.useSearch();\n const navigate = routeApi.useNavigate();\n const onFiltersChange = (patch: Partial<TriggerEventFilters>) => {\n void navigate({search: {...search, ...patch}, replace: true});\n };\n return (\n <div className=\"flex min-w-0 flex-col gap-section\">\n <Header variant=\"h1\">Events</Header>\n <EventsPage\n workspaceId={workspace.id}\n workspaceSlug={workspace.slug}\n filters={search}\n onFiltersChange={onFiltersChange}\n />\n </div>\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","Header","getRouteApi","EventsPage","validateTriggerEventsSearch","routeApi","validateSearch","search","staticData","frame","component","workspace","useSearch","navigate","useNavigate","onFiltersChange","patch","replace","div","className","variant","workspaceId","id","workspaceSlug","slug","filters"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,MAAM,QAAO,+BAA+B;AACpD,SAAQC,WAAW,QAAO,yBAAyB;AAEnD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAkCC,2BAA2B,QAAO,aAAa;AAEjF,MAAMC,WAAWH,YAAY;AAE7B,0FAA0F;AAC1F,yFAAyF;AACzF,2FAA2F;AAC3F,6EAA6E;AAC7E,SAASI,eAAeC,MAA+B;IACrD,OAAOH,4BAA4BG;AACrC;AAEA,eAAeR,YAAY;IACzBS,YAAY;QAACC,OAAO;IAAS;IAC7BH;IACAI,WAAW;QACT,MAAMC,YAAYX;QAClB,MAAMO,SAASF,SAASO,SAAS;QACjC,MAAMC,WAAWR,SAASS,WAAW;QACrC,MAAMC,kBAAkB,CAACC;YACvB,KAAKH,SAAS;gBAACN,QAAQ;oBAAC,GAAGA,MAAM;oBAAE,GAAGS,KAAK;gBAAA;gBAAGC,SAAS;YAAI;QAC7D;QACA,qBACE,MAACC;YAAIC,WAAU;;8BACb,KAAClB;oBAAOmB,SAAQ;8BAAK;;8BACrB,KAACjB;oBACCkB,aAAaV,UAAUW,EAAE;oBACzBC,eAAeZ,UAAUa,IAAI;oBAC7BC,SAASlB;oBACTQ,iBAAiBA;;;;IAIzB;AACF,GAAG"}