@memberjunction/ng-conversations 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -3
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.js +181 -47
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +220 -70
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +154 -40
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +951 -367
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +388 -44
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2407 -731
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
- package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts +84 -10
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +173 -49
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +119 -35
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts +76 -10
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +164 -50
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +82 -16
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +549 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1250 -421
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +411 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +896 -222
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +288 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +561 -123
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.js +13 -3
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.js +36 -8
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +348 -87
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +78 -8
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +177 -46
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +1 -1
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.js +1 -1
- 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 +1 -1
- 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 +3 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.d.ts +2 -1
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.js +1 -1
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +1 -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.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +3 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +26 -8
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +4 -4
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +19 -19
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.d.ts +2 -3
- package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.js +3 -2
- package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +17 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.js +122 -45
- package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -31
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +138 -124
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +1 -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 +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +4 -2
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +7 -3
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts +133 -22
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +312 -83
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +69 -9
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +139 -31
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +110 -30
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +25 -5
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +223 -75
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
- package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.js +100 -16
- package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +146 -36
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/toast/toast.component.d.ts +11 -1
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
- package/dist/lib/components/toast/toast.component.js +25 -5
- package/dist/lib/components/toast/toast.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
- package/dist/lib/directives/chat-slot.directive.js.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.js +14 -4
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +34 -7
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +37 -7
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +103 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
- package/dist/lib/models/agent-turn.model.js +12 -0
- package/dist/lib/models/agent-turn.model.js.map +1 -0
- package/dist/lib/models/collection-view.model.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +8 -0
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +98 -34
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +30 -4
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +71 -19
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +17 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +48 -16
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +39 -0
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +152 -17
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +58 -5
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +135 -35
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.d.ts +24 -0
- package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -0
- package/dist/lib/services/browser-realtime-media-host.js +95 -0
- package/dist/lib/services/browser-realtime-media-host.js.map +1 -0
- package/dist/lib/services/collection-permission.service.d.ts +28 -0
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +88 -32
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/collection-state.service.d.ts +11 -1
- package/dist/lib/services/collection-state.service.d.ts.map +1 -1
- package/dist/lib/services/collection-state.service.js +25 -5
- package/dist/lib/services/collection-state.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +26 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +57 -18
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +41 -2
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +80 -13
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +50 -10
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +31 -0
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +71 -15
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +13 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +25 -5
- package/dist/lib/services/dialog.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +2 -0
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +5 -1
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/graphql-attachment-blob-store.d.ts +44 -0
- package/dist/lib/services/graphql-attachment-blob-store.d.ts.map +1 -0
- package/dist/lib/services/graphql-attachment-blob-store.js +113 -0
- package/dist/lib/services/graphql-attachment-blob-store.js.map +1 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts +17 -141
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +15 -460
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +10 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +25 -5
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/lib/services/notification.service.d.ts +54 -6
- package/dist/lib/services/notification.service.d.ts.map +1 -1
- package/dist/lib/services/notification.service.js +123 -27
- package/dist/lib/services/notification.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
- package/dist/lib/services/realtime-audio-recorder.js +12 -12
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.js +10 -2
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
- package/dist/lib/services/realtime-session-review.service.d.ts +1 -1
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session-review.service.js +1 -1
- package/dist/lib/services/realtime-session-review.service.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +16 -1150
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +28 -2430
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +42 -9
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +103 -23
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/services/toast.service.d.ts +19 -1
- package/dist/lib/services/toast.service.d.ts.map +1 -1
- package/dist/lib/services/toast.service.js +45 -9
- package/dist/lib/services/toast.service.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +36 -8
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
- package/dist/lib/utils/agent-artifact-summary.js +3 -3
- package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
- package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +96 -0
- package/dist/lib/utils/agent-turn-routing.js.map +1 -0
- package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
- package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
- package/dist/lib/utils/artifact-panel-action.js +10 -2
- package/dist/lib/utils/artifact-panel-action.js.map +1 -1
- package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +5 -1
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
- package/dist/lib/utils/plan-mode-preference.js +6 -6
- package/dist/lib/utils/plan-mode-preference.js.map +1 -1
- package/dist/lib/utils/realtime-session-timeline.d.ts +8 -79
- package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -1
- package/dist/lib/utils/realtime-session-timeline.js +8 -89
- package/dist/lib/utils/realtime-session-timeline.js.map +1 -1
- package/dist/public-api.d.ts +5 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +9 -2
- package/dist/public-api.js.map +1 -1
- package/package.json +33 -32
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +0 -384
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +0 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +0 -231
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +0 -1
- package/dist/lib/services/delegation-result-parser.d.ts +0 -50
- package/dist/lib/services/delegation-result-parser.d.ts.map +0 -1
- package/dist/lib/services/delegation-result-parser.js +0 -60
- package/dist/lib/services/delegation-result-parser.js.map +0 -1
- package/dist/lib/services/narration-template.d.ts +0 -42
- package/dist/lib/services/narration-template.d.ts.map +0 -1
- package/dist/lib/services/narration-template.js +0 -73
- package/dist/lib/services/narration-template.js.map +0 -1
- package/dist/lib/services/skill-picker-narrowing.d.ts +0 -13
- package/dist/lib/services/skill-picker-narrowing.d.ts.map +0 -1
- package/dist/lib/services/skill-picker-narrowing.js +0 -13
- package/dist/lib/services/skill-picker-narrowing.js.map +0 -1
|
@@ -510,17 +510,115 @@ function SearchPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
510
510
|
*/
|
|
511
511
|
export class SearchPanelComponent {
|
|
512
512
|
searchService;
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
513
|
+
cdr;
|
|
514
|
+
EnvironmentId;
|
|
515
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
516
|
+
set environmentId(value) {
|
|
517
|
+
this.EnvironmentId = value;
|
|
518
|
+
}
|
|
519
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
520
|
+
get environmentId() {
|
|
521
|
+
return this.EnvironmentId;
|
|
522
|
+
}
|
|
523
|
+
CurrentUser;
|
|
524
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
525
|
+
set currentUser(value) {
|
|
526
|
+
this.CurrentUser = value;
|
|
527
|
+
}
|
|
528
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
529
|
+
get currentUser() {
|
|
530
|
+
return this.CurrentUser;
|
|
531
|
+
}
|
|
532
|
+
/** Term to open with, e.g. handed over from a narrower filter the user had already typed. */
|
|
533
|
+
InitialQuery = '';
|
|
534
|
+
/** @deprecated Use {@link InitialQuery}. */
|
|
535
|
+
set initialQuery(value) {
|
|
536
|
+
this.InitialQuery = value;
|
|
537
|
+
}
|
|
538
|
+
/** @deprecated Use {@link InitialQuery}. */
|
|
539
|
+
get initialQuery() {
|
|
540
|
+
return this.InitialQuery;
|
|
541
|
+
}
|
|
542
|
+
_isOpen = false;
|
|
543
|
+
/**
|
|
544
|
+
* A setter rather than ngOnChanges so only an actual open transition acts — ngOnChanges
|
|
545
|
+
* fires for every input, so a CurrentUser or EnvironmentId re-emit while the panel was
|
|
546
|
+
* open yanked focus back out of whatever field the user was in.
|
|
547
|
+
*/
|
|
548
|
+
set IsOpen(value) {
|
|
549
|
+
const wasOpen = this._isOpen;
|
|
550
|
+
this._isOpen = value;
|
|
551
|
+
if (value && !wasOpen) {
|
|
552
|
+
this.onOpened();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
get IsOpen() {
|
|
556
|
+
return this._isOpen;
|
|
557
|
+
}
|
|
558
|
+
/** @deprecated Use {@link IsOpen}. */
|
|
559
|
+
set isOpen(value) {
|
|
560
|
+
this.IsOpen = value;
|
|
561
|
+
}
|
|
562
|
+
/** @deprecated Use {@link IsOpen}. */
|
|
563
|
+
get isOpen() {
|
|
564
|
+
return this.IsOpen;
|
|
565
|
+
}
|
|
516
566
|
close = new EventEmitter();
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
567
|
+
ResultSelected = new EventEmitter();
|
|
568
|
+
/**
|
|
569
|
+
* @deprecated Use {@link ResultSelected}.
|
|
570
|
+
*
|
|
571
|
+
* The same emitter under the old binding name, so a template still binding
|
|
572
|
+
* (resultSelected) keeps working. Must stay AFTER ResultSelected: class fields
|
|
573
|
+
* initialise in order, and the other way round this captures undefined.
|
|
574
|
+
*/
|
|
575
|
+
resultSelected = this.ResultSelected;
|
|
576
|
+
SearchInput;
|
|
577
|
+
/** @deprecated Use {@link SearchInput}. */
|
|
578
|
+
get searchInput() {
|
|
579
|
+
return this.SearchInput;
|
|
580
|
+
}
|
|
581
|
+
/** @deprecated Use {@link SearchInput}. */
|
|
582
|
+
set searchInput(value) {
|
|
583
|
+
this.SearchInput = value;
|
|
584
|
+
}
|
|
585
|
+
SearchQuery = '';
|
|
586
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
587
|
+
get searchQuery() {
|
|
588
|
+
return this.SearchQuery;
|
|
589
|
+
}
|
|
590
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
591
|
+
set searchQuery(value) {
|
|
592
|
+
this.SearchQuery = value;
|
|
593
|
+
}
|
|
594
|
+
ActiveFilter = 'all';
|
|
595
|
+
/** @deprecated Use {@link ActiveFilter}. */
|
|
596
|
+
get activeFilter() {
|
|
597
|
+
return this.ActiveFilter;
|
|
598
|
+
}
|
|
599
|
+
/** @deprecated Use {@link ActiveFilter}. */
|
|
600
|
+
set activeFilter(value) {
|
|
601
|
+
this.ActiveFilter = value;
|
|
602
|
+
}
|
|
603
|
+
DateRange = { start: null, end: null };
|
|
604
|
+
/** @deprecated Use {@link DateRange}. */
|
|
605
|
+
get dateRange() {
|
|
606
|
+
return this.DateRange;
|
|
607
|
+
}
|
|
608
|
+
/** @deprecated Use {@link DateRange}. */
|
|
609
|
+
set dateRange(value) {
|
|
610
|
+
this.DateRange = value;
|
|
611
|
+
}
|
|
612
|
+
IsSearching = false;
|
|
613
|
+
/** @deprecated Use {@link IsSearching}. */
|
|
614
|
+
get isSearching() {
|
|
615
|
+
return this.IsSearching;
|
|
616
|
+
}
|
|
617
|
+
/** @deprecated Use {@link IsSearching}. */
|
|
618
|
+
set isSearching(value) {
|
|
619
|
+
this.IsSearching = value;
|
|
620
|
+
}
|
|
621
|
+
Results = {
|
|
524
622
|
conversations: [],
|
|
525
623
|
messages: [],
|
|
526
624
|
artifacts: [],
|
|
@@ -528,18 +626,73 @@ export class SearchPanelComponent {
|
|
|
528
626
|
tasks: [],
|
|
529
627
|
total: 0
|
|
530
628
|
};
|
|
531
|
-
|
|
532
|
-
|
|
629
|
+
/** @deprecated Use {@link Results}. */
|
|
630
|
+
get results() {
|
|
631
|
+
return this.Results;
|
|
632
|
+
}
|
|
633
|
+
/** @deprecated Use {@link Results}. */
|
|
634
|
+
set results(value) {
|
|
635
|
+
this.Results = value;
|
|
636
|
+
}
|
|
637
|
+
RecentSearches = [];
|
|
638
|
+
/** @deprecated Use {@link RecentSearches}. */
|
|
639
|
+
get recentSearches() {
|
|
640
|
+
return this.RecentSearches;
|
|
641
|
+
}
|
|
642
|
+
/** @deprecated Use {@link RecentSearches}. */
|
|
643
|
+
set recentSearches(value) {
|
|
644
|
+
this.RecentSearches = value;
|
|
645
|
+
}
|
|
646
|
+
SelectedIndex = -1;
|
|
647
|
+
/** @deprecated Use {@link SelectedIndex}. */
|
|
648
|
+
get selectedIndex() {
|
|
649
|
+
return this.SelectedIndex;
|
|
650
|
+
}
|
|
651
|
+
/** @deprecated Use {@link SelectedIndex}. */
|
|
652
|
+
set selectedIndex(value) {
|
|
653
|
+
this.SelectedIndex = value;
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Flat view of `Results`, rebuilt only on each results emission. The template binds
|
|
657
|
+
* IsResultSelected() once per row, so deriving this on demand allocated a fresh array of
|
|
658
|
+
* every result for every row on every change-detection pass.
|
|
659
|
+
*/
|
|
660
|
+
flatResults = [];
|
|
533
661
|
/** Message for the "no results" empty state, echoing the search term. */
|
|
534
662
|
get NoResultsMessage() {
|
|
535
|
-
return `No results found for "${this.
|
|
663
|
+
return `No results found for "${this.SearchQuery}"`;
|
|
536
664
|
}
|
|
537
665
|
destroy$ = new Subject();
|
|
538
|
-
|
|
666
|
+
/** True only while ngOnInit subscribes — see applyState(). */
|
|
667
|
+
initializing = false;
|
|
668
|
+
constructor(searchService, cdr) {
|
|
539
669
|
this.searchService = searchService;
|
|
670
|
+
this.cdr = cdr;
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Apply state from an async emission and render it.
|
|
674
|
+
*
|
|
675
|
+
* The search resolves through the data provider's transport, and that emission does not
|
|
676
|
+
* reliably schedule a change-detection pass: results land on the component while the panel
|
|
677
|
+
* keeps showing the previous state until some DOM event — Enter, a click on the modal,
|
|
678
|
+
* even the blur from clicking into devtools — triggers the next one. detectChanges()
|
|
679
|
+
* checks this view on the spot; markForCheck() would only mark it for a pass that never
|
|
680
|
+
* comes.
|
|
681
|
+
*/
|
|
682
|
+
applyState(fn) {
|
|
683
|
+
fn();
|
|
684
|
+
// The BehaviorSubjects replay synchronously while ngOnInit subscribes, which is already
|
|
685
|
+
// inside a pass. takeUntil(destroy$) stops emissions at teardown, so there is no
|
|
686
|
+
// destroyed-view case to guard against.
|
|
687
|
+
if (!this.initializing) {
|
|
688
|
+
this.cdr.detectChanges();
|
|
689
|
+
}
|
|
540
690
|
}
|
|
541
691
|
ngOnInit() {
|
|
692
|
+
// Each BehaviorSubject replays synchronously on subscribe, inside this pass.
|
|
693
|
+
this.initializing = true;
|
|
542
694
|
this.subscribeToSearchState();
|
|
695
|
+
this.initializing = false;
|
|
543
696
|
this.loadRecentSearches();
|
|
544
697
|
}
|
|
545
698
|
ngOnDestroy() {
|
|
@@ -553,159 +706,211 @@ export class SearchPanelComponent {
|
|
|
553
706
|
this.searchService.isSearching$
|
|
554
707
|
.pipe(takeUntil(this.destroy$))
|
|
555
708
|
.subscribe(isSearching => {
|
|
556
|
-
this.
|
|
709
|
+
this.applyState(() => {
|
|
710
|
+
this.IsSearching = isSearching;
|
|
711
|
+
});
|
|
557
712
|
});
|
|
558
713
|
this.searchService.searchResults$
|
|
559
714
|
.pipe(takeUntil(this.destroy$))
|
|
560
715
|
.subscribe(results => {
|
|
561
|
-
this.
|
|
562
|
-
|
|
716
|
+
this.applyState(() => {
|
|
717
|
+
this.Results = results;
|
|
718
|
+
this.flatResults = [
|
|
719
|
+
...results.conversations,
|
|
720
|
+
...results.messages,
|
|
721
|
+
...results.artifacts,
|
|
722
|
+
...results.collections,
|
|
723
|
+
...results.tasks
|
|
724
|
+
];
|
|
725
|
+
this.SelectedIndex = -1;
|
|
726
|
+
});
|
|
563
727
|
});
|
|
564
728
|
this.searchService.searchFilter$
|
|
565
729
|
.pipe(takeUntil(this.destroy$))
|
|
566
730
|
.subscribe(filter => {
|
|
567
|
-
this.
|
|
731
|
+
this.applyState(() => {
|
|
732
|
+
this.ActiveFilter = filter;
|
|
733
|
+
});
|
|
568
734
|
});
|
|
569
735
|
this.searchService.dateRange$
|
|
570
736
|
.pipe(takeUntil(this.destroy$))
|
|
571
737
|
.subscribe(range => {
|
|
572
|
-
this.
|
|
738
|
+
this.applyState(() => {
|
|
739
|
+
this.DateRange = range;
|
|
740
|
+
});
|
|
573
741
|
});
|
|
574
742
|
}
|
|
575
743
|
/**
|
|
576
744
|
* Load recent searches
|
|
577
745
|
*/
|
|
578
746
|
loadRecentSearches() {
|
|
579
|
-
this.
|
|
747
|
+
this.RecentSearches = this.searchService.getRecentSearches();
|
|
580
748
|
}
|
|
581
749
|
/**
|
|
582
750
|
* Handle search input
|
|
583
751
|
*/
|
|
584
|
-
|
|
585
|
-
if (this.
|
|
752
|
+
OnSearchInput() {
|
|
753
|
+
if (this.SearchQuery.trim()) {
|
|
586
754
|
this.performSearch();
|
|
587
755
|
}
|
|
588
756
|
else {
|
|
589
757
|
this.searchService.clearResults();
|
|
590
758
|
}
|
|
591
759
|
}
|
|
760
|
+
/** @deprecated Use {@link OnSearchInput}. */
|
|
761
|
+
onSearchInput() {
|
|
762
|
+
return this.OnSearchInput();
|
|
763
|
+
}
|
|
592
764
|
/**
|
|
593
765
|
* Perform search
|
|
594
766
|
*/
|
|
595
767
|
async performSearch() {
|
|
596
|
-
await this.searchService.search(this.
|
|
768
|
+
await this.searchService.search(this.SearchQuery, this.EnvironmentId, this.CurrentUser);
|
|
597
769
|
}
|
|
598
770
|
/**
|
|
599
771
|
* Set search filter
|
|
600
772
|
*/
|
|
601
|
-
|
|
773
|
+
SetFilter(filter) {
|
|
602
774
|
this.searchService.setSearchFilter(filter);
|
|
603
|
-
if (this.
|
|
775
|
+
if (this.SearchQuery.trim()) {
|
|
604
776
|
this.performSearch();
|
|
605
777
|
}
|
|
606
778
|
}
|
|
779
|
+
/** @deprecated Use {@link SetFilter}. */
|
|
780
|
+
setFilter(filter) {
|
|
781
|
+
return this.SetFilter(filter);
|
|
782
|
+
}
|
|
607
783
|
/**
|
|
608
784
|
* Clear search
|
|
609
785
|
*/
|
|
610
|
-
|
|
611
|
-
this.
|
|
786
|
+
ClearSearch() {
|
|
787
|
+
this.SearchQuery = '';
|
|
612
788
|
this.searchService.clearResults();
|
|
613
789
|
this.focusSearchInput();
|
|
614
790
|
}
|
|
791
|
+
/** @deprecated Use {@link ClearSearch}. */
|
|
792
|
+
clearSearch() {
|
|
793
|
+
return this.ClearSearch();
|
|
794
|
+
}
|
|
615
795
|
/**
|
|
616
796
|
* Select a result
|
|
617
797
|
*/
|
|
798
|
+
SelectResult(result) {
|
|
799
|
+
this.ResultSelected.emit(result);
|
|
800
|
+
this.ClosePanel();
|
|
801
|
+
}
|
|
802
|
+
/** @deprecated Use {@link SelectResult}. */
|
|
618
803
|
selectResult(result) {
|
|
619
|
-
this.
|
|
620
|
-
this.closePanel();
|
|
804
|
+
return this.SelectResult(result);
|
|
621
805
|
}
|
|
622
806
|
/**
|
|
623
807
|
* Use recent search
|
|
624
808
|
*/
|
|
625
|
-
|
|
626
|
-
this.
|
|
809
|
+
UseRecentSearch(query) {
|
|
810
|
+
this.SearchQuery = query;
|
|
627
811
|
this.performSearch();
|
|
628
812
|
}
|
|
813
|
+
/** @deprecated Use {@link UseRecentSearch}. */
|
|
814
|
+
useRecentSearch(query) {
|
|
815
|
+
return this.UseRecentSearch(query);
|
|
816
|
+
}
|
|
629
817
|
/**
|
|
630
818
|
* Clear recent searches
|
|
631
819
|
*/
|
|
632
|
-
|
|
820
|
+
ClearRecentSearches() {
|
|
633
821
|
this.searchService.clearRecentSearches();
|
|
634
|
-
this.
|
|
822
|
+
this.RecentSearches = [];
|
|
823
|
+
}
|
|
824
|
+
/** @deprecated Use {@link ClearRecentSearches}. */
|
|
825
|
+
clearRecentSearches() {
|
|
826
|
+
return this.ClearRecentSearches();
|
|
635
827
|
}
|
|
636
828
|
/**
|
|
637
829
|
* Close panel
|
|
638
830
|
*/
|
|
639
|
-
|
|
831
|
+
ClosePanel() {
|
|
640
832
|
this.close.emit();
|
|
641
833
|
}
|
|
834
|
+
/** @deprecated Use {@link ClosePanel}. */
|
|
835
|
+
closePanel() {
|
|
836
|
+
return this.ClosePanel();
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Seed and focus the box once the panel is open.
|
|
840
|
+
*
|
|
841
|
+
* Deferred to the next task so the @if(IsOpen) view exists (there is no input to focus
|
|
842
|
+
* before it renders) and so every input bound in the same pass has been set — this reads
|
|
843
|
+
* InitialQuery, which the host may bind after IsOpen.
|
|
844
|
+
*/
|
|
845
|
+
onOpened() {
|
|
846
|
+
setTimeout(() => {
|
|
847
|
+
const seed = this.InitialQuery?.trim();
|
|
848
|
+
if (seed && seed !== this.SearchQuery) {
|
|
849
|
+
this.SearchQuery = seed;
|
|
850
|
+
this.OnSearchInput();
|
|
851
|
+
this.cdr.detectChanges();
|
|
852
|
+
}
|
|
853
|
+
this.SearchInput?.nativeElement.focus();
|
|
854
|
+
}, 0);
|
|
855
|
+
}
|
|
642
856
|
/**
|
|
643
857
|
* Focus search input
|
|
644
858
|
*/
|
|
645
859
|
focusSearchInput() {
|
|
646
860
|
setTimeout(() => {
|
|
647
|
-
this.
|
|
861
|
+
this.SearchInput?.nativeElement.focus();
|
|
648
862
|
}, 0);
|
|
649
863
|
}
|
|
650
864
|
/**
|
|
651
865
|
* Handle keyboard navigation
|
|
652
866
|
*/
|
|
653
867
|
handleKeyboard(event) {
|
|
654
|
-
if (!this.
|
|
868
|
+
if (!this.IsOpen)
|
|
655
869
|
return;
|
|
656
|
-
const allResults = this.
|
|
870
|
+
const allResults = this.flatResults;
|
|
657
871
|
switch (event.key) {
|
|
658
872
|
case 'Escape':
|
|
659
873
|
event.preventDefault();
|
|
660
|
-
this.
|
|
874
|
+
this.ClosePanel();
|
|
661
875
|
break;
|
|
662
876
|
case 'ArrowDown':
|
|
663
877
|
event.preventDefault();
|
|
664
878
|
if (allResults.length > 0) {
|
|
665
|
-
this.
|
|
879
|
+
this.SelectedIndex = Math.min(this.SelectedIndex + 1, allResults.length - 1);
|
|
666
880
|
}
|
|
667
881
|
break;
|
|
668
882
|
case 'ArrowUp':
|
|
669
883
|
event.preventDefault();
|
|
670
|
-
if (this.
|
|
671
|
-
this.
|
|
884
|
+
if (this.SelectedIndex > 0) {
|
|
885
|
+
this.SelectedIndex--;
|
|
672
886
|
}
|
|
673
887
|
else {
|
|
674
|
-
this.
|
|
888
|
+
this.SelectedIndex = -1;
|
|
675
889
|
}
|
|
676
890
|
break;
|
|
677
891
|
case 'Enter':
|
|
678
892
|
event.preventDefault();
|
|
679
|
-
if (this.
|
|
680
|
-
this.
|
|
893
|
+
if (this.SelectedIndex >= 0 && allResults[this.SelectedIndex]) {
|
|
894
|
+
this.SelectResult(allResults[this.SelectedIndex]);
|
|
681
895
|
}
|
|
682
896
|
break;
|
|
683
897
|
}
|
|
684
898
|
}
|
|
685
|
-
/**
|
|
686
|
-
* Get all results as flat array
|
|
687
|
-
*/
|
|
688
|
-
getAllResultsFlat() {
|
|
689
|
-
return [
|
|
690
|
-
...this.results.conversations,
|
|
691
|
-
...this.results.messages,
|
|
692
|
-
...this.results.artifacts,
|
|
693
|
-
...this.results.collections,
|
|
694
|
-
...this.results.tasks
|
|
695
|
-
];
|
|
696
|
-
}
|
|
697
899
|
/**
|
|
698
900
|
* Check if result is selected
|
|
699
901
|
*/
|
|
902
|
+
IsResultSelected(result) {
|
|
903
|
+
const selected = this.flatResults[this.SelectedIndex];
|
|
904
|
+
return !!selected && selected.id === result.id && selected.type === result.type;
|
|
905
|
+
}
|
|
906
|
+
/** @deprecated Use {@link IsResultSelected}. */
|
|
700
907
|
isResultSelected(result) {
|
|
701
|
-
|
|
702
|
-
const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);
|
|
703
|
-
return index === this.selectedIndex;
|
|
908
|
+
return this.IsResultSelected(result);
|
|
704
909
|
}
|
|
705
910
|
/**
|
|
706
911
|
* Get icon for result type
|
|
707
912
|
*/
|
|
708
|
-
|
|
913
|
+
GetResultIcon(type) {
|
|
709
914
|
switch (type) {
|
|
710
915
|
case 'conversation':
|
|
711
916
|
return 'fa-comments';
|
|
@@ -721,10 +926,14 @@ export class SearchPanelComponent {
|
|
|
721
926
|
return 'fa-circle';
|
|
722
927
|
}
|
|
723
928
|
}
|
|
929
|
+
/** @deprecated Use {@link GetResultIcon}. */
|
|
930
|
+
getResultIcon(type) {
|
|
931
|
+
return this.GetResultIcon(type);
|
|
932
|
+
}
|
|
724
933
|
/**
|
|
725
934
|
* Get filter display text
|
|
726
935
|
*/
|
|
727
|
-
|
|
936
|
+
GetFilterText(filter) {
|
|
728
937
|
switch (filter) {
|
|
729
938
|
case 'all':
|
|
730
939
|
return 'All';
|
|
@@ -742,6 +951,10 @@ export class SearchPanelComponent {
|
|
|
742
951
|
return 'All';
|
|
743
952
|
}
|
|
744
953
|
}
|
|
954
|
+
/** @deprecated Use {@link GetFilterText}. */
|
|
955
|
+
getFilterText(filter) {
|
|
956
|
+
return this.GetFilterText(filter);
|
|
957
|
+
}
|
|
745
958
|
/**
|
|
746
959
|
* Format date for display
|
|
747
960
|
*/
|
|
@@ -762,69 +975,85 @@ export class SearchPanelComponent {
|
|
|
762
975
|
return `${Math.floor(days / 365)} years ago`;
|
|
763
976
|
}
|
|
764
977
|
/** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */
|
|
765
|
-
|
|
978
|
+
HighlightMatch(text, query) {
|
|
766
979
|
return HighlightSearchMatches(text, query);
|
|
767
980
|
}
|
|
981
|
+
/** @deprecated Use {@link HighlightMatch}. */
|
|
982
|
+
highlightMatch(text, query) {
|
|
983
|
+
return this.HighlightMatch(text, query);
|
|
984
|
+
}
|
|
768
985
|
/**
|
|
769
986
|
* Handle date range change
|
|
770
987
|
*/
|
|
771
|
-
|
|
772
|
-
this.searchService.setDateRange(this.
|
|
773
|
-
if (this.
|
|
988
|
+
OnDateRangeChange() {
|
|
989
|
+
this.searchService.setDateRange(this.DateRange);
|
|
990
|
+
if (this.SearchQuery.trim()) {
|
|
774
991
|
this.performSearch();
|
|
775
992
|
}
|
|
776
993
|
}
|
|
994
|
+
/** @deprecated Use {@link OnDateRangeChange}. */
|
|
995
|
+
onDateRangeChange() {
|
|
996
|
+
return this.OnDateRangeChange();
|
|
997
|
+
}
|
|
777
998
|
/**
|
|
778
999
|
* Clear date range
|
|
779
1000
|
*/
|
|
780
|
-
|
|
781
|
-
this.
|
|
1001
|
+
ClearDateRange() {
|
|
1002
|
+
this.DateRange = { start: null, end: null };
|
|
782
1003
|
this.searchService.setDateRange({ start: null, end: null });
|
|
783
|
-
if (this.
|
|
1004
|
+
if (this.SearchQuery.trim()) {
|
|
784
1005
|
this.performSearch();
|
|
785
1006
|
}
|
|
786
1007
|
}
|
|
787
|
-
/**
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
ngOnChanges() {
|
|
791
|
-
if (this.isOpen) {
|
|
792
|
-
this.focusSearchInput();
|
|
793
|
-
}
|
|
1008
|
+
/** @deprecated Use {@link ClearDateRange}. */
|
|
1009
|
+
clearDateRange() {
|
|
1010
|
+
return this.ClearDateRange();
|
|
794
1011
|
}
|
|
795
|
-
static ɵfac = function SearchPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SearchPanelComponent)(i0.ɵɵdirectiveInject(i1.SearchService)); };
|
|
1012
|
+
static ɵfac = function SearchPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SearchPanelComponent)(i0.ɵɵdirectiveInject(i1.SearchService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
796
1013
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SearchPanelComponent, selectors: [["mj-search-panel"]], viewQuery: function SearchPanelComponent_Query(rf, ctx) { if (rf & 1) {
|
|
797
1014
|
i0.ɵɵviewQuery(_c0, 5);
|
|
798
1015
|
} if (rf & 2) {
|
|
799
1016
|
let _t;
|
|
800
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1017
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.SearchInput = _t.first);
|
|
801
1018
|
} }, hostBindings: function SearchPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
802
1019
|
i0.ɵɵlistener("keydown", function SearchPanelComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyboard($event); });
|
|
803
|
-
} }, inputs: { environmentId: "environmentId", currentUser: "currentUser", isOpen: "isOpen" }, outputs: { close: "close", resultSelected: "resultSelected" }, standalone: false,
|
|
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) {
|
|
804
1021
|
i0.ɵɵconditionalCreate(0, SearchPanelComponent_Conditional_0_Template, 54, 18, "div", 1);
|
|
805
1022
|
} if (rf & 2) {
|
|
806
1023
|
i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
|
|
807
|
-
} }, 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.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}"] });
|
|
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}"] });
|
|
808
1025
|
}
|
|
809
1026
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchPanelComponent, [{
|
|
810
1027
|
type: Component,
|
|
811
|
-
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.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"] }]
|
|
812
|
-
}], () => [{ type: i1.SearchService }], {
|
|
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"] }]
|
|
1029
|
+
}], () => [{ type: i1.SearchService }, { type: i0.ChangeDetectorRef }], { EnvironmentId: [{
|
|
1030
|
+
type: Input
|
|
1031
|
+
}], environmentId: [{
|
|
1032
|
+
type: Input
|
|
1033
|
+
}], CurrentUser: [{
|
|
813
1034
|
type: Input
|
|
814
1035
|
}], currentUser: [{
|
|
815
1036
|
type: Input
|
|
1037
|
+
}], InitialQuery: [{
|
|
1038
|
+
type: Input
|
|
1039
|
+
}], initialQuery: [{
|
|
1040
|
+
type: Input
|
|
1041
|
+
}], IsOpen: [{
|
|
1042
|
+
type: Input
|
|
816
1043
|
}], isOpen: [{
|
|
817
1044
|
type: Input
|
|
818
1045
|
}], close: [{
|
|
819
1046
|
type: Output
|
|
1047
|
+
}], ResultSelected: [{
|
|
1048
|
+
type: Output
|
|
820
1049
|
}], resultSelected: [{
|
|
821
1050
|
type: Output
|
|
822
|
-
}],
|
|
1051
|
+
}], SearchInput: [{
|
|
823
1052
|
type: ViewChild,
|
|
824
1053
|
args: ['searchInput']
|
|
825
1054
|
}], handleKeyboard: [{
|
|
826
1055
|
type: HostListener,
|
|
827
1056
|
args: ['keydown', ['$event']]
|
|
828
1057
|
}] }); })();
|
|
829
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SearchPanelComponent, { className: "SearchPanelComponent", filePath: "src/lib/components/search/search-panel.component.ts", lineNumber:
|
|
1058
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SearchPanelComponent, { className: "SearchPanelComponent", filePath: "src/lib/components/search/search-panel.component.ts", lineNumber: 36 }); })();
|
|
830
1059
|
//# sourceMappingURL=search-panel.component.js.map
|