@memberjunction/ng-conversations 6.2.0-edge.3 → 6.2.0-edge.5
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/README.md +33 -7
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +1 -0
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +14 -2
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +35 -4
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +651 -53
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +3002 -661
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/forks-popover.component.d.ts +37 -0
- package/dist/lib/components/conversation/forks-popover.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/forks-popover.component.js +164 -0
- package/dist/lib/components/conversation/forks-popover.component.js.map +1 -0
- package/dist/lib/components/export/export-modal.component.d.ts +7 -2
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +16 -3
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +11 -9
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +96 -11
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +253 -112
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +304 -16
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +2029 -363
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +101 -22
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +326 -55
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts +34 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js +75 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts +80 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js +202 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts +45 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js +123 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts +90 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.js +223 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts +98 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.js +161 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts +48 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js +205 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +19 -2
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.js +83 -9
- package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +30 -9
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +78 -14
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts +71 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js +259 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts +129 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.js +373 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.js.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts +77 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js +420 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.d.ts +83 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.js +292 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts +39 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.js +152 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts +109 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.js +146 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts +19 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.js +39 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts +183 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js +761 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts +25 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.js +57 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts +40 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js +97 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts +144 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.js +57 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts +36 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.js +55 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts +55 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js +210 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts +32 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +90 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts +7 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.js +28 -1
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +8 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +89 -71
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts +21 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.js +49 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +44 -11
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +162 -50
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +8 -2
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.js +14 -18
- package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +42 -2
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +137 -102
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts +71 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.js +221 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +264 -22
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +851 -135
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts +14 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.js +14 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts +74 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.js +171 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +71 -13
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +232 -73
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +5 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +8 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +12 -2
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +5 -1
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +10 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +42 -2
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +20 -3
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +44 -10
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +28 -44
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +76 -162
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts +2 -0
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +25 -12
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +33 -32
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +72 -88
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +30 -29
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +27 -5
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +25 -0
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +36 -0
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +5 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
- package/dist/lib/models/agent-turn.model.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +34 -8
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +90 -37
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +0 -9
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +1 -32
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.d.ts +19 -7
- package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.js +21 -72
- package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +48 -16
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +110 -35
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-detail-window.store.d.ts +22 -4
- package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
- package/dist/lib/services/conversation-detail-window.store.js +50 -9
- package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
- package/dist/lib/services/conversation-naming.d.ts +72 -22
- package/dist/lib/services/conversation-naming.d.ts.map +1 -1
- package/dist/lib/services/conversation-naming.js +93 -12
- package/dist/lib/services/conversation-naming.js.map +1 -1
- package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
- package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
- package/dist/lib/services/conversation-tasks-filter.js +69 -0
- package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
- package/dist/lib/services/data-cache.service.d.ts +13 -5
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +39 -19
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +26 -9
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +61 -18
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +115 -79
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.js +273 -186
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pairing.d.ts +10 -5
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
- package/dist/lib/services/realtime-pairing.js +15 -6
- package/dist/lib/services/realtime-pairing.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +31 -2
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +34 -2
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
- package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
- package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
- package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
- package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
- package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
- package/dist/lib/services/recording/libopus-worker-source.js +170 -0
- package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
- package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
- package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
- package/dist/lib/services/recording/linear-resampler.js +85 -0
- package/dist/lib/services/recording/linear-resampler.js.map +1 -0
- package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
- package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
- package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
- package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
- package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
- package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
- package/dist/lib/services/search.service.d.ts +7 -2
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +16 -20
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/utils/conversation-branching.d.ts +4 -0
- package/dist/lib/utils/conversation-branching.d.ts.map +1 -0
- package/dist/lib/utils/conversation-branching.js +5 -0
- package/dist/lib/utils/conversation-branching.js.map +1 -0
- package/dist/lib/utils/conversation-forks.d.ts +315 -0
- package/dist/lib/utils/conversation-forks.d.ts.map +1 -0
- package/dist/lib/utils/conversation-forks.js +456 -0
- package/dist/lib/utils/conversation-forks.js.map +1 -0
- package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +24 -5
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/dist/public-api.d.ts +23 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +30 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +37 -33
- package/dist/lib/components/thread/thread-panel.component.d.ts +0 -126
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +0 -1
- package/dist/lib/components/thread/thread-panel.component.js +0 -440
- package/dist/lib/components/thread/thread-panel.component.js.map +0 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
- package/dist/lib/services/realtime-pcm-wav.js +0 -213
- package/dist/lib/services/realtime-pcm-wav.js.map +0 -1
|
@@ -143,7 +143,13 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_C
|
|
|
143
143
|
i0.ɵɵadvance(2);
|
|
144
144
|
i0.ɵɵtextInterpolate1(" ", result_r11.conversationName, " ");
|
|
145
145
|
} }
|
|
146
|
-
function
|
|
146
|
+
function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
147
|
+
i0.ɵɵelementStart(0, "span", 57);
|
|
148
|
+
i0.ɵɵelement(1, "i", 58);
|
|
149
|
+
i0.ɵɵtext(2, " in a fork");
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
151
|
+
} }
|
|
152
|
+
function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
147
153
|
i0.ɵɵelement(0, "div", 53);
|
|
148
154
|
} if (rf & 2) {
|
|
149
155
|
const result_r11 = i0.ɵɵnextContext().$implicit;
|
|
@@ -159,11 +165,12 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_T
|
|
|
159
165
|
i0.ɵɵelementEnd();
|
|
160
166
|
i0.ɵɵelementStart(3, "div", 50);
|
|
161
167
|
i0.ɵɵconditionalCreate(4, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Conditional_4_Template, 3, 1, "div", 56);
|
|
162
|
-
i0.ɵɵ
|
|
163
|
-
i0.ɵɵ
|
|
168
|
+
i0.ɵɵconditionalCreate(5, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Conditional_5_Template, 3, 0, "span", 57);
|
|
169
|
+
i0.ɵɵelement(6, "div", 52);
|
|
170
|
+
i0.ɵɵconditionalCreate(7, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Conditional_7_Template, 1, 1, "div", 53);
|
|
164
171
|
i0.ɵɵelementEnd();
|
|
165
|
-
i0.ɵɵelementStart(
|
|
166
|
-
i0.ɵɵtext(
|
|
172
|
+
i0.ɵɵelementStart(8, "div", 54)(9, "span", 55);
|
|
173
|
+
i0.ɵɵtext(10);
|
|
167
174
|
i0.ɵɵelementEnd()()();
|
|
168
175
|
} if (rf & 2) {
|
|
169
176
|
const result_r11 = ctx.$implicit;
|
|
@@ -174,9 +181,11 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_T
|
|
|
174
181
|
i0.ɵɵadvance(2);
|
|
175
182
|
i0.ɵɵconditional(result_r11.conversationName ? 4 : -1);
|
|
176
183
|
i0.ɵɵadvance();
|
|
184
|
+
i0.ɵɵconditional(ctx_r1.IsInFork(result_r11) ? 5 : -1);
|
|
185
|
+
i0.ɵɵadvance();
|
|
177
186
|
i0.ɵɵproperty("innerHTML", ctx_r1.highlightMatch(result_r11.preview, ctx_r1.searchQuery), i0.ɵɵsanitizeHtml);
|
|
178
187
|
i0.ɵɵadvance();
|
|
179
|
-
i0.ɵɵconditional(result_r11.matchedText ?
|
|
188
|
+
i0.ɵɵconditional(result_r11.matchedText ? 7 : -1);
|
|
180
189
|
i0.ɵɵadvance(3);
|
|
181
190
|
i0.ɵɵtextInterpolate(ctx_r1.formatDate(result_r11.createdAt));
|
|
182
191
|
} }
|
|
@@ -186,7 +195,7 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_Templat
|
|
|
186
195
|
i0.ɵɵtext(3);
|
|
187
196
|
i0.ɵɵelementEnd();
|
|
188
197
|
i0.ɵɵelementStart(4, "div", 45);
|
|
189
|
-
i0.ɵɵrepeaterCreate(5, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Template,
|
|
198
|
+
i0.ɵɵrepeaterCreate(5, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_For_6_Template, 11, 9, "button", 46, _forTrack0);
|
|
190
199
|
i0.ɵɵelementEnd()();
|
|
191
200
|
} if (rf & 2) {
|
|
192
201
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -196,7 +205,7 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_3_Templat
|
|
|
196
205
|
i0.ɵɵrepeater(ctx_r1.results.messages);
|
|
197
206
|
} }
|
|
198
207
|
function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
199
|
-
i0.ɵɵelementStart(0, "div",
|
|
208
|
+
i0.ɵɵelementStart(0, "div", 59)(1, "span", 60);
|
|
200
209
|
i0.ɵɵtext(2);
|
|
201
210
|
i0.ɵɵelementEnd()();
|
|
202
211
|
} if (rf & 2) {
|
|
@@ -230,7 +239,7 @@ function SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_T
|
|
|
230
239
|
i0.ɵɵelementEnd();
|
|
231
240
|
i0.ɵɵelementStart(3, "div", 50);
|
|
232
241
|
i0.ɵɵelement(4, "div", 51);
|
|
233
|
-
i0.ɵɵconditionalCreate(5, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_Conditional_5_Template, 3, 1, "div",
|
|
242
|
+
i0.ɵɵconditionalCreate(5, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_Conditional_5_Template, 3, 1, "div", 59);
|
|
234
243
|
i0.ɵɵconditionalCreate(6, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_Conditional_6_Template, 3, 1, "div", 56);
|
|
235
244
|
i0.ɵɵelement(7, "div", 52);
|
|
236
245
|
i0.ɵɵconditionalCreate(8, SearchPanelComponent_Conditional_0_Conditional_37_Conditional_4_For_6_Conditional_8_Template, 1, 1, "div", 53);
|
|
@@ -792,6 +801,10 @@ export class SearchPanelComponent {
|
|
|
792
801
|
clearSearch() {
|
|
793
802
|
return this.ClearSearch();
|
|
794
803
|
}
|
|
804
|
+
/** True when a message hit sits in a fork rather than in Main. */
|
|
805
|
+
IsInFork(result) {
|
|
806
|
+
return result.type === 'message' && result.branchId != null;
|
|
807
|
+
}
|
|
795
808
|
/**
|
|
796
809
|
* Select a result
|
|
797
810
|
*/
|
|
@@ -1017,15 +1030,15 @@ export class SearchPanelComponent {
|
|
|
1017
1030
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.SearchInput = _t.first);
|
|
1018
1031
|
} }, hostBindings: function SearchPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1019
1032
|
i0.ɵɵlistener("keydown", function SearchPanelComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyboard($event); });
|
|
1020
|
-
} }, inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", InitialQuery: "InitialQuery", initialQuery: "initialQuery", IsOpen: "IsOpen", isOpen: "isOpen" }, outputs: { close: "close", ResultSelected: "ResultSelected", resultSelected: "resultSelected" }, standalone: false, decls: 1, vars: 1, consts: [["searchInput", ""], [1, "search-panel-overlay"], [1, "search-panel-overlay", 3, "click"], [1, "search-panel", 3, "click"], [1, "search-header"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search conversations, messages, artifacts, collections, and tasks...", "autocomplete", "off", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["type", "button", "title", "Clear search", 1, "clear-button"], ["type", "button", "title", "Close (Esc)", 1, "close-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "search-filters"], [1, "filter-buttons"], ["type", "button", 1, "filter-button", 3, "click"], [1, "fa-solid", "fa-comments"], [1, "fa-solid", "fa-comment"], [1, "fa-solid", "fa-file-alt"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-tasks"], [1, "date-filter"], ["Placeholder", "From", 3, "ngModelChange", "ngModel"], ["Placeholder", "To", 3, "ngModelChange", "ngModel"], ["type", "button", "title", "Clear date range", 1, "clear-date-button"], [1, "search-results"], [1, "search-loading"], ["Variant", "no-results", "Message", "Try adjusting your filters or search terms", 3, "Title"], [1, "search-footer"], [1, "keyboard-hints"], [1, "hint"], ["type", "button", "title", "Clear search", 1, "clear-button", 3, "click"], ["type", "button", "title", "Clear date range", 1, "clear-date-button", 3, "click"], [1, "fa-solid", "fa-times-circle"], ["text", "Searching...", "size", "medium"], [1, "recent-searches"], ["Icon", "fa-solid fa-magnifying-glass", "Message", "Search across all your conversations, messages, artifacts, collections, and tasks"], [1, "search-tips"], [1, "recent-searches-header"], ["type", "button", "title", "Clear recent searches", 1, "clear-recent-button", 3, "click"], [1, "recent-searches-list"], ["type", "button", 1, "recent-search-item"], ["type", "button", 1, "recent-search-item", 3, "click"], [1, "fa-solid", "fa-history"], [1, "results-summary"], [1, "results-group"], [1, "results-group-title"], [1, "results-list"], ["type", "button", 1, "result-item", 3, "selected"], ["type", "button", 1, "result-item", 3, "click"], [1, "result-icon"], [1, "fa-solid"], [1, "result-content"], [1, "result-title", 3, "innerHTML"], [1, "result-preview", 3, "innerHTML"], [1, "result-match", 3, "innerHTML"], [1, "result-meta"], [1, "result-date"], [1, "result-conversation"], [1, "result-type"], [1, "type-badge"]], template: function SearchPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1033
|
+
} }, inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", InitialQuery: "InitialQuery", initialQuery: "initialQuery", IsOpen: "IsOpen", isOpen: "isOpen" }, outputs: { close: "close", ResultSelected: "ResultSelected", resultSelected: "resultSelected" }, standalone: false, decls: 1, vars: 1, consts: [["searchInput", ""], [1, "search-panel-overlay"], [1, "search-panel-overlay", 3, "click"], [1, "search-panel", 3, "click"], [1, "search-header"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search conversations, messages, artifacts, collections, and tasks...", "autocomplete", "off", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["type", "button", "title", "Clear search", 1, "clear-button"], ["type", "button", "title", "Close (Esc)", 1, "close-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "search-filters"], [1, "filter-buttons"], ["type", "button", 1, "filter-button", 3, "click"], [1, "fa-solid", "fa-comments"], [1, "fa-solid", "fa-comment"], [1, "fa-solid", "fa-file-alt"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-tasks"], [1, "date-filter"], ["Placeholder", "From", 3, "ngModelChange", "ngModel"], ["Placeholder", "To", 3, "ngModelChange", "ngModel"], ["type", "button", "title", "Clear date range", 1, "clear-date-button"], [1, "search-results"], [1, "search-loading"], ["Variant", "no-results", "Message", "Try adjusting your filters or search terms", 3, "Title"], [1, "search-footer"], [1, "keyboard-hints"], [1, "hint"], ["type", "button", "title", "Clear search", 1, "clear-button", 3, "click"], ["type", "button", "title", "Clear date range", 1, "clear-date-button", 3, "click"], [1, "fa-solid", "fa-times-circle"], ["text", "Searching...", "size", "medium"], [1, "recent-searches"], ["Icon", "fa-solid fa-magnifying-glass", "Message", "Search across all your conversations, messages, artifacts, collections, and tasks"], [1, "search-tips"], [1, "recent-searches-header"], ["type", "button", "title", "Clear recent searches", 1, "clear-recent-button", 3, "click"], [1, "recent-searches-list"], ["type", "button", 1, "recent-search-item"], ["type", "button", 1, "recent-search-item", 3, "click"], [1, "fa-solid", "fa-history"], [1, "results-summary"], [1, "results-group"], [1, "results-group-title"], [1, "results-list"], ["type", "button", 1, "result-item", 3, "selected"], ["type", "button", 1, "result-item", 3, "click"], [1, "result-icon"], [1, "fa-solid"], [1, "result-content"], [1, "result-title", 3, "innerHTML"], [1, "result-preview", 3, "innerHTML"], [1, "result-match", 3, "innerHTML"], [1, "result-meta"], [1, "result-date"], [1, "result-conversation"], ["title", "Opening this message opens its fork", 1, "branch-tag"], [1, "fa-solid", "fa-code-branch"], [1, "result-type"], [1, "type-badge"]], template: function SearchPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1021
1034
|
i0.ɵɵconditionalCreate(0, SearchPanelComponent_Conditional_0_Template, 54, 18, "div", 1);
|
|
1022
1035
|
} if (rf & 2) {
|
|
1023
1036
|
i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
|
|
1024
|
-
} }, dependencies: [i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJDatepickerComponent, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: [".search-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n z-index: 10000;\n padding-top: 10vh;\n backdrop-filter: blur(2px);\n}\n\n.search-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-xl);\n width: 90%;\n max-width: 800px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n.search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 8px 12px;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 16px;\n}\n\n\n\n\n\n\n\n.search-input-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: static;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 16px;\n outline: none;\n color: var(--mj-text-primary);\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n.search-filters[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.filter-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-button[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n}\n\n.filter-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.filter-button.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.date-filter[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.clear-date-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s;\n}\n\n.clear-date-button[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n\n.search-results[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.search-loading[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: var(--mj-text-secondary);\n}\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 8px 0 16px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n\n.results-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.results-group-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.results-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n}\n\n.result-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n.result-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.result-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.result-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.result-preview[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-match[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-style: italic;\n}\n\n.result-conversation[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.result-type[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.result-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.result-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n.result-item[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(mark) {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n padding: 2px 0;\n border-radius: 2px;\n font-weight: 600;\n}\n\n\n.search-tips[_ngcontent-%COMP%] {\n margin-top: 24px;\n text-align: left;\n background: var(--mj-bg-surface-sunken);\n padding: 16px;\n border-radius: 6px;\n max-width: 400px;\n}\n\n.search-tips[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.search-tips[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n}\n\n.search-tips[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin: 4px 0;\n}\n\n\n.recent-searches[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.recent-searches-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.recent-searches-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.clear-recent-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 13px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-recent-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.recent-searches-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.recent-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.recent-search-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.recent-search-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n.search-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n}\n\n.keyboard-hints[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n justify-content: center;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\nkbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 11px;\n color: var(--mj-text-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n@media (max-width: 768px) {\n .search-panel[_ngcontent-%COMP%] {\n width: 95%;\n max-height: 90vh;\n }\n\n .search-filters[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .date-filter[_ngcontent-%COMP%] {\n margin-left: 0;\n }\n\n .keyboard-hints[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}"] });
|
|
1037
|
+
} }, dependencies: [i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJDatepickerComponent, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: [".search-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n z-index: 10000;\n padding-top: 10vh;\n backdrop-filter: blur(2px);\n}\n\n.search-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-xl);\n width: 90%;\n max-width: 800px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n.search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 8px 12px;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 16px;\n}\n\n\n\n\n\n\n\n.search-input-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: static;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 16px;\n outline: none;\n color: var(--mj-text-primary);\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n.search-filters[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.filter-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-button[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n}\n\n.filter-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.filter-button.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.date-filter[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.clear-date-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s;\n}\n\n.clear-date-button[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n\n.search-results[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.search-loading[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: var(--mj-text-secondary);\n}\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 8px 0 16px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n\n.results-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.results-group-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.results-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n}\n\n.result-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n.result-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.result-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.result-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.result-preview[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-match[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-style: italic;\n}\n\n.result-conversation[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.result-type[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n\n.branch-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-bottom: 4px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.result-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.result-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n.result-item[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(mark) {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n padding: 2px 0;\n border-radius: 2px;\n font-weight: 600;\n}\n\n\n.search-tips[_ngcontent-%COMP%] {\n margin-top: 24px;\n text-align: left;\n background: var(--mj-bg-surface-sunken);\n padding: 16px;\n border-radius: 6px;\n max-width: 400px;\n}\n\n.search-tips[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.search-tips[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n}\n\n.search-tips[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin: 4px 0;\n}\n\n\n.recent-searches[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.recent-searches-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.recent-searches-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.clear-recent-button[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 13px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-recent-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.recent-searches-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.recent-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.recent-search-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.recent-search-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n.search-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n}\n\n.keyboard-hints[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n justify-content: center;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\nkbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 11px;\n color: var(--mj-text-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n@media (max-width: 768px) {\n .search-panel[_ngcontent-%COMP%] {\n width: 95%;\n max-height: 90vh;\n }\n\n .search-filters[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .date-filter[_ngcontent-%COMP%] {\n margin-left: 0;\n }\n\n .keyboard-hints[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}"] });
|
|
1025
1038
|
}
|
|
1026
1039
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchPanelComponent, [{
|
|
1027
1040
|
type: Component,
|
|
1028
|
-
args: [{ standalone: false, selector: 'mj-search-panel', template: "@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>\u2191</kbd><kbd>\u2193</kbd> Navigate</span>\n <span class=\"hint\"><kbd>\u21B5</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [".search-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n z-index: 10000;\n padding-top: 10vh;\n backdrop-filter: blur(2px);\n}\n\n.search-panel {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-xl);\n width: 90%;\n max-width: 800px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Header */\n.search-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 8px 12px;\n}\n\n.search-icon {\n color: var(--mj-text-secondary);\n font-size: 16px;\n}\n\n/* Explorer's app-wide _shared-patterns.scss absolutely-positions any bare .search-icon\n and pairs that with a compensating padding-left scoped to .mj-search-box /\n .search-container / .mj-search. This wrapper is none of those, so the icon gets pulled\n out of the flex row and positioned against the overlay instead \u2014 landing outside the\n panel \u2014 while the input slides left into the vacated slot. Emulated encapsulation does\n not block global rules from reaching in, so opt back out explicitly. */\n.search-input-wrapper .search-icon {\n position: static;\n}\n\n.search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 16px;\n outline: none;\n color: var(--mj-text-primary);\n}\n\n.search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-button:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.close-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.close-button:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Filters */\n.search-filters {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.filter-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-button {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n}\n\n.filter-button:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.filter-button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.date-filter {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.clear-date-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s;\n}\n\n.clear-date-button:hover {\n color: var(--mj-text-primary);\n}\n\n/* Results */\n.search-results {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.search-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: var(--mj-text-secondary);\n}\n\n.results-summary {\n padding: 8px 0 16px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n\n.results-group {\n margin-bottom: 24px;\n}\n\n.results-group-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-title i {\n color: var(--mj-brand-primary);\n}\n\n.results-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.result-item {\n display: flex;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n}\n\n.result-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n.result-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.result-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.result-content {\n flex: 1;\n min-width: 0;\n}\n\n.result-title {\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.result-preview {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-match {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-style: italic;\n}\n\n.result-conversation {\n font-size: 12px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.result-type {\n margin-top: 4px;\n}\n\n.type-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.result-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.result-date {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Highlight */\n.result-item :deep(mark) {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n padding: 2px 0;\n border-radius: 2px;\n font-weight: 600;\n}\n\n/* Search tips \u2014 projected into the initial empty state's content slot */\n.search-tips {\n margin-top: 24px;\n text-align: left;\n background: var(--mj-bg-surface-sunken);\n padding: 16px;\n border-radius: 6px;\n max-width: 400px;\n}\n\n.search-tips h4 {\n margin: 0 0 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.search-tips ul {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n}\n\n.search-tips li {\n margin: 4px 0;\n}\n\n/* Recent Searches */\n.recent-searches {\n margin-bottom: 24px;\n}\n\n.recent-searches-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.recent-searches-header h3 {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.clear-recent-button {\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 13px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-recent-button:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.recent-searches-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.recent-search-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.recent-search-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.recent-search-item i {\n color: var(--mj-text-muted);\n}\n\n/* Footer */\n.search-footer {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n}\n\n.keyboard-hints {\n display: flex;\n gap: 16px;\n justify-content: center;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.hint {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\nkbd {\n display: inline-block;\n padding: 3px 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 11px;\n color: var(--mj-text-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .search-panel {\n width: 95%;\n max-height: 90vh;\n }\n\n .search-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .date-filter {\n margin-left: 0;\n }\n\n .keyboard-hints {\n flex-wrap: wrap;\n }\n}\n"] }]
|
|
1041
|
+
args: [{ standalone: false, selector: 'mj-search-panel', template: "@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n @if (IsInFork(result)) {\n <span class=\"branch-tag\" title=\"Opening this message opens its fork\"><i class=\"fa-solid fa-code-branch\"></i> in a fork</span>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>\u2191</kbd><kbd>\u2193</kbd> Navigate</span>\n <span class=\"hint\"><kbd>\u21B5</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n", styles: [".search-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n z-index: 10000;\n padding-top: 10vh;\n backdrop-filter: blur(2px);\n}\n\n.search-panel {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-xl);\n width: 90%;\n max-width: 800px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Header */\n.search-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 8px 12px;\n}\n\n.search-icon {\n color: var(--mj-text-secondary);\n font-size: 16px;\n}\n\n/* Explorer's app-wide _shared-patterns.scss absolutely-positions any bare .search-icon\n and pairs that with a compensating padding-left scoped to .mj-search-box /\n .search-container / .mj-search. This wrapper is none of those, so the icon gets pulled\n out of the flex row and positioned against the overlay instead \u2014 landing outside the\n panel \u2014 while the input slides left into the vacated slot. Emulated encapsulation does\n not block global rules from reaching in, so opt back out explicitly. */\n.search-input-wrapper .search-icon {\n position: static;\n}\n\n.search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 16px;\n outline: none;\n color: var(--mj-text-primary);\n}\n\n.search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-button:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.close-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.close-button:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Filters */\n.search-filters {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.filter-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.filter-button {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n}\n\n.filter-button:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.filter-button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.date-filter {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.clear-date-button {\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s;\n}\n\n.clear-date-button:hover {\n color: var(--mj-text-primary);\n}\n\n/* Results */\n.search-results {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.search-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: var(--mj-text-secondary);\n}\n\n.results-summary {\n padding: 8px 0 16px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n\n.results-group {\n margin-bottom: 24px;\n}\n\n.results-group-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-title i {\n color: var(--mj-brand-primary);\n}\n\n.results-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.result-item {\n display: flex;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n}\n\n.result-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n.result-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.result-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.result-content {\n flex: 1;\n min-width: 0;\n}\n\n.result-title {\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.result-preview {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-match {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-style: italic;\n}\n\n.result-conversation {\n font-size: 12px;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.result-type {\n margin-top: 4px;\n}\n\n.type-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n/* A message hit on a branch other than the one its conversation shows */\n.branch-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-bottom: 4px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.result-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.result-date {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Highlight */\n.result-item :deep(mark) {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n padding: 2px 0;\n border-radius: 2px;\n font-weight: 600;\n}\n\n/* Search tips \u2014 projected into the initial empty state's content slot */\n.search-tips {\n margin-top: 24px;\n text-align: left;\n background: var(--mj-bg-surface-sunken);\n padding: 16px;\n border-radius: 6px;\n max-width: 400px;\n}\n\n.search-tips h4 {\n margin: 0 0 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.search-tips ul {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n}\n\n.search-tips li {\n margin: 4px 0;\n}\n\n/* Recent Searches */\n.recent-searches {\n margin-bottom: 24px;\n}\n\n.recent-searches-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.recent-searches-header h3 {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.clear-recent-button {\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 13px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.clear-recent-button:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.recent-searches-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.recent-search-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n text-align: left;\n transition: all 0.2s;\n width: 100%;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.recent-search-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.recent-search-item i {\n color: var(--mj-text-muted);\n}\n\n/* Footer */\n.search-footer {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n}\n\n.keyboard-hints {\n display: flex;\n gap: 16px;\n justify-content: center;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.hint {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\nkbd {\n display: inline-block;\n padding: 3px 6px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n font-size: 11px;\n color: var(--mj-text-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .search-panel {\n width: 95%;\n max-height: 90vh;\n }\n\n .search-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .date-filter {\n margin-left: 0;\n }\n\n .keyboard-hints {\n flex-wrap: wrap;\n }\n}\n"] }]
|
|
1029
1042
|
}], () => [{ type: i1.SearchService }, { type: i0.ChangeDetectorRef }], { EnvironmentId: [{
|
|
1030
1043
|
type: Input
|
|
1031
1044
|
}], environmentId: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n /** Term to open with, e.g. handed over from a narrower filter the user had already typed. */\n @Input() InitialQuery: string = '';\n\n /** @deprecated Use {@link InitialQuery}. */\n @Input() set initialQuery(value: string) {\n this.InitialQuery = value;\n }\n /** @deprecated Use {@link InitialQuery}. */\n get initialQuery(): string {\n return this.InitialQuery;\n }\n\n private _isOpen: boolean = false;\n\n /**\n * A setter rather than ngOnChanges so only an actual open transition acts — ngOnChanges\n * fires for every input, so a CurrentUser or EnvironmentId re-emit while the panel was\n * open yanked focus back out of whatever field the user was in.\n */\n @Input()\n set IsOpen(value: boolean) {\n const wasOpen = this._isOpen;\n this._isOpen = value;\n if (value && !wasOpen) {\n this.onOpened();\n }\n }\n get IsOpen(): boolean {\n return this._isOpen;\n }\n\n /** @deprecated Use {@link IsOpen}. */\n @Input() set isOpen(value: boolean) {\n this.IsOpen = value;\n }\n /** @deprecated Use {@link IsOpen}. */\n get isOpen(): boolean {\n return this.IsOpen;\n }\n\n @Output() close = new EventEmitter<void>();\n @Output() ResultSelected = new EventEmitter<SearchResult>();\n\n /**\n * @deprecated Use {@link ResultSelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (resultSelected) keeps working. Must stay AFTER ResultSelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() resultSelected = this.ResultSelected;\n\n @ViewChild('searchInput') SearchInput?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link SearchInput}. */\n get searchInput(): ElementRef<HTMLInputElement> | undefined {\n return this.SearchInput;\n }\n /** @deprecated Use {@link SearchInput}. */\n set searchInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.SearchInput = value;\n }\n\n public SearchQuery: string = '';\n\n /** @deprecated Use {@link SearchQuery}. */\n public get searchQuery(): string {\n return this.SearchQuery;\n }\n /** @deprecated Use {@link SearchQuery}. */\n public set searchQuery(value: string) {\n this.SearchQuery = value;\n }\n public ActiveFilter: SearchFilter = 'all';\n\n /** @deprecated Use {@link ActiveFilter}. */\n public get activeFilter(): SearchFilter {\n return this.ActiveFilter;\n }\n /** @deprecated Use {@link ActiveFilter}. */\n public set activeFilter(value: SearchFilter) {\n this.ActiveFilter = value;\n }\n public DateRange: DateRange = { start: null, end: null };\n\n /** @deprecated Use {@link DateRange}. */\n public get dateRange(): DateRange {\n return this.DateRange;\n }\n /** @deprecated Use {@link DateRange}. */\n public set dateRange(value: DateRange) {\n this.DateRange = value;\n }\n public IsSearching: boolean = false;\n\n /** @deprecated Use {@link IsSearching}. */\n public get isSearching(): boolean {\n return this.IsSearching;\n }\n /** @deprecated Use {@link IsSearching}. */\n public set isSearching(value: boolean) {\n this.IsSearching = value;\n }\n public Results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n\n /** @deprecated Use {@link Results}. */\n public get results(): GroupedSearchResults {\n return this.Results;\n }\n /** @deprecated Use {@link Results}. */\n public set results(value: GroupedSearchResults) {\n this.Results = value;\n }\n public RecentSearches: string[] = [];\n\n /** @deprecated Use {@link RecentSearches}. */\n public get recentSearches(): string[] {\n return this.RecentSearches;\n }\n /** @deprecated Use {@link RecentSearches}. */\n public set recentSearches(value: string[]) {\n this.RecentSearches = value;\n }\n public SelectedIndex: number = -1;\n\n /** @deprecated Use {@link SelectedIndex}. */\n public get selectedIndex(): number {\n return this.SelectedIndex;\n }\n /** @deprecated Use {@link SelectedIndex}. */\n public set selectedIndex(value: number) {\n this.SelectedIndex = value;\n }\n\n /**\n * Flat view of `Results`, rebuilt only on each results emission. The template binds\n * IsResultSelected() once per row, so deriving this on demand allocated a fresh array of\n * every result for every row on every change-detection pass.\n */\n private flatResults: SearchResult[] = [];\n\n /** Message for the \"no results\" empty state, echoing the search term. */\n public get NoResultsMessage(): string {\n return `No results found for \"${this.SearchQuery}\"`;\n }\n\n private destroy$ = new Subject<void>();\n\n /** True only while ngOnInit subscribes — see applyState(). */\n private initializing = false;\n\n constructor(\n private searchService: SearchService,\n private cdr: ChangeDetectorRef\n ) {}\n\n /**\n * Apply state from an async emission and render it.\n *\n * The search resolves through the data provider's transport, and that emission does not\n * reliably schedule a change-detection pass: results land on the component while the panel\n * keeps showing the previous state until some DOM event — Enter, a click on the modal,\n * even the blur from clicking into devtools — triggers the next one. detectChanges()\n * checks this view on the spot; markForCheck() would only mark it for a pass that never\n * comes.\n */\n private applyState(fn: () => void): void {\n fn();\n // The BehaviorSubjects replay synchronously while ngOnInit subscribes, which is already\n // inside a pass. takeUntil(destroy$) stops emissions at teardown, so there is no\n // destroyed-view case to guard against.\n if (!this.initializing) {\n this.cdr.detectChanges();\n }\n }\n\n ngOnInit(): void {\n // Each BehaviorSubject replays synchronously on subscribe, inside this pass.\n this.initializing = true;\n this.subscribeToSearchState();\n this.initializing = false;\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.applyState(() => {\n this.IsSearching = isSearching;\n });\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.applyState(() => {\n this.Results = results;\n this.flatResults = [\n ...results.conversations,\n ...results.messages,\n ...results.artifacts,\n ...results.collections,\n ...results.tasks\n ];\n this.SelectedIndex = -1;\n });\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.applyState(() => {\n this.ActiveFilter = filter;\n });\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.applyState(() => {\n this.DateRange = range;\n });\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.RecentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public OnSearchInput(): void {\n if (this.SearchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /** @deprecated Use {@link OnSearchInput}. */\n public onSearchInput(): void {\n return this.OnSearchInput();\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.SearchQuery,\n this.EnvironmentId,\n this.CurrentUser\n );\n }\n\n /**\n * Set search filter\n */\n public SetFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link SetFilter}. */\n public setFilter(filter: SearchFilter): void {\n return this.SetFilter(filter);\n }\n\n /**\n * Clear search\n */\n public ClearSearch(): void {\n this.SearchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n public clearSearch(): void {\n return this.ClearSearch();\n }\n\n /**\n * Select a result\n */\n public SelectResult(result: SearchResult): void {\n this.ResultSelected.emit(result);\n this.ClosePanel();\n }\n\n /** @deprecated Use {@link SelectResult}. */\n public selectResult(result: SearchResult): void {\n return this.SelectResult(result);\n }\n\n /**\n * Use recent search\n */\n public UseRecentSearch(query: string): void {\n this.SearchQuery = query;\n this.performSearch();\n }\n\n /** @deprecated Use {@link UseRecentSearch}. */\n public useRecentSearch(query: string): void {\n return this.UseRecentSearch(query);\n }\n\n /**\n * Clear recent searches\n */\n public ClearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.RecentSearches = [];\n }\n\n /** @deprecated Use {@link ClearRecentSearches}. */\n public clearRecentSearches(): void {\n return this.ClearRecentSearches();\n }\n\n /**\n * Close panel\n */\n public ClosePanel(): void {\n this.close.emit();\n }\n\n /** @deprecated Use {@link ClosePanel}. */\n public closePanel(): void {\n return this.ClosePanel();\n }\n\n /**\n * Seed and focus the box once the panel is open.\n *\n * Deferred to the next task so the @if(IsOpen) view exists (there is no input to focus\n * before it renders) and so every input bound in the same pass has been set — this reads\n * InitialQuery, which the host may bind after IsOpen.\n */\n private onOpened(): void {\n setTimeout(() => {\n const seed = this.InitialQuery?.trim();\n if (seed && seed !== this.SearchQuery) {\n this.SearchQuery = seed;\n this.OnSearchInput();\n this.cdr.detectChanges();\n }\n this.SearchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.SearchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n const allResults = this.flatResults;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.ClosePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.SelectedIndex > 0) {\n this.SelectedIndex--;\n } else {\n this.SelectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex >= 0 && allResults[this.SelectedIndex]) {\n this.SelectResult(allResults[this.SelectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Check if result is selected\n */\n public IsResultSelected(result: SearchResult): boolean {\n const selected = this.flatResults[this.SelectedIndex];\n return !!selected && selected.id === result.id && selected.type === result.type;\n }\n\n /** @deprecated Use {@link IsResultSelected}. */\n public isResultSelected(result: SearchResult): boolean {\n return this.IsResultSelected(result);\n }\n\n /**\n * Get icon for result type\n */\n public GetResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /** @deprecated Use {@link GetResultIcon}. */\n public getResultIcon(type: string): string {\n return this.GetResultIcon(type);\n }\n\n /**\n * Get filter display text\n */\n public GetFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /** @deprecated Use {@link GetFilterText}. */\n public getFilterText(filter: SearchFilter): string {\n return this.GetFilterText(filter);\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public HighlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /** @deprecated Use {@link HighlightMatch}. */\n public highlightMatch(text: string, query: string): string {\n return this.HighlightMatch(text, query);\n }\n\n /**\n * Handle date range change\n */\n public OnDateRangeChange(): void {\n this.searchService.setDateRange(this.DateRange);\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link OnDateRangeChange}. */\n public onDateRangeChange(): void {\n return this.OnDateRangeChange();\n }\n\n /**\n * Clear date range\n */\n public ClearDateRange(): void {\n this.DateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link ClearDateRange}. */\n public clearDateRange(): void {\n return this.ClearDateRange();\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n /** Term to open with, e.g. handed over from a narrower filter the user had already typed. */\n @Input() InitialQuery: string = '';\n\n /** @deprecated Use {@link InitialQuery}. */\n @Input() set initialQuery(value: string) {\n this.InitialQuery = value;\n }\n /** @deprecated Use {@link InitialQuery}. */\n get initialQuery(): string {\n return this.InitialQuery;\n }\n\n private _isOpen: boolean = false;\n\n /**\n * A setter rather than ngOnChanges so only an actual open transition acts — ngOnChanges\n * fires for every input, so a CurrentUser or EnvironmentId re-emit while the panel was\n * open yanked focus back out of whatever field the user was in.\n */\n @Input()\n set IsOpen(value: boolean) {\n const wasOpen = this._isOpen;\n this._isOpen = value;\n if (value && !wasOpen) {\n this.onOpened();\n }\n }\n get IsOpen(): boolean {\n return this._isOpen;\n }\n\n /** @deprecated Use {@link IsOpen}. */\n @Input() set isOpen(value: boolean) {\n this.IsOpen = value;\n }\n /** @deprecated Use {@link IsOpen}. */\n get isOpen(): boolean {\n return this.IsOpen;\n }\n\n @Output() close = new EventEmitter<void>();\n @Output() ResultSelected = new EventEmitter<SearchResult>();\n\n /**\n * @deprecated Use {@link ResultSelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (resultSelected) keeps working. Must stay AFTER ResultSelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() resultSelected = this.ResultSelected;\n\n @ViewChild('searchInput') SearchInput?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link SearchInput}. */\n get searchInput(): ElementRef<HTMLInputElement> | undefined {\n return this.SearchInput;\n }\n /** @deprecated Use {@link SearchInput}. */\n set searchInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.SearchInput = value;\n }\n\n public SearchQuery: string = '';\n\n /** @deprecated Use {@link SearchQuery}. */\n public get searchQuery(): string {\n return this.SearchQuery;\n }\n /** @deprecated Use {@link SearchQuery}. */\n public set searchQuery(value: string) {\n this.SearchQuery = value;\n }\n public ActiveFilter: SearchFilter = 'all';\n\n /** @deprecated Use {@link ActiveFilter}. */\n public get activeFilter(): SearchFilter {\n return this.ActiveFilter;\n }\n /** @deprecated Use {@link ActiveFilter}. */\n public set activeFilter(value: SearchFilter) {\n this.ActiveFilter = value;\n }\n public DateRange: DateRange = { start: null, end: null };\n\n /** @deprecated Use {@link DateRange}. */\n public get dateRange(): DateRange {\n return this.DateRange;\n }\n /** @deprecated Use {@link DateRange}. */\n public set dateRange(value: DateRange) {\n this.DateRange = value;\n }\n public IsSearching: boolean = false;\n\n /** @deprecated Use {@link IsSearching}. */\n public get isSearching(): boolean {\n return this.IsSearching;\n }\n /** @deprecated Use {@link IsSearching}. */\n public set isSearching(value: boolean) {\n this.IsSearching = value;\n }\n public Results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n\n /** @deprecated Use {@link Results}. */\n public get results(): GroupedSearchResults {\n return this.Results;\n }\n /** @deprecated Use {@link Results}. */\n public set results(value: GroupedSearchResults) {\n this.Results = value;\n }\n public RecentSearches: string[] = [];\n\n /** @deprecated Use {@link RecentSearches}. */\n public get recentSearches(): string[] {\n return this.RecentSearches;\n }\n /** @deprecated Use {@link RecentSearches}. */\n public set recentSearches(value: string[]) {\n this.RecentSearches = value;\n }\n public SelectedIndex: number = -1;\n\n /** @deprecated Use {@link SelectedIndex}. */\n public get selectedIndex(): number {\n return this.SelectedIndex;\n }\n /** @deprecated Use {@link SelectedIndex}. */\n public set selectedIndex(value: number) {\n this.SelectedIndex = value;\n }\n\n /**\n * Flat view of `Results`, rebuilt only on each results emission. The template binds\n * IsResultSelected() once per row, so deriving this on demand allocated a fresh array of\n * every result for every row on every change-detection pass.\n */\n private flatResults: SearchResult[] = [];\n\n /** Message for the \"no results\" empty state, echoing the search term. */\n public get NoResultsMessage(): string {\n return `No results found for \"${this.SearchQuery}\"`;\n }\n\n private destroy$ = new Subject<void>();\n\n /** True only while ngOnInit subscribes — see applyState(). */\n private initializing = false;\n\n constructor(\n private searchService: SearchService,\n private cdr: ChangeDetectorRef\n ) {}\n\n /**\n * Apply state from an async emission and render it.\n *\n * The search resolves through the data provider's transport, and that emission does not\n * reliably schedule a change-detection pass: results land on the component while the panel\n * keeps showing the previous state until some DOM event — Enter, a click on the modal,\n * even the blur from clicking into devtools — triggers the next one. detectChanges()\n * checks this view on the spot; markForCheck() would only mark it for a pass that never\n * comes.\n */\n private applyState(fn: () => void): void {\n fn();\n // The BehaviorSubjects replay synchronously while ngOnInit subscribes, which is already\n // inside a pass. takeUntil(destroy$) stops emissions at teardown, so there is no\n // destroyed-view case to guard against.\n if (!this.initializing) {\n this.cdr.detectChanges();\n }\n }\n\n ngOnInit(): void {\n // Each BehaviorSubject replays synchronously on subscribe, inside this pass.\n this.initializing = true;\n this.subscribeToSearchState();\n this.initializing = false;\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.applyState(() => {\n this.IsSearching = isSearching;\n });\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.applyState(() => {\n this.Results = results;\n this.flatResults = [\n ...results.conversations,\n ...results.messages,\n ...results.artifacts,\n ...results.collections,\n ...results.tasks\n ];\n this.SelectedIndex = -1;\n });\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.applyState(() => {\n this.ActiveFilter = filter;\n });\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.applyState(() => {\n this.DateRange = range;\n });\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.RecentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public OnSearchInput(): void {\n if (this.SearchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /** @deprecated Use {@link OnSearchInput}. */\n public onSearchInput(): void {\n return this.OnSearchInput();\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.SearchQuery,\n this.EnvironmentId,\n this.CurrentUser\n );\n }\n\n /**\n * Set search filter\n */\n public SetFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link SetFilter}. */\n public setFilter(filter: SearchFilter): void {\n return this.SetFilter(filter);\n }\n\n /**\n * Clear search\n */\n public ClearSearch(): void {\n this.SearchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n public clearSearch(): void {\n return this.ClearSearch();\n }\n\n /** True when a message hit sits in a fork rather than in Main. */\n public IsInFork(result: SearchResult): boolean {\n return result.type === 'message' && result.branchId != null;\n }\n\n /**\n * Select a result\n */\n public SelectResult(result: SearchResult): void {\n this.ResultSelected.emit(result);\n this.ClosePanel();\n }\n\n /** @deprecated Use {@link SelectResult}. */\n public selectResult(result: SearchResult): void {\n return this.SelectResult(result);\n }\n\n /**\n * Use recent search\n */\n public UseRecentSearch(query: string): void {\n this.SearchQuery = query;\n this.performSearch();\n }\n\n /** @deprecated Use {@link UseRecentSearch}. */\n public useRecentSearch(query: string): void {\n return this.UseRecentSearch(query);\n }\n\n /**\n * Clear recent searches\n */\n public ClearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.RecentSearches = [];\n }\n\n /** @deprecated Use {@link ClearRecentSearches}. */\n public clearRecentSearches(): void {\n return this.ClearRecentSearches();\n }\n\n /**\n * Close panel\n */\n public ClosePanel(): void {\n this.close.emit();\n }\n\n /** @deprecated Use {@link ClosePanel}. */\n public closePanel(): void {\n return this.ClosePanel();\n }\n\n /**\n * Seed and focus the box once the panel is open.\n *\n * Deferred to the next task so the @if(IsOpen) view exists (there is no input to focus\n * before it renders) and so every input bound in the same pass has been set — this reads\n * InitialQuery, which the host may bind after IsOpen.\n */\n private onOpened(): void {\n setTimeout(() => {\n const seed = this.InitialQuery?.trim();\n if (seed && seed !== this.SearchQuery) {\n this.SearchQuery = seed;\n this.OnSearchInput();\n this.cdr.detectChanges();\n }\n this.SearchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.SearchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n const allResults = this.flatResults;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.ClosePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.SelectedIndex > 0) {\n this.SelectedIndex--;\n } else {\n this.SelectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex >= 0 && allResults[this.SelectedIndex]) {\n this.SelectResult(allResults[this.SelectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Check if result is selected\n */\n public IsResultSelected(result: SearchResult): boolean {\n const selected = this.flatResults[this.SelectedIndex];\n return !!selected && selected.id === result.id && selected.type === result.type;\n }\n\n /** @deprecated Use {@link IsResultSelected}. */\n public isResultSelected(result: SearchResult): boolean {\n return this.IsResultSelected(result);\n }\n\n /**\n * Get icon for result type\n */\n public GetResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /** @deprecated Use {@link GetResultIcon}. */\n public getResultIcon(type: string): string {\n return this.GetResultIcon(type);\n }\n\n /**\n * Get filter display text\n */\n public GetFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /** @deprecated Use {@link GetFilterText}. */\n public getFilterText(filter: SearchFilter): string {\n return this.GetFilterText(filter);\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public HighlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /** @deprecated Use {@link HighlightMatch}. */\n public highlightMatch(text: string, query: string): string {\n return this.HighlightMatch(text, query);\n }\n\n /**\n * Handle date range change\n */\n public OnDateRangeChange(): void {\n this.searchService.setDateRange(this.DateRange);\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link OnDateRangeChange}. */\n public onDateRangeChange(): void {\n return this.OnDateRangeChange();\n }\n\n /**\n * Clear date range\n */\n public ClearDateRange(): void {\n this.DateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.SearchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /** @deprecated Use {@link ClearDateRange}. */\n public clearDateRange(): void {\n return this.ClearDateRange();\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n @if (IsInFork(result)) {\n <span class=\"branch-tag\" title=\"Opening this message opens its fork\"><i class=\"fa-solid fa-code-branch\"></i> in a fork</span>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
|
|
@@ -201,7 +201,7 @@ export class RoutinesSectionComponent extends BaseAngularComponent {
|
|
|
201
201
|
this.cdr.markForCheck();
|
|
202
202
|
}
|
|
203
203
|
rebuildCounts(engine) {
|
|
204
|
-
const routines = engine.Routines;
|
|
204
|
+
const routines = engine.Routines.filter((r) => r.RoutineType !== 'AgentWake');
|
|
205
205
|
this.TotalCount = routines.length;
|
|
206
206
|
this.ActiveCount = routines.filter((r) => r.Status === 'Active').length;
|
|
207
207
|
this.cdr.markForCheck();
|