@flanksource/clicky-ui 0.3.41 → 0.3.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +4 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +3 -1
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +4 -2
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +16 -0
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts +4 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +16 -0
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +4 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/Combobox.cjs +54 -8
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +56 -10
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxMenu.cjs +139 -113
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts +3 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +139 -113
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxMenuTrigger.cjs +87 -0
- package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
- package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
- package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
- package/dist/components/ComboboxMenuTrigger.js +87 -0
- package/dist/components/ComboboxMenuTrigger.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +30 -7
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +30 -7
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +20 -3
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +11 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +21 -4
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/combobox-types.d.ts +8 -0
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-badge.cjs +108 -0
- package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
- package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-badge.js +108 -0
- package/dist/components/json-schema-form-debug-badge.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
- package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.js +13 -0
- package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
- package/dist/components/json-schema-form-debug-groups.cjs +56 -0
- package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
- package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-groups.js +56 -0
- package/dist/components/json-schema-form-debug-groups.js.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
- package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.js +159 -0
- package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
- package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.js +102 -0
- package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
- package/dist/components/json-schema-form-debug.cjs +31 -0
- package/dist/components/json-schema-form-debug.cjs.map +1 -0
- package/dist/components/json-schema-form-debug.d.ts +11 -0
- package/dist/components/json-schema-form-debug.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug.js +31 -0
- package/dist/components/json-schema-form-debug.js.map +1 -0
- package/dist/components/json-schema-form-enum-choice.cjs +114 -0
- package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
- package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
- package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
- package/dist/components/json-schema-form-enum-choice.js +114 -0
- package/dist/components/json-schema-form-enum-choice.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +3 -93
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +1 -91
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-listeners.cjs +7 -1
- package/dist/components/json-schema-form-listeners.cjs.map +1 -1
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
- package/dist/components/json-schema-form-listeners.js +7 -1
- package/dist/components/json-schema-form-listeners.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +21 -5
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +21 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-tone.cjs +12 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -1
- package/dist/components/json-schema-form-tone.js +12 -0
- package/dist/components/json-schema-form-tone.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/data/GraphDiagram.cjs +125 -138
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +30 -23
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +128 -141
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramEdges.cjs +208 -0
- package/dist/data/GraphDiagramEdges.cjs.map +1 -0
- package/dist/data/GraphDiagramEdges.d.ts +40 -0
- package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
- package/dist/data/GraphDiagramEdges.js +208 -0
- package/dist/data/GraphDiagramEdges.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +142 -0
- package/dist/data/GraphDiagramNodes.cjs.map +1 -0
- package/dist/data/GraphDiagramNodes.d.ts +22 -0
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
- package/dist/data/GraphDiagramNodes.js +142 -0
- package/dist/data/GraphDiagramNodes.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +38 -44
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +26 -2
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.summary.cjs +9 -3
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +9 -3
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +4 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.js +146 -0
- package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +57 -20
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +13 -3
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
- package/dist/data/ai/SessionViewer.decision.cjs +21 -0
- package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
- package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision.js +21 -0
- package/dist/data/ai/SessionViewer.decision.js.map +1 -0
- package/dist/data/ai/SessionViewer.input.cjs +14 -0
- package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.input.d.ts +5 -0
- package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.input.js +14 -0
- package/dist/data/ai/SessionViewer.input.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +58 -21
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +6 -3
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +6 -3
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +27 -235
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +8 -2
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +8 -2
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/approval-request.cjs +75 -0
- package/dist/data/ai/approval-request.cjs.map +1 -0
- package/dist/data/ai/approval-request.d.ts +155 -0
- package/dist/data/ai/approval-request.d.ts.map +1 -0
- package/dist/data/ai/approval-request.js +75 -0
- package/dist/data/ai/approval-request.js.map +1 -0
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.js +73 -0
- package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
- package/dist/data/ai/runtime-spec-fields.cjs +166 -0
- package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
- package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
- package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
- package/dist/data/ai/runtime-spec-fields.js +166 -0
- package/dist/data/ai/runtime-spec-fields.js.map +1 -0
- package/dist/data/ai/session-categories.cjs +4 -0
- package/dist/data/ai/session-categories.cjs.map +1 -1
- package/dist/data/ai/session-categories.d.ts +1 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -1
- package/dist/data/ai/session-categories.js +4 -0
- package/dist/data/ai/session-categories.js.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +49 -21
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +49 -21
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +1 -1
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +1 -1
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +216 -0
- package/dist/data/graph-columns-layout.cjs.map +1 -0
- package/dist/data/graph-columns-layout.d.ts +56 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -0
- package/dist/data/graph-columns-layout.js +216 -0
- package/dist/data/graph-columns-layout.js.map +1 -0
- package/dist/data/graph-diagram-model.cjs +73 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -0
- package/dist/data/graph-diagram-model.d.ts +90 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -0
- package/dist/data/graph-diagram-model.js +73 -0
- package/dist/data/graph-diagram-model.js.map +1 -0
- package/dist/data/graph-edge-routing.cjs +235 -0
- package/dist/data/graph-edge-routing.cjs.map +1 -0
- package/dist/data/graph-edge-routing.d.ts +73 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -0
- package/dist/data/graph-edge-routing.js +235 -0
- package/dist/data/graph-edge-routing.js.map +1 -0
- package/dist/data/graph-layout.cjs +0 -82
- package/dist/data/graph-layout.cjs.map +1 -1
- package/dist/data/graph-layout.d.ts +1 -28
- package/dist/data/graph-layout.d.ts.map +1 -1
- package/dist/data/graph-layout.js +1 -83
- package/dist/data/graph-layout.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +129 -33
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +13 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +130 -34
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/fixtures.d.ts +12 -0
- package/dist/data/har/fixtures.d.ts.map +1 -1
- package/dist/data/har/types.d.ts +12 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +67 -84
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +4 -5
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.js +170 -0
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +70 -87
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.js +56 -0
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
- package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +10 -6
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.js +95 -0
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
- package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +25 -14
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
- package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.js +41 -0
- package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
- package/dist/data/use-edge-focus.cjs +20 -0
- package/dist/data/use-edge-focus.cjs.map +1 -0
- package/dist/data/use-edge-focus.d.ts +23 -0
- package/dist/data/use-edge-focus.d.ts.map +1 -0
- package/dist/data/use-edge-focus.js +20 -0
- package/dist/data/use-edge-focus.js.map +1 -0
- package/dist/data/use-pan-zoom.cjs +159 -0
- package/dist/data/use-pan-zoom.cjs.map +1 -0
- package/dist/data/use-pan-zoom.d.ts +79 -0
- package/dist/data/use-pan-zoom.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.js +159 -0
- package/dist/data/use-pan-zoom.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +5 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +4 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +31 -15
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.cjs +5 -2
- package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.js +5 -2
- package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.cjs +2 -0
- package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.js +2 -0
- package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.cjs +1 -0
- package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.d.ts +3 -0
- package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.js +1 -0
- package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +3 -1
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +3 -1
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/useOperationPages.cjs +6 -1
- package/dist/rpc/useOperationPages.cjs.map +1 -1
- package/dist/rpc/useOperationPages.d.ts +3 -1
- package/dist/rpc/useOperationPages.d.ts.map +1 -1
- package/dist/rpc/useOperationPages.js +6 -1
- package/dist/rpc/useOperationPages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/schemas/json-schema-form.schema.json +5 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.js +0 -423
- package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
- package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
- package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.js +0 -262
- package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.js +0 -346
- package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
|
@@ -4,12 +4,14 @@ import { useFloatingTree, useFloatingNodeId, useFloatingParentNodeId, useListIte
|
|
|
4
4
|
import { Icon } from "../data/Icon.js";
|
|
5
5
|
import { MenuContext, MENU_POPOVER_CLASS } from "./dropdownMenuContext.js";
|
|
6
6
|
import { useFloatingZIndex, useEscapeLayer } from "./modalStack.js";
|
|
7
|
+
import { cn } from "../lib/utils.js";
|
|
7
8
|
import { UiChevronRight } from "../icons/components/UiChevronRight.js";
|
|
8
9
|
const MENU_ITEM_CLASS = "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50";
|
|
9
10
|
const MENU_HEADER_CLASS = "select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground";
|
|
10
11
|
function MenuItemIcon({
|
|
11
12
|
icon,
|
|
12
|
-
iconColor
|
|
13
|
+
iconColor,
|
|
14
|
+
iconClassName
|
|
13
15
|
}) {
|
|
14
16
|
if (!icon) return null;
|
|
15
17
|
return (
|
|
@@ -20,7 +22,7 @@ function MenuItemIcon({
|
|
|
20
22
|
/* @__PURE__ */ jsx(
|
|
21
23
|
"span",
|
|
22
24
|
{
|
|
23
|
-
className: "inline-flex shrink-0 text-base",
|
|
25
|
+
className: cn("inline-flex shrink-0 text-base", iconClassName),
|
|
24
26
|
style: iconColor ? { color: iconColor } : void 0,
|
|
25
27
|
children: /* @__PURE__ */ jsx(Icon, { ...typeof icon === "string" ? { name: icon } : { icon } })
|
|
26
28
|
}
|
|
@@ -58,7 +60,14 @@ function MenuLeaf({ item }) {
|
|
|
58
60
|
}
|
|
59
61
|
}),
|
|
60
62
|
children: [
|
|
61
|
-
/* @__PURE__ */ jsx(
|
|
63
|
+
/* @__PURE__ */ jsx(
|
|
64
|
+
MenuItemIcon,
|
|
65
|
+
{
|
|
66
|
+
icon: item.icon,
|
|
67
|
+
iconColor: item.iconColor,
|
|
68
|
+
iconClassName: item.iconClassName
|
|
69
|
+
}
|
|
70
|
+
),
|
|
62
71
|
item.label
|
|
63
72
|
]
|
|
64
73
|
}
|
|
@@ -84,7 +93,7 @@ function MenuSubmenu({ item }) {
|
|
|
84
93
|
middleware: [
|
|
85
94
|
offset({ mainAxis: 0, alignmentAxis: -4 }),
|
|
86
95
|
flip({ padding: 8 }),
|
|
87
|
-
shift({ padding: 8 })
|
|
96
|
+
shift({ padding: 8, crossAxis: true })
|
|
88
97
|
],
|
|
89
98
|
whileElementsMounted: autoUpdate
|
|
90
99
|
});
|
|
@@ -102,13 +111,9 @@ function MenuSubmenu({ item }) {
|
|
|
102
111
|
onNavigate: setActiveIndex,
|
|
103
112
|
loop: true
|
|
104
113
|
});
|
|
105
|
-
const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
|
|
106
|
-
hover,
|
|
107
|
-
|
|
108
|
-
role,
|
|
109
|
-
dismiss,
|
|
110
|
-
listNav
|
|
111
|
-
]);
|
|
114
|
+
const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
|
|
115
|
+
[hover, click, role, dismiss, listNav]
|
|
116
|
+
);
|
|
112
117
|
useEscapeLayer(isOpen, () => setIsOpen(false));
|
|
113
118
|
useEffect(() => {
|
|
114
119
|
if (!tree) return;
|
|
@@ -158,7 +163,14 @@ function MenuSubmenu({ item }) {
|
|
|
158
163
|
})
|
|
159
164
|
),
|
|
160
165
|
children: [
|
|
161
|
-
/* @__PURE__ */ jsx(
|
|
166
|
+
/* @__PURE__ */ jsx(
|
|
167
|
+
MenuItemIcon,
|
|
168
|
+
{
|
|
169
|
+
icon: item.icon,
|
|
170
|
+
iconColor: item.iconColor,
|
|
171
|
+
iconClassName: item.iconClassName
|
|
172
|
+
}
|
|
173
|
+
),
|
|
162
174
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
|
|
163
175
|
/* @__PURE__ */ jsx(Icon, { icon: UiChevronRight, className: "ml-auto shrink-0 opacity-60" })
|
|
164
176
|
]
|
|
@@ -181,16 +193,20 @@ function MenuSubmenu({ item }) {
|
|
|
181
193
|
modal: false,
|
|
182
194
|
initialFocus: -1,
|
|
183
195
|
returnFocus: false,
|
|
184
|
-
children: /* @__PURE__ */
|
|
196
|
+
children: /* @__PURE__ */ jsxs(
|
|
185
197
|
"div",
|
|
186
198
|
{
|
|
187
199
|
ref: refs.setFloating,
|
|
188
200
|
role: "menu",
|
|
189
|
-
"aria-label": ariaLabel,
|
|
190
201
|
style: { ...floatingStyles, zIndex: floatingZ },
|
|
191
202
|
className: MENU_POPOVER_CLASS,
|
|
192
203
|
...getFloatingProps(),
|
|
193
|
-
|
|
204
|
+
"aria-label": ariaLabel,
|
|
205
|
+
...ariaLabel ? { "aria-labelledby": void 0 } : {},
|
|
206
|
+
children: [
|
|
207
|
+
item.header != null && /* @__PURE__ */ jsx("div", { className: "border-b border-border px-3 py-1.5", children: item.header }),
|
|
208
|
+
/* @__PURE__ */ jsx(MenuItemList, { items: item.children ?? [] })
|
|
209
|
+
]
|
|
194
210
|
}
|
|
195
211
|
)
|
|
196
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className=\"inline-flex shrink-0 text-base\"\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon icon={item.icon} iconColor={item.iconColor} />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([\n hover,\n click,\n role,\n dismiss,\n listNav,\n ]);\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon icon={item.icon} iconColor={item.iconColor} />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n aria-label={ariaLabel}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n >\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":";;;;;;;;AAkCA,MAAM,kBACJ;AACF,MAAM,oBACJ;AAEF,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,KAAM,QAAO;AAClB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAG,kCAAkC,aAAa;AAAA,QAC7D,OAAO,YAAY,EAAE,OAAO,cAAc;AAAA,QAE1C,UAAA,oBAAC,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,SAAS,EAAE,KAAA,EAAK,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA;AAGxE;AAEA,SAAS,SAAS,EAAE,QAAoC;AACtD,QAAM,OAAO,WAAW,WAAW;AACnC,QAAM,OAAO,gBAAA;AACb,QAAM,WAAW,YAAA;AACjB,QAAM,WAAW,SAAS,UAAU,KAAK;AAEzC,QAAM,WAAW,MAAM;AACrB,QAAI,KAAK,SAAU;AACnB,SAAK,SAAA;AAEL,iCAAM,OAAO,KAAK;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,SAAS;AAAA,MACd,MAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU,WAAW,IAAI;AAAA,MACzB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,WAAW;AAAA,MACV,GAAG,KAAK,aAAa;AAAA,QACpB,SAAS;AAAA,QACT,SAAS,MAAM,KAAK,kBAAkB,IAAI;AAAA,QAC1C,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,kBAAM,eAAA;AACN,qBAAA;AAAA,UACF;AAAA,QACF;AAAA,MAAA,CACD;AAAA,MAED,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAErB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,SAAS,YAAY,EAAE,QAAoC;AACzD,QAAM,SAAS,WAAW,WAAW;AACrC,QAAM,OAAO,gBAAA;AACb,QAAM,SAAS,kBAAA;AACf,QAAM,WAAW,wBAAA;AACjB,QAAM,WAAW,YAAA;AAEjB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,cAAc,OAAkC,EAAE;AACxD,QAAM,YAAY,kBAAA;AAElB,QAAM,EAAE,MAAM,gBAAgB,QAAA,IAAY,YAA+B;AAAA;AAAA,IAEvE,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,MACV,OAAO,EAAE,UAAU,GAAG,eAAe,IAAI;AAAA,MACzC,KAAK,EAAE,SAAS,GAAG;AAAA,MACnB,MAAM,EAAE,SAAS,GAAG,WAAW,MAAM;AAAA,IAAA;AAAA,IAEvC,sBAAsB;AAAA,EAAA,CACvB;AAED,QAAM,QAAQ,SAAS,SAAS;AAAA,IAC9B,OAAO,EAAE,MAAM,GAAA;AAAA,IACf,aAAa,YAAA;AAAA,EAAY,CAC1B;AAID,QAAM,QAAQ,SAAS,SAAS,EAAE,QAAQ,OAAO;AACjD,QAAM,OAAO,QAAQ,SAAS,EAAE,MAAM,QAAQ;AAG9C,QAAM,UAAU,WAAW,SAAS,EAAE,WAAW,OAAO,SAAS,MAAM;AACvE,QAAM,UAAU,kBAAkB,SAAS;AAAA,IACzC,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA,CACP;AACD,QAAM,EAAE,mBAAmB,kBAAkB,aAAA,IAAiB;AAAA,IAC5D,CAAC,OAAO,OAAO,MAAM,SAAS,OAAO;AAAA,EAAA;AAGvC,iBAAe,QAAQ,MAAM,UAAU,KAAK,CAAC;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,MAAM,UAAU,KAAK;AACtC,UAAM,gBAAgB,CAAC,UAGjB;AACJ,UAAI,MAAM,WAAW,UAAU,MAAM,aAAa,UAAU;AAC1D,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AACA,SAAK,OAAO,GAAG,SAAS,QAAQ;AAChC,SAAK,OAAO,GAAG,YAAY,aAAa;AACxC,WAAO,MAAM;AACX,WAAK,OAAO,IAAI,SAAS,QAAQ;AACjC,WAAK,OAAO,IAAI,YAAY,aAAa;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAE3B,YAAU,MAAM;AACd,QAAI,UAAU,KAAM,MAAK,OAAO,KAAK,YAAY,EAAE,UAAU,QAAQ;AAAA,EACvE,GAAG,CAAC,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAEnC,QAAM,WAAW,SAAS,UAAU,OAAO;AAC3C,QAAM,eAAe,aAAa,CAAC,KAAK,cAAc,SAAS,GAAG,CAAC;AACnE,QAAM,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAEhE,SACE,qBAAC,cAAA,EAAa,IAAI,QAChB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAU,WAAW,IAAI;AAAA,QACzB,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,qBAAmB,iBAAiB,KAAK;AAAA,QACzC,WAAW;AAAA,QACV,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,UAKT,kBAAkB;AAAA,YAChB,SAAS,MAAM;AACb,gCAAkB,KAAK;AACvB,qBAAO,kBAAkB,IAAI;AAAA,YAC/B;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAGH,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,eAAe,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEtB,oBAAC,QAAA,EAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,UACtD,oBAAC,MAAA,EAAK,MAAM,gBAAgB,WAAU,8BAAA,CAA8B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEtE;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAGF,UAAA,oBAAC,cAAA,EAAa,aACX,UAAA,8BACE,gBAAA,EACC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,cAAc;AAAA,YACd,aAAa;AAAA,YAEb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK,KAAK;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO,EAAE,GAAG,gBAAgB,QAAQ,UAAA;AAAA,gBACpC,WAAW;AAAA,gBACV,GAAG,iBAAA;AAAA,gBACJ,cAAY;AAAA,gBACX,GAAI,YAAY,EAAE,mBAAmB,OAAA,IAAc,CAAA;AAAA,gBAEnD,UAAA;AAAA,kBAAA,KAAK,UAAU,QACd,oBAAC,SAAI,WAAU,sCACZ,eAAK,OAAA,CACR;AAAA,sCAED,cAAA,EAAa,OAAO,KAAK,YAAY,CAAA,EAAC,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5C;AAAA,QAAA,GAEJ,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AASO,SAAS,aAAa,EAAE,SAAwC;AACrE,SACE,oBAAA,UAAA,EACG,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,UAAM,aACJ,KAAK,SAAS,QAAQ,KAAK,YAAU,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AACzD,UAAM,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,SAAS,SAAS;AAC9D,WACE,qBAACA,YAAA,EACE,UAAA;AAAA,MAAA,kCACE,OAAA,EAAI,MAAK,gBAAe,WAAW,mBACjC,eAAK,MAAA,CACR;AAAA,MAED,cACC,oBAAC,aAAA,EAAY,MAAY,IAEzB,oBAAC,YAAS,KAAA,CAAY;AAAA,IAAA,EAAA,GATX,KAWf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -30,7 +30,7 @@ function ProfileFieldFilterEditor({
|
|
|
30
30
|
const state = filter.disabled || filter.kind === "none" ? "off" : filter.kind || "auto";
|
|
31
31
|
const effectiveKind = state === "auto" ? profileWizardModel.inferredFilterKind(field) : state;
|
|
32
32
|
const enabled = state !== "off" && effectiveKind !== "none";
|
|
33
|
-
const picksFromAList = effectiveKind
|
|
33
|
+
const picksFromAList = selectsValues(effectiveKind);
|
|
34
34
|
const supportsMultiple = picksFromAList || effectiveKind === "exact";
|
|
35
35
|
const enumerated = (((_a = filter.options) == null ? void 0 : _a.length) ?? 0) > 0;
|
|
36
36
|
const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);
|
|
@@ -187,8 +187,11 @@ function ProfileFieldFilterEditor({
|
|
|
187
187
|
] }) : null
|
|
188
188
|
] });
|
|
189
189
|
}
|
|
190
|
+
function selectsValues(kind) {
|
|
191
|
+
return kind === "terms" || kind === "match";
|
|
192
|
+
}
|
|
190
193
|
function filterForKind(filter, kind) {
|
|
191
|
-
if (kind
|
|
194
|
+
if (selectsValues(kind)) return filter;
|
|
192
195
|
if (kind === "exact") {
|
|
193
196
|
return profileWizardModel.patchColumnFilter(filter, {
|
|
194
197
|
options: void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldFilterEditor.cjs","sources":["../../../src/profiles/fields/profileFieldFilterEditor.tsx"],"sourcesContent":["import {\n UiDatabase,\n UiListChecks,\n UiListDashes,\n UiListOrdered,\n UiMagicWand,\n UiProhibit,\n} from \"../../icons\";\nimport { EditorField, inputClassName } from \"./profileFieldControls\";\nimport { profileFilterKindIcon } from \"./profileFieldIcons\";\nimport {\n inferredFilterKind,\n patchColumnFilter,\n PROFILE_FILTER_DEFAULT_LIMIT,\n PROFILE_FILTER_KIND_OPTIONS,\n PROFILE_FILTER_MAX_LIMIT,\n type Patch,\n type ProfileColumn,\n type ProfileColumnFilter,\n} from \"../wizard/profileWizardModel\";\n\ntype FilterState = \"auto\" | \"off\" | string;\n\nconst FILTER_SEGMENTS = [\n { value: \"auto\", label: \"Auto\", icon: <UiMagicWand /> },\n { value: \"off\", label: \"Off\", icon: <UiProhibit /> },\n ...PROFILE_FILTER_KIND_OPTIONS.filter(\n (option) => option.value !== \"none\",\n ).map((option) => ({\n ...option,\n icon: profileFilterKindIcon(option.value),\n })),\n] as const;\n\nexport function ProfileFieldFilterEditor({\n field,\n columns,\n onChange,\n}: {\n field: ProfileColumn;\n columns: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const filter = field.filter ?? {};\n const state: FilterState =\n filter.disabled || filter.kind === \"none\" ? \"off\" : filter.kind || \"auto\";\n const effectiveKind = state === \"auto\" ? inferredFilterKind(field) : state;\n const enabled = state !== \"off\" && effectiveKind !== \"none\";\n const picksFromAList = effectiveKind === \"terms\";\n const supportsMultiple = picksFromAList || effectiveKind === \"exact\";\n const enumerated = (filter.options?.length ?? 0) > 0;\n const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n\n const set = (patch: Patch<ProfileColumnFilter>) =>\n onChange({ filter: patchColumnFilter(field.filter, patch) });\n const selectState = (next: FilterState) => {\n if (next === \"off\") {\n set({\n disabled: true,\n kind: filter.kind === \"none\" ? undefined : filter.kind,\n });\n return;\n }\n const kind = next === \"auto\" ? inferredFilterKind(field) : next;\n const selected = patchColumnFilter(filter, {\n disabled: undefined,\n kind: next === \"auto\" ? undefined : next,\n });\n onChange({ filter: filterForKind(selected, kind) });\n };\n\n return (\n <section className={`grid gap-4 ${wide}`} aria-label=\"Filtering\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">Filter type</span>\n <div\n role=\"radiogroup\"\n aria-label=\"Filter type\"\n className=\"flex flex-wrap gap-1 rounded-md border bg-muted/30 p-1\"\n >\n {FILTER_SEGMENTS.map((segment) => {\n const selected = state === segment.value;\n return (\n <label\n key={segment.value}\n title={segment.label}\n className={`flex h-9 cursor-pointer items-center gap-1.5 rounded px-2 text-xs transition-colors focus-within:ring-2 focus-within:ring-primary/30 ${\n selected\n ? \"bg-background font-medium text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\"\n }`}\n >\n <input\n type=\"radio\"\n name={`filter-type-${field.name}`}\n value={segment.value}\n checked={selected}\n aria-label={segment.label}\n className=\"sr-only\"\n onChange={() => selectState(segment.value)}\n />\n <span className=\"text-[15px]\">{segment.icon}</span>\n <span>{segment.label}</span>\n </label>\n );\n })}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n Auto derives the control from the data type; choose a type to override it.\n </span>\n </div>\n\n {enabled ? (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField\n label=\"Backend field\"\n icon={<UiDatabase />}\n help=\"The indexed field for a document store, or the result column for SQL; blank infers it from the column.\"\n >\n <input\n aria-label=\"Backend field\"\n value={filter.field ?? \"\"}\n className={inputClassName}\n placeholder={field.source || field.name}\n onChange={(event) =>\n set({ field: event.target.value || undefined })\n }\n />\n </EditorField>\n {picksFromAList ? (\n <>\n <div className={wide}>\n <EditorField\n label=\"Values\"\n icon={<UiListDashes />}\n help=\"Comma-separated values to offer instead of asking the backend; leave blank to enumerate from the data.\"\n >\n <input\n aria-label=\"Values\"\n value={(filter.options ?? []).join(\", \")}\n className={inputClassName}\n placeholder=\"Ask the backend\"\n onChange={(event) =>\n set({ options: parseFilterOptions(event.target.value) })\n }\n />\n </EditorField>\n </div>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={looksUp}\n disabled={enumerated}\n onChange={(event) => set({ lookup: event.target.checked })}\n />\n <span\n className={enumerated ? \"text-muted-foreground\" : undefined}\n >\n {enumerated\n ? \"Values are listed above\"\n : \"Look values up from the data\"}\n </span>\n </label>\n <EditorField\n label=\"Values offered\"\n icon={<UiListOrdered />}\n help={`How many distinct values the control lists before the rest have to be typed. Blank uses ${PROFILE_FILTER_DEFAULT_LIMIT}.`}\n >\n <input\n aria-label=\"Values offered\"\n type=\"number\"\n min={1}\n max={PROFILE_FILTER_MAX_LIMIT}\n value={filter.limit ?? \"\"}\n disabled={!looksUp}\n className={inputClassName}\n placeholder={String(PROFILE_FILTER_DEFAULT_LIMIT)}\n onChange={(event) =>\n set({\n limit: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n </>\n ) : null}\n {supportsMultiple ? (\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={filter.multi ?? true}\n onChange={(event) => set({ multi: event.target.checked })}\n />\n <UiListChecks className=\"text-[15px] text-muted-foreground\" />\n Allow several values at once\n </label>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction filterForKind(\n filter: ProfileColumnFilter | undefined,\n kind: string,\n): ProfileColumnFilter | undefined {\n if (kind === \"terms\") return filter;\n if (kind === \"exact\") {\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n });\n }\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n multi: undefined,\n });\n}\n\nfunction parseFilterOptions(raw: string): string[] | undefined {\n const values = raw\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n return values.length ? values : undefined;\n}\n"],"names":["jsx","UiMagicWand","UiProhibit","PROFILE_FILTER_KIND_OPTIONS","profileFilterKindIcon","inferredFilterKind","patchColumnFilter","jsxs","EditorField","UiDatabase","inputClassName","Fragment","UiListDashes","UiListOrdered","PROFILE_FILTER_DEFAULT_LIMIT","PROFILE_FILTER_MAX_LIMIT","UiListChecks"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileFieldFilterEditor.cjs","sources":["../../../src/profiles/fields/profileFieldFilterEditor.tsx"],"sourcesContent":["import {\n UiDatabase,\n UiListChecks,\n UiListDashes,\n UiListOrdered,\n UiMagicWand,\n UiProhibit,\n} from \"../../icons\";\nimport { EditorField, inputClassName } from \"./profileFieldControls\";\nimport { profileFilterKindIcon } from \"./profileFieldIcons\";\nimport {\n inferredFilterKind,\n patchColumnFilter,\n PROFILE_FILTER_DEFAULT_LIMIT,\n PROFILE_FILTER_KIND_OPTIONS,\n PROFILE_FILTER_MAX_LIMIT,\n type Patch,\n type ProfileColumn,\n type ProfileColumnFilter,\n} from \"../wizard/profileWizardModel\";\n\ntype FilterState = \"auto\" | \"off\" | string;\n\nconst FILTER_SEGMENTS = [\n { value: \"auto\", label: \"Auto\", icon: <UiMagicWand /> },\n { value: \"off\", label: \"Off\", icon: <UiProhibit /> },\n ...PROFILE_FILTER_KIND_OPTIONS.filter(\n (option) => option.value !== \"none\",\n ).map((option) => ({\n ...option,\n icon: profileFilterKindIcon(option.value),\n })),\n] as const;\n\nexport function ProfileFieldFilterEditor({\n field,\n columns,\n onChange,\n}: {\n field: ProfileColumn;\n columns: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const filter = field.filter ?? {};\n const state: FilterState =\n filter.disabled || filter.kind === \"none\" ? \"off\" : filter.kind || \"auto\";\n const effectiveKind = state === \"auto\" ? inferredFilterKind(field) : state;\n const enabled = state !== \"off\" && effectiveKind !== \"none\";\n const picksFromAList = selectsValues(effectiveKind);\n const supportsMultiple = picksFromAList || effectiveKind === \"exact\";\n const enumerated = (filter.options?.length ?? 0) > 0;\n const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n\n const set = (patch: Patch<ProfileColumnFilter>) =>\n onChange({ filter: patchColumnFilter(field.filter, patch) });\n const selectState = (next: FilterState) => {\n if (next === \"off\") {\n set({\n disabled: true,\n kind: filter.kind === \"none\" ? undefined : filter.kind,\n });\n return;\n }\n const kind = next === \"auto\" ? inferredFilterKind(field) : next;\n const selected = patchColumnFilter(filter, {\n disabled: undefined,\n kind: next === \"auto\" ? undefined : next,\n });\n onChange({ filter: filterForKind(selected, kind) });\n };\n\n return (\n <section className={`grid gap-4 ${wide}`} aria-label=\"Filtering\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">Filter type</span>\n <div\n role=\"radiogroup\"\n aria-label=\"Filter type\"\n className=\"flex flex-wrap gap-1 rounded-md border bg-muted/30 p-1\"\n >\n {FILTER_SEGMENTS.map((segment) => {\n const selected = state === segment.value;\n return (\n <label\n key={segment.value}\n title={segment.label}\n className={`flex h-9 cursor-pointer items-center gap-1.5 rounded px-2 text-xs transition-colors focus-within:ring-2 focus-within:ring-primary/30 ${\n selected\n ? \"bg-background font-medium text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\"\n }`}\n >\n <input\n type=\"radio\"\n name={`filter-type-${field.name}`}\n value={segment.value}\n checked={selected}\n aria-label={segment.label}\n className=\"sr-only\"\n onChange={() => selectState(segment.value)}\n />\n <span className=\"text-[15px]\">{segment.icon}</span>\n <span>{segment.label}</span>\n </label>\n );\n })}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n Auto derives the control from the data type; choose a type to override it.\n </span>\n </div>\n\n {enabled ? (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField\n label=\"Backend field\"\n icon={<UiDatabase />}\n help=\"The indexed field for a document store, or the result column for SQL; blank infers it from the column.\"\n >\n <input\n aria-label=\"Backend field\"\n value={filter.field ?? \"\"}\n className={inputClassName}\n placeholder={field.source || field.name}\n onChange={(event) =>\n set({ field: event.target.value || undefined })\n }\n />\n </EditorField>\n {picksFromAList ? (\n <>\n <div className={wide}>\n <EditorField\n label=\"Values\"\n icon={<UiListDashes />}\n help=\"Comma-separated values to offer instead of asking the backend; leave blank to enumerate from the data.\"\n >\n <input\n aria-label=\"Values\"\n value={(filter.options ?? []).join(\", \")}\n className={inputClassName}\n placeholder=\"Ask the backend\"\n onChange={(event) =>\n set({ options: parseFilterOptions(event.target.value) })\n }\n />\n </EditorField>\n </div>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={looksUp}\n disabled={enumerated}\n onChange={(event) => set({ lookup: event.target.checked })}\n />\n <span\n className={enumerated ? \"text-muted-foreground\" : undefined}\n >\n {enumerated\n ? \"Values are listed above\"\n : \"Look values up from the data\"}\n </span>\n </label>\n <EditorField\n label=\"Values offered\"\n icon={<UiListOrdered />}\n help={`How many distinct values the control lists before the rest have to be typed. Blank uses ${PROFILE_FILTER_DEFAULT_LIMIT}.`}\n >\n <input\n aria-label=\"Values offered\"\n type=\"number\"\n min={1}\n max={PROFILE_FILTER_MAX_LIMIT}\n value={filter.limit ?? \"\"}\n disabled={!looksUp}\n className={inputClassName}\n placeholder={String(PROFILE_FILTER_DEFAULT_LIMIT)}\n onChange={(event) =>\n set({\n limit: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n </>\n ) : null}\n {supportsMultiple ? (\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={filter.multi ?? true}\n onChange={(event) => set({ multi: event.target.checked })}\n />\n <UiListChecks className=\"text-[15px] text-muted-foreground\" />\n Allow several values at once\n </label>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n}\n\n/** Whether kind picks values from a list — values, or the patterns a value\n * matches — and so takes options, a lookup and several values at once.\n * Mirrors query.ColumnFilterKind.selectsValues. */\nfunction selectsValues(kind: string): boolean {\n return kind === \"terms\" || kind === \"match\";\n}\n\nfunction filterForKind(\n filter: ProfileColumnFilter | undefined,\n kind: string,\n): ProfileColumnFilter | undefined {\n if (selectsValues(kind)) return filter;\n if (kind === \"exact\") {\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n });\n }\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n multi: undefined,\n });\n}\n\nfunction parseFilterOptions(raw: string): string[] | undefined {\n const values = raw\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n return values.length ? values : undefined;\n}\n"],"names":["jsx","UiMagicWand","UiProhibit","PROFILE_FILTER_KIND_OPTIONS","profileFilterKindIcon","inferredFilterKind","patchColumnFilter","jsxs","EditorField","UiDatabase","inputClassName","Fragment","UiListDashes","UiListOrdered","PROFILE_FILTER_DEFAULT_LIMIT","PROFILE_FILTER_MAX_LIMIT","UiListChecks"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ function ProfileFieldFilterEditor({
|
|
|
28
28
|
const state = filter.disabled || filter.kind === "none" ? "off" : filter.kind || "auto";
|
|
29
29
|
const effectiveKind = state === "auto" ? inferredFilterKind(field) : state;
|
|
30
30
|
const enabled = state !== "off" && effectiveKind !== "none";
|
|
31
|
-
const picksFromAList = effectiveKind
|
|
31
|
+
const picksFromAList = selectsValues(effectiveKind);
|
|
32
32
|
const supportsMultiple = picksFromAList || effectiveKind === "exact";
|
|
33
33
|
const enumerated = (((_a = filter.options) == null ? void 0 : _a.length) ?? 0) > 0;
|
|
34
34
|
const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);
|
|
@@ -185,8 +185,11 @@ function ProfileFieldFilterEditor({
|
|
|
185
185
|
] }) : null
|
|
186
186
|
] });
|
|
187
187
|
}
|
|
188
|
+
function selectsValues(kind) {
|
|
189
|
+
return kind === "terms" || kind === "match";
|
|
190
|
+
}
|
|
188
191
|
function filterForKind(filter, kind) {
|
|
189
|
-
if (kind
|
|
192
|
+
if (selectsValues(kind)) return filter;
|
|
190
193
|
if (kind === "exact") {
|
|
191
194
|
return patchColumnFilter(filter, {
|
|
192
195
|
options: void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldFilterEditor.js","sources":["../../../src/profiles/fields/profileFieldFilterEditor.tsx"],"sourcesContent":["import {\n UiDatabase,\n UiListChecks,\n UiListDashes,\n UiListOrdered,\n UiMagicWand,\n UiProhibit,\n} from \"../../icons\";\nimport { EditorField, inputClassName } from \"./profileFieldControls\";\nimport { profileFilterKindIcon } from \"./profileFieldIcons\";\nimport {\n inferredFilterKind,\n patchColumnFilter,\n PROFILE_FILTER_DEFAULT_LIMIT,\n PROFILE_FILTER_KIND_OPTIONS,\n PROFILE_FILTER_MAX_LIMIT,\n type Patch,\n type ProfileColumn,\n type ProfileColumnFilter,\n} from \"../wizard/profileWizardModel\";\n\ntype FilterState = \"auto\" | \"off\" | string;\n\nconst FILTER_SEGMENTS = [\n { value: \"auto\", label: \"Auto\", icon: <UiMagicWand /> },\n { value: \"off\", label: \"Off\", icon: <UiProhibit /> },\n ...PROFILE_FILTER_KIND_OPTIONS.filter(\n (option) => option.value !== \"none\",\n ).map((option) => ({\n ...option,\n icon: profileFilterKindIcon(option.value),\n })),\n] as const;\n\nexport function ProfileFieldFilterEditor({\n field,\n columns,\n onChange,\n}: {\n field: ProfileColumn;\n columns: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const filter = field.filter ?? {};\n const state: FilterState =\n filter.disabled || filter.kind === \"none\" ? \"off\" : filter.kind || \"auto\";\n const effectiveKind = state === \"auto\" ? inferredFilterKind(field) : state;\n const enabled = state !== \"off\" && effectiveKind !== \"none\";\n const picksFromAList = effectiveKind === \"terms\";\n const supportsMultiple = picksFromAList || effectiveKind === \"exact\";\n const enumerated = (filter.options?.length ?? 0) > 0;\n const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n\n const set = (patch: Patch<ProfileColumnFilter>) =>\n onChange({ filter: patchColumnFilter(field.filter, patch) });\n const selectState = (next: FilterState) => {\n if (next === \"off\") {\n set({\n disabled: true,\n kind: filter.kind === \"none\" ? undefined : filter.kind,\n });\n return;\n }\n const kind = next === \"auto\" ? inferredFilterKind(field) : next;\n const selected = patchColumnFilter(filter, {\n disabled: undefined,\n kind: next === \"auto\" ? undefined : next,\n });\n onChange({ filter: filterForKind(selected, kind) });\n };\n\n return (\n <section className={`grid gap-4 ${wide}`} aria-label=\"Filtering\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">Filter type</span>\n <div\n role=\"radiogroup\"\n aria-label=\"Filter type\"\n className=\"flex flex-wrap gap-1 rounded-md border bg-muted/30 p-1\"\n >\n {FILTER_SEGMENTS.map((segment) => {\n const selected = state === segment.value;\n return (\n <label\n key={segment.value}\n title={segment.label}\n className={`flex h-9 cursor-pointer items-center gap-1.5 rounded px-2 text-xs transition-colors focus-within:ring-2 focus-within:ring-primary/30 ${\n selected\n ? \"bg-background font-medium text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\"\n }`}\n >\n <input\n type=\"radio\"\n name={`filter-type-${field.name}`}\n value={segment.value}\n checked={selected}\n aria-label={segment.label}\n className=\"sr-only\"\n onChange={() => selectState(segment.value)}\n />\n <span className=\"text-[15px]\">{segment.icon}</span>\n <span>{segment.label}</span>\n </label>\n );\n })}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n Auto derives the control from the data type; choose a type to override it.\n </span>\n </div>\n\n {enabled ? (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField\n label=\"Backend field\"\n icon={<UiDatabase />}\n help=\"The indexed field for a document store, or the result column for SQL; blank infers it from the column.\"\n >\n <input\n aria-label=\"Backend field\"\n value={filter.field ?? \"\"}\n className={inputClassName}\n placeholder={field.source || field.name}\n onChange={(event) =>\n set({ field: event.target.value || undefined })\n }\n />\n </EditorField>\n {picksFromAList ? (\n <>\n <div className={wide}>\n <EditorField\n label=\"Values\"\n icon={<UiListDashes />}\n help=\"Comma-separated values to offer instead of asking the backend; leave blank to enumerate from the data.\"\n >\n <input\n aria-label=\"Values\"\n value={(filter.options ?? []).join(\", \")}\n className={inputClassName}\n placeholder=\"Ask the backend\"\n onChange={(event) =>\n set({ options: parseFilterOptions(event.target.value) })\n }\n />\n </EditorField>\n </div>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={looksUp}\n disabled={enumerated}\n onChange={(event) => set({ lookup: event.target.checked })}\n />\n <span\n className={enumerated ? \"text-muted-foreground\" : undefined}\n >\n {enumerated\n ? \"Values are listed above\"\n : \"Look values up from the data\"}\n </span>\n </label>\n <EditorField\n label=\"Values offered\"\n icon={<UiListOrdered />}\n help={`How many distinct values the control lists before the rest have to be typed. Blank uses ${PROFILE_FILTER_DEFAULT_LIMIT}.`}\n >\n <input\n aria-label=\"Values offered\"\n type=\"number\"\n min={1}\n max={PROFILE_FILTER_MAX_LIMIT}\n value={filter.limit ?? \"\"}\n disabled={!looksUp}\n className={inputClassName}\n placeholder={String(PROFILE_FILTER_DEFAULT_LIMIT)}\n onChange={(event) =>\n set({\n limit: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n </>\n ) : null}\n {supportsMultiple ? (\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={filter.multi ?? true}\n onChange={(event) => set({ multi: event.target.checked })}\n />\n <UiListChecks className=\"text-[15px] text-muted-foreground\" />\n Allow several values at once\n </label>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction filterForKind(\n filter: ProfileColumnFilter | undefined,\n kind: string,\n): ProfileColumnFilter | undefined {\n if (kind === \"terms\") return filter;\n if (kind === \"exact\") {\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n });\n }\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n multi: undefined,\n });\n}\n\nfunction parseFilterOptions(raw: string): string[] | undefined {\n const values = raw\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n return values.length ? values : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileFieldFilterEditor.js","sources":["../../../src/profiles/fields/profileFieldFilterEditor.tsx"],"sourcesContent":["import {\n UiDatabase,\n UiListChecks,\n UiListDashes,\n UiListOrdered,\n UiMagicWand,\n UiProhibit,\n} from \"../../icons\";\nimport { EditorField, inputClassName } from \"./profileFieldControls\";\nimport { profileFilterKindIcon } from \"./profileFieldIcons\";\nimport {\n inferredFilterKind,\n patchColumnFilter,\n PROFILE_FILTER_DEFAULT_LIMIT,\n PROFILE_FILTER_KIND_OPTIONS,\n PROFILE_FILTER_MAX_LIMIT,\n type Patch,\n type ProfileColumn,\n type ProfileColumnFilter,\n} from \"../wizard/profileWizardModel\";\n\ntype FilterState = \"auto\" | \"off\" | string;\n\nconst FILTER_SEGMENTS = [\n { value: \"auto\", label: \"Auto\", icon: <UiMagicWand /> },\n { value: \"off\", label: \"Off\", icon: <UiProhibit /> },\n ...PROFILE_FILTER_KIND_OPTIONS.filter(\n (option) => option.value !== \"none\",\n ).map((option) => ({\n ...option,\n icon: profileFilterKindIcon(option.value),\n })),\n] as const;\n\nexport function ProfileFieldFilterEditor({\n field,\n columns,\n onChange,\n}: {\n field: ProfileColumn;\n columns: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const filter = field.filter ?? {};\n const state: FilterState =\n filter.disabled || filter.kind === \"none\" ? \"off\" : filter.kind || \"auto\";\n const effectiveKind = state === \"auto\" ? inferredFilterKind(field) : state;\n const enabled = state !== \"off\" && effectiveKind !== \"none\";\n const picksFromAList = selectsValues(effectiveKind);\n const supportsMultiple = picksFromAList || effectiveKind === \"exact\";\n const enumerated = (filter.options?.length ?? 0) > 0;\n const looksUp = picksFromAList && !enumerated && (filter.lookup ?? true);\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n\n const set = (patch: Patch<ProfileColumnFilter>) =>\n onChange({ filter: patchColumnFilter(field.filter, patch) });\n const selectState = (next: FilterState) => {\n if (next === \"off\") {\n set({\n disabled: true,\n kind: filter.kind === \"none\" ? undefined : filter.kind,\n });\n return;\n }\n const kind = next === \"auto\" ? inferredFilterKind(field) : next;\n const selected = patchColumnFilter(filter, {\n disabled: undefined,\n kind: next === \"auto\" ? undefined : next,\n });\n onChange({ filter: filterForKind(selected, kind) });\n };\n\n return (\n <section className={`grid gap-4 ${wide}`} aria-label=\"Filtering\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\">Filter type</span>\n <div\n role=\"radiogroup\"\n aria-label=\"Filter type\"\n className=\"flex flex-wrap gap-1 rounded-md border bg-muted/30 p-1\"\n >\n {FILTER_SEGMENTS.map((segment) => {\n const selected = state === segment.value;\n return (\n <label\n key={segment.value}\n title={segment.label}\n className={`flex h-9 cursor-pointer items-center gap-1.5 rounded px-2 text-xs transition-colors focus-within:ring-2 focus-within:ring-primary/30 ${\n selected\n ? \"bg-background font-medium text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\"\n }`}\n >\n <input\n type=\"radio\"\n name={`filter-type-${field.name}`}\n value={segment.value}\n checked={selected}\n aria-label={segment.label}\n className=\"sr-only\"\n onChange={() => selectState(segment.value)}\n />\n <span className=\"text-[15px]\">{segment.icon}</span>\n <span>{segment.label}</span>\n </label>\n );\n })}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n Auto derives the control from the data type; choose a type to override it.\n </span>\n </div>\n\n {enabled ? (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField\n label=\"Backend field\"\n icon={<UiDatabase />}\n help=\"The indexed field for a document store, or the result column for SQL; blank infers it from the column.\"\n >\n <input\n aria-label=\"Backend field\"\n value={filter.field ?? \"\"}\n className={inputClassName}\n placeholder={field.source || field.name}\n onChange={(event) =>\n set({ field: event.target.value || undefined })\n }\n />\n </EditorField>\n {picksFromAList ? (\n <>\n <div className={wide}>\n <EditorField\n label=\"Values\"\n icon={<UiListDashes />}\n help=\"Comma-separated values to offer instead of asking the backend; leave blank to enumerate from the data.\"\n >\n <input\n aria-label=\"Values\"\n value={(filter.options ?? []).join(\", \")}\n className={inputClassName}\n placeholder=\"Ask the backend\"\n onChange={(event) =>\n set({ options: parseFilterOptions(event.target.value) })\n }\n />\n </EditorField>\n </div>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={looksUp}\n disabled={enumerated}\n onChange={(event) => set({ lookup: event.target.checked })}\n />\n <span\n className={enumerated ? \"text-muted-foreground\" : undefined}\n >\n {enumerated\n ? \"Values are listed above\"\n : \"Look values up from the data\"}\n </span>\n </label>\n <EditorField\n label=\"Values offered\"\n icon={<UiListOrdered />}\n help={`How many distinct values the control lists before the rest have to be typed. Blank uses ${PROFILE_FILTER_DEFAULT_LIMIT}.`}\n >\n <input\n aria-label=\"Values offered\"\n type=\"number\"\n min={1}\n max={PROFILE_FILTER_MAX_LIMIT}\n value={filter.limit ?? \"\"}\n disabled={!looksUp}\n className={inputClassName}\n placeholder={String(PROFILE_FILTER_DEFAULT_LIMIT)}\n onChange={(event) =>\n set({\n limit: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n </>\n ) : null}\n {supportsMultiple ? (\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={filter.multi ?? true}\n onChange={(event) => set({ multi: event.target.checked })}\n />\n <UiListChecks className=\"text-[15px] text-muted-foreground\" />\n Allow several values at once\n </label>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n}\n\n/** Whether kind picks values from a list — values, or the patterns a value\n * matches — and so takes options, a lookup and several values at once.\n * Mirrors query.ColumnFilterKind.selectsValues. */\nfunction selectsValues(kind: string): boolean {\n return kind === \"terms\" || kind === \"match\";\n}\n\nfunction filterForKind(\n filter: ProfileColumnFilter | undefined,\n kind: string,\n): ProfileColumnFilter | undefined {\n if (selectsValues(kind)) return filter;\n if (kind === \"exact\") {\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n });\n }\n return patchColumnFilter(filter, {\n options: undefined,\n lookup: undefined,\n limit: undefined,\n multi: undefined,\n });\n}\n\nfunction parseFilterOptions(raw: string): string[] | undefined {\n const values = raw\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n return values.length ? values : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ const UiListChecks = require("../../icons/components/UiListChecks.cjs");
|
|
|
23
23
|
const UiProhibit = require("../../icons/components/UiProhibit.cjs");
|
|
24
24
|
const UiSliders = require("../../icons/components/UiSliders.cjs");
|
|
25
25
|
const UiFingerprint = require("../../icons/components/UiFingerprint.cjs");
|
|
26
|
+
const UiAsterisk = require("../../icons/components/UiAsterisk.cjs");
|
|
26
27
|
const TYPE_ICONS = {
|
|
27
28
|
string: /* @__PURE__ */ jsxRuntime.jsx(UiCursorText.UiCursorText, {}),
|
|
28
29
|
number: /* @__PURE__ */ jsxRuntime.jsx(UiSigma.UiSigma, {}),
|
|
@@ -38,6 +39,7 @@ const TYPE_ICONS = {
|
|
|
38
39
|
};
|
|
39
40
|
const FILTER_KIND_ICONS = {
|
|
40
41
|
terms: /* @__PURE__ */ jsxRuntime.jsx(UiListChecks.UiListChecks, {}),
|
|
42
|
+
match: /* @__PURE__ */ jsxRuntime.jsx(UiAsterisk.UiAsterisk, {}),
|
|
41
43
|
exact: /* @__PURE__ */ jsxRuntime.jsx(UiFingerprint.UiFingerprint, {}),
|
|
42
44
|
range: /* @__PURE__ */ jsxRuntime.jsx(UiSliders.UiSliders, {}),
|
|
43
45
|
duration: /* @__PURE__ */ jsxRuntime.jsx(UiTimer.UiTimer, {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldIcons.cjs","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"sourcesContent":["/**\n * The glyphs a profile column's enums render with, and the Combobox options\n * built from them.\n *\n * The params editor gets these from the schema (`x-enum-icons`); the column\n * editor is hand-rolled, so its vocabulary lives here instead — one place both\n * the grid and the inspector read, rather than an icon picked twice.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ComboboxOption } from \"../../components/combobox-types\";\n// Monochrome UI glyphs only: the symbol icons (UiString, UiJson, UiField, …)\n// carry hardcoded IDE colours, which read as stray dots beside a form label.\nimport {\n UiActivity,\n UiBraces,\n UiCalendar,\n UiChartPie,\n UiClock,\n UiColumns,\n UiCurrencyDollar,\n UiCursorText,\n UiFingerprint,\n UiHardDrive,\n UiListChecks,\n UiListDashes,\n UiProhibit,\n UiPulse,\n UiShieldCheck,\n UiSigma,\n UiSliders,\n UiTag,\n UiTimer,\n UiToggleOn,\n} from \"../../icons\";\nimport { PROFILE_FIELD_TYPES } from \"./profileFieldTypes\";\nimport {\n PROFILE_COLUMN_FORMAT_OPTIONS,\n PROFILE_COLUMN_UNIT_OPTIONS,\n PROFILE_FILTER_KIND_OPTIONS,\n} from \"../wizard/profileWizardModel\";\n\nconst TYPE_ICONS: Record<string, ReactNode> = {\n string: <UiCursorText />,\n number: <UiSigma />,\n boolean: <UiToggleOn />,\n datetime: <UiCalendar />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n status: <UiPulse />,\n health: <UiShieldCheck />,\n key_value: <UiTag />,\n key_values: <UiListDashes />,\n json: <UiBraces />,\n};\n\n// A filter borrows the glyph of the type that infers it — duration from\n// UiTimer, date from UiCalendar — so the Type and the control it implies read\n// as one thing. Time keeps the clock, which is what makes the date/date-and-\n// time split legible at a glance.\nconst FILTER_KIND_ICONS: Record<string, ReactNode> = {\n terms: <UiListChecks />,\n exact: <UiFingerprint />,\n range: <UiSliders />,\n duration: <UiTimer />,\n date: <UiCalendar />,\n time: <UiClock />,\n boolean: <UiToggleOn />,\n text: <UiCursorText />,\n none: <UiProhibit />,\n};\n\nconst ROLE_ICONS: Record<string, ReactNode> = {\n timestamp: <UiClock />,\n tags: <UiTag />,\n status: <UiPulse />,\n};\n\nconst FORMAT_ICONS: Record<string, ReactNode> = {\n date: <UiCalendar />,\n float: <UiSigma />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n currency: <UiCurrencyDollar />,\n};\n\nconst UNIT_ICONS: Record<string, ReactNode> = {\n none: <UiSigma />,\n short: <UiSigma />,\n percent: <UiChartPie />,\n percentunit: <UiChartPie />,\n bytes: <UiHardDrive />,\n decbytes: <UiHardDrive />,\n Bps: <UiActivity />,\n binBps: <UiActivity />,\n ms: <UiTimer />,\n s: <UiTimer />,\n};\n\nexport function profileTypeIcon(type?: string): ReactNode {\n return (type && TYPE_ICONS[type]) ?? <UiColumns />;\n}\n\nexport function profileFilterKindIcon(kind: string): ReactNode {\n return FILTER_KIND_ICONS[kind] ?? <UiListChecks />;\n}\n\nexport const profileTypeOptions: ComboboxOption[] = PROFILE_FIELD_TYPES.map((type) => ({\n value: type,\n label: type,\n icon: TYPE_ICONS[type],\n}));\n\nexport const profileRoleOptions: ComboboxOption[] = [\n { value: \"timestamp\", label: \"Timestamp\", icon: ROLE_ICONS[\"timestamp\"] },\n { value: \"tags\", label: \"Tags\", icon: ROLE_ICONS[\"tags\"] },\n { value: \"status\", label: \"Status\", icon: ROLE_ICONS[\"status\"] },\n];\n\nexport const profileFormatOptions: ComboboxOption[] = PROFILE_COLUMN_FORMAT_OPTIONS.map(\n (option) => ({ ...option, icon: FORMAT_ICONS[option.value] }),\n);\n\nexport const profileUnitOptions: ComboboxOption[] = PROFILE_COLUMN_UNIT_OPTIONS.map(\n (option) => ({ ...option, icon: UNIT_ICONS[option.value] }),\n);\n\nexport const profileFilterKindOptions: ComboboxOption[] = PROFILE_FILTER_KIND_OPTIONS.map(\n (option) => ({ ...option, icon: FILTER_KIND_ICONS[option.value] }),\n);\n"],"names":["UiCursorText","UiSigma","UiToggleOn","UiCalendar","UiTimer","UiHardDrive","UiPulse","UiShieldCheck","UiTag","UiListDashes","UiBraces","UiListChecks","UiFingerprint","UiSliders","UiClock","UiProhibit","UiCurrencyDollar","UiChartPie","UiActivity","UiColumns","jsx","PROFILE_FIELD_TYPES","PROFILE_COLUMN_FORMAT_OPTIONS","PROFILE_COLUMN_UNIT_OPTIONS","PROFILE_FILTER_KIND_OPTIONS"],"mappings":"
|
|
1
|
+
{"version":3,"file":"profileFieldIcons.cjs","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"sourcesContent":["/**\n * The glyphs a profile column's enums render with, and the Combobox options\n * built from them.\n *\n * The params editor gets these from the schema (`x-enum-icons`); the column\n * editor is hand-rolled, so its vocabulary lives here instead — one place both\n * the grid and the inspector read, rather than an icon picked twice.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ComboboxOption } from \"../../components/combobox-types\";\n// Monochrome UI glyphs only: the symbol icons (UiString, UiJson, UiField, …)\n// carry hardcoded IDE colours, which read as stray dots beside a form label.\nimport {\n UiActivity,\n UiAsterisk,\n UiBraces,\n UiCalendar,\n UiChartPie,\n UiClock,\n UiColumns,\n UiCurrencyDollar,\n UiCursorText,\n UiFingerprint,\n UiHardDrive,\n UiListChecks,\n UiListDashes,\n UiProhibit,\n UiPulse,\n UiShieldCheck,\n UiSigma,\n UiSliders,\n UiTag,\n UiTimer,\n UiToggleOn,\n} from \"../../icons\";\nimport { PROFILE_FIELD_TYPES } from \"./profileFieldTypes\";\nimport {\n PROFILE_COLUMN_FORMAT_OPTIONS,\n PROFILE_COLUMN_UNIT_OPTIONS,\n PROFILE_FILTER_KIND_OPTIONS,\n} from \"../wizard/profileWizardModel\";\n\nconst TYPE_ICONS: Record<string, ReactNode> = {\n string: <UiCursorText />,\n number: <UiSigma />,\n boolean: <UiToggleOn />,\n datetime: <UiCalendar />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n status: <UiPulse />,\n health: <UiShieldCheck />,\n key_value: <UiTag />,\n key_values: <UiListDashes />,\n json: <UiBraces />,\n};\n\n// A filter borrows the glyph of the type that infers it — duration from\n// UiTimer, date from UiCalendar — so the Type and the control it implies read\n// as one thing. Time keeps the clock, which is what makes the date/date-and-\n// time split legible at a glance.\nconst FILTER_KIND_ICONS: Record<string, ReactNode> = {\n terms: <UiListChecks />,\n match: <UiAsterisk />,\n exact: <UiFingerprint />,\n range: <UiSliders />,\n duration: <UiTimer />,\n date: <UiCalendar />,\n time: <UiClock />,\n boolean: <UiToggleOn />,\n text: <UiCursorText />,\n none: <UiProhibit />,\n};\n\nconst ROLE_ICONS: Record<string, ReactNode> = {\n timestamp: <UiClock />,\n tags: <UiTag />,\n status: <UiPulse />,\n};\n\nconst FORMAT_ICONS: Record<string, ReactNode> = {\n date: <UiCalendar />,\n float: <UiSigma />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n currency: <UiCurrencyDollar />,\n};\n\nconst UNIT_ICONS: Record<string, ReactNode> = {\n none: <UiSigma />,\n short: <UiSigma />,\n percent: <UiChartPie />,\n percentunit: <UiChartPie />,\n bytes: <UiHardDrive />,\n decbytes: <UiHardDrive />,\n Bps: <UiActivity />,\n binBps: <UiActivity />,\n ms: <UiTimer />,\n s: <UiTimer />,\n};\n\nexport function profileTypeIcon(type?: string): ReactNode {\n return (type && TYPE_ICONS[type]) ?? <UiColumns />;\n}\n\nexport function profileFilterKindIcon(kind: string): ReactNode {\n return FILTER_KIND_ICONS[kind] ?? <UiListChecks />;\n}\n\nexport const profileTypeOptions: ComboboxOption[] = PROFILE_FIELD_TYPES.map((type) => ({\n value: type,\n label: type,\n icon: TYPE_ICONS[type],\n}));\n\nexport const profileRoleOptions: ComboboxOption[] = [\n { value: \"timestamp\", label: \"Timestamp\", icon: ROLE_ICONS[\"timestamp\"] },\n { value: \"tags\", label: \"Tags\", icon: ROLE_ICONS[\"tags\"] },\n { value: \"status\", label: \"Status\", icon: ROLE_ICONS[\"status\"] },\n];\n\nexport const profileFormatOptions: ComboboxOption[] = PROFILE_COLUMN_FORMAT_OPTIONS.map(\n (option) => ({ ...option, icon: FORMAT_ICONS[option.value] }),\n);\n\nexport const profileUnitOptions: ComboboxOption[] = PROFILE_COLUMN_UNIT_OPTIONS.map(\n (option) => ({ ...option, icon: UNIT_ICONS[option.value] }),\n);\n\nexport const profileFilterKindOptions: ComboboxOption[] = PROFILE_FILTER_KIND_OPTIONS.map(\n (option) => ({ ...option, icon: FILTER_KIND_ICONS[option.value] }),\n);\n"],"names":["UiCursorText","UiSigma","UiToggleOn","UiCalendar","UiTimer","UiHardDrive","UiPulse","UiShieldCheck","UiTag","UiListDashes","UiBraces","UiListChecks","UiAsterisk","UiFingerprint","UiSliders","UiClock","UiProhibit","UiCurrencyDollar","UiChartPie","UiActivity","UiColumns","jsx","PROFILE_FIELD_TYPES","PROFILE_COLUMN_FORMAT_OPTIONS","PROFILE_COLUMN_UNIT_OPTIONS","PROFILE_FILTER_KIND_OPTIONS"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,aAAwC;AAAA,EAC5C,uCAASA,aAAAA,cAAA,EAAa;AAAA,EACtB,uCAASC,QAAAA,SAAA,EAAQ;AAAA,EACjB,wCAAUC,WAAAA,YAAA,EAAW;AAAA,EACrB,yCAAWC,WAAAA,YAAA,EAAW;AAAA,EACtB,yCAAWC,QAAAA,SAAA,EAAQ;AAAA,EACnB,sCAAQC,YAAAA,aAAA,EAAY;AAAA,EACpB,uCAASC,QAAAA,SAAA,EAAQ;AAAA,EACjB,uCAASC,SAAAA,eAAA,EAAc;AAAA,EACvB,0CAAYC,MAAAA,OAAA,EAAM;AAAA,EAClB,2CAAaC,aAAAA,cAAA,EAAa;AAAA,EAC1B,qCAAOC,SAAAA,UAAA,CAAA,CAAS;AAClB;AAMA,MAAM,oBAA+C;AAAA,EACnD,sCAAQC,aAAAA,cAAA,EAAa;AAAA,EACrB,sCAAQC,WAAAA,YAAA,EAAW;AAAA,EACnB,sCAAQC,cAAAA,eAAA,EAAc;AAAA,EACtB,sCAAQC,UAAAA,WAAA,EAAU;AAAA,EAClB,yCAAWV,QAAAA,SAAA,EAAQ;AAAA,EACnB,qCAAOD,WAAAA,YAAA,EAAW;AAAA,EAClB,qCAAOY,QAAAA,SAAA,EAAQ;AAAA,EACf,wCAAUb,WAAAA,YAAA,EAAW;AAAA,EACrB,qCAAOF,aAAAA,cAAA,EAAa;AAAA,EACpB,qCAAOgB,WAAAA,YAAA,CAAA,CAAW;AACpB;AAEA,MAAM,aAAwC;AAAA,EAC5C,0CAAYD,QAAAA,SAAA,EAAQ;AAAA,EACpB,qCAAOP,MAAAA,OAAA,EAAM;AAAA,EACb,uCAASF,QAAAA,SAAA,CAAA,CAAQ;AACnB;AAEA,MAAM,eAA0C;AAAA,EAC9C,qCAAOH,WAAAA,YAAA,EAAW;AAAA,EAClB,sCAAQF,QAAAA,SAAA,EAAQ;AAAA,EAChB,yCAAWG,QAAAA,SAAA,EAAQ;AAAA,EACnB,sCAAQC,YAAAA,aAAA,EAAY;AAAA,EACpB,yCAAWY,iBAAAA,kBAAA,CAAA,CAAiB;AAC9B;AAEA,MAAM,aAAwC;AAAA,EAC5C,qCAAOhB,QAAAA,SAAA,EAAQ;AAAA,EACf,sCAAQA,QAAAA,SAAA,EAAQ;AAAA,EAChB,wCAAUiB,WAAAA,YAAA,EAAW;AAAA,EACrB,4CAAcA,WAAAA,YAAA,EAAW;AAAA,EACzB,sCAAQb,YAAAA,aAAA,EAAY;AAAA,EACpB,yCAAWA,YAAAA,aAAA,EAAY;AAAA,EACvB,oCAAMc,WAAAA,YAAA,EAAW;AAAA,EACjB,uCAASA,WAAAA,YAAA,EAAW;AAAA,EACpB,mCAAKf,QAAAA,SAAA,EAAQ;AAAA,EACb,kCAAIA,QAAAA,SAAA,CAAA,CAAQ;AACd;AAEO,SAAS,gBAAgB,MAA0B;AACxD,UAAQ,QAAQ,WAAW,IAAI,qCAAOgB,UAAAA,WAAA,EAAU;AAClD;AAEO,SAAS,sBAAsB,MAAyB;AAC7D,SAAO,kBAAkB,IAAI,KAAKC,2BAAAA,IAACV,aAAAA,cAAA,CAAA,CAAa;AAClD;AAEO,MAAM,qBAAuCW,kBAAAA,oBAAoB,IAAI,CAAC,UAAU;AAAA,EACrF,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,WAAW,IAAI;AACvB,EAAE;AAEK,MAAM,qBAAuC;AAAA,EAClD,EAAE,OAAO,aAAa,OAAO,aAAa,MAAM,WAAW,WAAW,EAAA;AAAA,EACtE,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,WAAW,MAAM,EAAA;AAAA,EACvD,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,QAAQ,EAAA;AAC/D;AAEO,MAAM,uBAAyCC,mBAAAA,8BAA8B;AAAA,EAClF,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,aAAa,OAAO,KAAK,EAAA;AAC3D;AAEO,MAAM,qBAAuCC,mBAAAA,4BAA4B;AAAA,EAC9E,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,WAAW,OAAO,KAAK,EAAA;AACzD;AAE0DC,mBAAAA,4BAA4B;AAAA,EACpF,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,kBAAkB,OAAO,KAAK,EAAA;AAChE;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldIcons.d.ts","sourceRoot":"","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"profileFieldIcons.d.ts","sourceRoot":"","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AA2FtE,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAExD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAE7D;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAI5C,CAAC;AAEJ,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAI9C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAEhD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAE9C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,cAAc,EAEpD,CAAC"}
|
|
@@ -21,6 +21,7 @@ import { UiListChecks } from "../../icons/components/UiListChecks.js";
|
|
|
21
21
|
import { UiProhibit } from "../../icons/components/UiProhibit.js";
|
|
22
22
|
import { UiSliders } from "../../icons/components/UiSliders.js";
|
|
23
23
|
import { UiFingerprint } from "../../icons/components/UiFingerprint.js";
|
|
24
|
+
import { UiAsterisk } from "../../icons/components/UiAsterisk.js";
|
|
24
25
|
const TYPE_ICONS = {
|
|
25
26
|
string: /* @__PURE__ */ jsx(UiCursorText, {}),
|
|
26
27
|
number: /* @__PURE__ */ jsx(UiSigma, {}),
|
|
@@ -36,6 +37,7 @@ const TYPE_ICONS = {
|
|
|
36
37
|
};
|
|
37
38
|
const FILTER_KIND_ICONS = {
|
|
38
39
|
terms: /* @__PURE__ */ jsx(UiListChecks, {}),
|
|
40
|
+
match: /* @__PURE__ */ jsx(UiAsterisk, {}),
|
|
39
41
|
exact: /* @__PURE__ */ jsx(UiFingerprint, {}),
|
|
40
42
|
range: /* @__PURE__ */ jsx(UiSliders, {}),
|
|
41
43
|
duration: /* @__PURE__ */ jsx(UiTimer, {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldIcons.js","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"sourcesContent":["/**\n * The glyphs a profile column's enums render with, and the Combobox options\n * built from them.\n *\n * The params editor gets these from the schema (`x-enum-icons`); the column\n * editor is hand-rolled, so its vocabulary lives here instead — one place both\n * the grid and the inspector read, rather than an icon picked twice.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ComboboxOption } from \"../../components/combobox-types\";\n// Monochrome UI glyphs only: the symbol icons (UiString, UiJson, UiField, …)\n// carry hardcoded IDE colours, which read as stray dots beside a form label.\nimport {\n UiActivity,\n UiBraces,\n UiCalendar,\n UiChartPie,\n UiClock,\n UiColumns,\n UiCurrencyDollar,\n UiCursorText,\n UiFingerprint,\n UiHardDrive,\n UiListChecks,\n UiListDashes,\n UiProhibit,\n UiPulse,\n UiShieldCheck,\n UiSigma,\n UiSliders,\n UiTag,\n UiTimer,\n UiToggleOn,\n} from \"../../icons\";\nimport { PROFILE_FIELD_TYPES } from \"./profileFieldTypes\";\nimport {\n PROFILE_COLUMN_FORMAT_OPTIONS,\n PROFILE_COLUMN_UNIT_OPTIONS,\n PROFILE_FILTER_KIND_OPTIONS,\n} from \"../wizard/profileWizardModel\";\n\nconst TYPE_ICONS: Record<string, ReactNode> = {\n string: <UiCursorText />,\n number: <UiSigma />,\n boolean: <UiToggleOn />,\n datetime: <UiCalendar />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n status: <UiPulse />,\n health: <UiShieldCheck />,\n key_value: <UiTag />,\n key_values: <UiListDashes />,\n json: <UiBraces />,\n};\n\n// A filter borrows the glyph of the type that infers it — duration from\n// UiTimer, date from UiCalendar — so the Type and the control it implies read\n// as one thing. Time keeps the clock, which is what makes the date/date-and-\n// time split legible at a glance.\nconst FILTER_KIND_ICONS: Record<string, ReactNode> = {\n terms: <UiListChecks />,\n exact: <UiFingerprint />,\n range: <UiSliders />,\n duration: <UiTimer />,\n date: <UiCalendar />,\n time: <UiClock />,\n boolean: <UiToggleOn />,\n text: <UiCursorText />,\n none: <UiProhibit />,\n};\n\nconst ROLE_ICONS: Record<string, ReactNode> = {\n timestamp: <UiClock />,\n tags: <UiTag />,\n status: <UiPulse />,\n};\n\nconst FORMAT_ICONS: Record<string, ReactNode> = {\n date: <UiCalendar />,\n float: <UiSigma />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n currency: <UiCurrencyDollar />,\n};\n\nconst UNIT_ICONS: Record<string, ReactNode> = {\n none: <UiSigma />,\n short: <UiSigma />,\n percent: <UiChartPie />,\n percentunit: <UiChartPie />,\n bytes: <UiHardDrive />,\n decbytes: <UiHardDrive />,\n Bps: <UiActivity />,\n binBps: <UiActivity />,\n ms: <UiTimer />,\n s: <UiTimer />,\n};\n\nexport function profileTypeIcon(type?: string): ReactNode {\n return (type && TYPE_ICONS[type]) ?? <UiColumns />;\n}\n\nexport function profileFilterKindIcon(kind: string): ReactNode {\n return FILTER_KIND_ICONS[kind] ?? <UiListChecks />;\n}\n\nexport const profileTypeOptions: ComboboxOption[] = PROFILE_FIELD_TYPES.map((type) => ({\n value: type,\n label: type,\n icon: TYPE_ICONS[type],\n}));\n\nexport const profileRoleOptions: ComboboxOption[] = [\n { value: \"timestamp\", label: \"Timestamp\", icon: ROLE_ICONS[\"timestamp\"] },\n { value: \"tags\", label: \"Tags\", icon: ROLE_ICONS[\"tags\"] },\n { value: \"status\", label: \"Status\", icon: ROLE_ICONS[\"status\"] },\n];\n\nexport const profileFormatOptions: ComboboxOption[] = PROFILE_COLUMN_FORMAT_OPTIONS.map(\n (option) => ({ ...option, icon: FORMAT_ICONS[option.value] }),\n);\n\nexport const profileUnitOptions: ComboboxOption[] = PROFILE_COLUMN_UNIT_OPTIONS.map(\n (option) => ({ ...option, icon: UNIT_ICONS[option.value] }),\n);\n\nexport const profileFilterKindOptions: ComboboxOption[] = PROFILE_FILTER_KIND_OPTIONS.map(\n (option) => ({ ...option, icon: FILTER_KIND_ICONS[option.value] }),\n);\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"profileFieldIcons.js","sources":["../../../src/profiles/fields/profileFieldIcons.tsx"],"sourcesContent":["/**\n * The glyphs a profile column's enums render with, and the Combobox options\n * built from them.\n *\n * The params editor gets these from the schema (`x-enum-icons`); the column\n * editor is hand-rolled, so its vocabulary lives here instead — one place both\n * the grid and the inspector read, rather than an icon picked twice.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ComboboxOption } from \"../../components/combobox-types\";\n// Monochrome UI glyphs only: the symbol icons (UiString, UiJson, UiField, …)\n// carry hardcoded IDE colours, which read as stray dots beside a form label.\nimport {\n UiActivity,\n UiAsterisk,\n UiBraces,\n UiCalendar,\n UiChartPie,\n UiClock,\n UiColumns,\n UiCurrencyDollar,\n UiCursorText,\n UiFingerprint,\n UiHardDrive,\n UiListChecks,\n UiListDashes,\n UiProhibit,\n UiPulse,\n UiShieldCheck,\n UiSigma,\n UiSliders,\n UiTag,\n UiTimer,\n UiToggleOn,\n} from \"../../icons\";\nimport { PROFILE_FIELD_TYPES } from \"./profileFieldTypes\";\nimport {\n PROFILE_COLUMN_FORMAT_OPTIONS,\n PROFILE_COLUMN_UNIT_OPTIONS,\n PROFILE_FILTER_KIND_OPTIONS,\n} from \"../wizard/profileWizardModel\";\n\nconst TYPE_ICONS: Record<string, ReactNode> = {\n string: <UiCursorText />,\n number: <UiSigma />,\n boolean: <UiToggleOn />,\n datetime: <UiCalendar />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n status: <UiPulse />,\n health: <UiShieldCheck />,\n key_value: <UiTag />,\n key_values: <UiListDashes />,\n json: <UiBraces />,\n};\n\n// A filter borrows the glyph of the type that infers it — duration from\n// UiTimer, date from UiCalendar — so the Type and the control it implies read\n// as one thing. Time keeps the clock, which is what makes the date/date-and-\n// time split legible at a glance.\nconst FILTER_KIND_ICONS: Record<string, ReactNode> = {\n terms: <UiListChecks />,\n match: <UiAsterisk />,\n exact: <UiFingerprint />,\n range: <UiSliders />,\n duration: <UiTimer />,\n date: <UiCalendar />,\n time: <UiClock />,\n boolean: <UiToggleOn />,\n text: <UiCursorText />,\n none: <UiProhibit />,\n};\n\nconst ROLE_ICONS: Record<string, ReactNode> = {\n timestamp: <UiClock />,\n tags: <UiTag />,\n status: <UiPulse />,\n};\n\nconst FORMAT_ICONS: Record<string, ReactNode> = {\n date: <UiCalendar />,\n float: <UiSigma />,\n duration: <UiTimer />,\n bytes: <UiHardDrive />,\n currency: <UiCurrencyDollar />,\n};\n\nconst UNIT_ICONS: Record<string, ReactNode> = {\n none: <UiSigma />,\n short: <UiSigma />,\n percent: <UiChartPie />,\n percentunit: <UiChartPie />,\n bytes: <UiHardDrive />,\n decbytes: <UiHardDrive />,\n Bps: <UiActivity />,\n binBps: <UiActivity />,\n ms: <UiTimer />,\n s: <UiTimer />,\n};\n\nexport function profileTypeIcon(type?: string): ReactNode {\n return (type && TYPE_ICONS[type]) ?? <UiColumns />;\n}\n\nexport function profileFilterKindIcon(kind: string): ReactNode {\n return FILTER_KIND_ICONS[kind] ?? <UiListChecks />;\n}\n\nexport const profileTypeOptions: ComboboxOption[] = PROFILE_FIELD_TYPES.map((type) => ({\n value: type,\n label: type,\n icon: TYPE_ICONS[type],\n}));\n\nexport const profileRoleOptions: ComboboxOption[] = [\n { value: \"timestamp\", label: \"Timestamp\", icon: ROLE_ICONS[\"timestamp\"] },\n { value: \"tags\", label: \"Tags\", icon: ROLE_ICONS[\"tags\"] },\n { value: \"status\", label: \"Status\", icon: ROLE_ICONS[\"status\"] },\n];\n\nexport const profileFormatOptions: ComboboxOption[] = PROFILE_COLUMN_FORMAT_OPTIONS.map(\n (option) => ({ ...option, icon: FORMAT_ICONS[option.value] }),\n);\n\nexport const profileUnitOptions: ComboboxOption[] = PROFILE_COLUMN_UNIT_OPTIONS.map(\n (option) => ({ ...option, icon: UNIT_ICONS[option.value] }),\n);\n\nexport const profileFilterKindOptions: ComboboxOption[] = PROFILE_FILTER_KIND_OPTIONS.map(\n (option) => ({ ...option, icon: FILTER_KIND_ICONS[option.value] }),\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,aAAwC;AAAA,EAC5C,4BAAS,cAAA,EAAa;AAAA,EACtB,4BAAS,SAAA,EAAQ;AAAA,EACjB,6BAAU,YAAA,EAAW;AAAA,EACrB,8BAAW,YAAA,EAAW;AAAA,EACtB,8BAAW,SAAA,EAAQ;AAAA,EACnB,2BAAQ,aAAA,EAAY;AAAA,EACpB,4BAAS,SAAA,EAAQ;AAAA,EACjB,4BAAS,eAAA,EAAc;AAAA,EACvB,+BAAY,OAAA,EAAM;AAAA,EAClB,gCAAa,cAAA,EAAa;AAAA,EAC1B,0BAAO,UAAA,CAAA,CAAS;AAClB;AAMA,MAAM,oBAA+C;AAAA,EACnD,2BAAQ,cAAA,EAAa;AAAA,EACrB,2BAAQ,YAAA,EAAW;AAAA,EACnB,2BAAQ,eAAA,EAAc;AAAA,EACtB,2BAAQ,WAAA,EAAU;AAAA,EAClB,8BAAW,SAAA,EAAQ;AAAA,EACnB,0BAAO,YAAA,EAAW;AAAA,EAClB,0BAAO,SAAA,EAAQ;AAAA,EACf,6BAAU,YAAA,EAAW;AAAA,EACrB,0BAAO,cAAA,EAAa;AAAA,EACpB,0BAAO,YAAA,CAAA,CAAW;AACpB;AAEA,MAAM,aAAwC;AAAA,EAC5C,+BAAY,SAAA,EAAQ;AAAA,EACpB,0BAAO,OAAA,EAAM;AAAA,EACb,4BAAS,SAAA,CAAA,CAAQ;AACnB;AAEA,MAAM,eAA0C;AAAA,EAC9C,0BAAO,YAAA,EAAW;AAAA,EAClB,2BAAQ,SAAA,EAAQ;AAAA,EAChB,8BAAW,SAAA,EAAQ;AAAA,EACnB,2BAAQ,aAAA,EAAY;AAAA,EACpB,8BAAW,kBAAA,CAAA,CAAiB;AAC9B;AAEA,MAAM,aAAwC;AAAA,EAC5C,0BAAO,SAAA,EAAQ;AAAA,EACf,2BAAQ,SAAA,EAAQ;AAAA,EAChB,6BAAU,YAAA,EAAW;AAAA,EACrB,iCAAc,YAAA,EAAW;AAAA,EACzB,2BAAQ,aAAA,EAAY;AAAA,EACpB,8BAAW,aAAA,EAAY;AAAA,EACvB,yBAAM,YAAA,EAAW;AAAA,EACjB,4BAAS,YAAA,EAAW;AAAA,EACpB,wBAAK,SAAA,EAAQ;AAAA,EACb,uBAAI,SAAA,CAAA,CAAQ;AACd;AAEO,SAAS,gBAAgB,MAA0B;AACxD,UAAQ,QAAQ,WAAW,IAAI,0BAAO,WAAA,EAAU;AAClD;AAEO,SAAS,sBAAsB,MAAyB;AAC7D,SAAO,kBAAkB,IAAI,KAAK,oBAAC,cAAA,CAAA,CAAa;AAClD;AAEO,MAAM,qBAAuC,oBAAoB,IAAI,CAAC,UAAU;AAAA,EACrF,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,WAAW,IAAI;AACvB,EAAE;AAEK,MAAM,qBAAuC;AAAA,EAClD,EAAE,OAAO,aAAa,OAAO,aAAa,MAAM,WAAW,WAAW,EAAA;AAAA,EACtE,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,WAAW,MAAM,EAAA;AAAA,EACvD,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,WAAW,QAAQ,EAAA;AAC/D;AAEO,MAAM,uBAAyC,8BAA8B;AAAA,EAClF,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,aAAa,OAAO,KAAK,EAAA;AAC3D;AAEO,MAAM,qBAAuC,4BAA4B;AAAA,EAC9E,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,WAAW,OAAO,KAAK,EAAA;AACzD;AAE0D,4BAA4B;AAAA,EACpF,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,kBAAkB,OAAO,KAAK,EAAA;AAChE;"}
|
|
@@ -95,6 +95,7 @@ function applyVisibleFieldSelection(discovered, configured, visibleNames, select
|
|
|
95
95
|
}
|
|
96
96
|
const PROFILE_FILTER_KIND_OPTIONS = [
|
|
97
97
|
{ value: "terms", label: "Value list" },
|
|
98
|
+
{ value: "match", label: "Pattern list" },
|
|
98
99
|
{ value: "exact", label: "Exact match" },
|
|
99
100
|
{ value: "text", label: "Text search" },
|
|
100
101
|
{ value: "range", label: "Numeric range" },
|