@mastra/playground-ui 51.0.1-alpha.2 → 51.1.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/dist/components/ChatShell.cjs.js +1 -1
- package/dist/components/ChatShell.es.js +1 -1
- package/dist/components/DataList.cjs.js +4 -4
- package/dist/components/DataList.es.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MessageScroller.cjs.js +1 -1
- package/dist/components/MessageScroller.es.js +2 -2
- package/dist/components/PropertyFilter.cjs.js +8 -46
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +9 -47
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/SankeyChart.cjs.js +2 -2
- package/dist/components/SankeyChart.es.js +2 -2
- package/dist/components/ThreadRail.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +121 -0
- package/dist/components/ai/tool-call.cjs.js.map +1 -0
- package/dist/components/ai/tool-call.d.ts +2 -0
- package/dist/components/ai/tool-call.es.js +107 -0
- package/dist/components/ai/tool-call.es.js.map +1 -0
- package/dist/{data-list-1ZBvLIZN.js → data-list-BH7hZM1i.js} +2 -2
- package/dist/{data-list-1ZBvLIZN.js.map → data-list-BH7hZM1i.js.map} +1 -1
- package/dist/{data-list-Cfj5klVF.cjs → data-list-Ct54I5vM.cjs} +2 -2
- package/dist/{data-list-Cfj5klVF.cjs.map → data-list-Ct54I5vM.cjs.map} +1 -1
- package/dist/{data-list-skeleton-qASobJaP.cjs → data-list-skeleton-BF-7wpb9.cjs} +2 -2
- package/dist/{data-list-skeleton-qASobJaP.cjs.map → data-list-skeleton-BF-7wpb9.cjs.map} +1 -1
- package/dist/{data-list-skeleton-CSUKnbTp.js → data-list-skeleton-DYOnJOWM.js} +2 -2
- package/dist/{data-list-skeleton-CSUKnbTp.js.map → data-list-skeleton-DYOnJOWM.js.map} +1 -1
- package/dist/{data-list-top-cell-BJBfjw34.cjs → data-list-top-cell-ByJL1bVv.cjs} +3 -8
- package/dist/data-list-top-cell-ByJL1bVv.cjs.map +1 -0
- package/dist/{data-list-top-cell-DeUwFnvc.js → data-list-top-cell-C1a8If1K.js} +3 -8
- package/dist/data-list-top-cell-C1a8If1K.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/memory/components/flame-graph-data.cjs.js +128 -0
- package/dist/domains/memory/components/flame-graph-data.cjs.js.map +1 -0
- package/dist/domains/memory/components/flame-graph-data.d.ts +2 -0
- package/dist/domains/memory/components/flame-graph-data.es.js +115 -0
- package/dist/domains/memory/components/flame-graph-data.es.js.map +1 -0
- package/dist/domains/memory/components/flame-graph.cjs.js +32 -111
- package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +28 -108
- package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +8 -8
- package/dist/domains/memory/components/memory-studio-panel.cjs.js.map +1 -1
- package/dist/domains/memory/components/memory-studio-panel.es.js +8 -8
- package/dist/domains/memory/components/memory-studio-panel.es.js.map +1 -1
- package/dist/domains/memory/lib/replay-selection.cjs.js +3 -10
- package/dist/domains/memory/lib/replay-selection.cjs.js.map +1 -1
- package/dist/domains/memory/lib/replay-selection.es.js +3 -10
- package/dist/domains/memory/lib/replay-selection.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +5 -10
- package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.es.js +4 -9
- package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.utils.cjs.js +24 -0
- package/dist/domains/metrics/components/latency-card-view.utils.cjs.js.map +1 -0
- package/dist/domains/metrics/components/latency-card-view.utils.d.ts +2 -0
- package/dist/domains/metrics/components/latency-card-view.utils.es.js +18 -0
- package/dist/domains/metrics/components/latency-card-view.utils.es.js.map +1 -0
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
- package/dist/domains/traces/components/traces-list-view.es.js +3 -3
- package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-toolbar.es.js +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.cjs.js +0 -1
- package/dist/domains/traces/hooks/use-trace-url-state.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.es.js +0 -1
- package/dist/domains/traces/hooks/use-trace-url-state.es.js.map +1 -1
- package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
- package/dist/ee/signals/flow-card.cjs.js +1 -1
- package/dist/ee/signals/flow-card.es.js +1 -1
- package/dist/ee/signals/lifeline-row.cjs.js +1 -1
- package/dist/ee/signals/lifeline-row.es.js +1 -1
- package/dist/ee/signals/sankey-signals.cjs.js +15 -10
- package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
- package/dist/ee/signals/sankey-signals.es.js +15 -10
- package/dist/ee/signals/sankey-signals.es.js.map +1 -1
- package/dist/ee/signals/signal-delta-column.cjs.js +1 -1
- package/dist/ee/signals/signal-delta-column.es.js +1 -1
- package/dist/ee/signals/signal-lifelines.cjs.js +1 -1
- package/dist/ee/signals/signal-lifelines.es.js +1 -1
- package/dist/ee/signals/sortable-signal-headers.cjs.js +1 -1
- package/dist/ee/signals/sortable-signal-headers.es.js +1 -1
- package/dist/ee/signals/theme-detail-panel.cjs.js +1 -1
- package/dist/ee/signals/theme-detail-panel.es.js +1 -1
- package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
- package/dist/ee/signals/theme-filter-banner.es.js +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.cjs.js +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.es.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/hooks/use-environment-variables-editor.cjs.js +0 -2
- package/dist/hooks/use-environment-variables-editor.cjs.js.map +1 -1
- package/dist/hooks/use-environment-variables-editor.es.js +0 -2
- package/dist/hooks/use-environment-variables-editor.es.js.map +1 -1
- package/dist/{logs-data-list-CbrMOwrq.js → logs-data-list-DTBAev6g.js} +2 -2
- package/dist/{logs-data-list-CbrMOwrq.js.map → logs-data-list-DTBAev6g.js.map} +1 -1
- package/dist/{logs-data-list-CuYnW-VA.cjs → logs-data-list-DvSidzsS.cjs} +2 -2
- package/dist/{logs-data-list-CuYnW-VA.cjs.map → logs-data-list-DvSidzsS.cjs.map} +1 -1
- package/dist/{message-scroller-D0xet-EH.js → message-scroller-Bx6ka_Fe.js} +37 -36
- package/dist/message-scroller-Bx6ka_Fe.js.map +1 -0
- package/dist/{message-scroller-PIxGmJ34.cjs → message-scroller-CMFvOewg.cjs} +36 -35
- package/dist/message-scroller-CMFvOewg.cjs.map +1 -0
- package/dist/{message-scroller-context-tTA6jxho.js → message-scroller-context-BNIQ0Yq4.js} +2 -2
- package/dist/{message-scroller-context-tTA6jxho.js.map → message-scroller-context-BNIQ0Yq4.js.map} +1 -1
- package/dist/{message-scroller-hooks-D5yxCon2.js → message-scroller-hooks-DW4jIBHi.js} +2 -2
- package/dist/{message-scroller-hooks-D5yxCon2.js.map → message-scroller-hooks-DW4jIBHi.js.map} +1 -1
- package/dist/{property-filter-applied-CDFWHZq-.js → property-filter-applied-BD0PmYxh.js} +2 -8
- package/dist/property-filter-applied-BD0PmYxh.js.map +1 -0
- package/dist/{property-filter-applied-BnyxfR1a.cjs → property-filter-applied-BQmX9ASZ.cjs} +2 -8
- package/dist/property-filter-applied-BQmX9ASZ.cjs.map +1 -0
- package/dist/{sankey-chart-zhW_F0Rm.js → sankey-chart-Bc7rzi5f.js} +2 -2
- package/dist/{sankey-chart-zhW_F0Rm.js.map → sankey-chart-Bc7rzi5f.js.map} +1 -1
- package/dist/{sankey-chart-Bp-DrL1q.cjs → sankey-chart-CYxUnjrO.cjs} +2 -2
- package/dist/{sankey-chart-Bp-DrL1q.cjs.map → sankey-chart-CYxUnjrO.cjs.map} +1 -1
- package/dist/{sankeyColor-CQ5nkgtL.js → sankeyColor-BoMbAWtq.js} +2 -2
- package/dist/sankeyColor-BoMbAWtq.js.map +1 -0
- package/dist/{sankeyColor-DONd5cg9.cjs → sankeyColor-DHE7ggh8.cjs} +2 -2
- package/dist/sankeyColor-DHE7ggh8.cjs.map +1 -0
- package/dist/src/domains/memory/components/flame-graph-data.d.ts +53 -0
- package/dist/src/domains/memory/components/flame-graph.d.ts +12 -0
- package/dist/src/domains/metrics/components/latency-card-view.d.ts +2 -1
- package/dist/src/domains/metrics/components/latency-card-view.utils.d.ts +19 -0
- package/dist/src/ds/components/DataList/data-list-cells.d.ts +2 -2
- package/dist/src/ds/components/MessageScroller/message-scroller-geometry.d.ts +32 -0
- package/dist/src/ds/components/PropertyFilter/pick-multi-panel.d.ts +2 -1
- package/dist/src/ds/components/ai/tool-call/index.d.ts +1 -0
- package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +25 -0
- package/dist/src/ds/components/ai/tool-call/tool-call.stories.d.ts +9 -0
- package/dist/src/ee/signals/sankey-signals.d.ts +4 -1
- package/dist/style.css +568 -30
- package/dist/{traces-data-list-BzQw4Dtx.js → traces-data-list-BIRR83Ie.js} +3 -3
- package/dist/{traces-data-list-BzQw4Dtx.js.map → traces-data-list-BIRR83Ie.js.map} +1 -1
- package/dist/{traces-data-list-BExIWzzW.cjs → traces-data-list-Be0f5_rb.cjs} +3 -3
- package/dist/{traces-data-list-BExIWzzW.cjs.map → traces-data-list-Be0f5_rb.cjs.map} +1 -1
- package/package.json +7 -7
- package/dist/data-list-top-cell-BJBfjw34.cjs.map +0 -1
- package/dist/data-list-top-cell-DeUwFnvc.js.map +0 -1
- package/dist/message-scroller-D0xet-EH.js.map +0 -1
- package/dist/message-scroller-PIxGmJ34.cjs.map +0 -1
- package/dist/property-filter-applied-BnyxfR1a.cjs.map +0 -1
- package/dist/property-filter-applied-CDFWHZq-.js.map +0 -1
- package/dist/sankeyColor-CQ5nkgtL.js.map +0 -1
- package/dist/sankeyColor-DONd5cg9.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# @mastra/playground-ui
|
|
2
2
|
|
|
3
|
+
## 51.1.0-alpha.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`ae8790c`](https://github.com/mastra-ai/mastra/commit/ae8790c4bfaa088d2ab279d1dcc06f326b9fd109), [`ee0c1a0`](https://github.com/mastra-ai/mastra/commit/ee0c1a097de3acebe7dfc8c136479d4cb5b5b451), [`befbfc2`](https://github.com/mastra-ai/mastra/commit/befbfc260d5ec5ece7cdb65a80e94292f428d4c9), [`04a815f`](https://github.com/mastra-ai/mastra/commit/04a815fc8971d29e97fcdcc5008a1eb472fc00ff), [`cced745`](https://github.com/mastra-ai/mastra/commit/cced745a056ec2225c5bc702e32d848847aa8b65)]:
|
|
8
|
+
- @mastra/core@1.62.0-alpha.7
|
|
9
|
+
- @mastra/memory@1.28.0-alpha.2
|
|
10
|
+
- @mastra/client-js@1.42.1-alpha.7
|
|
11
|
+
- @mastra/react@1.4.6-alpha.7
|
|
12
|
+
|
|
13
|
+
## 51.1.0-alpha.6
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- Added a composable tool-call component for building accessible, collapsible tool activity rows with custom icons, details, status content, and expanded results. ([#22183](https://github.com/mastra-ai/mastra/pull/22183))
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { ToolCall, ToolCallContent, ToolCallTrigger } from '@mastra/playground-ui/components/ai/tool-call';
|
|
21
|
+
|
|
22
|
+
<ToolCall status="running">
|
|
23
|
+
<ToolCallTrigger>Running command</ToolCallTrigger>
|
|
24
|
+
<ToolCallContent>Command output</ToolCallContent>
|
|
25
|
+
</ToolCall>;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- Added controlled snapshot frame selection to SankeySignals. The component now requires selectedFrameId and onFrameIdChange props, so the host application owns which timeline snapshot is displayed (for example to persist and restore it). Timeline clicks, snapshot playback, and perspective changes all report the new frame through onFrameIdChange. The playground signals overview page resolves the initial frame from the snapshot list and passes it down. ([#22187](https://github.com/mastra-ai/mastra/pull/22187))
|
|
31
|
+
|
|
32
|
+
- Updated dependencies [[`c8e4cea`](https://github.com/mastra-ai/mastra/commit/c8e4ceac9a390d78c8327dff3cdb2861dd71957f), [`ed01e9a`](https://github.com/mastra-ai/mastra/commit/ed01e9a807514a904374bf687a7b8f18750f6f78), [`4e9a228`](https://github.com/mastra-ai/mastra/commit/4e9a2283d5fd6ed1b70a2751eb3dc2cbf82ada20), [`63041eb`](https://github.com/mastra-ai/mastra/commit/63041eb4c50b520a0a80e03d4cd6ea99f67715a0)]:
|
|
33
|
+
- @mastra/core@1.62.0-alpha.6
|
|
34
|
+
- @mastra/client-js@1.42.1-alpha.6
|
|
35
|
+
- @mastra/react@1.4.6-alpha.6
|
|
36
|
+
|
|
37
|
+
## 51.0.1-alpha.5
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Updated dependencies [[`65edab1`](https://github.com/mastra-ai/mastra/commit/65edab1c233d17b8f163bad12fca410d0e6f16b1), [`ab20a38`](https://github.com/mastra-ai/mastra/commit/ab20a38d0275f8d85e0f3833bd87ef487bcc609f), [`dbbfeb8`](https://github.com/mastra-ai/mastra/commit/dbbfeb85ec949dc9ebc0755e1ad262e4f5eba8db), [`3cc9d00`](https://github.com/mastra-ai/mastra/commit/3cc9d00b2b4333e0377a5e9df5eff92c17ce7630), [`733a537`](https://github.com/mastra-ai/mastra/commit/733a537489a858b5880b2e98809334fba895a221), [`d55807c`](https://github.com/mastra-ai/mastra/commit/d55807cb9f080f3f5d1db06aca02b8fe0992507e), [`9207dfa`](https://github.com/mastra-ai/mastra/commit/9207dfab8062e5fc68b751684797ff86fe0b4e70), [`12c61d2`](https://github.com/mastra-ai/mastra/commit/12c61d280c8cb208bc3c8dbcbe5dcc60cf9d1cd0), [`9a12ef3`](https://github.com/mastra-ai/mastra/commit/9a12ef3fccf3f4186db0f294f4ee1f02cf4d8db2)]:
|
|
42
|
+
- @mastra/core@1.62.0-alpha.5
|
|
43
|
+
- @mastra/memory@1.28.0-alpha.1
|
|
44
|
+
- @mastra/client-js@1.42.1-alpha.5
|
|
45
|
+
- @mastra/react@1.4.6-alpha.5
|
|
46
|
+
|
|
47
|
+
## 51.0.1-alpha.4
|
|
48
|
+
|
|
49
|
+
### Patch Changes
|
|
50
|
+
|
|
51
|
+
- Updated dependencies [[`79f04a7`](https://github.com/mastra-ai/mastra/commit/79f04a7f6c6829da541139f638f2f1d267916e08), [`fd4d5fe`](https://github.com/mastra-ai/mastra/commit/fd4d5fe4f943699b85db5e74404f190d5a6b8c2a), [`f591643`](https://github.com/mastra-ai/mastra/commit/f591643becdf0be9bddce6ba1748e64bc30d77f1), [`b1ad324`](https://github.com/mastra-ai/mastra/commit/b1ad324d657f3544b0701332aef7eb10e9a36258), [`61c566d`](https://github.com/mastra-ai/mastra/commit/61c566dd2f2cde2b23ed8f139924e530d4202214)]:
|
|
52
|
+
- @mastra/core@1.62.0-alpha.4
|
|
53
|
+
- @mastra/client-js@1.42.1-alpha.4
|
|
54
|
+
- @mastra/react@1.4.6-alpha.4
|
|
55
|
+
|
|
56
|
+
## 51.0.1-alpha.3
|
|
57
|
+
|
|
58
|
+
### Patch Changes
|
|
59
|
+
|
|
60
|
+
- Updated dependencies [[`2c85f42`](https://github.com/mastra-ai/mastra/commit/2c85f428e04ccd63ea31a7ec80b5b327afdad555), [`11bbeb9`](https://github.com/mastra-ai/mastra/commit/11bbeb9b108ef2264e05acefc6dafb9cbb342921), [`1a485f3`](https://github.com/mastra-ai/mastra/commit/1a485f3538f5ec64d58bd8b5e1e99de0c695c87b), [`0d37487`](https://github.com/mastra-ai/mastra/commit/0d37487d9f349388a3f1cef6a536cf9dcc4b6273), [`8661d7d`](https://github.com/mastra-ai/mastra/commit/8661d7d7179f0a024456aabdd8679bcecd09ac28), [`575e343`](https://github.com/mastra-ai/mastra/commit/575e343900451021d96110916497d334af7bc252), [`cacb839`](https://github.com/mastra-ai/mastra/commit/cacb8392d9e74189b56d857290b0615f98a2683d), [`b47b26e`](https://github.com/mastra-ai/mastra/commit/b47b26e6fe95cb8a3482be2c5e52de157fe59d0b), [`0d37487`](https://github.com/mastra-ai/mastra/commit/0d37487d9f349388a3f1cef6a536cf9dcc4b6273), [`9a3d352`](https://github.com/mastra-ai/mastra/commit/9a3d352a5ba0c2a9e4f7a9cc4f028a393bc74306), [`c46eb09`](https://github.com/mastra-ai/mastra/commit/c46eb09ce4987509af57a0ac582c61241a6dd2f1), [`30ed33e`](https://github.com/mastra-ai/mastra/commit/30ed33ee14084a26019aba15fceadda6d6ddefaf), [`91ad69d`](https://github.com/mastra-ai/mastra/commit/91ad69d64994c89199b0c55399e64ed91c61df2f), [`8dc408d`](https://github.com/mastra-ai/mastra/commit/8dc408d34438f9e13297f792c11a5cfd6cf952e1), [`c92def1`](https://github.com/mastra-ai/mastra/commit/c92def10a13c822972c96f0a4ca6ffc1f4258aed), [`c5eaec5`](https://github.com/mastra-ai/mastra/commit/c5eaec5a860d80d0e3805e67db0414b87ac8cbed), [`e66b2ba`](https://github.com/mastra-ai/mastra/commit/e66b2ba100db63eaeab6e21e1ea34b113f2ec781)]:
|
|
61
|
+
- @mastra/core@1.62.0-alpha.3
|
|
62
|
+
- @mastra/memory@1.27.1-alpha.0
|
|
63
|
+
- @mastra/client-js@1.42.1-alpha.3
|
|
64
|
+
- @mastra/react@1.4.6-alpha.3
|
|
65
|
+
|
|
3
66
|
## 51.0.1-alpha.2
|
|
4
67
|
|
|
5
68
|
### Patch Changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const messageScroller = require('../message-scroller-
|
|
6
|
+
const messageScroller = require('../message-scroller-CMFvOewg.cjs');
|
|
7
7
|
const utils_cn = require('../cn-vA5sWo9W.cjs');
|
|
8
8
|
|
|
9
9
|
function ChatShellRoot({ className, scroller, ...props }) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { d as MessageScrollerProvider, e as MessageScrollerViewport, M as MessageScroller, a as MessageScrollerButton, b as MessageScrollerContent } from '../message-scroller-
|
|
2
|
+
import { d as MessageScrollerProvider, e as MessageScrollerViewport, M as MessageScroller, a as MessageScrollerButton, b as MessageScrollerContent } from '../message-scroller-Bx6ka_Fe.js';
|
|
3
3
|
import { c as cn } from '../cn-BakJzhuv.js';
|
|
4
4
|
|
|
5
5
|
function ChatShellRoot({ className, scroller, ...props }) {
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const dataList = require('../data-list-
|
|
6
|
-
const dataListSkeleton = require('../data-list-skeleton-
|
|
5
|
+
const dataList = require('../data-list-Ct54I5vM.cjs');
|
|
6
|
+
const dataListSkeleton = require('../data-list-skeleton-BF-7wpb9.cjs');
|
|
7
7
|
const jsxRuntime = require('react/jsx-runtime');
|
|
8
|
-
const dataListTopCell = require('../data-list-top-cell-
|
|
8
|
+
const dataListTopCell = require('../data-list-top-cell-ByJL1bVv.cjs');
|
|
9
9
|
const dateFns = require('date-fns');
|
|
10
|
-
const tracesDataList = require('../traces-data-list-
|
|
10
|
+
const tracesDataList = require('../traces-data-list-Be0f5_rb.cjs');
|
|
11
11
|
|
|
12
12
|
function toDate(value) {
|
|
13
13
|
const date = value instanceof Date ? value : new Date(value);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { D as DataList } from '../data-list-
|
|
2
|
-
export { D as DataListSkeleton } from '../data-list-skeleton-
|
|
1
|
+
export { D as DataList } from '../data-list-BH7hZM1i.js';
|
|
2
|
+
export { D as DataListSkeleton } from '../data-list-skeleton-DYOnJOWM.js';
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
|
-
import { a as DataListCell, c as DataListNextPageLoading, f as DataListNoMatch, i as DataListRowButton, m as DataListTopCell, n as DataListTop, D as DataListRoot } from '../data-list-top-cell-
|
|
4
|
+
import { a as DataListCell, c as DataListNextPageLoading, f as DataListNoMatch, i as DataListRowButton, m as DataListTopCell, n as DataListTop, D as DataListRoot } from '../data-list-top-cell-C1a8If1K.js';
|
|
5
5
|
import { format, isToday } from 'date-fns';
|
|
6
|
-
export { T as TracesDataList } from '../traces-data-list-
|
|
6
|
+
export { T as TracesDataList } from '../traces-data-list-BIRR83Ie.js';
|
|
7
7
|
|
|
8
8
|
function toDate(value) {
|
|
9
9
|
const date = value instanceof Date ? value : new Date(value);
|
|
@@ -10,7 +10,7 @@ const Button = require('../Button-BWj3opYd.cjs');
|
|
|
10
10
|
const Notice = require('../Notice-C6IkjU_x.cjs');
|
|
11
11
|
const envFile = require('../env-file-BU2hStkm.cjs');
|
|
12
12
|
const Txt = require('../Txt-I5lK8zy7.cjs');
|
|
13
|
-
const dataList = require('../data-list-
|
|
13
|
+
const dataList = require('../data-list-Ct54I5vM.cjs');
|
|
14
14
|
const hooks_useCopyToClipboard = require('../hooks/use-copy-to-clipboard.cjs.js');
|
|
15
15
|
const fieldBlock = require('../field-block-BcTR08I7.cjs');
|
|
16
16
|
const inputGroup = require('../input-group-B9RjCBAJ.cjs');
|
|
@@ -6,7 +6,7 @@ import { B as Button } from '../Button-XHy01fYR.js';
|
|
|
6
6
|
import { N as Notice } from '../Notice-BtIu4ZoP.js';
|
|
7
7
|
import { D as DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE } from '../env-file-BITYowCx.js';
|
|
8
8
|
import { T as Txt } from '../Txt-Df42XG5p.js';
|
|
9
|
-
import { D as DataList } from '../data-list-
|
|
9
|
+
import { D as DataList } from '../data-list-BH7hZM1i.js';
|
|
10
10
|
import { useCopyToClipboard } from '../hooks/use-copy-to-clipboard.es.js';
|
|
11
11
|
import { F as FieldBlock } from '../field-block-B63CpA4d.js';
|
|
12
12
|
import { I as InputGroup, c as InputGroupInput, a as InputGroupAddon, b as InputGroupButton } from '../input-group-DLUlOO5B.js';
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const logsDataList = require('../logs-data-list-
|
|
6
|
-
const dataListSkeleton = require('../data-list-skeleton-
|
|
5
|
+
const logsDataList = require('../logs-data-list-DvSidzsS.cjs');
|
|
6
|
+
const dataListSkeleton = require('../data-list-skeleton-BF-7wpb9.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { L as LogsDataList } from '../logs-data-list-
|
|
2
|
-
export { D as LogsDataListSkeleton } from '../data-list-skeleton-
|
|
1
|
+
export { L as LogsDataList } from '../logs-data-list-DTBAev6g.js';
|
|
2
|
+
export { D as LogsDataListSkeleton } from '../data-list-skeleton-DYOnJOWM.js';
|
|
3
3
|
//# sourceMappingURL=LogsDataList.es.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const messageScroller = require('../message-scroller-
|
|
5
|
+
const messageScroller = require('../message-scroller-CMFvOewg.cjs');
|
|
6
6
|
const messageScrollerHooks = require('../message-scroller-hooks-BxAf8k0Y.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { M as MessageScroller, a as MessageScrollerButton, b as MessageScrollerContent, c as MessageScrollerItem, d as MessageScrollerProvider, e as MessageScrollerViewport } from '../message-scroller-
|
|
2
|
-
export { u as useMessageScroller, a as useMessageScrollerScrollable, b as useMessageScrollerVisibility, c as useOptionalMessageScroller, d as useOptionalMessageScrollerScrollable, e as useOptionalMessageScrollerVisibility } from '../message-scroller-hooks-
|
|
1
|
+
export { M as MessageScroller, a as MessageScrollerButton, b as MessageScrollerContent, c as MessageScrollerItem, d as MessageScrollerProvider, e as MessageScrollerViewport } from '../message-scroller-Bx6ka_Fe.js';
|
|
2
|
+
export { u as useMessageScroller, a as useMessageScrollerScrollable, b as useMessageScrollerVisibility, c as useOptionalMessageScroller, d as useOptionalMessageScrollerScrollable, e as useOptionalMessageScrollerVisibility } from '../message-scroller-hooks-DW4jIBHi.js';
|
|
3
3
|
//# sourceMappingURL=MessageScroller.es.js.map
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const propertyFilterApplied = require('../property-filter-applied-
|
|
5
|
+
const propertyFilterApplied = require('../property-filter-applied-BQmX9ASZ.cjs');
|
|
6
6
|
const jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
const lucideReact = require('lucide-react');
|
|
8
8
|
const React = require('react');
|
|
9
9
|
const Button = require('../Button-BWj3opYd.cjs');
|
|
10
10
|
const combobox = require('../combobox-Cc6ePsiD.cjs');
|
|
11
|
-
const input = require('../input-0R-fQTCF.cjs');
|
|
12
11
|
const popover = require('../popover-CO0UtG2f.cjs');
|
|
13
12
|
const utils_cn = require('../cn-vA5sWo9W.cjs');
|
|
14
13
|
|
|
@@ -29,11 +28,9 @@ function PropertyFilterCreator({
|
|
|
29
28
|
}, [fields, hiddenFieldIds]);
|
|
30
29
|
const [open, setOpen] = React.useState(false);
|
|
31
30
|
const [fieldId, setFieldId] = React.useState();
|
|
32
|
-
const [textValue, setTextValue] = React.useState("");
|
|
33
31
|
const [multiValue, setMultiValue] = React.useState([]);
|
|
34
32
|
const [error, setError] = React.useState();
|
|
35
33
|
const [openPickMultiFieldId, setOpenPickMultiFieldId] = React.useState();
|
|
36
|
-
const textInputRef = React.useRef(null);
|
|
37
34
|
const skipCloseFocusRef = React.useRef(false);
|
|
38
35
|
const togglePickMulti = React.useCallback((id) => {
|
|
39
36
|
setOpenPickMultiFieldId((current) => current === id ? void 0 : id);
|
|
@@ -53,22 +50,16 @@ function PropertyFilterCreator({
|
|
|
53
50
|
}, [tokens, fields]);
|
|
54
51
|
const reset = React.useCallback(() => {
|
|
55
52
|
setFieldId(void 0);
|
|
56
|
-
setTextValue("");
|
|
57
53
|
setMultiValue([]);
|
|
58
54
|
setError(void 0);
|
|
59
55
|
}, []);
|
|
60
56
|
React.useEffect(() => {
|
|
61
57
|
if (!open) reset();
|
|
62
58
|
}, [open, reset]);
|
|
63
|
-
React.useEffect(() => {
|
|
64
|
-
if (!open) return;
|
|
65
|
-
if (selectedField?.kind === "text") textInputRef.current?.focus();
|
|
66
|
-
}, [open, selectedField]);
|
|
67
59
|
const replacePickMultiToken = React.useCallback(
|
|
68
60
|
(fieldId2, value) => {
|
|
69
61
|
const existingIndex = tokens.findIndex((t) => t.fieldId === fieldId2);
|
|
70
|
-
|
|
71
|
-
if (shouldRemove) {
|
|
62
|
+
if (Array.isArray(value) && value.length === 0) {
|
|
72
63
|
if (existingIndex === -1) return;
|
|
73
64
|
onTokensChange(tokens.filter((_, i) => i !== existingIndex));
|
|
74
65
|
return;
|
|
@@ -92,18 +83,13 @@ function PropertyFilterCreator({
|
|
|
92
83
|
setError(`Remove the existing ${selectedField.label} filter before adding another.`);
|
|
93
84
|
return;
|
|
94
85
|
}
|
|
95
|
-
if (
|
|
96
|
-
setError(`Enter a value for ${selectedField.label}.`);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (selectedField.kind === "multi-select" && multiValue.length === 0) {
|
|
86
|
+
if (multiValue.length === 0) {
|
|
100
87
|
setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);
|
|
101
88
|
return;
|
|
102
89
|
}
|
|
103
|
-
|
|
104
|
-
onTokensChange([...tokens, token]);
|
|
90
|
+
onTokensChange([...tokens, { fieldId: selectedField.id, value: multiValue }]);
|
|
105
91
|
setOpen(false);
|
|
106
|
-
}, [multiValue, onTokensChange, selectedField, singleUseFieldIds,
|
|
92
|
+
}, [multiValue, onTokensChange, selectedField, singleUseFieldIds, tokens]);
|
|
107
93
|
return /* @__PURE__ */ jsxRuntime.jsxs(popover.Popover, { open, onOpenChange: setOpen, children: [
|
|
108
94
|
/* @__PURE__ */ jsxRuntime.jsx(popover.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { variant: "outline", size, disabled, children: [
|
|
109
95
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListFilterPlusIcon, {}),
|
|
@@ -130,12 +116,7 @@ function PropertyFilterCreator({
|
|
|
130
116
|
type: "button",
|
|
131
117
|
"aria-label": "Back to properties",
|
|
132
118
|
className: "text-neutral3 hover:text-neutral6 transition-colors",
|
|
133
|
-
onClick:
|
|
134
|
-
setFieldId(void 0);
|
|
135
|
-
setTextValue("");
|
|
136
|
-
setMultiValue([]);
|
|
137
|
-
setError(void 0);
|
|
138
|
-
},
|
|
119
|
+
onClick: reset,
|
|
139
120
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeftIcon, { className: "size-4" })
|
|
140
121
|
}
|
|
141
122
|
),
|
|
@@ -212,26 +193,7 @@ function PropertyFilterCreator({
|
|
|
212
193
|
}) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-ui-sm text-neutral3 px-2 py-1.5", children: "No matching property." })
|
|
213
194
|
}
|
|
214
195
|
),
|
|
215
|
-
selectedField &&
|
|
216
|
-
input.Input,
|
|
217
|
-
{
|
|
218
|
-
ref: textInputRef,
|
|
219
|
-
size: "md",
|
|
220
|
-
value: textValue,
|
|
221
|
-
onChange: (e) => {
|
|
222
|
-
setTextValue(e.target.value);
|
|
223
|
-
setError(void 0);
|
|
224
|
-
},
|
|
225
|
-
placeholder: selectedField.placeholder ?? `Enter ${selectedField.label}`,
|
|
226
|
-
onKeyDown: (e) => {
|
|
227
|
-
if (e.key === "Enter") {
|
|
228
|
-
e.preventDefault();
|
|
229
|
-
commit();
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
),
|
|
234
|
-
selectedField && selectedField.kind === "multi-select" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
selectedField && /* @__PURE__ */ jsxRuntime.jsx(
|
|
235
197
|
combobox.Combobox,
|
|
236
198
|
{
|
|
237
199
|
multiple: true,
|
|
@@ -248,7 +210,7 @@ function PropertyFilterCreator({
|
|
|
248
210
|
}
|
|
249
211
|
),
|
|
250
212
|
error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-ui-sm text-red-500", children: error }),
|
|
251
|
-
selectedField &&
|
|
213
|
+
selectedField && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
252
214
|
/* @__PURE__ */ jsxRuntime.jsx(Button.Button, { variant: "ghost", size: "md", onClick: () => setOpen(false), children: "Cancel" }),
|
|
253
215
|
/* @__PURE__ */ jsxRuntime.jsx(Button.Button, { variant: "outline", size: "md", onClick: commit, children: "Add filter" })
|
|
254
216
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertyFilter.cjs.js","sources":["../../src/ds/components/PropertyFilter/property-filter-creator.tsx"],"sourcesContent":["import { ArrowLeftIcon, ChevronRightIcon, FilterIcon, ListFilterPlusIcon, PlusIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { Combobox } from '@/ds/components/Combobox/combobox';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type PropertyFilterCreatorProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n label?: string;\n disabled?: boolean;\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Called when the user picks a text (id-style) field. Consumers are expected\n * to render a pending applied-filter pill with an active input so the user\n * can type the value inline instead of in this popover.\n */\n onStartTextFilter?: (fieldId: string) => void;\n /**\n * Field ids hidden from the Add Filter dropdown. Use to prevent users from\n * recreating a filter that an upstream context already owns (e.g. the agent\n * id when viewing the agent-scoped traces tab).\n */\n hiddenFieldIds?: readonly string[];\n};\n\n/**\n * Minimal Linear-style filter creator: a `+ Filter` button whose popover walks\n * the user through property → value → commit. For id-style text fields, the\n * picker closes immediately and the applied-filter pill owns the input. For\n * `pick-multi` fields (e.g. Root Entity Name) hovering the item opens a\n * separate side popover with checkboxes — each check adds its own applied\n * filter and the main popover stays open so users can pick many.\n */\nexport function PropertyFilterCreator({\n fields,\n tokens,\n onTokensChange,\n label = 'Add Filter',\n disabled,\n size,\n onStartTextFilter,\n hiddenFieldIds,\n}: PropertyFilterCreatorProps) {\n const visibleFields = useMemo(() => {\n if (!hiddenFieldIds || hiddenFieldIds.length === 0) return fields;\n const hidden = new Set(hiddenFieldIds);\n return fields.filter(f => !hidden.has(f.id));\n }, [fields, hiddenFieldIds]);\n const [open, setOpen] = useState(false);\n const [fieldId, setFieldId] = useState<string | undefined>();\n const [textValue, setTextValue] = useState('');\n const [multiValue, setMultiValue] = useState<string[]>([]);\n const [error, setError] = useState<string | undefined>();\n // Single source of truth for which pick-multi side panel is open. Opens only\n // via explicit click/keyboard press on the menu item — no hover/focus\n // auto-open (was too flicker-prone).\n const [openPickMultiFieldId, setOpenPickMultiFieldId] = useState<string | undefined>();\n\n const textInputRef = useRef<HTMLInputElement>(null);\n // When the user picks a text field we close this popover and hand off focus\n // to the newly-created pill's input — prevent Radix from returning focus to\n // the trigger button in that case.\n const skipCloseFocusRef = useRef(false);\n\n const togglePickMulti = useCallback((id: string) => {\n setOpenPickMultiFieldId(current => (current === id ? undefined : id));\n }, []);\n const closePickMulti = useCallback(() => setOpenPickMultiFieldId(undefined), []);\n\n useEffect(() => {\n if (!open) setOpenPickMultiFieldId(undefined);\n }, [open]);\n\n const selectedField = useMemo(() => visibleFields.find(f => f.id === fieldId), [visibleFields, fieldId]);\n // Only single-use kinds (text, multi-select) count as \"used\". `pick-multi`\n // allows multiple tokens with the same fieldId.\n const singleUseFieldIds = useMemo(() => {\n const ids = new Set<string>();\n for (const token of tokens) {\n const field = fields.find(f => f.id === token.fieldId);\n if (field && field.kind !== 'pick-multi') ids.add(token.fieldId);\n }\n return ids;\n }, [tokens, fields]);\n\n const reset = useCallback(() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }, []);\n\n useEffect(() => {\n if (!open) reset();\n }, [open, reset]);\n\n useEffect(() => {\n if (!open) return;\n if (selectedField?.kind === 'text') textInputRef.current?.focus();\n }, [open, selectedField]);\n\n /**\n * Replace whatever token exists for `fieldId` with the given value. Used by\n * both single-select (radio) and multi-select (checkbox) pick-multi panels.\n * Pass `undefined` or `[]` to remove the token entirely.\n */\n const replacePickMultiToken = useCallback(\n (fieldId: string, value: string | string[] | undefined) => {\n const existingIndex = tokens.findIndex(t => t.fieldId === fieldId);\n const shouldRemove = value === undefined || (Array.isArray(value) && value.length === 0);\n\n if (shouldRemove) {\n if (existingIndex === -1) return;\n onTokensChange(tokens.filter((_, i) => i !== existingIndex));\n return;\n }\n\n if (existingIndex === -1) {\n onTokensChange([...tokens, { fieldId, value }]);\n return;\n }\n\n const nextTokens = [...tokens];\n nextTokens[existingIndex] = { fieldId, value };\n onTokensChange(nextTokens);\n },\n [onTokensChange, tokens],\n );\n\n const commit = useCallback(() => {\n if (!selectedField) {\n setError('Choose a property first.');\n return;\n }\n if (singleUseFieldIds.has(selectedField.id)) {\n setError(`Remove the existing ${selectedField.label} filter before adding another.`);\n return;\n }\n if (selectedField.kind === 'text' && !textValue.trim()) {\n setError(`Enter a value for ${selectedField.label}.`);\n return;\n }\n if (selectedField.kind === 'multi-select' && multiValue.length === 0) {\n setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);\n return;\n }\n const token: PropertyFilterToken =\n selectedField.kind === 'multi-select'\n ? { fieldId: selectedField.id, value: multiValue }\n : { fieldId: selectedField.id, value: (textValue as string).trim() };\n onTokensChange([...tokens, token]);\n setOpen(false);\n }, [multiValue, onTokensChange, selectedField, singleUseFieldIds, textValue, tokens]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size={size} disabled={disabled}>\n <ListFilterPlusIcon />\n {label}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"w-64 p-3\"\n initialFocus={false}\n finalFocus={() => {\n if (skipCloseFocusRef.current) {\n skipCloseFocusRef.current = false;\n return false;\n }\n return true;\n }}\n >\n <div className=\"grid gap-3\">\n {selectedField && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Back to properties\"\n className=\"text-neutral3 hover:text-neutral6 transition-colors\"\n onClick={() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }}\n >\n <ArrowLeftIcon className=\"size-4\" />\n </button>\n <FilterIcon className=\"text-neutral3 size-4 shrink-0\" />\n <span className=\"text-ui-sm text-neutral3\">{`${selectedField.label} · is`}</span>\n </div>\n )}\n\n {!selectedField && (\n <div\n role=\"menu\"\n className=\"max-h-[80dvh] overflow-auto\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[data-filter-item]:not([disabled])'),\n );\n if (buttons.length === 0) return;\n e.preventDefault();\n const active = document.activeElement as HTMLElement | null;\n const current = buttons.findIndex(b => b === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = buttons.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % buttons.length;\n else next = current <= 0 ? buttons.length - 1 : current - 1;\n buttons[next]?.focus();\n }}\n >\n {visibleFields.length > 0 ? (\n visibleFields.map(f => {\n const used = singleUseFieldIds.has(f.id);\n if (f.kind === 'pick-multi') {\n return (\n <PickMultiMenuItem\n key={f.id}\n field={f}\n tokens={tokens}\n onChange={replacePickMultiToken}\n open={openPickMultiFieldId === f.id}\n onToggle={togglePickMulti}\n onClose={closePickMulti}\n />\n );\n }\n return (\n <button\n key={f.id}\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n used\n ? 'cursor-not-allowed text-neutral2 opacity-70'\n : 'text-neutral4 hover:bg-surface4 hover:text-neutral6',\n )}\n disabled={used}\n onClick={() => {\n setError(undefined);\n if (f.kind === 'text') {\n onTokensChange([...tokens, { fieldId: f.id, value: '' }]);\n onStartTextFilter?.(f.id);\n skipCloseFocusRef.current = true;\n setOpen(false);\n return;\n }\n setFieldId(f.id);\n }}\n >\n <span className=\"truncate\">{f.label}</span>\n {used ? (\n <span className=\"text-neutral3 ml-auto\">In use</span>\n ) : (\n <PlusIcon className=\"text-neutral3 ml-auto size-4 opacity-0 transition-opacity group-hover:opacity-100 group-focus:opacity-100\" />\n )}\n </button>\n );\n })\n ) : (\n <div className=\"text-ui-sm text-neutral3 px-2 py-1.5\">No matching property.</div>\n )}\n </div>\n )}\n\n {selectedField && selectedField.kind === 'text' && (\n <Input\n ref={textInputRef}\n size=\"md\"\n value={textValue}\n onChange={e => {\n setTextValue(e.target.value);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Enter ${selectedField.label}`}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n }\n }}\n />\n )}\n\n {selectedField && selectedField.kind === 'multi-select' && (\n <Combobox\n multiple\n options={selectedField.options ?? []}\n value={multiValue}\n onValueChange={v => {\n setMultiValue(v);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Choose ${selectedField.label}`}\n searchPlaceholder={`Search ${selectedField.label.toLowerCase()}...`}\n emptyText={selectedField.emptyText ?? 'No option found.'}\n size=\"md\"\n />\n )}\n\n {error && <div className=\"text-ui-sm text-red-500\">{error}</div>}\n\n {selectedField && selectedField.kind !== 'pick-multi' && (\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"md\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"outline\" size=\"md\" onClick={commit}>\n Add filter\n </Button>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\ntype PickMultiMenuItemProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n open: boolean;\n onToggle: (fieldId: string) => void;\n onClose: () => void;\n};\n\n/**\n * A property-picker menu item that opens a separate Radix popover (portaled to\n * the side) with a radio group (single-select) or checkbox list (multi-select,\n * `field.multi === true`). Open/close is driven by explicit click / keyboard\n * press; the panel only closes when the user clicks outside, presses Escape,\n * or clicks the row again to toggle it off.\n */\nfunction PickMultiMenuItem({ field, tokens, onChange, open, onToggle, onClose }: PickMultiMenuItemProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <Popover\n open={open}\n onOpenChange={next => {\n if (next) onToggle(field.id);\n else onClose();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md text-neutral4 transition-colors hover:bg-surface4 hover:text-neutral6',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n )}\n onKeyDown={e => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n if (!open) onToggle(field.id);\n e.preventDefault();\n requestAnimationFrame(() => {\n const first = contentRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n });\n }}\n >\n {open && <ChevronRightIcon className=\"text-neutral3 size-4 shrink-0\" />}\n <span className=\"truncate\">{field.label}</span>\n {!open && <ChevronRightIcon className=\"text-neutral3 ml-auto size-4 shrink-0\" />}\n </button>\n </PopoverTrigger>\n <PopoverContent\n ref={contentRef}\n side=\"right\"\n align=\"start\"\n sideOffset={8}\n className=\"w-64 p-2\"\n initialFocus={false}\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const items = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[data-pick-multi-item]:not([disabled])'),\n );\n if (items.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n const active = document.activeElement as HTMLElement | null;\n const current = items.findIndex(el => el === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % items.length;\n else next = current <= 0 ? items.length - 1 : current - 1;\n items[next]?.focus();\n }}\n data-pick-multi-panel\n >\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["useMemo","useState","useRef","useCallback","useEffect","fieldId","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","PopoverContent","ArrowLeftIcon","FilterIcon","cn","PlusIcon","Input","Combobox","ChevronRightIcon","PickMultiPanel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PropertyFilter.cjs.js","sources":["../../src/ds/components/PropertyFilter/property-filter-creator.tsx"],"sourcesContent":["import { ArrowLeftIcon, ChevronRightIcon, FilterIcon, ListFilterPlusIcon, PlusIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { Combobox } from '@/ds/components/Combobox/combobox';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type PropertyFilterCreatorProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n label?: string;\n disabled?: boolean;\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Called when the user picks a text (id-style) field. Consumers are expected\n * to render a pending applied-filter pill with an active input so the user\n * can type the value inline instead of in this popover.\n */\n onStartTextFilter?: (fieldId: string) => void;\n /**\n * Field ids hidden from the Add Filter dropdown. Use to prevent users from\n * recreating a filter that an upstream context already owns (e.g. the agent\n * id when viewing the agent-scoped traces tab).\n */\n hiddenFieldIds?: readonly string[];\n};\n\n/**\n * Minimal Linear-style filter creator: a `+ Filter` button whose popover walks\n * the user through property → value → commit. For id-style text fields, the\n * picker closes immediately and the applied-filter pill owns the input. For\n * `pick-multi` fields (e.g. Root Entity Name) hovering the item opens a\n * separate side popover with checkboxes — each check adds its own applied\n * filter and the main popover stays open so users can pick many.\n */\nexport function PropertyFilterCreator({\n fields,\n tokens,\n onTokensChange,\n label = 'Add Filter',\n disabled,\n size,\n onStartTextFilter,\n hiddenFieldIds,\n}: PropertyFilterCreatorProps) {\n const visibleFields = useMemo(() => {\n if (!hiddenFieldIds || hiddenFieldIds.length === 0) return fields;\n const hidden = new Set(hiddenFieldIds);\n return fields.filter(f => !hidden.has(f.id));\n }, [fields, hiddenFieldIds]);\n const [open, setOpen] = useState(false);\n const [fieldId, setFieldId] = useState<string | undefined>();\n const [multiValue, setMultiValue] = useState<string[]>([]);\n const [error, setError] = useState<string | undefined>();\n // Single source of truth for which pick-multi side panel is open. Opens only\n // via explicit click/keyboard press on the menu item — no hover/focus\n // auto-open (was too flicker-prone).\n const [openPickMultiFieldId, setOpenPickMultiFieldId] = useState<string | undefined>();\n\n // When the user picks a text field we close this popover and hand off focus\n // to the newly-created pill's input — prevent Radix from returning focus to\n // the trigger button in that case.\n const skipCloseFocusRef = useRef(false);\n\n const togglePickMulti = useCallback((id: string) => {\n setOpenPickMultiFieldId(current => (current === id ? undefined : id));\n }, []);\n const closePickMulti = useCallback(() => setOpenPickMultiFieldId(undefined), []);\n\n useEffect(() => {\n if (!open) setOpenPickMultiFieldId(undefined);\n }, [open]);\n\n const selectedField = useMemo(() => visibleFields.find(f => f.id === fieldId), [visibleFields, fieldId]);\n // Only single-use kinds (text, multi-select) count as \"used\". `pick-multi`\n // allows multiple tokens with the same fieldId.\n const singleUseFieldIds = useMemo(() => {\n const ids = new Set<string>();\n for (const token of tokens) {\n const field = fields.find(f => f.id === token.fieldId);\n if (field && field.kind !== 'pick-multi') ids.add(token.fieldId);\n }\n return ids;\n }, [tokens, fields]);\n\n const reset = useCallback(() => {\n setFieldId(undefined);\n setMultiValue([]);\n setError(undefined);\n }, []);\n\n useEffect(() => {\n if (!open) reset();\n }, [open, reset]);\n\n /**\n * Replace whatever token exists for `fieldId` with the given value. Used by\n * both single-select (radio) and multi-select (checkbox) pick-multi panels.\n * An empty list means nothing is selected, which removes the token here —\n * unlike the applied pill, where the filter stays on in a neutral state.\n */\n const replacePickMultiToken = useCallback(\n (fieldId: string, value: string | string[]) => {\n const existingIndex = tokens.findIndex(t => t.fieldId === fieldId);\n\n if (Array.isArray(value) && value.length === 0) {\n if (existingIndex === -1) return;\n onTokensChange(tokens.filter((_, i) => i !== existingIndex));\n return;\n }\n\n if (existingIndex === -1) {\n onTokensChange([...tokens, { fieldId, value }]);\n return;\n }\n\n const nextTokens = [...tokens];\n nextTokens[existingIndex] = { fieldId, value };\n onTokensChange(nextTokens);\n },\n [onTokensChange, tokens],\n );\n\n const commit = useCallback(() => {\n if (!selectedField) {\n setError('Choose a property first.');\n return;\n }\n if (singleUseFieldIds.has(selectedField.id)) {\n setError(`Remove the existing ${selectedField.label} filter before adding another.`);\n return;\n }\n if (multiValue.length === 0) {\n setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);\n return;\n }\n onTokensChange([...tokens, { fieldId: selectedField.id, value: multiValue }]);\n setOpen(false);\n }, [multiValue, onTokensChange, selectedField, singleUseFieldIds, tokens]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size={size} disabled={disabled}>\n <ListFilterPlusIcon />\n {label}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"w-64 p-3\"\n initialFocus={false}\n finalFocus={() => {\n if (skipCloseFocusRef.current) {\n skipCloseFocusRef.current = false;\n return false;\n }\n return true;\n }}\n >\n <div className=\"grid gap-3\">\n {selectedField && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Back to properties\"\n className=\"text-neutral3 hover:text-neutral6 transition-colors\"\n onClick={reset}\n >\n <ArrowLeftIcon className=\"size-4\" />\n </button>\n <FilterIcon className=\"text-neutral3 size-4 shrink-0\" />\n <span className=\"text-ui-sm text-neutral3\">{`${selectedField.label} · is`}</span>\n </div>\n )}\n\n {!selectedField && (\n <div\n role=\"menu\"\n className=\"max-h-[80dvh] overflow-auto\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[data-filter-item]:not([disabled])'),\n );\n if (buttons.length === 0) return;\n e.preventDefault();\n const active = document.activeElement as HTMLElement | null;\n const current = buttons.findIndex(b => b === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = buttons.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % buttons.length;\n else next = current <= 0 ? buttons.length - 1 : current - 1;\n buttons[next]?.focus();\n }}\n >\n {visibleFields.length > 0 ? (\n visibleFields.map(f => {\n const used = singleUseFieldIds.has(f.id);\n if (f.kind === 'pick-multi') {\n return (\n <PickMultiMenuItem\n key={f.id}\n field={f}\n tokens={tokens}\n onChange={replacePickMultiToken}\n open={openPickMultiFieldId === f.id}\n onToggle={togglePickMulti}\n onClose={closePickMulti}\n />\n );\n }\n return (\n <button\n key={f.id}\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n used\n ? 'cursor-not-allowed text-neutral2 opacity-70'\n : 'text-neutral4 hover:bg-surface4 hover:text-neutral6',\n )}\n disabled={used}\n onClick={() => {\n setError(undefined);\n if (f.kind === 'text') {\n onTokensChange([...tokens, { fieldId: f.id, value: '' }]);\n onStartTextFilter?.(f.id);\n skipCloseFocusRef.current = true;\n setOpen(false);\n return;\n }\n setFieldId(f.id);\n }}\n >\n <span className=\"truncate\">{f.label}</span>\n {used ? (\n <span className=\"text-neutral3 ml-auto\">In use</span>\n ) : (\n <PlusIcon className=\"text-neutral3 ml-auto size-4 opacity-0 transition-opacity group-hover:opacity-100 group-focus:opacity-100\" />\n )}\n </button>\n );\n })\n ) : (\n <div className=\"text-ui-sm text-neutral3 px-2 py-1.5\">No matching property.</div>\n )}\n </div>\n )}\n\n {selectedField && (\n <Combobox\n multiple\n options={selectedField.options ?? []}\n value={multiValue}\n onValueChange={v => {\n setMultiValue(v);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Choose ${selectedField.label}`}\n searchPlaceholder={`Search ${selectedField.label.toLowerCase()}...`}\n emptyText={selectedField.emptyText ?? 'No option found.'}\n size=\"md\"\n />\n )}\n\n {error && <div className=\"text-ui-sm text-red-500\">{error}</div>}\n\n {selectedField && (\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"md\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"outline\" size=\"md\" onClick={commit}>\n Add filter\n </Button>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\ntype PickMultiMenuItemProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[]) => void;\n open: boolean;\n onToggle: (fieldId: string) => void;\n onClose: () => void;\n};\n\n/**\n * A property-picker menu item that opens a separate Radix popover (portaled to\n * the side) with a radio group (single-select) or checkbox list (multi-select,\n * `field.multi === true`). Open/close is driven by explicit click / keyboard\n * press; the panel only closes when the user clicks outside, presses Escape,\n * or clicks the row again to toggle it off.\n */\nfunction PickMultiMenuItem({ field, tokens, onChange, open, onToggle, onClose }: PickMultiMenuItemProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <Popover\n open={open}\n onOpenChange={next => {\n if (next) onToggle(field.id);\n else onClose();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md text-neutral4 transition-colors hover:bg-surface4 hover:text-neutral6',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n )}\n onKeyDown={e => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n if (!open) onToggle(field.id);\n e.preventDefault();\n requestAnimationFrame(() => {\n const first = contentRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n });\n }}\n >\n {open && <ChevronRightIcon className=\"text-neutral3 size-4 shrink-0\" />}\n <span className=\"truncate\">{field.label}</span>\n {!open && <ChevronRightIcon className=\"text-neutral3 ml-auto size-4 shrink-0\" />}\n </button>\n </PopoverTrigger>\n <PopoverContent\n ref={contentRef}\n side=\"right\"\n align=\"start\"\n sideOffset={8}\n className=\"w-64 p-2\"\n initialFocus={false}\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const items = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[data-pick-multi-item]:not([disabled])'),\n );\n if (items.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n const active = document.activeElement as HTMLElement | null;\n const current = items.findIndex(el => el === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % items.length;\n else next = current <= 0 ? items.length - 1 : current - 1;\n items[next]?.focus();\n }}\n data-pick-multi-panel\n >\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["useMemo","useState","useRef","useCallback","useEffect","fieldId","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","PopoverContent","ArrowLeftIcon","FilterIcon","cn","PlusIcon","Combobox","ChevronRightIcon","PickMultiPanel"],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { b as PickMultiPanel } from '../property-filter-applied-
|
|
2
|
-
export { a as PropertyFilterActions, P as PropertyFilterApplied } from '../property-filter-applied-
|
|
1
|
+
import { b as PickMultiPanel } from '../property-filter-applied-BD0PmYxh.js';
|
|
2
|
+
export { a as PropertyFilterActions, P as PropertyFilterApplied } from '../property-filter-applied-BD0PmYxh.js';
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
4
|
import { ListFilterPlusIcon, ArrowLeftIcon, FilterIcon, PlusIcon, ChevronRightIcon } from 'lucide-react';
|
|
5
5
|
import { useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
6
6
|
import { B as Button } from '../Button-XHy01fYR.js';
|
|
7
7
|
import { C as Combobox } from '../combobox-BWcXIkzo.js';
|
|
8
|
-
import { I as Input } from '../input-DVZ0-3KP.js';
|
|
9
8
|
import { P as Popover, b as PopoverTrigger, a as PopoverContent } from '../popover-DwDnnrzj.js';
|
|
10
9
|
import { c as cn } from '../cn-BakJzhuv.js';
|
|
11
10
|
|
|
@@ -26,11 +25,9 @@ function PropertyFilterCreator({
|
|
|
26
25
|
}, [fields, hiddenFieldIds]);
|
|
27
26
|
const [open, setOpen] = useState(false);
|
|
28
27
|
const [fieldId, setFieldId] = useState();
|
|
29
|
-
const [textValue, setTextValue] = useState("");
|
|
30
28
|
const [multiValue, setMultiValue] = useState([]);
|
|
31
29
|
const [error, setError] = useState();
|
|
32
30
|
const [openPickMultiFieldId, setOpenPickMultiFieldId] = useState();
|
|
33
|
-
const textInputRef = useRef(null);
|
|
34
31
|
const skipCloseFocusRef = useRef(false);
|
|
35
32
|
const togglePickMulti = useCallback((id) => {
|
|
36
33
|
setOpenPickMultiFieldId((current) => current === id ? void 0 : id);
|
|
@@ -50,22 +47,16 @@ function PropertyFilterCreator({
|
|
|
50
47
|
}, [tokens, fields]);
|
|
51
48
|
const reset = useCallback(() => {
|
|
52
49
|
setFieldId(void 0);
|
|
53
|
-
setTextValue("");
|
|
54
50
|
setMultiValue([]);
|
|
55
51
|
setError(void 0);
|
|
56
52
|
}, []);
|
|
57
53
|
useEffect(() => {
|
|
58
54
|
if (!open) reset();
|
|
59
55
|
}, [open, reset]);
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
if (!open) return;
|
|
62
|
-
if (selectedField?.kind === "text") textInputRef.current?.focus();
|
|
63
|
-
}, [open, selectedField]);
|
|
64
56
|
const replacePickMultiToken = useCallback(
|
|
65
57
|
(fieldId2, value) => {
|
|
66
58
|
const existingIndex = tokens.findIndex((t) => t.fieldId === fieldId2);
|
|
67
|
-
|
|
68
|
-
if (shouldRemove) {
|
|
59
|
+
if (Array.isArray(value) && value.length === 0) {
|
|
69
60
|
if (existingIndex === -1) return;
|
|
70
61
|
onTokensChange(tokens.filter((_, i) => i !== existingIndex));
|
|
71
62
|
return;
|
|
@@ -89,18 +80,13 @@ function PropertyFilterCreator({
|
|
|
89
80
|
setError(`Remove the existing ${selectedField.label} filter before adding another.`);
|
|
90
81
|
return;
|
|
91
82
|
}
|
|
92
|
-
if (
|
|
93
|
-
setError(`Enter a value for ${selectedField.label}.`);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
if (selectedField.kind === "multi-select" && multiValue.length === 0) {
|
|
83
|
+
if (multiValue.length === 0) {
|
|
97
84
|
setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);
|
|
98
85
|
return;
|
|
99
86
|
}
|
|
100
|
-
|
|
101
|
-
onTokensChange([...tokens, token]);
|
|
87
|
+
onTokensChange([...tokens, { fieldId: selectedField.id, value: multiValue }]);
|
|
102
88
|
setOpen(false);
|
|
103
|
-
}, [multiValue, onTokensChange, selectedField, singleUseFieldIds,
|
|
89
|
+
}, [multiValue, onTokensChange, selectedField, singleUseFieldIds, tokens]);
|
|
104
90
|
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
105
91
|
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size, disabled, children: [
|
|
106
92
|
/* @__PURE__ */ jsx(ListFilterPlusIcon, {}),
|
|
@@ -127,12 +113,7 @@ function PropertyFilterCreator({
|
|
|
127
113
|
type: "button",
|
|
128
114
|
"aria-label": "Back to properties",
|
|
129
115
|
className: "text-neutral3 hover:text-neutral6 transition-colors",
|
|
130
|
-
onClick:
|
|
131
|
-
setFieldId(void 0);
|
|
132
|
-
setTextValue("");
|
|
133
|
-
setMultiValue([]);
|
|
134
|
-
setError(void 0);
|
|
135
|
-
},
|
|
116
|
+
onClick: reset,
|
|
136
117
|
children: /* @__PURE__ */ jsx(ArrowLeftIcon, { className: "size-4" })
|
|
137
118
|
}
|
|
138
119
|
),
|
|
@@ -209,26 +190,7 @@ function PropertyFilterCreator({
|
|
|
209
190
|
}) : /* @__PURE__ */ jsx("div", { className: "text-ui-sm text-neutral3 px-2 py-1.5", children: "No matching property." })
|
|
210
191
|
}
|
|
211
192
|
),
|
|
212
|
-
selectedField &&
|
|
213
|
-
Input,
|
|
214
|
-
{
|
|
215
|
-
ref: textInputRef,
|
|
216
|
-
size: "md",
|
|
217
|
-
value: textValue,
|
|
218
|
-
onChange: (e) => {
|
|
219
|
-
setTextValue(e.target.value);
|
|
220
|
-
setError(void 0);
|
|
221
|
-
},
|
|
222
|
-
placeholder: selectedField.placeholder ?? `Enter ${selectedField.label}`,
|
|
223
|
-
onKeyDown: (e) => {
|
|
224
|
-
if (e.key === "Enter") {
|
|
225
|
-
e.preventDefault();
|
|
226
|
-
commit();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
),
|
|
231
|
-
selectedField && selectedField.kind === "multi-select" && /* @__PURE__ */ jsx(
|
|
193
|
+
selectedField && /* @__PURE__ */ jsx(
|
|
232
194
|
Combobox,
|
|
233
195
|
{
|
|
234
196
|
multiple: true,
|
|
@@ -245,7 +207,7 @@ function PropertyFilterCreator({
|
|
|
245
207
|
}
|
|
246
208
|
),
|
|
247
209
|
error && /* @__PURE__ */ jsx("div", { className: "text-ui-sm text-red-500", children: error }),
|
|
248
|
-
selectedField &&
|
|
210
|
+
selectedField && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
249
211
|
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "md", onClick: () => setOpen(false), children: "Cancel" }),
|
|
250
212
|
/* @__PURE__ */ jsx(Button, { variant: "outline", size: "md", onClick: commit, children: "Add filter" })
|
|
251
213
|
] })
|