@memberjunction/ng-conversations 5.32.0 → 5.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +75 -30
  2. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +1026 -478
  4. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  5. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  6. package/dist/lib/components/collection/collection-form-modal.component.js +5 -5
  7. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  8. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +8 -1
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  10. package/dist/lib/components/conversation/conversation-chat-area.component.js +30 -16
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  12. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  13. package/dist/lib/components/conversation/conversation-list.component.js +3 -3
  14. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  15. package/dist/lib/components/message/message-item.component.d.ts +12 -1
  16. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  17. package/dist/lib/components/message/message-item.component.js +34 -15
  18. package/dist/lib/components/message/message-item.component.js.map +1 -1
  19. package/dist/lib/components/search/search-panel.component.d.ts +1 -7
  20. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  21. package/dist/lib/components/search/search-panel.component.js +4 -14
  22. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  23. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /**\n * Highlight matched text in result\n */\n public highlightMatch(text: string, query: string): string {\n if (!query) return text;\n\n const regex = new RegExp(`(${this.escapeRegex(query)})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n\n /**\n * Escape regex special characters\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>Search across all your conversations, messages, artifacts, collections, and tasks</p>\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 </div>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search-minus empty-icon\"></i>\n <p>No results found for \"{{ searchQuery }}\"</p>\n <p class=\"no-results-hint\">Try adjusting your filters or search terms</p>\n </div>\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
1
+ {"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public highlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>Search across all your conversations, messages, artifacts, collections, and tasks</p>\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 </div>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search-minus empty-icon\"></i>\n <p>No results found for \"{{ searchQuery }}\"</p>\n <p class=\"no-results-hint\">Try adjusting your filters or search terms</p>\n </div>\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-conversations",
3
- "version": "5.32.0",
3
+ "version": "5.34.0",
4
4
  "description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -29,29 +29,29 @@
29
29
  "@angular/router": "21.1.3"
30
30
  },
31
31
  "dependencies": {
32
- "@memberjunction/ng-ui-components": "5.32.0",
32
+ "@memberjunction/ng-ui-components": "5.34.0",
33
33
  "@angular/animations": "21.1.3",
34
34
  "@angular/cdk": "21.1.3",
35
- "@memberjunction/ai": "5.32.0",
36
- "@memberjunction/ai-agent-client": "5.32.0",
37
- "@memberjunction/ai-core-plus": "5.32.0",
38
- "@memberjunction/ai-engine-base": "5.32.0",
39
- "@memberjunction/ng-agent-client": "5.32.0",
40
- "@memberjunction/core": "5.32.0",
41
- "@memberjunction/core-entities": "5.32.0",
42
- "@memberjunction/global": "5.32.0",
43
- "@memberjunction/graphql-dataprovider": "5.32.0",
44
- "@memberjunction/ng-artifacts": "5.32.0",
45
- "@memberjunction/ng-base-types": "5.32.0",
46
- "@memberjunction/ng-code-editor": "5.32.0",
47
- "@memberjunction/ng-container-directives": "5.32.0",
48
- "@memberjunction/ng-forms": "5.32.0",
49
- "@memberjunction/ng-markdown": "5.32.0",
50
- "@memberjunction/ng-notifications": "5.32.0",
51
- "@memberjunction/ng-resource-permissions": "5.32.0",
52
- "@memberjunction/ng-shared-generic": "5.32.0",
53
- "@memberjunction/ng-tasks": "5.32.0",
54
- "@memberjunction/ng-testing": "5.32.0",
35
+ "@memberjunction/ai": "5.34.0",
36
+ "@memberjunction/ai-agent-client": "5.34.0",
37
+ "@memberjunction/ai-core-plus": "5.34.0",
38
+ "@memberjunction/ai-engine-base": "5.34.0",
39
+ "@memberjunction/ng-agent-client": "5.34.0",
40
+ "@memberjunction/core": "5.34.0",
41
+ "@memberjunction/core-entities": "5.34.0",
42
+ "@memberjunction/global": "5.34.0",
43
+ "@memberjunction/graphql-dataprovider": "5.34.0",
44
+ "@memberjunction/ng-artifacts": "5.34.0",
45
+ "@memberjunction/ng-base-types": "5.34.0",
46
+ "@memberjunction/ng-code-editor": "5.34.0",
47
+ "@memberjunction/ng-container-directives": "5.34.0",
48
+ "@memberjunction/ng-forms": "5.34.0",
49
+ "@memberjunction/ng-markdown": "5.34.0",
50
+ "@memberjunction/ng-notifications": "5.34.0",
51
+ "@memberjunction/ng-resource-permissions": "5.34.0",
52
+ "@memberjunction/ng-shared-generic": "5.34.0",
53
+ "@memberjunction/ng-tasks": "5.34.0",
54
+ "@memberjunction/ng-testing": "5.34.0",
55
55
  "rxjs": "^7.8.2",
56
56
  "tslib": "^2.8.1"
57
57
  },