@mastra/playground-ui 67.0.0 → 68.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/KnowledgePageGraph.css +11 -0
  2. package/dist/components/ai/tool-approval.cjs.js +1 -1
  3. package/dist/components/ai/tool-approval.es.js +1 -1
  4. package/dist/components/ai/tool-call.cjs.js +2 -2
  5. package/dist/components/ai/tool-call.es.js +2 -2
  6. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  7. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  8. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  9. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  10. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +40 -0
  11. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -0
  12. package/dist/domains/chat/knowledge/knowledge-links.d.ts +1 -0
  13. package/dist/domains/chat/knowledge/knowledge-links.es.js +38 -0
  14. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -0
  15. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +79 -0
  16. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -0
  17. package/dist/domains/chat/knowledge/pinned-knowledge-data.d.ts +1 -0
  18. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +77 -0
  19. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -0
  20. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +124 -0
  21. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -0
  22. package/dist/domains/chat/knowledge/pinned-knowledge.d.ts +1 -0
  23. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +123 -0
  24. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -0
  25. package/dist/domains/chat/knowledge.cjs.js +12 -0
  26. package/dist/domains/chat/knowledge.d.ts +1 -0
  27. package/dist/domains/chat/knowledge.es.js +5 -0
  28. package/dist/domains/chat/messages/message-row.cjs.js +2 -2
  29. package/dist/domains/chat/messages/message-row.es.js +2 -2
  30. package/dist/domains/chat/messages/signal-badge.cjs.js +7 -0
  31. package/dist/domains/chat/messages/signal-badge.cjs.js.map +1 -1
  32. package/dist/domains/chat/messages/signal-badge.es.js +7 -0
  33. package/dist/domains/chat/messages/signal-badge.es.js.map +1 -1
  34. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  35. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  36. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  37. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  38. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  39. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  40. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +273 -0
  41. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -0
  42. package/dist/domains/chat/tools/badges/knowledge-tool-badge.d.ts +1 -0
  43. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +270 -0
  44. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -0
  45. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  46. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  47. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  48. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  49. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  50. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  51. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +3 -3
  52. package/dist/domains/chat/tools/badges/tool-badge.es.js +3 -3
  53. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  54. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  55. package/dist/domains/chat/tools/tool-card-kind.cjs.js +4 -2
  56. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  57. package/dist/domains/chat/tools/tool-card-kind.es.js +4 -2
  58. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  59. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  60. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  61. package/dist/domains/chat/tools/tool-groups.cjs.js +3 -2
  62. package/dist/domains/chat/tools/tool-groups.cjs.js.map +1 -1
  63. package/dist/domains/chat/tools/tool-groups.es.js +3 -2
  64. package/dist/domains/chat/tools/tool-groups.es.js.map +1 -1
  65. package/dist/domains/chat.cjs.js +11 -0
  66. package/dist/domains/chat.es.js +5 -1
  67. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +438 -0
  68. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -0
  69. package/dist/domains/knowledge/components/KnowledgePageDetail.d.ts +1 -0
  70. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +436 -0
  71. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -0
  72. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +521 -0
  73. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -0
  74. package/dist/domains/knowledge/components/KnowledgePageExplorer.d.ts +1 -0
  75. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +520 -0
  76. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -0
  77. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +626 -0
  78. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -0
  79. package/dist/domains/knowledge/components/KnowledgePageGraph.d.ts +1 -0
  80. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +625 -0
  81. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -0
  82. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +170 -0
  83. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -0
  84. package/dist/domains/knowledge/components/KnowledgePageTree.d.ts +1 -0
  85. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +168 -0
  86. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -0
  87. package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js +37 -0
  88. package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js.map +1 -0
  89. package/dist/domains/knowledge/hooks/useInteractionIdle.d.ts +1 -0
  90. package/dist/domains/knowledge/hooks/useInteractionIdle.es.js +35 -0
  91. package/dist/domains/knowledge/hooks/useInteractionIdle.es.js.map +1 -0
  92. package/dist/domains/knowledge/lib/layout.cjs.js +93 -0
  93. package/dist/domains/knowledge/lib/layout.cjs.js.map +1 -0
  94. package/dist/domains/knowledge/lib/layout.d.ts +1 -0
  95. package/dist/domains/knowledge/lib/layout.es.js +92 -0
  96. package/dist/domains/knowledge/lib/layout.es.js.map +1 -0
  97. package/dist/domains/knowledge/lib/pageGraph.cjs.js +135 -0
  98. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -0
  99. package/dist/domains/knowledge/lib/pageGraph.d.ts +1 -0
  100. package/dist/domains/knowledge/lib/pageGraph.es.js +128 -0
  101. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -0
  102. package/dist/domains/knowledge/lib/pageLayout.cjs.js +49 -0
  103. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +1 -0
  104. package/dist/domains/knowledge/lib/pageLayout.d.ts +1 -0
  105. package/dist/domains/knowledge/lib/pageLayout.es.js +48 -0
  106. package/dist/domains/knowledge/lib/pageLayout.es.js.map +1 -0
  107. package/dist/domains/knowledge/lib/pageTree.cjs.js +98 -0
  108. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -0
  109. package/dist/domains/knowledge/lib/pageTree.d.ts +1 -0
  110. package/dist/domains/knowledge/lib/pageTree.es.js +94 -0
  111. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -0
  112. package/dist/domains/knowledge/lib/popupPlacement.cjs.js +22 -0
  113. package/dist/domains/knowledge/lib/popupPlacement.cjs.js.map +1 -0
  114. package/dist/domains/knowledge/lib/popupPlacement.d.ts +1 -0
  115. package/dist/domains/knowledge/lib/popupPlacement.es.js +21 -0
  116. package/dist/domains/knowledge/lib/popupPlacement.es.js.map +1 -0
  117. package/dist/domains/knowledge/lib/recordText.cjs.js +26 -0
  118. package/dist/domains/knowledge/lib/recordText.cjs.js.map +1 -0
  119. package/dist/domains/knowledge/lib/recordText.d.ts +1 -0
  120. package/dist/domains/knowledge/lib/recordText.es.js +25 -0
  121. package/dist/domains/knowledge/lib/recordText.es.js.map +1 -0
  122. package/dist/domains/knowledge/pageTypes.cjs.js +0 -0
  123. package/dist/domains/knowledge/pageTypes.d.ts +1 -0
  124. package/dist/domains/knowledge/pageTypes.es.js +0 -0
  125. package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
  126. package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
  127. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
  128. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
  129. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js +3 -2
  130. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js.map +1 -1
  131. package/dist/domains/observability/saved-views/saved-views-provider.es.js +3 -2
  132. package/dist/domains/observability/saved-views/saved-views-provider.es.js.map +1 -1
  133. package/dist/domains/observability/saved-views/saved-views-source.cjs.js.map +1 -1
  134. package/dist/domains/observability/saved-views/saved-views-source.es.js.map +1 -1
  135. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +3 -2
  136. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js.map +1 -1
  137. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +3 -2
  138. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js.map +1 -1
  139. package/dist/domains/observability/saved-views.cjs.js +1 -1
  140. package/dist/domains/observability/saved-views.es.js +1 -1
  141. package/dist/domains/observability.cjs.js +1 -1
  142. package/dist/domains/observability.es.js +1 -1
  143. package/dist/domains/skills/skill-simple-form.cjs.js +2 -2
  144. package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -1
  145. package/dist/domains/skills/skill-simple-form.es.js +2 -2
  146. package/dist/domains/skills/skill-simple-form.es.js.map +1 -1
  147. package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
  148. package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
  149. package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
  150. package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
  151. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  152. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  153. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  154. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  155. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +1 -1
  156. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +1 -1
  157. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  158. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  159. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  160. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  161. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  162. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  163. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  164. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  165. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  166. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  167. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  168. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  169. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
  170. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
  171. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +2 -1
  172. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js.map +1 -1
  173. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +2 -1
  174. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js.map +1 -1
  175. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  176. package/dist/lib/form/dynamic-form.cjs.js.map +1 -1
  177. package/dist/lib/form/dynamic-form.es.js +2 -2
  178. package/dist/lib/form/dynamic-form.es.js.map +1 -1
  179. package/dist/lib/form/json-draft.cjs.js +1 -1
  180. package/dist/lib/form/json-draft.es.js +1 -1
  181. package/dist/lib/form/zod-provider/compat.cjs.js +8 -0
  182. package/dist/lib/form/zod-provider/compat.cjs.js.map +1 -1
  183. package/dist/lib/form/zod-provider/compat.es.js +8 -1
  184. package/dist/lib/form/zod-provider/compat.es.js.map +1 -1
  185. package/dist/lib/form/zod-provider.cjs.js +1 -1
  186. package/dist/lib/form/zod-provider.es.js +1 -1
  187. package/dist/{observability-saved-views-CwCii7hh.cjs → observability-saved-views-BNU3GkK6.cjs} +8 -6
  188. package/dist/observability-saved-views-BNU3GkK6.cjs.map +1 -0
  189. package/dist/{observability-saved-views-Bo5kLN20.js → observability-saved-views-Zlz74syw.js} +8 -6
  190. package/dist/observability-saved-views-Zlz74syw.js.map +1 -0
  191. package/dist/{span-payload-primitives-Dyhbqaa7.js → span-payload-primitives-ChvD2RrN.js} +2 -2
  192. package/dist/{span-payload-primitives-Dyhbqaa7.js.map → span-payload-primitives-ChvD2RrN.js.map} +1 -1
  193. package/dist/{span-payload-primitives-B10Xxmx7.cjs → span-payload-primitives-w1vtAXAw.cjs} +2 -2
  194. package/dist/{span-payload-primitives-B10Xxmx7.cjs.map → span-payload-primitives-w1vtAXAw.cjs.map} +1 -1
  195. package/dist/src/domains/chat/index.d.ts +1 -0
  196. package/dist/src/domains/chat/knowledge/index.d.ts +5 -0
  197. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +21 -0
  198. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +22 -0
  199. package/dist/src/domains/chat/knowledge/pinned-knowledge.d.ts +9 -0
  200. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +19 -0
  201. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +2 -2
  202. package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +42 -0
  203. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +80 -0
  204. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +35 -0
  205. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +27 -0
  206. package/dist/src/domains/knowledge/hooks/useInteractionIdle.d.ts +12 -0
  207. package/dist/src/domains/knowledge/lib/layout.d.ts +35 -0
  208. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +45 -0
  209. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +24 -0
  210. package/dist/src/domains/knowledge/lib/pageTree.d.ts +28 -0
  211. package/dist/src/domains/knowledge/lib/popupPlacement.d.ts +12 -0
  212. package/dist/src/domains/knowledge/lib/recordText.d.ts +9 -0
  213. package/dist/src/domains/knowledge/pageTypes.d.ts +96 -0
  214. package/dist/src/domains/observability/saved-views/saved-views-provider.d.ts +6 -1
  215. package/dist/src/domains/observability/saved-views/saved-views-source.d.ts +1 -0
  216. package/dist/src/domains/observability/saved-views/use-hosted-saved-views.d.ts +1 -1
  217. package/dist/src/domains/skills/skill-simple-form.d.ts +3 -1
  218. package/dist/src/ds/components/SavedViews/saved-view-picker.d.ts +3 -1
  219. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +30 -0
  220. package/dist/src/lib/form/zod-provider/compat.d.ts +5 -0
  221. package/dist/style.css +63 -1
  222. package/dist/{tool-approval-FeuyUUcL.js → tool-approval-DHeCkWHT.js} +3 -3
  223. package/dist/{tool-approval-FeuyUUcL.js.map → tool-approval-DHeCkWHT.js.map} +1 -1
  224. package/dist/{tool-approval-BfjoSNOC.cjs → tool-approval-Dfi0uAKU.cjs} +3 -3
  225. package/dist/{tool-approval-BfjoSNOC.cjs.map → tool-approval-Dfi0uAKU.cjs.map} +1 -1
  226. package/dist/{tool-call-CvilN9ti.cjs → tool-call-BCsDhIhs.cjs} +32 -2
  227. package/dist/{tool-call-CvilN9ti.cjs.map → tool-call-BCsDhIhs.cjs.map} +1 -1
  228. package/dist/{tool-call-BxYXs9w0.js → tool-call-CILZa3tn.js} +32 -2
  229. package/dist/{tool-call-BxYXs9w0.js.map → tool-call-CILZa3tn.js.map} +1 -1
  230. package/dist/{tool-card-ELW898uw.js → tool-card-C3sDFUWc.js} +18 -4
  231. package/dist/tool-card-C3sDFUWc.js.map +1 -0
  232. package/dist/{tool-card-B7O8AsRl.cjs → tool-card-CJ7Kxi-U.cjs} +18 -4
  233. package/dist/tool-card-CJ7Kxi-U.cjs.map +1 -0
  234. package/dist/{tool-presentation-BLErsb7c.cjs → tool-presentation-CQlDEwgS.cjs} +26 -1
  235. package/dist/tool-presentation-CQlDEwgS.cjs.map +1 -0
  236. package/dist/{tool-presentation-BSZYIWx2.js → tool-presentation-DvCsb_kz.js} +26 -1
  237. package/dist/tool-presentation-DvCsb_kz.js.map +1 -0
  238. package/package.json +11 -9
  239. package/dist/observability-saved-views-Bo5kLN20.js.map +0 -1
  240. package/dist/observability-saved-views-CwCii7hh.cjs.map +0 -1
  241. package/dist/tool-card-B7O8AsRl.cjs.map +0 -1
  242. package/dist/tool-card-ELW898uw.js.map +0 -1
  243. package/dist/tool-presentation-BLErsb7c.cjs.map +0 -1
  244. package/dist/tool-presentation-BSZYIWx2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-workflow-trigger.es.js","names":[],"sources":["../../../../src/domains/workflows/workflow/use-workflow-trigger.ts"],"sourcesContent":["import type { GetWorkflowResponse, TimeTravelParams } from '@mastra/client-js';\nimport { useCallback, useContext, useMemo } from 'react';\nimport { parse } from 'superjson';\nimport { z } from 'zod';\n\nimport type { WorkflowRunStreamResult } from '../context/workflow-run-context';\nimport { WorkflowRunContext } from '../context/workflow-run-context';\nimport {\n buildNextStepInput,\n buildStepSuccessors,\n buildStepsFlow,\n collectGraphStepFlags,\n constructNodesAndEdges,\n isBranchArmBypassed,\n isLastRunnableStep,\n selectNextStepKey,\n} from './utils';\nimport { WORKFLOW_STEP_NODE_TYPE } from './workflow-step-node-utils';\nimport type { ResumeStepParams } from './workflow-suspended-steps';\nimport { jsonSchemaToZodRuntime } from '@/lib/form/json-schema-to-zod-runtime';\n\nexport interface SuspendedStep {\n stepId: string;\n runId: string;\n suspendPayload: unknown;\n}\n\nexport function useSuspendedSteps(streamResult: WorkflowRunStreamResult | null, runId: string): SuspendedStep[] {\n return useMemo(() => {\n return Object.entries(streamResult?.steps || {})\n .filter(([_, { status }]) => status === 'suspended')\n .map(([stepId, { suspendPayload }]) => ({ stepId, runId, suspendPayload }));\n }, [streamResult?.steps, runId]);\n}\n\nexport function useWorkflowSchemas(workflow?: GetWorkflowResponse) {\n return useMemo(() => {\n const triggerSchema = workflow?.inputSchema;\n const stateSchema = workflow?.stateSchema;\n\n const zodInputSchema = triggerSchema ? jsonSchemaToZodRuntime(parse(triggerSchema)) : null;\n const zodStateSchema = stateSchema ? jsonSchemaToZodRuntime(parse(stateSchema)) : null;\n\n return {\n zodSchemaToUse: zodStateSchema\n ? z.object({\n inputData: zodInputSchema ?? z.any(),\n initialState: zodStateSchema.optional(),\n })\n : zodInputSchema,\n hasStateSchema: !!stateSchema,\n };\n }, [workflow?.inputSchema, workflow?.stateSchema]);\n}\n\nfunction useWorkflowStepGraphInfo(stepGraph: GetWorkflowResponse['stepGraph'] | undefined) {\n return useMemo(() => {\n const { nodes, edges } = constructNodesAndEdges({ stepGraph });\n const stepNodesInOrder = nodes.flatMap(node => {\n if (node.type !== WORKFLOW_STEP_NODE_TYPE || node.data.nodeRole === 'condition' || !node.data.stepId) {\n return [];\n }\n return [node.data.stepId];\n });\n\n const stepsFlow = buildStepsFlow(edges);\n const stepSuccessors = buildStepSuccessors(stepsFlow);\n const { conditionalStepIds, nestedWorkflowStepIds } = collectGraphStepFlags(stepGraph);\n\n return { stepNodesInOrder, stepsFlow, stepSuccessors, conditionalStepIds, nestedWorkflowStepIds };\n }, [stepGraph]);\n}\n\nexport function useWaitingStepKey(): string | undefined {\n const { result, workflow } = useContext(WorkflowRunContext);\n\n const { stepNodesInOrder, stepsFlow, stepSuccessors, conditionalStepIds } = useWorkflowStepGraphInfo(\n workflow?.stepGraph,\n );\n\n const steps = result?.steps;\n const isPaused = result?.status === 'paused';\n\n const isStepResolved = useCallback(\n (stepId: string) => steps?.[stepId]?.status === 'success' || steps?.[stepId]?.status === 'skipped',\n [steps],\n );\n const isStepBypassed = useCallback(\n (stepId: string) => isBranchArmBypassed({ stepId, conditionalStepIds, stepSuccessors, stepsFlow, steps }),\n [conditionalStepIds, stepSuccessors, stepsFlow, steps],\n );\n\n return useMemo(\n () =>\n isPaused ? selectNextStepKey({ stepNodesInOrder, isStepSuccess: isStepResolved, isStepBypassed }) : undefined,\n [isPaused, stepNodesInOrder, isStepResolved, isStepBypassed],\n );\n}\n\nexport function useNextPerStep(requestContext: Record<string, any>) {\n const { result, runId, workflowId, workflow, payload, setDebugMode, timeTravelWorkflowStream } =\n useContext(WorkflowRunContext);\n\n const { stepsFlow, stepNodesInOrder, nestedWorkflowStepIds, conditionalStepIds, stepSuccessors } =\n useWorkflowStepGraphInfo(workflow?.stepGraph);\n\n const steps = result?.steps;\n\n const isStepResolved = useCallback(\n (stepId: string) => steps?.[stepId]?.status === 'success' || steps?.[stepId]?.status === 'skipped',\n [steps],\n );\n const isStepBypassed = useCallback(\n (stepId: string) => isBranchArmBypassed({ stepId, conditionalStepIds, stepSuccessors, stepsFlow, steps }),\n [conditionalStepIds, stepSuccessors, stepsFlow, steps],\n );\n\n const nextStepKey = useWaitingStepKey();\n\n const stepPayload = useMemo(() => {\n const input = buildNextStepInput({ nextStepKey, stepsFlow, steps, isStepBypassed });\n if (input) return input;\n if (nextStepKey && (stepsFlow[nextStepKey]?.length ?? 0) === 0) {\n return { hasMultiSteps: false, input: result?.input !== undefined ? result.input : payload };\n }\n return undefined;\n }, [nextStepKey, stepsFlow, steps, result?.input, payload, isStepBypassed]);\n\n const isLastStep = useMemo(\n () => isLastRunnableStep({ nextStepKey, stepNodesInOrder, isStepSuccess: isStepResolved, isStepBypassed }),\n [nextStepKey, stepNodesInOrder, isStepResolved, isStepBypassed],\n );\n\n const canRunNextStep = Boolean(nextStepKey && stepPayload);\n\n const runStep = useCallback(\n (isContinueRun: boolean) => {\n if (!nextStepKey || !stepPayload) return;\n const isNestedWorkflowStep = nestedWorkflowStepIds.has(nextStepKey);\n const runToFinish = isContinueRun || isNestedWorkflowStep || isLastStep;\n\n const payload = {\n runId,\n workflowId,\n step: nextStepKey,\n inputData: stepPayload.hasMultiSteps ? undefined : stepPayload.input,\n requestContext,\n perStep: !runToFinish,\n ...(stepPayload.hasMultiSteps\n ? {\n context: Object.keys(stepPayload.input).reduce<NonNullable<TimeTravelParams['context']>>(\n (acc, stepId) => {\n acc[stepId] = { status: 'success', output: stepPayload.input[stepId] };\n return acc;\n },\n {},\n ),\n }\n : {}),\n };\n\n if (isContinueRun) {\n setDebugMode(false);\n }\n\n void timeTravelWorkflowStream(payload);\n },\n [\n nextStepKey,\n stepPayload,\n runId,\n workflowId,\n requestContext,\n setDebugMode,\n timeTravelWorkflowStream,\n nestedWorkflowStepIds,\n isLastStep,\n ],\n );\n\n return {\n canRunNextStep,\n nextStepLabel: nextStepKey && conditionalStepIds.has(nextStepKey) ? 'Evaluate branch conditions' : nextStepKey,\n runNextStep: useCallback(() => runStep(false), [runStep]),\n continueFullRun: useCallback(() => runStep(true), [runStep]),\n };\n}\n\nexport function useResumeWorkflow(requestContext: Record<string, any>) {\n const { workflowId, workflow, createWorkflowRun, resumeWorkflow } = useContext(WorkflowRunContext);\n\n return useCallback(\n async (step: ResumeStepParams) => {\n if (!workflow) return;\n\n const { stepId, runId: prevRunId, resumeData } = step;\n\n const run = await createWorkflowRun({ workflowId, prevRunId });\n\n await resumeWorkflow({\n step: stepId,\n runId: run.runId,\n resumeData,\n workflowId,\n requestContext,\n });\n },\n [workflowId, workflow, createWorkflowRun, resumeWorkflow, requestContext],\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-workflow-trigger.es.js","names":[],"sources":["../../../../src/domains/workflows/workflow/use-workflow-trigger.ts"],"sourcesContent":["import type { GetWorkflowResponse, TimeTravelParams } from '@mastra/client-js';\nimport { useCallback, useContext, useMemo } from 'react';\nimport { parse } from 'superjson';\nimport { z } from 'zod';\n\nimport type { WorkflowRunStreamResult } from '../context/workflow-run-context';\nimport { WorkflowRunContext } from '../context/workflow-run-context';\nimport {\n buildNextStepInput,\n buildStepSuccessors,\n buildStepsFlow,\n collectGraphStepFlags,\n constructNodesAndEdges,\n isBranchArmBypassed,\n isLastRunnableStep,\n selectNextStepKey,\n} from './utils';\nimport { WORKFLOW_STEP_NODE_TYPE } from './workflow-step-node-utils';\nimport type { ResumeStepParams } from './workflow-suspended-steps';\nimport { jsonSchemaToZodRuntime } from '@/lib/form/json-schema-to-zod-runtime';\nimport { asObjectProperty } from '@/lib/form/zod-provider/compat';\n\nexport interface SuspendedStep {\n stepId: string;\n runId: string;\n suspendPayload: unknown;\n}\n\nexport function useSuspendedSteps(streamResult: WorkflowRunStreamResult | null, runId: string): SuspendedStep[] {\n return useMemo(() => {\n return Object.entries(streamResult?.steps || {})\n .filter(([_, { status }]) => status === 'suspended')\n .map(([stepId, { suspendPayload }]) => ({ stepId, runId, suspendPayload }));\n }, [streamResult?.steps, runId]);\n}\n\nexport function useWorkflowSchemas(workflow?: GetWorkflowResponse) {\n return useMemo(() => {\n const triggerSchema = workflow?.inputSchema;\n const stateSchema = workflow?.stateSchema;\n\n const zodInputSchema = triggerSchema ? jsonSchemaToZodRuntime(parse(triggerSchema)) : null;\n const zodStateSchema = stateSchema ? jsonSchemaToZodRuntime(parse(stateSchema)) : null;\n\n return {\n zodSchemaToUse: zodStateSchema\n ? z.object({\n inputData: asObjectProperty(zodInputSchema ?? z.any()),\n initialState: zodStateSchema.optional(),\n })\n : zodInputSchema,\n hasStateSchema: !!stateSchema,\n };\n }, [workflow?.inputSchema, workflow?.stateSchema]);\n}\n\nfunction useWorkflowStepGraphInfo(stepGraph: GetWorkflowResponse['stepGraph'] | undefined) {\n return useMemo(() => {\n const { nodes, edges } = constructNodesAndEdges({ stepGraph });\n const stepNodesInOrder = nodes.flatMap(node => {\n if (node.type !== WORKFLOW_STEP_NODE_TYPE || node.data.nodeRole === 'condition' || !node.data.stepId) {\n return [];\n }\n return [node.data.stepId];\n });\n\n const stepsFlow = buildStepsFlow(edges);\n const stepSuccessors = buildStepSuccessors(stepsFlow);\n const { conditionalStepIds, nestedWorkflowStepIds } = collectGraphStepFlags(stepGraph);\n\n return { stepNodesInOrder, stepsFlow, stepSuccessors, conditionalStepIds, nestedWorkflowStepIds };\n }, [stepGraph]);\n}\n\nexport function useWaitingStepKey(): string | undefined {\n const { result, workflow } = useContext(WorkflowRunContext);\n\n const { stepNodesInOrder, stepsFlow, stepSuccessors, conditionalStepIds } = useWorkflowStepGraphInfo(\n workflow?.stepGraph,\n );\n\n const steps = result?.steps;\n const isPaused = result?.status === 'paused';\n\n const isStepResolved = useCallback(\n (stepId: string) => steps?.[stepId]?.status === 'success' || steps?.[stepId]?.status === 'skipped',\n [steps],\n );\n const isStepBypassed = useCallback(\n (stepId: string) => isBranchArmBypassed({ stepId, conditionalStepIds, stepSuccessors, stepsFlow, steps }),\n [conditionalStepIds, stepSuccessors, stepsFlow, steps],\n );\n\n return useMemo(\n () =>\n isPaused ? selectNextStepKey({ stepNodesInOrder, isStepSuccess: isStepResolved, isStepBypassed }) : undefined,\n [isPaused, stepNodesInOrder, isStepResolved, isStepBypassed],\n );\n}\n\nexport function useNextPerStep(requestContext: Record<string, any>) {\n const { result, runId, workflowId, workflow, payload, setDebugMode, timeTravelWorkflowStream } =\n useContext(WorkflowRunContext);\n\n const { stepsFlow, stepNodesInOrder, nestedWorkflowStepIds, conditionalStepIds, stepSuccessors } =\n useWorkflowStepGraphInfo(workflow?.stepGraph);\n\n const steps = result?.steps;\n\n const isStepResolved = useCallback(\n (stepId: string) => steps?.[stepId]?.status === 'success' || steps?.[stepId]?.status === 'skipped',\n [steps],\n );\n const isStepBypassed = useCallback(\n (stepId: string) => isBranchArmBypassed({ stepId, conditionalStepIds, stepSuccessors, stepsFlow, steps }),\n [conditionalStepIds, stepSuccessors, stepsFlow, steps],\n );\n\n const nextStepKey = useWaitingStepKey();\n\n const stepPayload = useMemo(() => {\n const input = buildNextStepInput({ nextStepKey, stepsFlow, steps, isStepBypassed });\n if (input) return input;\n if (nextStepKey && (stepsFlow[nextStepKey]?.length ?? 0) === 0) {\n return { hasMultiSteps: false, input: result?.input !== undefined ? result.input : payload };\n }\n return undefined;\n }, [nextStepKey, stepsFlow, steps, result?.input, payload, isStepBypassed]);\n\n const isLastStep = useMemo(\n () => isLastRunnableStep({ nextStepKey, stepNodesInOrder, isStepSuccess: isStepResolved, isStepBypassed }),\n [nextStepKey, stepNodesInOrder, isStepResolved, isStepBypassed],\n );\n\n const canRunNextStep = Boolean(nextStepKey && stepPayload);\n\n const runStep = useCallback(\n (isContinueRun: boolean) => {\n if (!nextStepKey || !stepPayload) return;\n const isNestedWorkflowStep = nestedWorkflowStepIds.has(nextStepKey);\n const runToFinish = isContinueRun || isNestedWorkflowStep || isLastStep;\n\n const payload = {\n runId,\n workflowId,\n step: nextStepKey,\n inputData: stepPayload.hasMultiSteps ? undefined : stepPayload.input,\n requestContext,\n perStep: !runToFinish,\n ...(stepPayload.hasMultiSteps\n ? {\n context: Object.keys(stepPayload.input).reduce<NonNullable<TimeTravelParams['context']>>(\n (acc, stepId) => {\n acc[stepId] = { status: 'success', output: stepPayload.input[stepId] };\n return acc;\n },\n {},\n ),\n }\n : {}),\n };\n\n if (isContinueRun) {\n setDebugMode(false);\n }\n\n void timeTravelWorkflowStream(payload);\n },\n [\n nextStepKey,\n stepPayload,\n runId,\n workflowId,\n requestContext,\n setDebugMode,\n timeTravelWorkflowStream,\n nestedWorkflowStepIds,\n isLastStep,\n ],\n );\n\n return {\n canRunNextStep,\n nextStepLabel: nextStepKey && conditionalStepIds.has(nextStepKey) ? 'Evaluate branch conditions' : nextStepKey,\n runNextStep: useCallback(() => runStep(false), [runStep]),\n continueFullRun: useCallback(() => runStep(true), [runStep]),\n };\n}\n\nexport function useResumeWorkflow(requestContext: Record<string, any>) {\n const { workflowId, workflow, createWorkflowRun, resumeWorkflow } = useContext(WorkflowRunContext);\n\n return useCallback(\n async (step: ResumeStepParams) => {\n if (!workflow) return;\n\n const { stepId, runId: prevRunId, resumeData } = step;\n\n const run = await createWorkflowRun({ workflowId, prevRunId });\n\n await resumeWorkflow({\n step: stepId,\n runId: run.runId,\n resumeData,\n workflowId,\n requestContext,\n });\n },\n [workflowId, workflow, createWorkflowRun, resumeWorkflow, requestContext],\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_lib_form_zod_provider_compat = require("./zod-provider/compat.cjs.js");
2
3
  const require_lib_form_components_form_submit_row = require("./components/form-submit-row.cjs.js");
3
4
  require("./field-context.cjs.js");
4
5
  const require_lib_form_auto_form = require("./auto-form.cjs.js");
5
- const require_lib_form_zod_provider_compat = require("./zod-provider/compat.cjs.js");
6
6
  const require_lib_form_is_empty_zod_object = require("./is-empty-zod-object.cjs.js");
7
7
  const require_lib_form_zod_provider = require("./zod-provider.cjs.js");
8
8
  let react = require("react");
@@ -15,7 +15,7 @@ function getFormInput(values, isWrapped) {
15
15
  function normalizeSchema(schema, isWrapped) {
16
16
  if (require_lib_form_is_empty_zod_object.isEmptyZodObject(schema)) return zod.z.object({});
17
17
  if (!isWrapped) return schema;
18
- return zod.z.object({ ["​"]: schema.description ? schema : schema.describe("Input") });
18
+ return zod.z.object({ ["​"]: require_lib_form_zod_provider_compat.asObjectProperty(schema.description ? schema : schema.describe("Input")) });
19
19
  }
20
20
  var SubmitRowContext = (0, react.createContext)(null);
21
21
  var SubmitButton = ({ children }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-form.cjs.js","names":["isEmptyZodObject","z","createContext","useContext","FormSubmitRow","getShape","useRef","useCallback","useMemo","CustomZodProvider","AutoForm"],"sources":["../../../src/lib/form/dynamic-form.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport { z } from 'zod';\nimport { AutoForm } from './auto-form';\nimport { FormSubmitRow } from './components/form-submit-row';\nimport type { FormSubmitRowProps } from './components/form-submit-row';\nimport { ROOT_FIELD_KEY } from './field-context';\nimport { isEmptyZodObject } from './is-empty-zod-object';\nimport { CustomZodProvider } from './zod-provider';\nimport { getShape } from './zod-provider/compat';\nimport type { ButtonProps } from '@/ds/components/Button';\n\ninterface DynamicFormProps {\n schema: any;\n onSubmit?: (values: any) => void | Promise<void>;\n onValuesChange?: (values: any) => void;\n defaultValues?: any;\n isSubmitLoading?: boolean;\n submitButtonLabel?: string;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: ButtonProps['variant'];\n submitButtonFullWidth?: boolean;\n className?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n}\n\nfunction getFormInput(values: Record<string, unknown>, isWrapped: boolean) {\n return isWrapped ? values[ROOT_FIELD_KEY] : values;\n}\n\nfunction normalizeSchema(schema: z.ZodType, isWrapped: boolean) {\n if (isEmptyZodObject(schema)) return z.object({});\n if (!isWrapped) return schema;\n return z.object({ [ROOT_FIELD_KEY]: schema.description ? schema : schema.describe('Input') });\n}\n\nconst SubmitRowContext = createContext<FormSubmitRowProps | null>(null);\n\n// Defined once, outside any hook: AutoForm renders `uiComponents.SubmitButton` as a component\n// type, so recreating it per render would unmount and remount everything in `submitActions`.\nconst SubmitButton = ({ children }: { children: ReactNode }) => {\n const rowProps = useContext(SubmitRowContext);\n return rowProps ? <FormSubmitRow {...rowProps}>{children}</FormSubmitRow> : null;\n};\n\nconst uiComponents = { SubmitButton };\n\nexport function DynamicForm({\n schema,\n onSubmit,\n onValuesChange,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n className,\n readOnly,\n children,\n submitActions,\n leftActions,\n}: DynamicFormProps) {\n const isWrapped = getShape(schema) === undefined;\n const subscriptionRef = useRef<{ unsubscribe: () => void } | null>(null);\n const onValuesChangeRef = useRef(onValuesChange);\n useLayoutEffect(() => {\n onValuesChangeRef.current = onValuesChange;\n }, [onValuesChange]);\n\n useEffect(() => () => subscriptionRef.current?.unsubscribe(), []);\n\n const hasValuesListener = Boolean(onValuesChange);\n\n const handleFormInit = useCallback(\n (form: UseFormReturn<any>) => {\n subscriptionRef.current?.unsubscribe();\n subscriptionRef.current = null;\n\n if (!hasValuesListener) return;\n\n subscriptionRef.current = form.watch(values => onValuesChangeRef.current?.(getFormInput(values, isWrapped)));\n onValuesChangeRef.current?.(getFormInput(form.getValues(), isWrapped));\n },\n [hasValuesListener, isWrapped],\n );\n\n const schemaProvider = useMemo(\n () => (schema ? new CustomZodProvider(normalizeSchema(schema, isWrapped)) : null),\n [schema, isWrapped],\n );\n\n const submitRow = useMemo<FormSubmitRowProps | null>(\n () =>\n onSubmit\n ? {\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n }\n : null,\n [\n onSubmit,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n ],\n );\n\n const normalizedDefaultValues = useMemo(\n () => (isWrapped ? (defaultValues === undefined ? undefined : { [ROOT_FIELD_KEY]: defaultValues }) : defaultValues),\n [isWrapped, defaultValues],\n );\n\n const handleSubmit = useCallback(\n async (values: any) => {\n await onSubmit?.(getFormInput(values, isWrapped));\n },\n [onSubmit, isWrapped],\n );\n\n if (!schemaProvider) {\n console.error('no form schema found');\n return null;\n }\n\n return (\n <SubmitRowContext.Provider value={submitRow}>\n <AutoForm\n schema={schemaProvider}\n onSubmit={handleSubmit}\n onFormInit={handleFormInit}\n defaultValues={normalizedDefaultValues}\n formProps={{ className, noValidate: true }}\n uiComponents={uiComponents}\n withSubmit\n readOnly={readOnly}\n >\n {children}\n </AutoForm>\n </SubmitRowContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;;AA8BA,SAAS,aAAa,QAAiC,WAAoB;CACzE,OAAO,YAAY,OAAA,OAAyB;AAC9C;AAEA,SAAS,gBAAgB,QAAmB,WAAoB;CAC9D,IAAIA,qCAAAA,iBAAiB,MAAM,GAAG,OAAOC,IAAAA,EAAE,OAAO,CAAC,CAAC;CAChD,IAAI,CAAC,WAAW,OAAO;CACvB,OAAOA,IAAAA,EAAE,OAAO,GAAA,MAAoB,OAAO,cAAc,SAAS,OAAO,SAAS,OAAO,EAAE,CAAC;AAC9F;AAEA,IAAM,oBAAA,GAAmBC,MAAAA,cAAAA,CAAyC,IAAI;AAItE,IAAM,gBAAgB,EAAE,eAAwC;CAC9D,MAAM,YAAA,GAAWC,MAAAA,WAAAA,CAAW,gBAAgB;CAC5C,OAAO,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,4CAAAA,eAAD;EAAe,GAAI;EAAW;CAAwB,CAAA,IAAI;AAC9E;AAEA,IAAM,eAAe,EAAE,aAAa;AAEpC,SAAgB,YAAY,EAC1B,QACA,UACA,gBACA,eACA,iBACA,mBACA,kBACA,qBACA,uBACA,WACA,UACA,UACA,eACA,eACmB;CACnB,MAAM,YAAYC,qCAAAA,SAAS,MAAM,MAAM,KAAA;CACvC,MAAM,mBAAA,GAAkBC,MAAAA,OAAAA,CAA2C,IAAI;CACvE,MAAM,qBAAA,GAAoBA,MAAAA,OAAAA,CAAO,cAAc;CAC/C,CAAA,GAAA,MAAA,gBAAA,OAAsB;EACpB,kBAAkB,UAAU;CAC9B,GAAG,CAAC,cAAc,CAAC;CAEnB,CAAA,GAAA,MAAA,UAAA,aAAsB,gBAAgB,SAAS,YAAY,GAAG,CAAC,CAAC;CAEhE,MAAM,oBAAoB,QAAQ,cAAc;CAEhD,MAAM,kBAAA,GAAiBC,MAAAA,YAAAA,EACpB,SAA6B;EAC5B,gBAAgB,SAAS,YAAY;EACrC,gBAAgB,UAAU;EAE1B,IAAI,CAAC,mBAAmB;EAExB,gBAAgB,UAAU,KAAK,OAAM,WAAU,kBAAkB,UAAU,aAAa,QAAQ,SAAS,CAAC,CAAC;EAC3G,kBAAkB,UAAU,aAAa,KAAK,UAAU,GAAG,SAAS,CAAC;CACvE,GACA,CAAC,mBAAmB,SAAS,CAC/B;CAEA,MAAM,kBAAA,GAAiBC,MAAAA,QAAAA,OACd,SAAS,IAAIC,8BAAAA,kBAAkB,gBAAgB,QAAQ,SAAS,CAAC,IAAI,MAC5E,CAAC,QAAQ,SAAS,CACpB;CAEA,MAAM,aAAA,GAAYD,MAAAA,QAAAA,OAEd,WACI;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA,MACN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,2BAAA,GAA0BA,MAAAA,QAAAA,OACvB,YAAa,kBAAkB,KAAA,IAAY,KAAA,IAAY,GAAA,MAAoB,cAAc,IAAK,eACrG,CAAC,WAAW,aAAa,CAC3B;CAEA,MAAM,gBAAA,GAAeD,MAAAA,YAAAA,CACnB,OAAO,WAAgB;EACrB,MAAM,WAAW,aAAa,QAAQ,SAAS,CAAC;CAClD,GACA,CAAC,UAAU,SAAS,CACtB;CAEA,IAAI,CAAC,gBAAgB;EACnB,QAAQ,MAAM,sBAAsB;EACpC,OAAO;CACT;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAiB,UAAlB;EAA2B,OAAO;EAChC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,2BAAAA,UAAD;GACE,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,eAAe;GACf,WAAW;IAAE;IAAW,YAAY;GAAK;GAC3B;GACd,YAAA;GACU;GAET;EACO,CAAA;CACe,CAAA;AAE/B"}
1
+ {"version":3,"file":"dynamic-form.cjs.js","names":["isEmptyZodObject","z","asObjectProperty","createContext","useContext","FormSubmitRow","getShape","useRef","useCallback","useMemo","CustomZodProvider","AutoForm"],"sources":["../../../src/lib/form/dynamic-form.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport { z } from 'zod';\nimport { AutoForm } from './auto-form';\nimport { FormSubmitRow } from './components/form-submit-row';\nimport type { FormSubmitRowProps } from './components/form-submit-row';\nimport { ROOT_FIELD_KEY } from './field-context';\nimport { isEmptyZodObject } from './is-empty-zod-object';\nimport { CustomZodProvider } from './zod-provider';\nimport { asObjectProperty, getShape } from './zod-provider/compat';\nimport type { ButtonProps } from '@/ds/components/Button';\n\ninterface DynamicFormProps {\n schema: any;\n onSubmit?: (values: any) => void | Promise<void>;\n onValuesChange?: (values: any) => void;\n defaultValues?: any;\n isSubmitLoading?: boolean;\n submitButtonLabel?: string;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: ButtonProps['variant'];\n submitButtonFullWidth?: boolean;\n className?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n}\n\nfunction getFormInput(values: Record<string, unknown>, isWrapped: boolean) {\n return isWrapped ? values[ROOT_FIELD_KEY] : values;\n}\n\nfunction normalizeSchema(schema: z.ZodType, isWrapped: boolean) {\n if (isEmptyZodObject(schema)) return z.object({});\n if (!isWrapped) return schema;\n return z.object({ [ROOT_FIELD_KEY]: asObjectProperty(schema.description ? schema : schema.describe('Input')) });\n}\n\nconst SubmitRowContext = createContext<FormSubmitRowProps | null>(null);\n\n// Defined once, outside any hook: AutoForm renders `uiComponents.SubmitButton` as a component\n// type, so recreating it per render would unmount and remount everything in `submitActions`.\nconst SubmitButton = ({ children }: { children: ReactNode }) => {\n const rowProps = useContext(SubmitRowContext);\n return rowProps ? <FormSubmitRow {...rowProps}>{children}</FormSubmitRow> : null;\n};\n\nconst uiComponents = { SubmitButton };\n\nexport function DynamicForm({\n schema,\n onSubmit,\n onValuesChange,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n className,\n readOnly,\n children,\n submitActions,\n leftActions,\n}: DynamicFormProps) {\n const isWrapped = getShape(schema) === undefined;\n const subscriptionRef = useRef<{ unsubscribe: () => void } | null>(null);\n const onValuesChangeRef = useRef(onValuesChange);\n useLayoutEffect(() => {\n onValuesChangeRef.current = onValuesChange;\n }, [onValuesChange]);\n\n useEffect(() => () => subscriptionRef.current?.unsubscribe(), []);\n\n const hasValuesListener = Boolean(onValuesChange);\n\n const handleFormInit = useCallback(\n (form: UseFormReturn<any>) => {\n subscriptionRef.current?.unsubscribe();\n subscriptionRef.current = null;\n\n if (!hasValuesListener) return;\n\n subscriptionRef.current = form.watch(values => onValuesChangeRef.current?.(getFormInput(values, isWrapped)));\n onValuesChangeRef.current?.(getFormInput(form.getValues(), isWrapped));\n },\n [hasValuesListener, isWrapped],\n );\n\n const schemaProvider = useMemo(\n () => (schema ? new CustomZodProvider(normalizeSchema(schema, isWrapped)) : null),\n [schema, isWrapped],\n );\n\n const submitRow = useMemo<FormSubmitRowProps | null>(\n () =>\n onSubmit\n ? {\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n }\n : null,\n [\n onSubmit,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n ],\n );\n\n const normalizedDefaultValues = useMemo(\n () => (isWrapped ? (defaultValues === undefined ? undefined : { [ROOT_FIELD_KEY]: defaultValues }) : defaultValues),\n [isWrapped, defaultValues],\n );\n\n const handleSubmit = useCallback(\n async (values: any) => {\n await onSubmit?.(getFormInput(values, isWrapped));\n },\n [onSubmit, isWrapped],\n );\n\n if (!schemaProvider) {\n console.error('no form schema found');\n return null;\n }\n\n return (\n <SubmitRowContext.Provider value={submitRow}>\n <AutoForm\n schema={schemaProvider}\n onSubmit={handleSubmit}\n onFormInit={handleFormInit}\n defaultValues={normalizedDefaultValues}\n formProps={{ className, noValidate: true }}\n uiComponents={uiComponents}\n withSubmit\n readOnly={readOnly}\n >\n {children}\n </AutoForm>\n </SubmitRowContext.Provider>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ import { asObjectProperty, getShape } from "./zod-provider/compat.es.js";
1
2
  import { FormSubmitRow } from "./components/form-submit-row.es.js";
2
3
  import "./field-context.es.js";
3
4
  import { AutoForm } from "./auto-form.es.js";
4
- import { getShape } from "./zod-provider/compat.es.js";
5
5
  import { isEmptyZodObject } from "./is-empty-zod-object.es.js";
6
6
  import { CustomZodProvider } from "./zod-provider.es.js";
7
7
  import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef } from "react";
@@ -14,7 +14,7 @@ function getFormInput(values, isWrapped) {
14
14
  function normalizeSchema(schema, isWrapped) {
15
15
  if (isEmptyZodObject(schema)) return z.object({});
16
16
  if (!isWrapped) return schema;
17
- return z.object({ ["​"]: schema.description ? schema : schema.describe("Input") });
17
+ return z.object({ ["​"]: asObjectProperty(schema.description ? schema : schema.describe("Input")) });
18
18
  }
19
19
  var SubmitRowContext = createContext(null);
20
20
  var SubmitButton = ({ children }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-form.es.js","names":[],"sources":["../../../src/lib/form/dynamic-form.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport { z } from 'zod';\nimport { AutoForm } from './auto-form';\nimport { FormSubmitRow } from './components/form-submit-row';\nimport type { FormSubmitRowProps } from './components/form-submit-row';\nimport { ROOT_FIELD_KEY } from './field-context';\nimport { isEmptyZodObject } from './is-empty-zod-object';\nimport { CustomZodProvider } from './zod-provider';\nimport { getShape } from './zod-provider/compat';\nimport type { ButtonProps } from '@/ds/components/Button';\n\ninterface DynamicFormProps {\n schema: any;\n onSubmit?: (values: any) => void | Promise<void>;\n onValuesChange?: (values: any) => void;\n defaultValues?: any;\n isSubmitLoading?: boolean;\n submitButtonLabel?: string;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: ButtonProps['variant'];\n submitButtonFullWidth?: boolean;\n className?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n}\n\nfunction getFormInput(values: Record<string, unknown>, isWrapped: boolean) {\n return isWrapped ? values[ROOT_FIELD_KEY] : values;\n}\n\nfunction normalizeSchema(schema: z.ZodType, isWrapped: boolean) {\n if (isEmptyZodObject(schema)) return z.object({});\n if (!isWrapped) return schema;\n return z.object({ [ROOT_FIELD_KEY]: schema.description ? schema : schema.describe('Input') });\n}\n\nconst SubmitRowContext = createContext<FormSubmitRowProps | null>(null);\n\n// Defined once, outside any hook: AutoForm renders `uiComponents.SubmitButton` as a component\n// type, so recreating it per render would unmount and remount everything in `submitActions`.\nconst SubmitButton = ({ children }: { children: ReactNode }) => {\n const rowProps = useContext(SubmitRowContext);\n return rowProps ? <FormSubmitRow {...rowProps}>{children}</FormSubmitRow> : null;\n};\n\nconst uiComponents = { SubmitButton };\n\nexport function DynamicForm({\n schema,\n onSubmit,\n onValuesChange,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n className,\n readOnly,\n children,\n submitActions,\n leftActions,\n}: DynamicFormProps) {\n const isWrapped = getShape(schema) === undefined;\n const subscriptionRef = useRef<{ unsubscribe: () => void } | null>(null);\n const onValuesChangeRef = useRef(onValuesChange);\n useLayoutEffect(() => {\n onValuesChangeRef.current = onValuesChange;\n }, [onValuesChange]);\n\n useEffect(() => () => subscriptionRef.current?.unsubscribe(), []);\n\n const hasValuesListener = Boolean(onValuesChange);\n\n const handleFormInit = useCallback(\n (form: UseFormReturn<any>) => {\n subscriptionRef.current?.unsubscribe();\n subscriptionRef.current = null;\n\n if (!hasValuesListener) return;\n\n subscriptionRef.current = form.watch(values => onValuesChangeRef.current?.(getFormInput(values, isWrapped)));\n onValuesChangeRef.current?.(getFormInput(form.getValues(), isWrapped));\n },\n [hasValuesListener, isWrapped],\n );\n\n const schemaProvider = useMemo(\n () => (schema ? new CustomZodProvider(normalizeSchema(schema, isWrapped)) : null),\n [schema, isWrapped],\n );\n\n const submitRow = useMemo<FormSubmitRowProps | null>(\n () =>\n onSubmit\n ? {\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n }\n : null,\n [\n onSubmit,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n ],\n );\n\n const normalizedDefaultValues = useMemo(\n () => (isWrapped ? (defaultValues === undefined ? undefined : { [ROOT_FIELD_KEY]: defaultValues }) : defaultValues),\n [isWrapped, defaultValues],\n );\n\n const handleSubmit = useCallback(\n async (values: any) => {\n await onSubmit?.(getFormInput(values, isWrapped));\n },\n [onSubmit, isWrapped],\n );\n\n if (!schemaProvider) {\n console.error('no form schema found');\n return null;\n }\n\n return (\n <SubmitRowContext.Provider value={submitRow}>\n <AutoForm\n schema={schemaProvider}\n onSubmit={handleSubmit}\n onFormInit={handleFormInit}\n defaultValues={normalizedDefaultValues}\n formProps={{ className, noValidate: true }}\n uiComponents={uiComponents}\n withSubmit\n readOnly={readOnly}\n >\n {children}\n </AutoForm>\n </SubmitRowContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAS,aAAa,QAAiC,WAAoB;CACzE,OAAO,YAAY,OAAA,OAAyB;AAC9C;AAEA,SAAS,gBAAgB,QAAmB,WAAoB;CAC9D,IAAI,iBAAiB,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC;CAChD,IAAI,CAAC,WAAW,OAAO;CACvB,OAAO,EAAE,OAAO,GAAA,MAAoB,OAAO,cAAc,SAAS,OAAO,SAAS,OAAO,EAAE,CAAC;AAC9F;AAEA,IAAM,mBAAmB,cAAyC,IAAI;AAItE,IAAM,gBAAgB,EAAE,eAAwC;CAC9D,MAAM,WAAW,WAAW,gBAAgB;CAC5C,OAAO,WAAW,oBAAC,eAAD;EAAe,GAAI;EAAW;CAAwB,CAAA,IAAI;AAC9E;AAEA,IAAM,eAAe,EAAE,aAAa;AAEpC,SAAgB,YAAY,EAC1B,QACA,UACA,gBACA,eACA,iBACA,mBACA,kBACA,qBACA,uBACA,WACA,UACA,UACA,eACA,eACmB;CACnB,MAAM,YAAY,SAAS,MAAM,MAAM,KAAA;CACvC,MAAM,kBAAkB,OAA2C,IAAI;CACvE,MAAM,oBAAoB,OAAO,cAAc;CAC/C,sBAAsB;EACpB,kBAAkB,UAAU;CAC9B,GAAG,CAAC,cAAc,CAAC;CAEnB,sBAAsB,gBAAgB,SAAS,YAAY,GAAG,CAAC,CAAC;CAEhE,MAAM,oBAAoB,QAAQ,cAAc;CAEhD,MAAM,iBAAiB,aACpB,SAA6B;EAC5B,gBAAgB,SAAS,YAAY;EACrC,gBAAgB,UAAU;EAE1B,IAAI,CAAC,mBAAmB;EAExB,gBAAgB,UAAU,KAAK,OAAM,WAAU,kBAAkB,UAAU,aAAa,QAAQ,SAAS,CAAC,CAAC;EAC3G,kBAAkB,UAAU,aAAa,KAAK,UAAU,GAAG,SAAS,CAAC;CACvE,GACA,CAAC,mBAAmB,SAAS,CAC/B;CAEA,MAAM,iBAAiB,cACd,SAAS,IAAI,kBAAkB,gBAAgB,QAAQ,SAAS,CAAC,IAAI,MAC5E,CAAC,QAAQ,SAAS,CACpB;CAEA,MAAM,YAAY,cAEd,WACI;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA,MACN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,0BAA0B,cACvB,YAAa,kBAAkB,KAAA,IAAY,KAAA,IAAY,GAAA,MAAoB,cAAc,IAAK,eACrG,CAAC,WAAW,aAAa,CAC3B;CAEA,MAAM,eAAe,YACnB,OAAO,WAAgB;EACrB,MAAM,WAAW,aAAa,QAAQ,SAAS,CAAC;CAClD,GACA,CAAC,UAAU,SAAS,CACtB;CAEA,IAAI,CAAC,gBAAgB;EACnB,QAAQ,MAAM,sBAAsB;EACpC,OAAO;CACT;CAEA,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;EAChC,UAAA,oBAAC,UAAD;GACE,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,eAAe;GACf,WAAW;IAAE;IAAW,YAAY;GAAK;GAC3B;GACd,YAAA;GACU;GAET;EACO,CAAA;CACe,CAAA;AAE/B"}
1
+ {"version":3,"file":"dynamic-form.es.js","names":[],"sources":["../../../src/lib/form/dynamic-form.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport { z } from 'zod';\nimport { AutoForm } from './auto-form';\nimport { FormSubmitRow } from './components/form-submit-row';\nimport type { FormSubmitRowProps } from './components/form-submit-row';\nimport { ROOT_FIELD_KEY } from './field-context';\nimport { isEmptyZodObject } from './is-empty-zod-object';\nimport { CustomZodProvider } from './zod-provider';\nimport { asObjectProperty, getShape } from './zod-provider/compat';\nimport type { ButtonProps } from '@/ds/components/Button';\n\ninterface DynamicFormProps {\n schema: any;\n onSubmit?: (values: any) => void | Promise<void>;\n onValuesChange?: (values: any) => void;\n defaultValues?: any;\n isSubmitLoading?: boolean;\n submitButtonLabel?: string;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: ButtonProps['variant'];\n submitButtonFullWidth?: boolean;\n className?: string;\n readOnly?: boolean;\n children?: React.ReactNode;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n}\n\nfunction getFormInput(values: Record<string, unknown>, isWrapped: boolean) {\n return isWrapped ? values[ROOT_FIELD_KEY] : values;\n}\n\nfunction normalizeSchema(schema: z.ZodType, isWrapped: boolean) {\n if (isEmptyZodObject(schema)) return z.object({});\n if (!isWrapped) return schema;\n return z.object({ [ROOT_FIELD_KEY]: asObjectProperty(schema.description ? schema : schema.describe('Input')) });\n}\n\nconst SubmitRowContext = createContext<FormSubmitRowProps | null>(null);\n\n// Defined once, outside any hook: AutoForm renders `uiComponents.SubmitButton` as a component\n// type, so recreating it per render would unmount and remount everything in `submitActions`.\nconst SubmitButton = ({ children }: { children: ReactNode }) => {\n const rowProps = useContext(SubmitRowContext);\n return rowProps ? <FormSubmitRow {...rowProps}>{children}</FormSubmitRow> : null;\n};\n\nconst uiComponents = { SubmitButton };\n\nexport function DynamicForm({\n schema,\n onSubmit,\n onValuesChange,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n className,\n readOnly,\n children,\n submitActions,\n leftActions,\n}: DynamicFormProps) {\n const isWrapped = getShape(schema) === undefined;\n const subscriptionRef = useRef<{ unsubscribe: () => void } | null>(null);\n const onValuesChangeRef = useRef(onValuesChange);\n useLayoutEffect(() => {\n onValuesChangeRef.current = onValuesChange;\n }, [onValuesChange]);\n\n useEffect(() => () => subscriptionRef.current?.unsubscribe(), []);\n\n const hasValuesListener = Boolean(onValuesChange);\n\n const handleFormInit = useCallback(\n (form: UseFormReturn<any>) => {\n subscriptionRef.current?.unsubscribe();\n subscriptionRef.current = null;\n\n if (!hasValuesListener) return;\n\n subscriptionRef.current = form.watch(values => onValuesChangeRef.current?.(getFormInput(values, isWrapped)));\n onValuesChangeRef.current?.(getFormInput(form.getValues(), isWrapped));\n },\n [hasValuesListener, isWrapped],\n );\n\n const schemaProvider = useMemo(\n () => (schema ? new CustomZodProvider(normalizeSchema(schema, isWrapped)) : null),\n [schema, isWrapped],\n );\n\n const submitRow = useMemo<FormSubmitRowProps | null>(\n () =>\n onSubmit\n ? {\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n }\n : null,\n [\n onSubmit,\n isSubmitLoading,\n submitButtonLabel,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n submitActions,\n leftActions,\n ],\n );\n\n const normalizedDefaultValues = useMemo(\n () => (isWrapped ? (defaultValues === undefined ? undefined : { [ROOT_FIELD_KEY]: defaultValues }) : defaultValues),\n [isWrapped, defaultValues],\n );\n\n const handleSubmit = useCallback(\n async (values: any) => {\n await onSubmit?.(getFormInput(values, isWrapped));\n },\n [onSubmit, isWrapped],\n );\n\n if (!schemaProvider) {\n console.error('no form schema found');\n return null;\n }\n\n return (\n <SubmitRowContext.Provider value={submitRow}>\n <AutoForm\n schema={schemaProvider}\n onSubmit={handleSubmit}\n onFormInit={handleFormInit}\n defaultValues={normalizedDefaultValues}\n formProps={{ className, noValidate: true }}\n uiComponents={uiComponents}\n withSubmit\n readOnly={readOnly}\n >\n {children}\n </AutoForm>\n </SubmitRowContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAS,aAAa,QAAiC,WAAoB;CACzE,OAAO,YAAY,OAAA,OAAyB;AAC9C;AAEA,SAAS,gBAAgB,QAAmB,WAAoB;CAC9D,IAAI,iBAAiB,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC;CAChD,IAAI,CAAC,WAAW,OAAO;CACvB,OAAO,EAAE,OAAO,GAAA,MAAoB,iBAAiB,OAAO,cAAc,SAAS,OAAO,SAAS,OAAO,CAAC,EAAE,CAAC;AAChH;AAEA,IAAM,mBAAmB,cAAyC,IAAI;AAItE,IAAM,gBAAgB,EAAE,eAAwC;CAC9D,MAAM,WAAW,WAAW,gBAAgB;CAC5C,OAAO,WAAW,oBAAC,eAAD;EAAe,GAAI;EAAW;CAAwB,CAAA,IAAI;AAC9E;AAEA,IAAM,eAAe,EAAE,aAAa;AAEpC,SAAgB,YAAY,EAC1B,QACA,UACA,gBACA,eACA,iBACA,mBACA,kBACA,qBACA,uBACA,WACA,UACA,UACA,eACA,eACmB;CACnB,MAAM,YAAY,SAAS,MAAM,MAAM,KAAA;CACvC,MAAM,kBAAkB,OAA2C,IAAI;CACvE,MAAM,oBAAoB,OAAO,cAAc;CAC/C,sBAAsB;EACpB,kBAAkB,UAAU;CAC9B,GAAG,CAAC,cAAc,CAAC;CAEnB,sBAAsB,gBAAgB,SAAS,YAAY,GAAG,CAAC,CAAC;CAEhE,MAAM,oBAAoB,QAAQ,cAAc;CAEhD,MAAM,iBAAiB,aACpB,SAA6B;EAC5B,gBAAgB,SAAS,YAAY;EACrC,gBAAgB,UAAU;EAE1B,IAAI,CAAC,mBAAmB;EAExB,gBAAgB,UAAU,KAAK,OAAM,WAAU,kBAAkB,UAAU,aAAa,QAAQ,SAAS,CAAC,CAAC;EAC3G,kBAAkB,UAAU,aAAa,KAAK,UAAU,GAAG,SAAS,CAAC;CACvE,GACA,CAAC,mBAAmB,SAAS,CAC/B;CAEA,MAAM,iBAAiB,cACd,SAAS,IAAI,kBAAkB,gBAAgB,QAAQ,SAAS,CAAC,IAAI,MAC5E,CAAC,QAAQ,SAAS,CACpB;CAEA,MAAM,YAAY,cAEd,WACI;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA,MACN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,0BAA0B,cACvB,YAAa,kBAAkB,KAAA,IAAY,KAAA,IAAY,GAAA,MAAoB,cAAc,IAAK,eACrG,CAAC,WAAW,aAAa,CAC3B;CAEA,MAAM,eAAe,YACnB,OAAO,WAAgB;EACrB,MAAM,WAAW,aAAa,QAAQ,SAAS,CAAC;CAClD,GACA,CAAC,UAAU,SAAS,CACtB;CAEA,IAAI,CAAC,gBAAgB;EACnB,QAAQ,MAAM,sBAAsB;EACpC,OAAO;CACT;CAEA,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;EAChC,UAAA,oBAAC,UAAD;GACE,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,eAAe;GACf,WAAW;IAAE;IAAW,YAAY;GAAK;GAC3B;GACd,YAAA;GACU;GAET;EACO,CAAA;CACe,CAAA;AAE/B"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_lib_form_utils = require("./utils.cjs.js");
3
2
  const require_lib_form_zod_provider_compat = require("./zod-provider/compat.cjs.js");
3
+ const require_lib_form_utils = require("./utils.cjs.js");
4
4
  const require_lib_form_zod_provider_field_type_inference = require("./zod-provider/field-type-inference.cjs.js");
5
5
  // src/lib/form/json-draft.ts
6
6
  /** Parses the text of a JSON view, with an error ready to show under the editor. */
@@ -1,5 +1,5 @@
1
- import { isPlainObject } from "./utils.es.js";
2
1
  import { getBaseSchema } from "./zod-provider/compat.es.js";
2
+ import { isPlainObject } from "./utils.es.js";
3
3
  import { inferFieldType } from "./zod-provider/field-type-inference.es.js";
4
4
  // src/lib/form/json-draft.ts
5
5
  /** Parses the text of a JSON view, with an error ready to show under the editor. */
@@ -22,6 +22,13 @@ function isOptional(schema) {
22
22
  return false;
23
23
  }
24
24
  /**
25
+ * Use `schema` as an object property that may be left out whenever the schema accepts `undefined`.
26
+ * zod v3 did this implicitly; zod v4 still requires the key for schemas like `z.any()`.
27
+ */
28
+ function asObjectProperty(schema) {
29
+ return isOptional(schema) ? schema.optional() : schema;
30
+ }
31
+ /**
25
32
  * Get the shape of an object schema (works for both v3 and v4).
26
33
  * v3: schema.shape (getter) or schema._def.shape()
27
34
  * v4: schema.shape (getter) or schema._zod.def.shape
@@ -172,6 +179,7 @@ function isIntersectionSchema(schema) {
172
179
  const def = getDef(schema);
173
180
  return def?.typeName === "ZodIntersection" || def?.type === "intersection" || schema?.constructor?.name?.slice(1) === "ZodIntersection";
174
181
  }
182
+ exports.asObjectProperty = asObjectProperty;
175
183
  exports.getArrayElement = getArrayElement;
176
184
  exports.getBaseSchema = getBaseSchema;
177
185
  exports.getDef = getDef;
@@ -1 +1 @@
1
- {"version":3,"file":"compat.cjs.js","names":[],"sources":["../../../../src/lib/form/zod-provider/compat.ts"],"sourcesContent":["/**\n * Zod v3/v4 compatibility layer.\n *\n * Zod v3 stores schema internals in `schema._def`.\n * Zod v4 stores schema internals in `schema._zod.def`.\n *\n * This module provides helpers that work with both versions.\n */\n\ntype AnySchema = any;\n\nexport function isV4(schema: AnySchema): boolean {\n return schema != null && typeof schema === 'object' && '_zod' in schema;\n}\n\n/**\n * Get the internal definition object for a schema, regardless of Zod version.\n * v3: schema._def\n * v4: schema._zod.def\n */\nexport function getDef(schema: AnySchema): any {\n if (schema == null || typeof schema !== 'object') {\n return undefined;\n }\n if (isV4(schema)) {\n return schema._zod.def;\n }\n return schema._def;\n}\n\n/**\n * Check if a schema is optional (works for both v3 and v4).\n */\nexport function isOptional(schema: AnySchema): boolean {\n if (typeof schema.isOptional === 'function') {\n return schema.isOptional();\n }\n if (typeof schema.safeParse === 'function') {\n return schema.safeParse(undefined).success;\n }\n return false;\n}\n\n/**\n * Get the shape of an object schema (works for both v3 and v4).\n * v3: schema.shape (getter) or schema._def.shape()\n * v4: schema.shape (getter) or schema._zod.def.shape\n */\nexport function getShape(schema: AnySchema): Record<string, AnySchema> | undefined {\n if (schema.shape && typeof schema.shape === 'object') {\n return schema.shape;\n }\n const def = getDef(schema);\n if (def?.shape) {\n return typeof def.shape === 'function' ? def.shape() : def.shape;\n }\n return undefined;\n}\n\n/**\n * Unwrap to the base schema, stripping wrappers like ZodOptional, ZodDefault, ZodEffects, etc.\n * Works for both v3 (_def.innerType, _def.schema) and v4 (_zod.def.innerType, _zod.def.schema).\n */\nexport function getBaseSchema(schema: AnySchema): AnySchema {\n const def = getDef(schema);\n if (!def) return schema;\n if ('innerType' in def) {\n return getBaseSchema(def.innerType);\n }\n if ('schema' in def) {\n return getBaseSchema(def.schema);\n }\n return schema;\n}\n\n/**\n * Get enum entries/values from a schema.\n * v3: schema._def.values (array or object)\n * v4: schema._zod.def.entries (array or object)\n */\nexport function getEnumValues(schema: AnySchema): any[] | Record<string, any> | undefined {\n const def = getDef(schema);\n // v4 uses \"entries\" for enums\n if (def?.entries) return def.entries;\n // v3 uses \"values\" for enums\n if (def?.values) return def.values;\n return undefined;\n}\n\n/**\n * Get array element schema.\n * v3: schema._def.type\n * v4: schema._zod.def.element\n */\nexport function getArrayElement(schema: AnySchema): AnySchema | undefined {\n const def = getDef(schema);\n return def?.element ?? def?.type;\n}\n\n/**\n * Get the value schema of a ZodRecord.\n * v3: schema._def.valueType\n * v4: schema._zod.def.valueType\n */\nexport function getRecordValueSchema(schema: AnySchema): AnySchema | undefined {\n return getDef(schema)?.valueType;\n}\n\n/**\n * Get literal value(s) from a ZodLiteral schema.\n * v3: schema._def.value (single value)\n * v4: schema._zod.def.values (array or single value)\n */\nexport function getLiteralValue(schema: AnySchema): any {\n const def = getDef(schema);\n // v4: values (may be array)\n if (def?.values !== undefined) {\n return Array.isArray(def.values) ? def.values[0] : def.values;\n }\n // v3: value (single)\n if (def?.value !== undefined) {\n return def.value;\n }\n return undefined;\n}\n\n/**\n * Get literal values array from a ZodLiteral schema (for fieldConfig customData).\n * v4: schema._zod.def.values\n * v3: schema._def.value (wrapped in array)\n */\nexport function getLiteralValues(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.values !== undefined) return def.values;\n if (def?.value !== undefined) return [def.value];\n return undefined;\n}\n\n/**\n * Get default value from a ZodDefault schema.\n * v3: schema._def.defaultValue() — it's a function\n * v4: schema._zod.def.defaultValue — it's a direct value\n */\nexport function getDefaultValue(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.defaultValue !== undefined) {\n return typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n return undefined;\n}\n\n/**\n * Get union options from a ZodUnion or ZodDiscriminatedUnion schema.\n * v3: schema._def.options\n * v4: schema._zod.def.options\n */\nexport function getUnionOptions(schema: AnySchema): AnySchema[] | undefined {\n const def = getDef(schema);\n return def?.options;\n}\n\n/**\n * Get intersection left/right from a ZodIntersection schema.\n * v3: schema._def.left, schema._def.right\n * v4: schema._zod.def.left, schema._zod.def.right\n */\nexport function getIntersection(schema: AnySchema): { left: AnySchema; right: AnySchema } | undefined {\n const def = getDef(schema);\n if (def?.left && def?.right) {\n return { left: def.left, right: def.right };\n }\n // v4 also exposes schema.def directly\n if (schema.def?.left && schema.def?.right) {\n return { left: schema.def.left, right: schema.def.right };\n }\n return undefined;\n}\n\n/**\n * Get string checks from a ZodString schema.\n * v3: schema._def.checks (array of { kind, ... })\n * v4: schema._zod.def.checks (array of check schemas with _zod.def.check and _zod.def.format)\n */\nexport function getStringChecks(schema: AnySchema): any[] {\n const def = getDef(schema);\n return def?.checks ?? [];\n}\n\n/**\n * Check if a string schema has a datetime check.\n * v3: check.kind === 'datetime'\n * v4: check._zod.def.check === 'string_format' && check._zod.def.format === 'datetime'\n */\nexport function hasDateTimeCheck(checks: any[]): boolean {\n return checks.some(check => {\n // v4 format\n if (isV4(check)) {\n const checkDef = getDef(check);\n return checkDef?.check === 'string_format' && checkDef?.format === 'datetime';\n }\n // v3 format\n return check.kind === 'datetime';\n });\n}\n\n/**\n * Detect if a schema is a ZodObject-like (either v3 or v4).\n */\nexport function isObjectSchema(schema: AnySchema): boolean {\n return getShape(schema) !== undefined && !isIntersectionSchema(schema);\n}\n\n/**\n * Detect if a schema is a ZodDefault (either v3 or v4).\n */\nexport function isDefaultSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return def?.typeName === 'ZodDefault' || def?.type === 'default' || getDefaultValue(schema) !== undefined;\n}\n\n/**\n * Detect if a schema is a ZodLiteral (either v3 or v4).\n */\nexport function isLiteralSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodLiteral' || def?.type === 'literal' || schema?.constructor?.name?.slice(1) === 'ZodLiteral'\n );\n}\n\n/**\n * Detect if a schema is a ZodIntersection (either v3 or v4).\n */\nexport function isIntersectionSchema(schema: AnySchema): boolean {\n const intersection = getIntersection(schema);\n if (!intersection) return false;\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodIntersection' ||\n def?.type === 'intersection' ||\n schema?.constructor?.name?.slice(1) === 'ZodIntersection'\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"compat.cjs.js","names":[],"sources":["../../../../src/lib/form/zod-provider/compat.ts"],"sourcesContent":["/**\n * Zod v3/v4 compatibility layer.\n *\n * Zod v3 stores schema internals in `schema._def`.\n * Zod v4 stores schema internals in `schema._zod.def`.\n *\n * This module provides helpers that work with both versions.\n */\n\ntype AnySchema = any;\n\nexport function isV4(schema: AnySchema): boolean {\n return schema != null && typeof schema === 'object' && '_zod' in schema;\n}\n\n/**\n * Get the internal definition object for a schema, regardless of Zod version.\n * v3: schema._def\n * v4: schema._zod.def\n */\nexport function getDef(schema: AnySchema): any {\n if (schema == null || typeof schema !== 'object') {\n return undefined;\n }\n if (isV4(schema)) {\n return schema._zod.def;\n }\n return schema._def;\n}\n\n/**\n * Check if a schema is optional (works for both v3 and v4).\n */\nexport function isOptional(schema: AnySchema): boolean {\n if (typeof schema.isOptional === 'function') {\n return schema.isOptional();\n }\n if (typeof schema.safeParse === 'function') {\n return schema.safeParse(undefined).success;\n }\n return false;\n}\n\n/**\n * Use `schema` as an object property that may be left out whenever the schema accepts `undefined`.\n * zod v3 did this implicitly; zod v4 still requires the key for schemas like `z.any()`.\n */\nexport function asObjectProperty(schema: AnySchema): AnySchema {\n return isOptional(schema) ? schema.optional() : schema;\n}\n\n/**\n * Get the shape of an object schema (works for both v3 and v4).\n * v3: schema.shape (getter) or schema._def.shape()\n * v4: schema.shape (getter) or schema._zod.def.shape\n */\nexport function getShape(schema: AnySchema): Record<string, AnySchema> | undefined {\n if (schema.shape && typeof schema.shape === 'object') {\n return schema.shape;\n }\n const def = getDef(schema);\n if (def?.shape) {\n return typeof def.shape === 'function' ? def.shape() : def.shape;\n }\n return undefined;\n}\n\n/**\n * Unwrap to the base schema, stripping wrappers like ZodOptional, ZodDefault, ZodEffects, etc.\n * Works for both v3 (_def.innerType, _def.schema) and v4 (_zod.def.innerType, _zod.def.schema).\n */\nexport function getBaseSchema(schema: AnySchema): AnySchema {\n const def = getDef(schema);\n if (!def) return schema;\n if ('innerType' in def) {\n return getBaseSchema(def.innerType);\n }\n if ('schema' in def) {\n return getBaseSchema(def.schema);\n }\n return schema;\n}\n\n/**\n * Get enum entries/values from a schema.\n * v3: schema._def.values (array or object)\n * v4: schema._zod.def.entries (array or object)\n */\nexport function getEnumValues(schema: AnySchema): any[] | Record<string, any> | undefined {\n const def = getDef(schema);\n // v4 uses \"entries\" for enums\n if (def?.entries) return def.entries;\n // v3 uses \"values\" for enums\n if (def?.values) return def.values;\n return undefined;\n}\n\n/**\n * Get array element schema.\n * v3: schema._def.type\n * v4: schema._zod.def.element\n */\nexport function getArrayElement(schema: AnySchema): AnySchema | undefined {\n const def = getDef(schema);\n return def?.element ?? def?.type;\n}\n\n/**\n * Get the value schema of a ZodRecord.\n * v3: schema._def.valueType\n * v4: schema._zod.def.valueType\n */\nexport function getRecordValueSchema(schema: AnySchema): AnySchema | undefined {\n return getDef(schema)?.valueType;\n}\n\n/**\n * Get literal value(s) from a ZodLiteral schema.\n * v3: schema._def.value (single value)\n * v4: schema._zod.def.values (array or single value)\n */\nexport function getLiteralValue(schema: AnySchema): any {\n const def = getDef(schema);\n // v4: values (may be array)\n if (def?.values !== undefined) {\n return Array.isArray(def.values) ? def.values[0] : def.values;\n }\n // v3: value (single)\n if (def?.value !== undefined) {\n return def.value;\n }\n return undefined;\n}\n\n/**\n * Get literal values array from a ZodLiteral schema (for fieldConfig customData).\n * v4: schema._zod.def.values\n * v3: schema._def.value (wrapped in array)\n */\nexport function getLiteralValues(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.values !== undefined) return def.values;\n if (def?.value !== undefined) return [def.value];\n return undefined;\n}\n\n/**\n * Get default value from a ZodDefault schema.\n * v3: schema._def.defaultValue() — it's a function\n * v4: schema._zod.def.defaultValue — it's a direct value\n */\nexport function getDefaultValue(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.defaultValue !== undefined) {\n return typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n return undefined;\n}\n\n/**\n * Get union options from a ZodUnion or ZodDiscriminatedUnion schema.\n * v3: schema._def.options\n * v4: schema._zod.def.options\n */\nexport function getUnionOptions(schema: AnySchema): AnySchema[] | undefined {\n const def = getDef(schema);\n return def?.options;\n}\n\n/**\n * Get intersection left/right from a ZodIntersection schema.\n * v3: schema._def.left, schema._def.right\n * v4: schema._zod.def.left, schema._zod.def.right\n */\nexport function getIntersection(schema: AnySchema): { left: AnySchema; right: AnySchema } | undefined {\n const def = getDef(schema);\n if (def?.left && def?.right) {\n return { left: def.left, right: def.right };\n }\n // v4 also exposes schema.def directly\n if (schema.def?.left && schema.def?.right) {\n return { left: schema.def.left, right: schema.def.right };\n }\n return undefined;\n}\n\n/**\n * Get string checks from a ZodString schema.\n * v3: schema._def.checks (array of { kind, ... })\n * v4: schema._zod.def.checks (array of check schemas with _zod.def.check and _zod.def.format)\n */\nexport function getStringChecks(schema: AnySchema): any[] {\n const def = getDef(schema);\n return def?.checks ?? [];\n}\n\n/**\n * Check if a string schema has a datetime check.\n * v3: check.kind === 'datetime'\n * v4: check._zod.def.check === 'string_format' && check._zod.def.format === 'datetime'\n */\nexport function hasDateTimeCheck(checks: any[]): boolean {\n return checks.some(check => {\n // v4 format\n if (isV4(check)) {\n const checkDef = getDef(check);\n return checkDef?.check === 'string_format' && checkDef?.format === 'datetime';\n }\n // v3 format\n return check.kind === 'datetime';\n });\n}\n\n/**\n * Detect if a schema is a ZodObject-like (either v3 or v4).\n */\nexport function isObjectSchema(schema: AnySchema): boolean {\n return getShape(schema) !== undefined && !isIntersectionSchema(schema);\n}\n\n/**\n * Detect if a schema is a ZodDefault (either v3 or v4).\n */\nexport function isDefaultSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return def?.typeName === 'ZodDefault' || def?.type === 'default' || getDefaultValue(schema) !== undefined;\n}\n\n/**\n * Detect if a schema is a ZodLiteral (either v3 or v4).\n */\nexport function isLiteralSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodLiteral' || def?.type === 'literal' || schema?.constructor?.name?.slice(1) === 'ZodLiteral'\n );\n}\n\n/**\n * Detect if a schema is a ZodIntersection (either v3 or v4).\n */\nexport function isIntersectionSchema(schema: AnySchema): boolean {\n const intersection = getIntersection(schema);\n if (!intersection) return false;\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodIntersection' ||\n def?.type === 'intersection' ||\n schema?.constructor?.name?.slice(1) === 'ZodIntersection'\n );\n}\n"],"mappings":"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"}
@@ -21,6 +21,13 @@ function isOptional(schema) {
21
21
  return false;
22
22
  }
23
23
  /**
24
+ * Use `schema` as an object property that may be left out whenever the schema accepts `undefined`.
25
+ * zod v3 did this implicitly; zod v4 still requires the key for schemas like `z.any()`.
26
+ */
27
+ function asObjectProperty(schema) {
28
+ return isOptional(schema) ? schema.optional() : schema;
29
+ }
30
+ /**
24
31
  * Get the shape of an object schema (works for both v3 and v4).
25
32
  * v3: schema.shape (getter) or schema._def.shape()
26
33
  * v4: schema.shape (getter) or schema._zod.def.shape
@@ -171,6 +178,6 @@ function isIntersectionSchema(schema) {
171
178
  const def = getDef(schema);
172
179
  return def?.typeName === "ZodIntersection" || def?.type === "intersection" || schema?.constructor?.name?.slice(1) === "ZodIntersection";
173
180
  }
174
- export { getArrayElement, getBaseSchema, getDef, getDefaultValue, getEnumValues, getIntersection, getLiteralValue, getLiteralValues, getRecordValueSchema, getShape, getStringChecks, getUnionOptions, hasDateTimeCheck, isDefaultSchema, isIntersectionSchema, isLiteralSchema, isObjectSchema, isOptional, isV4 };
181
+ export { asObjectProperty, getArrayElement, getBaseSchema, getDef, getDefaultValue, getEnumValues, getIntersection, getLiteralValue, getLiteralValues, getRecordValueSchema, getShape, getStringChecks, getUnionOptions, hasDateTimeCheck, isDefaultSchema, isIntersectionSchema, isLiteralSchema, isObjectSchema, isOptional, isV4 };
175
182
 
176
183
  //# sourceMappingURL=compat.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compat.es.js","names":[],"sources":["../../../../src/lib/form/zod-provider/compat.ts"],"sourcesContent":["/**\n * Zod v3/v4 compatibility layer.\n *\n * Zod v3 stores schema internals in `schema._def`.\n * Zod v4 stores schema internals in `schema._zod.def`.\n *\n * This module provides helpers that work with both versions.\n */\n\ntype AnySchema = any;\n\nexport function isV4(schema: AnySchema): boolean {\n return schema != null && typeof schema === 'object' && '_zod' in schema;\n}\n\n/**\n * Get the internal definition object for a schema, regardless of Zod version.\n * v3: schema._def\n * v4: schema._zod.def\n */\nexport function getDef(schema: AnySchema): any {\n if (schema == null || typeof schema !== 'object') {\n return undefined;\n }\n if (isV4(schema)) {\n return schema._zod.def;\n }\n return schema._def;\n}\n\n/**\n * Check if a schema is optional (works for both v3 and v4).\n */\nexport function isOptional(schema: AnySchema): boolean {\n if (typeof schema.isOptional === 'function') {\n return schema.isOptional();\n }\n if (typeof schema.safeParse === 'function') {\n return schema.safeParse(undefined).success;\n }\n return false;\n}\n\n/**\n * Get the shape of an object schema (works for both v3 and v4).\n * v3: schema.shape (getter) or schema._def.shape()\n * v4: schema.shape (getter) or schema._zod.def.shape\n */\nexport function getShape(schema: AnySchema): Record<string, AnySchema> | undefined {\n if (schema.shape && typeof schema.shape === 'object') {\n return schema.shape;\n }\n const def = getDef(schema);\n if (def?.shape) {\n return typeof def.shape === 'function' ? def.shape() : def.shape;\n }\n return undefined;\n}\n\n/**\n * Unwrap to the base schema, stripping wrappers like ZodOptional, ZodDefault, ZodEffects, etc.\n * Works for both v3 (_def.innerType, _def.schema) and v4 (_zod.def.innerType, _zod.def.schema).\n */\nexport function getBaseSchema(schema: AnySchema): AnySchema {\n const def = getDef(schema);\n if (!def) return schema;\n if ('innerType' in def) {\n return getBaseSchema(def.innerType);\n }\n if ('schema' in def) {\n return getBaseSchema(def.schema);\n }\n return schema;\n}\n\n/**\n * Get enum entries/values from a schema.\n * v3: schema._def.values (array or object)\n * v4: schema._zod.def.entries (array or object)\n */\nexport function getEnumValues(schema: AnySchema): any[] | Record<string, any> | undefined {\n const def = getDef(schema);\n // v4 uses \"entries\" for enums\n if (def?.entries) return def.entries;\n // v3 uses \"values\" for enums\n if (def?.values) return def.values;\n return undefined;\n}\n\n/**\n * Get array element schema.\n * v3: schema._def.type\n * v4: schema._zod.def.element\n */\nexport function getArrayElement(schema: AnySchema): AnySchema | undefined {\n const def = getDef(schema);\n return def?.element ?? def?.type;\n}\n\n/**\n * Get the value schema of a ZodRecord.\n * v3: schema._def.valueType\n * v4: schema._zod.def.valueType\n */\nexport function getRecordValueSchema(schema: AnySchema): AnySchema | undefined {\n return getDef(schema)?.valueType;\n}\n\n/**\n * Get literal value(s) from a ZodLiteral schema.\n * v3: schema._def.value (single value)\n * v4: schema._zod.def.values (array or single value)\n */\nexport function getLiteralValue(schema: AnySchema): any {\n const def = getDef(schema);\n // v4: values (may be array)\n if (def?.values !== undefined) {\n return Array.isArray(def.values) ? def.values[0] : def.values;\n }\n // v3: value (single)\n if (def?.value !== undefined) {\n return def.value;\n }\n return undefined;\n}\n\n/**\n * Get literal values array from a ZodLiteral schema (for fieldConfig customData).\n * v4: schema._zod.def.values\n * v3: schema._def.value (wrapped in array)\n */\nexport function getLiteralValues(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.values !== undefined) return def.values;\n if (def?.value !== undefined) return [def.value];\n return undefined;\n}\n\n/**\n * Get default value from a ZodDefault schema.\n * v3: schema._def.defaultValue() — it's a function\n * v4: schema._zod.def.defaultValue — it's a direct value\n */\nexport function getDefaultValue(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.defaultValue !== undefined) {\n return typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n return undefined;\n}\n\n/**\n * Get union options from a ZodUnion or ZodDiscriminatedUnion schema.\n * v3: schema._def.options\n * v4: schema._zod.def.options\n */\nexport function getUnionOptions(schema: AnySchema): AnySchema[] | undefined {\n const def = getDef(schema);\n return def?.options;\n}\n\n/**\n * Get intersection left/right from a ZodIntersection schema.\n * v3: schema._def.left, schema._def.right\n * v4: schema._zod.def.left, schema._zod.def.right\n */\nexport function getIntersection(schema: AnySchema): { left: AnySchema; right: AnySchema } | undefined {\n const def = getDef(schema);\n if (def?.left && def?.right) {\n return { left: def.left, right: def.right };\n }\n // v4 also exposes schema.def directly\n if (schema.def?.left && schema.def?.right) {\n return { left: schema.def.left, right: schema.def.right };\n }\n return undefined;\n}\n\n/**\n * Get string checks from a ZodString schema.\n * v3: schema._def.checks (array of { kind, ... })\n * v4: schema._zod.def.checks (array of check schemas with _zod.def.check and _zod.def.format)\n */\nexport function getStringChecks(schema: AnySchema): any[] {\n const def = getDef(schema);\n return def?.checks ?? [];\n}\n\n/**\n * Check if a string schema has a datetime check.\n * v3: check.kind === 'datetime'\n * v4: check._zod.def.check === 'string_format' && check._zod.def.format === 'datetime'\n */\nexport function hasDateTimeCheck(checks: any[]): boolean {\n return checks.some(check => {\n // v4 format\n if (isV4(check)) {\n const checkDef = getDef(check);\n return checkDef?.check === 'string_format' && checkDef?.format === 'datetime';\n }\n // v3 format\n return check.kind === 'datetime';\n });\n}\n\n/**\n * Detect if a schema is a ZodObject-like (either v3 or v4).\n */\nexport function isObjectSchema(schema: AnySchema): boolean {\n return getShape(schema) !== undefined && !isIntersectionSchema(schema);\n}\n\n/**\n * Detect if a schema is a ZodDefault (either v3 or v4).\n */\nexport function isDefaultSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return def?.typeName === 'ZodDefault' || def?.type === 'default' || getDefaultValue(schema) !== undefined;\n}\n\n/**\n * Detect if a schema is a ZodLiteral (either v3 or v4).\n */\nexport function isLiteralSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodLiteral' || def?.type === 'literal' || schema?.constructor?.name?.slice(1) === 'ZodLiteral'\n );\n}\n\n/**\n * Detect if a schema is a ZodIntersection (either v3 or v4).\n */\nexport function isIntersectionSchema(schema: AnySchema): boolean {\n const intersection = getIntersection(schema);\n if (!intersection) return false;\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodIntersection' ||\n def?.type === 'intersection' ||\n schema?.constructor?.name?.slice(1) === 'ZodIntersection'\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"compat.es.js","names":[],"sources":["../../../../src/lib/form/zod-provider/compat.ts"],"sourcesContent":["/**\n * Zod v3/v4 compatibility layer.\n *\n * Zod v3 stores schema internals in `schema._def`.\n * Zod v4 stores schema internals in `schema._zod.def`.\n *\n * This module provides helpers that work with both versions.\n */\n\ntype AnySchema = any;\n\nexport function isV4(schema: AnySchema): boolean {\n return schema != null && typeof schema === 'object' && '_zod' in schema;\n}\n\n/**\n * Get the internal definition object for a schema, regardless of Zod version.\n * v3: schema._def\n * v4: schema._zod.def\n */\nexport function getDef(schema: AnySchema): any {\n if (schema == null || typeof schema !== 'object') {\n return undefined;\n }\n if (isV4(schema)) {\n return schema._zod.def;\n }\n return schema._def;\n}\n\n/**\n * Check if a schema is optional (works for both v3 and v4).\n */\nexport function isOptional(schema: AnySchema): boolean {\n if (typeof schema.isOptional === 'function') {\n return schema.isOptional();\n }\n if (typeof schema.safeParse === 'function') {\n return schema.safeParse(undefined).success;\n }\n return false;\n}\n\n/**\n * Use `schema` as an object property that may be left out whenever the schema accepts `undefined`.\n * zod v3 did this implicitly; zod v4 still requires the key for schemas like `z.any()`.\n */\nexport function asObjectProperty(schema: AnySchema): AnySchema {\n return isOptional(schema) ? schema.optional() : schema;\n}\n\n/**\n * Get the shape of an object schema (works for both v3 and v4).\n * v3: schema.shape (getter) or schema._def.shape()\n * v4: schema.shape (getter) or schema._zod.def.shape\n */\nexport function getShape(schema: AnySchema): Record<string, AnySchema> | undefined {\n if (schema.shape && typeof schema.shape === 'object') {\n return schema.shape;\n }\n const def = getDef(schema);\n if (def?.shape) {\n return typeof def.shape === 'function' ? def.shape() : def.shape;\n }\n return undefined;\n}\n\n/**\n * Unwrap to the base schema, stripping wrappers like ZodOptional, ZodDefault, ZodEffects, etc.\n * Works for both v3 (_def.innerType, _def.schema) and v4 (_zod.def.innerType, _zod.def.schema).\n */\nexport function getBaseSchema(schema: AnySchema): AnySchema {\n const def = getDef(schema);\n if (!def) return schema;\n if ('innerType' in def) {\n return getBaseSchema(def.innerType);\n }\n if ('schema' in def) {\n return getBaseSchema(def.schema);\n }\n return schema;\n}\n\n/**\n * Get enum entries/values from a schema.\n * v3: schema._def.values (array or object)\n * v4: schema._zod.def.entries (array or object)\n */\nexport function getEnumValues(schema: AnySchema): any[] | Record<string, any> | undefined {\n const def = getDef(schema);\n // v4 uses \"entries\" for enums\n if (def?.entries) return def.entries;\n // v3 uses \"values\" for enums\n if (def?.values) return def.values;\n return undefined;\n}\n\n/**\n * Get array element schema.\n * v3: schema._def.type\n * v4: schema._zod.def.element\n */\nexport function getArrayElement(schema: AnySchema): AnySchema | undefined {\n const def = getDef(schema);\n return def?.element ?? def?.type;\n}\n\n/**\n * Get the value schema of a ZodRecord.\n * v3: schema._def.valueType\n * v4: schema._zod.def.valueType\n */\nexport function getRecordValueSchema(schema: AnySchema): AnySchema | undefined {\n return getDef(schema)?.valueType;\n}\n\n/**\n * Get literal value(s) from a ZodLiteral schema.\n * v3: schema._def.value (single value)\n * v4: schema._zod.def.values (array or single value)\n */\nexport function getLiteralValue(schema: AnySchema): any {\n const def = getDef(schema);\n // v4: values (may be array)\n if (def?.values !== undefined) {\n return Array.isArray(def.values) ? def.values[0] : def.values;\n }\n // v3: value (single)\n if (def?.value !== undefined) {\n return def.value;\n }\n return undefined;\n}\n\n/**\n * Get literal values array from a ZodLiteral schema (for fieldConfig customData).\n * v4: schema._zod.def.values\n * v3: schema._def.value (wrapped in array)\n */\nexport function getLiteralValues(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.values !== undefined) return def.values;\n if (def?.value !== undefined) return [def.value];\n return undefined;\n}\n\n/**\n * Get default value from a ZodDefault schema.\n * v3: schema._def.defaultValue() — it's a function\n * v4: schema._zod.def.defaultValue — it's a direct value\n */\nexport function getDefaultValue(schema: AnySchema): any {\n const def = getDef(schema);\n if (def?.defaultValue !== undefined) {\n return typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n return undefined;\n}\n\n/**\n * Get union options from a ZodUnion or ZodDiscriminatedUnion schema.\n * v3: schema._def.options\n * v4: schema._zod.def.options\n */\nexport function getUnionOptions(schema: AnySchema): AnySchema[] | undefined {\n const def = getDef(schema);\n return def?.options;\n}\n\n/**\n * Get intersection left/right from a ZodIntersection schema.\n * v3: schema._def.left, schema._def.right\n * v4: schema._zod.def.left, schema._zod.def.right\n */\nexport function getIntersection(schema: AnySchema): { left: AnySchema; right: AnySchema } | undefined {\n const def = getDef(schema);\n if (def?.left && def?.right) {\n return { left: def.left, right: def.right };\n }\n // v4 also exposes schema.def directly\n if (schema.def?.left && schema.def?.right) {\n return { left: schema.def.left, right: schema.def.right };\n }\n return undefined;\n}\n\n/**\n * Get string checks from a ZodString schema.\n * v3: schema._def.checks (array of { kind, ... })\n * v4: schema._zod.def.checks (array of check schemas with _zod.def.check and _zod.def.format)\n */\nexport function getStringChecks(schema: AnySchema): any[] {\n const def = getDef(schema);\n return def?.checks ?? [];\n}\n\n/**\n * Check if a string schema has a datetime check.\n * v3: check.kind === 'datetime'\n * v4: check._zod.def.check === 'string_format' && check._zod.def.format === 'datetime'\n */\nexport function hasDateTimeCheck(checks: any[]): boolean {\n return checks.some(check => {\n // v4 format\n if (isV4(check)) {\n const checkDef = getDef(check);\n return checkDef?.check === 'string_format' && checkDef?.format === 'datetime';\n }\n // v3 format\n return check.kind === 'datetime';\n });\n}\n\n/**\n * Detect if a schema is a ZodObject-like (either v3 or v4).\n */\nexport function isObjectSchema(schema: AnySchema): boolean {\n return getShape(schema) !== undefined && !isIntersectionSchema(schema);\n}\n\n/**\n * Detect if a schema is a ZodDefault (either v3 or v4).\n */\nexport function isDefaultSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return def?.typeName === 'ZodDefault' || def?.type === 'default' || getDefaultValue(schema) !== undefined;\n}\n\n/**\n * Detect if a schema is a ZodLiteral (either v3 or v4).\n */\nexport function isLiteralSchema(schema: AnySchema): boolean {\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodLiteral' || def?.type === 'literal' || schema?.constructor?.name?.slice(1) === 'ZodLiteral'\n );\n}\n\n/**\n * Detect if a schema is a ZodIntersection (either v3 or v4).\n */\nexport function isIntersectionSchema(schema: AnySchema): boolean {\n const intersection = getIntersection(schema);\n if (!intersection) return false;\n const def = getDef(schema);\n return (\n def?.typeName === 'ZodIntersection' ||\n def?.type === 'intersection' ||\n schema?.constructor?.name?.slice(1) === 'ZodIntersection'\n );\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_lib_form_utils = require("./utils.cjs.js");
3
2
  const require_lib_form_zod_provider_compat = require("./zod-provider/compat.cjs.js");
3
+ const require_lib_form_utils = require("./utils.cjs.js");
4
4
  const require_lib_form_zod_provider_default_values = require("./zod-provider/default-values.cjs.js");
5
5
  const require_lib_form_zod_provider_field_type_inference = require("./zod-provider/field-type-inference.cjs.js");
6
6
  // src/lib/form/zod-provider/index.ts
@@ -1,5 +1,5 @@
1
- import { isPlainObject } from "./utils.es.js";
2
1
  import { getArrayElement, getBaseSchema, getDef, getEnumValues, getIntersection, getLiteralValues, getRecordValueSchema, getShape, getUnionOptions, isOptional } from "./zod-provider/compat.es.js";
2
+ import { isPlainObject } from "./utils.es.js";
3
3
  import { getDefaultValueInZodStack, getDefaultValues } from "./zod-provider/default-values.es.js";
4
4
  import { inferFieldType } from "./zod-provider/field-type-inference.es.js";
5
5
  // src/lib/form/zod-provider/index.ts
@@ -20,7 +20,7 @@ var DEFAULT_ITEM_VALUE = "";
20
20
  * actions, and save / reset once the page differs from the view. Driven by the same controller
21
21
  * as `SavedViewTabs`.
22
22
  */
23
- function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, canEdit = () => true, "aria-label": ariaLabel = "Views", className }) {
23
+ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, canEdit = () => true, canCreate = true, "aria-label": ariaLabel = "Views", className }) {
24
24
  const anchorRef = (0, react.useRef)(null);
25
25
  const [renaming, setRenaming] = (0, react.useState)(false);
26
26
  const { draft, activeView } = views;
@@ -101,7 +101,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
101
101
  } })
102
102
  ]
103
103
  })]
104
- }), activeView && !creating && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_dropdown_menu.DropdownMenu.Trigger, {
104
+ }), activeView && !creating && (editable || canCreate) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_dropdown_menu.DropdownMenu.Trigger, {
105
105
  variant: "ghost",
106
106
  size: "icon-sm",
107
107
  tooltip: "View actions",
@@ -114,7 +114,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
114
114
  onClick: () => setRenaming(true),
115
115
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.TextCursorInputIcon, { "aria-hidden": true }), "Rename"]
116
116
  }),
117
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Item, {
117
+ canCreate && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Item, {
118
118
  onClick: () => views.duplicate(activeView.id),
119
119
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.CopyIcon, { "aria-hidden": true }), "Duplicate"]
120
120
  }),
@@ -126,7 +126,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
126
126
  ]
127
127
  })] })]
128
128
  }),
129
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_popover.Popover, {
129
+ canCreate && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_popover.Popover, {
130
130
  open: creating,
131
131
  onOpenChange: (open) => {
132
132
  if (open) views.create(newViewSettings);
@@ -265,13 +265,14 @@ function ObservabilitySavedViews(props) {
265
265
  ...context
266
266
  });
267
267
  }
268
- function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, defaultDatePreset, className, source, queryKeyScope, canEdit }) {
268
+ function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, defaultDatePreset, className, source, queryKeyScope, canEdit, canCreate = true }) {
269
269
  const headerSlot = require_domains_observability_components_observability_header_slot.useObservabilityHeaderSlot();
270
270
  const views = require_domains_observability_saved_views_use_hosted_saved_views.useHostedSavedViews({
271
271
  page,
272
272
  source,
273
273
  queryKeyScope,
274
274
  canEdit,
275
+ canCreate,
275
276
  searchParams,
276
277
  setSearchParams,
277
278
  columns,
@@ -288,6 +289,7 @@ function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, def
288
289
  } },
289
290
  describeView: (view) => view.settings.record?.scope === "org" ? "Shared" : void 0,
290
291
  canEdit: (view) => !canEdit || !view.settings.record || canEdit(view.settings.record),
292
+ canCreate,
291
293
  className
292
294
  });
293
295
  return headerSlot ? (0, react_dom.createPortal)(picker, headerSlot) : picker;
@@ -299,4 +301,4 @@ Object.defineProperty(exports, "ObservabilitySavedViews", {
299
301
  }
300
302
  });
301
303
 
302
- //# sourceMappingURL=observability-saved-views-CwCii7hh.cjs.map
304
+ //# sourceMappingURL=observability-saved-views-BNU3GkK6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-saved-views-BNU3GkK6.cjs","names":["useRef","useState","cn","Txt","Button","ComboboxRoot","ComboboxTrigger","LayersIcon","ComboboxContent","ComboboxSearch","ComboboxEmpty","ComboboxList","ComboboxItem","ComboboxItemEnd","DropdownMenu","EllipsisIcon","TextCursorInputIcon","CopyIcon","_Fragment","Trash2Icon","Popover","PopoverTrigger","LayersPlusIcon","PopoverContent","Field","Input","FieldError","useSavedViewsSource","useObservabilityHeaderSlot","useHostedSavedViews","createPortal"],"sources":["../src/ds/components/SavedViews/saved-view-picker.tsx","../src/domains/observability/saved-views/observability-saved-views.tsx"],"sourcesContent":["import { CopyIcon, EllipsisIcon, LayersIcon, LayersPlusIcon, TextCursorInputIcon, Trash2Icon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { FormEvent, ReactNode, RefObject } from 'react';\nimport { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport type { SavedView } from './saved-view-schema';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport {\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxItemEnd,\n ComboboxList,\n ComboboxRoot,\n ComboboxSearch,\n ComboboxTrigger,\n} from '@/ds/components/Combobox/combobox-parts';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewPickerProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n /** Names the page's unfiltered state, e.g. \"All traces\". */\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n /** Muted text after a view in the list, e.g. \"Shared\". */\n describeView?: (view: SavedView<TSettings>) => ReactNode;\n /** Whether a view can be renamed, deleted or overwritten. Others can still be applied and duplicated. */\n canEdit?: (view: SavedView<TSettings>) => boolean;\n /** Whether new views can be saved here (save as new view, duplicate). Defaults to true. */\n canCreate?: boolean;\n 'aria-label'?: string;\n className?: string;\n};\n\ntype PickerItem = { value: string; label: string; viewId: string | undefined };\n\nconst DEFAULT_ITEM_VALUE = '';\n\n/**\n * A compact saved-views control for a page header: a searchable view picker, the active view's\n * actions, and save / reset once the page differs from the view. Driven by the same controller\n * as `SavedViewTabs`.\n */\nexport function SavedViewPicker<TSettings>({\n views,\n defaultLabel,\n newViewSettings,\n describeView,\n canEdit = () => true,\n canCreate = true,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewPickerProps<TSettings>) {\n const anchorRef = useRef<HTMLDivElement>(null);\n const [renaming, setRenaming] = useState(false);\n const { draft, activeView } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const activeUnsaved = !creating && draft?.viewId !== undefined && views.unsaved;\n const editable = activeView !== undefined && canEdit(activeView);\n\n const items: PickerItem[] = [\n { value: DEFAULT_ITEM_VALUE, label: defaultLabel, viewId: undefined },\n ...views.views.map(view => ({ value: view.id, label: view.name, viewId: view.id })),\n ];\n const selected = items.find(item => item.viewId === activeView?.id) ?? items[0];\n const viewsById = new Map(views.views.map(view => [view.id, view]));\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={cn('flex min-w-0 flex-wrap items-center justify-end gap-1.5', className)}\n >\n {views.error && !creating && !renaming && (\n <Txt role=\"alert\" variant=\"caption\" className=\"min-w-0 truncate text-destructive-foreground\">\n {views.error}\n </Txt>\n )}\n {activeUnsaved && (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" disabled={views.pending} onClick={views.discard}>\n Reset\n </Button>\n {editable && (\n <Button type=\"button\" variant=\"default\" size=\"sm\" disabled={views.pending} onClick={views.save}>\n Save changes\n </Button>\n )}\n </div>\n )}\n <div ref={anchorRef} className=\"flex min-w-0 items-center gap-0.5\">\n <ComboboxRoot\n items={items}\n value={selected}\n onValueChange={(item: PickerItem | null) => {\n if (item) views.select(item.viewId);\n }}\n isItemEqualToValue={(item: PickerItem, value: PickerItem) => item.value === value.value}\n autoHighlight\n >\n <ComboboxTrigger\n size=\"sm\"\n icon={<LayersIcon />}\n aria-label={`View: ${selected?.label}${activeUnsaved ? ', unsaved changes' : ''}`}\n className=\"max-w-60\"\n >\n {selected?.label}\n {activeUnsaved && (\n <span className=\"ml-1.5 inline-block size-1.5 rounded-full bg-warning-indicator align-middle\" />\n )}\n </ComboboxTrigger>\n <ComboboxContent align=\"end\">\n <ComboboxSearch placeholder=\"Search views…\" />\n <ComboboxEmpty>No views found.</ComboboxEmpty>\n <ComboboxList>\n {(item: PickerItem) => {\n const view = item.viewId ? viewsById.get(item.viewId) : undefined;\n return (\n <ComboboxItem key={item.value} value={item}>\n <span className=\"truncate\">{item.label}</span>\n {view && describeView && <ComboboxItemEnd>{describeView(view)}</ComboboxItemEnd>}\n </ComboboxItem>\n );\n }}\n </ComboboxList>\n </ComboboxContent>\n </ComboboxRoot>\n {activeView && !creating && (editable || canCreate) && (\n <DropdownMenu>\n <DropdownMenu.Trigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"View actions\" className=\"shrink-0\">\n <EllipsisIcon />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {editable && (\n <DropdownMenu.Item onClick={() => setRenaming(true)}>\n <TextCursorInputIcon aria-hidden />\n Rename\n </DropdownMenu.Item>\n )}\n {canCreate && (\n <DropdownMenu.Item onClick={() => views.duplicate(activeView.id)}>\n <CopyIcon aria-hidden />\n Duplicate\n </DropdownMenu.Item>\n )}\n {editable && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"destructive\" onClick={() => views.remove(activeView.id)}>\n <Trash2Icon aria-hidden />\n Delete view\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n {canCreate && (\n <Popover\n open={creating}\n onOpenChange={open => {\n if (open) views.create(newViewSettings);\n else views.discard();\n }}\n >\n <PopoverTrigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"Save as new view\" className=\"shrink-0\">\n <LayersPlusIcon />\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-72\">\n {creating && (\n <ViewNameForm\n title=\"Save as new view\"\n initialName={draft.name}\n submitLabel=\"Save view\"\n error={views.error}\n pending={views.pending}\n onNameChange={name => views.change({ name })}\n onSubmit={() => views.save()}\n onCancel={views.discard}\n />\n )}\n </PopoverContent>\n </Popover>\n )}\n {activeView && (\n <RenamePopover\n open={renaming}\n anchorRef={anchorRef}\n name={activeView.name}\n error={views.error}\n pending={views.pending}\n onClose={() => setRenaming(false)}\n onRename={name => views.rename(activeView.id, name)}\n />\n )}\n </div>\n );\n}\n\nfunction RenamePopover({\n open,\n anchorRef,\n name,\n error,\n pending,\n onClose,\n onRename,\n}: {\n open: boolean;\n anchorRef: RefObject<HTMLDivElement | null>;\n name: string;\n error: string | undefined;\n pending: boolean | undefined;\n onClose: () => void;\n onRename: (name: string) => boolean | Promise<boolean>;\n}) {\n // The name that last failed to save: its error shows until the user types something else.\n const [failedName, setFailedName] = useState<string>();\n const [typedName, setTypedName] = useState(name);\n const close = () => {\n setFailedName(undefined);\n setTypedName(name);\n onClose();\n };\n return (\n <Popover open={open} onOpenChange={next => !next && close()}>\n <PopoverContent anchor={anchorRef} align=\"end\" className=\"w-72\">\n {open && (\n <ViewNameForm\n title=\"Rename view\"\n initialName={name}\n submitLabel=\"Rename\"\n error={failedName !== undefined && failedName === typedName ? error : undefined}\n pending={pending}\n onNameChange={setTypedName}\n onSubmit={async next => {\n if (await onRename(next)) close();\n else setFailedName(next);\n }}\n onCancel={close}\n />\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ViewNameForm({\n title,\n initialName,\n submitLabel,\n error,\n pending,\n onNameChange,\n onSubmit,\n onCancel,\n}: {\n title: string;\n initialName: string;\n submitLabel: string;\n error?: string;\n pending?: boolean;\n onNameChange?: (name: string) => void;\n onSubmit: (name: string) => void | Promise<void>;\n onCancel: () => void;\n}) {\n const [name, setName] = useState(initialName);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (name.trim()) void onSubmit(name);\n };\n return (\n <form className=\"flex flex-col gap-3\" onSubmit={submit}>\n <Txt as=\"h2\" variant=\"label\">\n {title}\n </Txt>\n <Field invalid={error !== undefined}>\n <Input\n aria-label=\"View name\"\n size=\"sm\"\n autoFocus\n onFocus={event => event.currentTarget.select()}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n value={name}\n onChange={event => {\n setName(event.target.value);\n onNameChange?.(event.target.value);\n }}\n />\n <FieldError>{error}</FieldError>\n </Field>\n <div className=\"flex justify-end gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={pending || !name.trim()}>\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","import type { SavedViewPage } from '@mastra/core/storage';\nimport { createPortal } from 'react-dom';\nimport { useSavedViewsSource } from './saved-views-source';\nimport type { SavedViewsContextValue } from './saved-views-source';\nimport { useHostedSavedViews } from './use-hosted-saved-views';\nimport type { SavedViewColumnsControl } from './use-hosted-saved-views';\nimport { useObservabilityHeaderSlot } from '@/domains/observability/components/observability-header-slot';\nimport { SavedViewPicker } from '@/ds/components/SavedViews/saved-view-picker';\nimport type { SetURLSearchParamsLike } from '@/lib/sort/use-url-sort';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_LABELS: Record<SavedViewPage, string> = {\n traces: 'All traces',\n spans: 'All spans',\n threads: 'All threads',\n logs: 'All logs',\n};\n\nexport type ObservabilitySavedViewsProps = {\n page: SavedViewPage;\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n /** The page's column picker (traces, spans, threads), so views save and restore columns. */\n columns?: SavedViewColumnsControl;\n /**\n * The range the page shows when the URL names none, when the host's differs from the page's own\n * (the same value passed to `useObservabilityListFilters`).\n */\n defaultDatePreset?: string;\n className?: string;\n};\n\n/**\n * The saved views of an observability page: a searchable view picker with save and reset actions.\n * Inside the shared traces / spans / threads header it moves into that header's row. Renders nothing\n * unless a `SavedViewsProvider` above it supplies where views are stored.\n */\nexport function ObservabilitySavedViews(props: ObservabilitySavedViewsProps) {\n const context = useSavedViewsSource();\n if (!context) return null;\n return <HostedSavedViewsBar {...props} {...context} />;\n}\n\nfunction HostedSavedViewsBar({\n page,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n className,\n source,\n queryKeyScope,\n canEdit,\n canCreate = true,\n}: ObservabilitySavedViewsProps & SavedViewsContextValue) {\n const headerSlot = useObservabilityHeaderSlot();\n const views = useHostedSavedViews({\n page,\n source,\n queryKeyScope,\n canEdit,\n canCreate,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n });\n\n const picker = (\n <SavedViewPicker\n views={views}\n defaultLabel={DEFAULT_LABELS[page]}\n aria-label=\"Saved views\"\n newViewSettings={{ state: { schemaVersion: 1, page, filters: [] } }}\n describeView={view => (view.settings.record?.scope === 'org' ? 'Shared' : undefined)}\n canEdit={view => !canEdit || !view.settings.record || canEdit(view.settings.record)}\n canCreate={canCreate}\n className={className}\n />\n );\n return headerSlot ? createPortal(picker, headerSlot) : picker;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyCA,IAAM,qBAAqB;;;;;;AAO3B,SAAgB,gBAA2B,EACzC,OACA,cACA,iBACA,cACA,gBAAgB,MAChB,YAAY,MACZ,cAAc,YAAY,SAC1B,aACkC;CAClC,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAuB,IAAI;CAC7C,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAS,KAAK;CAC9C,MAAM,EAAE,OAAO,eAAe;CAC9B,MAAM,WAAW,UAAU,KAAA,KAAa,MAAM,WAAW,KAAA;CACzD,MAAM,gBAAgB,CAAC,YAAY,OAAO,WAAW,KAAA,KAAa,MAAM;CACxE,MAAM,WAAW,eAAe,KAAA,KAAa,QAAQ,UAAU;CAE/D,MAAM,QAAsB,CAC1B;EAAE,OAAO;EAAoB,OAAO;EAAc,QAAQ,KAAA;CAAU,GACpE,GAAG,MAAM,MAAM,KAAI,UAAS;EAAE,OAAO,KAAK;EAAI,OAAO,KAAK;EAAM,QAAQ,KAAK;CAAG,EAAE,CACpF;CACA,MAAM,WAAW,MAAM,MAAK,SAAQ,KAAK,WAAW,YAAY,EAAE,KAAK,MAAM;CAC7E,MAAM,YAAY,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;CAElE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,WAAWC,cAAAA,GAAG,2DAA2D,SAAS;EAHpF,UAAA;GAKG,MAAM,SAAS,CAAC,YAAY,CAAC,YAC5B,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;IAAK,MAAK;IAAQ,SAAQ;IAAU,WAAU;IAC3C,UAAA,MAAM;GACJ,CAAA;GAEN,iBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,UAAU,MAAM;KAAS,SAAS,MAAM;KAAS,UAAA;IAEzF,CAAA,GACP,YACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,MAAK;KAAK,UAAU,MAAM;KAAS,SAAS,MAAM;KAAM,UAAA;IAExF,CAAA,CAEP;;GAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,KAAK;IAAW,WAAU;IAA/B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,cAAD;KACS;KACP,OAAO;KACP,gBAAgB,SAA4B;MAC1C,IAAI,MAAM,MAAM,OAAO,KAAK,MAAM;KACpC;KACA,qBAAqB,MAAkB,UAAsB,KAAK,UAAU,MAAM;KAClF,eAAA;KAPF,UAAA,CASE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,iBAAD;MACE,MAAK;MACL,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,YAAD,CAAa,CAAA;MACnB,cAAY,SAAS,UAAU,QAAQ,gBAAgB,sBAAsB;MAC7E,WAAU;MAJZ,UAAA,CAMG,UAAU,OACV,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAU,8EAA+E,CAAA,CAElF;KACjB,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,iBAAD;MAAiB,OAAM;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,gBAAD,EAAgB,aAAY,gBAAiB,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,eAAD,EAAA,UAAe,kBAA8B,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,cAAD,EAAA,WACI,SAAqB;QACrB,MAAM,OAAO,KAAK,SAAS,UAAU,IAAI,KAAK,MAAM,IAAI,KAAA;QACxD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,cAAD;SAA+B,OAAO;SAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAY,UAAA,KAAK;SAAY,CAAA,GAC5C,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,iBAAD,EAAA,UAAkB,aAAa,IAAI,EAAmB,CAAA,CACnE;QAHK,GAAA,KAAK,KAGV;OAElB,EACY,CAAA;MACC;KACL,CAAA,CAAA;IACb,CAAA,GAAA,cAAc,CAAC,aAAa,YAAY,cACvC,iBAAA,GAAA,kBAAA,KAAA,CAACC,sBAAAA,cAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAa,SAAd;KAAsB,SAAQ;KAAQ,MAAK;KAAU,SAAQ;KAAe,WAAU;KACpF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,cAAD,CAAe,CAAA;IACK,CAAA,GACtB,iBAAA,GAAA,kBAAA,KAAA,CAACD,sBAAAA,aAAa,SAAd;KAAsB,OAAM;KAA5B,UAAA;MACG,YACC,iBAAA,GAAA,kBAAA,KAAA,CAACA,sBAAAA,aAAa,MAAd;OAAmB,eAAe,YAAY,IAAI;OAAlD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,aAAAA,qBAAD,EAAqB,eAAA,KAAa,CAAA,GAAC,QAElB;;MAEpB,aACC,iBAAA,GAAA,kBAAA,KAAA,CAACF,sBAAAA,aAAa,MAAd;OAAmB,eAAe,MAAM,UAAU,WAAW,EAAE;OAA/D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACG,aAAAA,UAAD,EAAU,eAAA,KAAa,CAAA,GAAC,WAEP;;MAEpB,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACJ,sBAAAA,aAAa,WAAd,CAAyB,CAAA,GACzB,iBAAA,GAAA,kBAAA,KAAA,CAACA,sBAAAA,aAAa,MAAd;OAAmB,SAAQ;OAAc,eAAe,MAAM,OAAO,WAAW,EAAE;OAAlF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACK,aAAAA,YAAD,EAAY,eAAA,KAAa,CAAA,GAAC,aAET;MACnB,CAAA,CAAA,EAAA,CAAA;KAEgB;IACV,CAAA,CAAA,EAAA,CAAA,CAEb;;GACJ,aACC,iBAAA,GAAA,kBAAA,KAAA,CAACC,gBAAAA,SAAD;IACE,MAAM;IACN,eAAc,SAAQ;KACpB,IAAI,MAAM,MAAM,OAAO,eAAe;UACjC,MAAM,QAAQ;IACrB;IALF,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD;KAAgB,SAAQ;KAAQ,MAAK;KAAU,SAAQ;KAAmB,WAAU;KAClF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,gBAAD,CAAiB,CAAA;IACH,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD;KAAgB,OAAM;KAAM,WAAU;KACnC,UAAA,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MACE,OAAM;MACN,aAAa,MAAM;MACnB,aAAY;MACZ,OAAO,MAAM;MACb,SAAS,MAAM;MACf,eAAc,SAAQ,MAAM,OAAO,EAAE,KAAK,CAAC;MAC3C,gBAAgB,MAAM,KAAK;MAC3B,UAAU,MAAM;KACjB,CAAA;IAEW,CAAA,CACT;;GAEV,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IACE,MAAM;IACK;IACX,MAAM,WAAW;IACjB,OAAO,MAAM;IACb,SAAS,MAAM;IACf,eAAe,YAAY,KAAK;IAChC,WAAU,SAAQ,MAAM,OAAO,WAAW,IAAI,IAAI;GACnD,CAAA;EAEA;;AAET;AAEA,SAAS,cAAc,EACrB,MACA,WACA,MACA,OACA,SACA,SACA,YASC;CAED,MAAM,CAAC,YAAY,kBAAA,GAAiBtB,MAAAA,SAAAA,CAAiB;CACrD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,IAAI;CAC/C,MAAM,cAAc;EAClB,cAAc,KAAA,CAAS;EACvB,aAAa,IAAI;EACjB,QAAQ;CACV;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACmB,gBAAAA,SAAD;EAAe;EAAM,eAAc,SAAQ,CAAC,QAAQ,MAAM;EACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,gBAAAA,gBAAD;GAAgB,QAAQ;GAAW,OAAM;GAAM,WAAU;GACtD,UAAA,QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IACE,OAAM;IACN,aAAa;IACb,aAAY;IACZ,OAAO,eAAe,KAAA,KAAa,eAAe,YAAY,QAAQ,KAAA;IAC7D;IACT,cAAc;IACd,UAAU,OAAM,SAAQ;KACtB,IAAI,MAAM,SAAS,IAAI,GAAG,MAAM;UAC3B,cAAc,IAAI;IACzB;IACA,UAAU;GACX,CAAA;EAEW,CAAA;CACT,CAAA;AAEb;AAEA,SAAS,aAAa,EACpB,OACA,aACA,aACA,OACA,SACA,cACA,UACA,YAUC;CACD,MAAM,CAAC,MAAM,YAAA,GAAWtB,MAAAA,SAAAA,CAAS,WAAW;CAC5C,MAAM,UAAU,UAAqB;EACnC,MAAM,eAAe;EACrB,IAAI,KAAK,KAAK,GAAG,SAAc,IAAI;CACrC;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;EAAM,WAAU;EAAsB,UAAU;EAAhD,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,YAAAA,KAAD;IAAK,IAAG;IAAK,SAAQ;IAClB,UAAA;GACE,CAAA;GACL,iBAAA,GAAA,kBAAA,KAAA,CAACqB,yBAAAA,OAAD;IAAO,SAAS,UAAU,KAAA;IAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;KACE,cAAW;KACX,MAAK;KACL,WAAA;KACA,UAAS,UAAS,MAAM,cAAc,OAAO;KAC7C,WAAA;KACA,OAAO;KACP,WAAU,UAAS;MACjB,QAAQ,MAAM,OAAO,KAAK;MAC1B,eAAe,MAAM,OAAO,KAAK;KACnC;IACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,YAAD,EAAA,UAAa,MAAkB,CAAA,CAC1B;;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACtB,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,SAAS;KAAU,UAAA;IAE3D,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,MAAK;KAAK,UAAU,WAAW,CAAC,KAAK,KAAK;KAC/E,UAAA;IACK,CAAA,CACL;;EACD;;AAEV;;ACxSA,IAAM,iBAAgD;CACpD,QAAQ;CACR,OAAO;CACP,SAAS;CACT,MAAM;AACR;;;;;;AAqBA,SAAgB,wBAAwB,OAAqC;CAC3E,MAAM,UAAUuB,6DAAAA,oBAAoB;CACpC,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;EAAqB,GAAI;EAAO,GAAI;CAAU,CAAA;AACvD;AAEA,SAAS,oBAAoB,EAC3B,MACA,cACA,iBACA,SACA,mBACA,WACA,QACA,eACA,SACA,YAAY,QAC4C;CACxD,MAAM,aAAaC,mEAAAA,2BAA2B;CAC9C,MAAM,QAAQC,iEAAAA,oBAAoB;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,SACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;EACS;EACP,cAAc,eAAe;EAC7B,cAAW;EACX,iBAAiB,EAAE,OAAO;GAAE,eAAe;GAAG;GAAM,SAAS,CAAC;EAAE,EAAE;EAClE,eAAc,SAAS,KAAK,SAAS,QAAQ,UAAU,QAAQ,WAAW,KAAA;EAC1E,UAAS,SAAQ,CAAC,WAAW,CAAC,KAAK,SAAS,UAAU,QAAQ,KAAK,SAAS,MAAM;EACvE;EACA;CACZ,CAAA;CAEH,OAAO,cAAA,GAAaC,UAAAA,aAAAA,CAAa,QAAQ,UAAU,IAAI;AACzD"}
@@ -20,7 +20,7 @@ var DEFAULT_ITEM_VALUE = "";
20
20
  * actions, and save / reset once the page differs from the view. Driven by the same controller
21
21
  * as `SavedViewTabs`.
22
22
  */
23
- function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, canEdit = () => true, "aria-label": ariaLabel = "Views", className }) {
23
+ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, canEdit = () => true, canCreate = true, "aria-label": ariaLabel = "Views", className }) {
24
24
  const anchorRef = useRef(null);
25
25
  const [renaming, setRenaming] = useState(false);
26
26
  const { draft, activeView } = views;
@@ -101,7 +101,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
101
101
  } })
102
102
  ]
103
103
  })]
104
- }), activeView && !creating && /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenu.Trigger, {
104
+ }), activeView && !creating && (editable || canCreate) && /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenu.Trigger, {
105
105
  variant: "ghost",
106
106
  size: "icon-sm",
107
107
  tooltip: "View actions",
@@ -114,7 +114,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
114
114
  onClick: () => setRenaming(true),
115
115
  children: [/* @__PURE__ */ jsx(TextCursorInputIcon, { "aria-hidden": true }), "Rename"]
116
116
  }),
117
- /* @__PURE__ */ jsxs(DropdownMenu.Item, {
117
+ canCreate && /* @__PURE__ */ jsxs(DropdownMenu.Item, {
118
118
  onClick: () => views.duplicate(activeView.id),
119
119
  children: [/* @__PURE__ */ jsx(CopyIcon, { "aria-hidden": true }), "Duplicate"]
120
120
  }),
@@ -126,7 +126,7 @@ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, c
126
126
  ]
127
127
  })] })]
128
128
  }),
129
- /* @__PURE__ */ jsxs(Popover, {
129
+ canCreate && /* @__PURE__ */ jsxs(Popover, {
130
130
  open: creating,
131
131
  onOpenChange: (open) => {
132
132
  if (open) views.create(newViewSettings);
@@ -265,13 +265,14 @@ function ObservabilitySavedViews(props) {
265
265
  ...context
266
266
  });
267
267
  }
268
- function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, defaultDatePreset, className, source, queryKeyScope, canEdit }) {
268
+ function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, defaultDatePreset, className, source, queryKeyScope, canEdit, canCreate = true }) {
269
269
  const headerSlot = useObservabilityHeaderSlot();
270
270
  const views = useHostedSavedViews({
271
271
  page,
272
272
  source,
273
273
  queryKeyScope,
274
274
  canEdit,
275
+ canCreate,
275
276
  searchParams,
276
277
  setSearchParams,
277
278
  columns,
@@ -288,10 +289,11 @@ function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, def
288
289
  } },
289
290
  describeView: (view) => view.settings.record?.scope === "org" ? "Shared" : void 0,
290
291
  canEdit: (view) => !canEdit || !view.settings.record || canEdit(view.settings.record),
292
+ canCreate,
291
293
  className
292
294
  });
293
295
  return headerSlot ? createPortal(picker, headerSlot) : picker;
294
296
  }
295
297
  export { ObservabilitySavedViews as t };
296
298
 
297
- //# sourceMappingURL=observability-saved-views-Bo5kLN20.js.map
299
+ //# sourceMappingURL=observability-saved-views-Zlz74syw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-saved-views-Zlz74syw.js","names":["_Fragment"],"sources":["../src/ds/components/SavedViews/saved-view-picker.tsx","../src/domains/observability/saved-views/observability-saved-views.tsx"],"sourcesContent":["import { CopyIcon, EllipsisIcon, LayersIcon, LayersPlusIcon, TextCursorInputIcon, Trash2Icon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { FormEvent, ReactNode, RefObject } from 'react';\nimport { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport type { SavedView } from './saved-view-schema';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport {\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxItemEnd,\n ComboboxList,\n ComboboxRoot,\n ComboboxSearch,\n ComboboxTrigger,\n} from '@/ds/components/Combobox/combobox-parts';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewPickerProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n /** Names the page's unfiltered state, e.g. \"All traces\". */\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n /** Muted text after a view in the list, e.g. \"Shared\". */\n describeView?: (view: SavedView<TSettings>) => ReactNode;\n /** Whether a view can be renamed, deleted or overwritten. Others can still be applied and duplicated. */\n canEdit?: (view: SavedView<TSettings>) => boolean;\n /** Whether new views can be saved here (save as new view, duplicate). Defaults to true. */\n canCreate?: boolean;\n 'aria-label'?: string;\n className?: string;\n};\n\ntype PickerItem = { value: string; label: string; viewId: string | undefined };\n\nconst DEFAULT_ITEM_VALUE = '';\n\n/**\n * A compact saved-views control for a page header: a searchable view picker, the active view's\n * actions, and save / reset once the page differs from the view. Driven by the same controller\n * as `SavedViewTabs`.\n */\nexport function SavedViewPicker<TSettings>({\n views,\n defaultLabel,\n newViewSettings,\n describeView,\n canEdit = () => true,\n canCreate = true,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewPickerProps<TSettings>) {\n const anchorRef = useRef<HTMLDivElement>(null);\n const [renaming, setRenaming] = useState(false);\n const { draft, activeView } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const activeUnsaved = !creating && draft?.viewId !== undefined && views.unsaved;\n const editable = activeView !== undefined && canEdit(activeView);\n\n const items: PickerItem[] = [\n { value: DEFAULT_ITEM_VALUE, label: defaultLabel, viewId: undefined },\n ...views.views.map(view => ({ value: view.id, label: view.name, viewId: view.id })),\n ];\n const selected = items.find(item => item.viewId === activeView?.id) ?? items[0];\n const viewsById = new Map(views.views.map(view => [view.id, view]));\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={cn('flex min-w-0 flex-wrap items-center justify-end gap-1.5', className)}\n >\n {views.error && !creating && !renaming && (\n <Txt role=\"alert\" variant=\"caption\" className=\"min-w-0 truncate text-destructive-foreground\">\n {views.error}\n </Txt>\n )}\n {activeUnsaved && (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" disabled={views.pending} onClick={views.discard}>\n Reset\n </Button>\n {editable && (\n <Button type=\"button\" variant=\"default\" size=\"sm\" disabled={views.pending} onClick={views.save}>\n Save changes\n </Button>\n )}\n </div>\n )}\n <div ref={anchorRef} className=\"flex min-w-0 items-center gap-0.5\">\n <ComboboxRoot\n items={items}\n value={selected}\n onValueChange={(item: PickerItem | null) => {\n if (item) views.select(item.viewId);\n }}\n isItemEqualToValue={(item: PickerItem, value: PickerItem) => item.value === value.value}\n autoHighlight\n >\n <ComboboxTrigger\n size=\"sm\"\n icon={<LayersIcon />}\n aria-label={`View: ${selected?.label}${activeUnsaved ? ', unsaved changes' : ''}`}\n className=\"max-w-60\"\n >\n {selected?.label}\n {activeUnsaved && (\n <span className=\"ml-1.5 inline-block size-1.5 rounded-full bg-warning-indicator align-middle\" />\n )}\n </ComboboxTrigger>\n <ComboboxContent align=\"end\">\n <ComboboxSearch placeholder=\"Search views…\" />\n <ComboboxEmpty>No views found.</ComboboxEmpty>\n <ComboboxList>\n {(item: PickerItem) => {\n const view = item.viewId ? viewsById.get(item.viewId) : undefined;\n return (\n <ComboboxItem key={item.value} value={item}>\n <span className=\"truncate\">{item.label}</span>\n {view && describeView && <ComboboxItemEnd>{describeView(view)}</ComboboxItemEnd>}\n </ComboboxItem>\n );\n }}\n </ComboboxList>\n </ComboboxContent>\n </ComboboxRoot>\n {activeView && !creating && (editable || canCreate) && (\n <DropdownMenu>\n <DropdownMenu.Trigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"View actions\" className=\"shrink-0\">\n <EllipsisIcon />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {editable && (\n <DropdownMenu.Item onClick={() => setRenaming(true)}>\n <TextCursorInputIcon aria-hidden />\n Rename\n </DropdownMenu.Item>\n )}\n {canCreate && (\n <DropdownMenu.Item onClick={() => views.duplicate(activeView.id)}>\n <CopyIcon aria-hidden />\n Duplicate\n </DropdownMenu.Item>\n )}\n {editable && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"destructive\" onClick={() => views.remove(activeView.id)}>\n <Trash2Icon aria-hidden />\n Delete view\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n {canCreate && (\n <Popover\n open={creating}\n onOpenChange={open => {\n if (open) views.create(newViewSettings);\n else views.discard();\n }}\n >\n <PopoverTrigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"Save as new view\" className=\"shrink-0\">\n <LayersPlusIcon />\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-72\">\n {creating && (\n <ViewNameForm\n title=\"Save as new view\"\n initialName={draft.name}\n submitLabel=\"Save view\"\n error={views.error}\n pending={views.pending}\n onNameChange={name => views.change({ name })}\n onSubmit={() => views.save()}\n onCancel={views.discard}\n />\n )}\n </PopoverContent>\n </Popover>\n )}\n {activeView && (\n <RenamePopover\n open={renaming}\n anchorRef={anchorRef}\n name={activeView.name}\n error={views.error}\n pending={views.pending}\n onClose={() => setRenaming(false)}\n onRename={name => views.rename(activeView.id, name)}\n />\n )}\n </div>\n );\n}\n\nfunction RenamePopover({\n open,\n anchorRef,\n name,\n error,\n pending,\n onClose,\n onRename,\n}: {\n open: boolean;\n anchorRef: RefObject<HTMLDivElement | null>;\n name: string;\n error: string | undefined;\n pending: boolean | undefined;\n onClose: () => void;\n onRename: (name: string) => boolean | Promise<boolean>;\n}) {\n // The name that last failed to save: its error shows until the user types something else.\n const [failedName, setFailedName] = useState<string>();\n const [typedName, setTypedName] = useState(name);\n const close = () => {\n setFailedName(undefined);\n setTypedName(name);\n onClose();\n };\n return (\n <Popover open={open} onOpenChange={next => !next && close()}>\n <PopoverContent anchor={anchorRef} align=\"end\" className=\"w-72\">\n {open && (\n <ViewNameForm\n title=\"Rename view\"\n initialName={name}\n submitLabel=\"Rename\"\n error={failedName !== undefined && failedName === typedName ? error : undefined}\n pending={pending}\n onNameChange={setTypedName}\n onSubmit={async next => {\n if (await onRename(next)) close();\n else setFailedName(next);\n }}\n onCancel={close}\n />\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ViewNameForm({\n title,\n initialName,\n submitLabel,\n error,\n pending,\n onNameChange,\n onSubmit,\n onCancel,\n}: {\n title: string;\n initialName: string;\n submitLabel: string;\n error?: string;\n pending?: boolean;\n onNameChange?: (name: string) => void;\n onSubmit: (name: string) => void | Promise<void>;\n onCancel: () => void;\n}) {\n const [name, setName] = useState(initialName);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (name.trim()) void onSubmit(name);\n };\n return (\n <form className=\"flex flex-col gap-3\" onSubmit={submit}>\n <Txt as=\"h2\" variant=\"label\">\n {title}\n </Txt>\n <Field invalid={error !== undefined}>\n <Input\n aria-label=\"View name\"\n size=\"sm\"\n autoFocus\n onFocus={event => event.currentTarget.select()}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n value={name}\n onChange={event => {\n setName(event.target.value);\n onNameChange?.(event.target.value);\n }}\n />\n <FieldError>{error}</FieldError>\n </Field>\n <div className=\"flex justify-end gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={pending || !name.trim()}>\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","import type { SavedViewPage } from '@mastra/core/storage';\nimport { createPortal } from 'react-dom';\nimport { useSavedViewsSource } from './saved-views-source';\nimport type { SavedViewsContextValue } from './saved-views-source';\nimport { useHostedSavedViews } from './use-hosted-saved-views';\nimport type { SavedViewColumnsControl } from './use-hosted-saved-views';\nimport { useObservabilityHeaderSlot } from '@/domains/observability/components/observability-header-slot';\nimport { SavedViewPicker } from '@/ds/components/SavedViews/saved-view-picker';\nimport type { SetURLSearchParamsLike } from '@/lib/sort/use-url-sort';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_LABELS: Record<SavedViewPage, string> = {\n traces: 'All traces',\n spans: 'All spans',\n threads: 'All threads',\n logs: 'All logs',\n};\n\nexport type ObservabilitySavedViewsProps = {\n page: SavedViewPage;\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n /** The page's column picker (traces, spans, threads), so views save and restore columns. */\n columns?: SavedViewColumnsControl;\n /**\n * The range the page shows when the URL names none, when the host's differs from the page's own\n * (the same value passed to `useObservabilityListFilters`).\n */\n defaultDatePreset?: string;\n className?: string;\n};\n\n/**\n * The saved views of an observability page: a searchable view picker with save and reset actions.\n * Inside the shared traces / spans / threads header it moves into that header's row. Renders nothing\n * unless a `SavedViewsProvider` above it supplies where views are stored.\n */\nexport function ObservabilitySavedViews(props: ObservabilitySavedViewsProps) {\n const context = useSavedViewsSource();\n if (!context) return null;\n return <HostedSavedViewsBar {...props} {...context} />;\n}\n\nfunction HostedSavedViewsBar({\n page,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n className,\n source,\n queryKeyScope,\n canEdit,\n canCreate = true,\n}: ObservabilitySavedViewsProps & SavedViewsContextValue) {\n const headerSlot = useObservabilityHeaderSlot();\n const views = useHostedSavedViews({\n page,\n source,\n queryKeyScope,\n canEdit,\n canCreate,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n });\n\n const picker = (\n <SavedViewPicker\n views={views}\n defaultLabel={DEFAULT_LABELS[page]}\n aria-label=\"Saved views\"\n newViewSettings={{ state: { schemaVersion: 1, page, filters: [] } }}\n describeView={view => (view.settings.record?.scope === 'org' ? 'Shared' : undefined)}\n canEdit={view => !canEdit || !view.settings.record || canEdit(view.settings.record)}\n canCreate={canCreate}\n className={className}\n />\n );\n return headerSlot ? createPortal(picker, headerSlot) : picker;\n}\n"],"mappings":"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"}