@memberjunction/ng-conversations 6.2.0-edge.0 → 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 +35 -2
- 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 +2399 -706
- 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/realtime-activity-rail.component.d.ts +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-delegation-card.component.d.ts +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 +2 -2
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
- 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 +136 -92
- 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 +2 -2
- 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 +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/whiteboard/whiteboard-channel.d.ts +3 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
- 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/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/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 +17 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +38 -10
- 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/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/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/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -96,19 +96,43 @@ function GlobalTasksPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1)
|
|
|
96
96
|
*/
|
|
97
97
|
export class GlobalTasksPanelComponent {
|
|
98
98
|
activeTasksService;
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
Tasks = [];
|
|
100
|
+
/** @deprecated Use {@link Tasks}. */
|
|
101
|
+
get tasks() {
|
|
102
|
+
return this.Tasks;
|
|
103
|
+
}
|
|
104
|
+
/** @deprecated Use {@link Tasks}. */
|
|
105
|
+
set tasks(value) {
|
|
106
|
+
this.Tasks = value;
|
|
107
|
+
}
|
|
108
|
+
IsMinimized = false;
|
|
109
|
+
/** @deprecated Use {@link IsMinimized}. */
|
|
110
|
+
get isMinimized() {
|
|
111
|
+
return this.IsMinimized;
|
|
112
|
+
}
|
|
113
|
+
/** @deprecated Use {@link IsMinimized}. */
|
|
114
|
+
set isMinimized(value) {
|
|
115
|
+
this.IsMinimized = value;
|
|
116
|
+
}
|
|
101
117
|
destroy$ = new Subject();
|
|
102
|
-
|
|
118
|
+
TaskClicked = new EventEmitter();
|
|
119
|
+
/**
|
|
120
|
+
* @deprecated Use {@link TaskClicked}.
|
|
121
|
+
*
|
|
122
|
+
* The same emitter under the old binding name, so a template still binding
|
|
123
|
+
* (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields
|
|
124
|
+
* initialise in order, and the other way round this captures undefined.
|
|
125
|
+
*/
|
|
126
|
+
taskClicked = this.TaskClicked;
|
|
103
127
|
constructor(activeTasksService) {
|
|
104
128
|
this.activeTasksService = activeTasksService;
|
|
105
129
|
}
|
|
106
130
|
ngOnInit() {
|
|
107
131
|
// Subscribe to active tasks
|
|
108
132
|
this.activeTasksService.tasks$.pipe(takeUntil(this.destroy$)).subscribe(tasks => {
|
|
109
|
-
this.
|
|
133
|
+
this.Tasks = tasks;
|
|
110
134
|
// Auto-expand if tasks appear and panel was minimized
|
|
111
|
-
if (this.
|
|
135
|
+
if (this.Tasks.length > 0 && this.IsMinimized) {
|
|
112
136
|
// Keep minimized, let user expand manually
|
|
113
137
|
}
|
|
114
138
|
});
|
|
@@ -117,21 +141,37 @@ export class GlobalTasksPanelComponent {
|
|
|
117
141
|
this.destroy$.next();
|
|
118
142
|
this.destroy$.complete();
|
|
119
143
|
}
|
|
144
|
+
Expand() {
|
|
145
|
+
this.IsMinimized = false;
|
|
146
|
+
}
|
|
147
|
+
/** @deprecated Use {@link Expand}. */
|
|
120
148
|
expand() {
|
|
121
|
-
this.
|
|
149
|
+
return this.Expand();
|
|
150
|
+
}
|
|
151
|
+
Minimize() {
|
|
152
|
+
this.IsMinimized = true;
|
|
122
153
|
}
|
|
154
|
+
/** @deprecated Use {@link Minimize}. */
|
|
123
155
|
minimize() {
|
|
124
|
-
this.
|
|
156
|
+
return this.Minimize();
|
|
157
|
+
}
|
|
158
|
+
OnTaskClick(task) {
|
|
159
|
+
this.TaskClicked.emit(task);
|
|
125
160
|
}
|
|
161
|
+
/** @deprecated Use {@link OnTaskClick}. */
|
|
126
162
|
onTaskClick(task) {
|
|
127
|
-
this.
|
|
163
|
+
return this.OnTaskClick(task);
|
|
128
164
|
}
|
|
129
|
-
|
|
165
|
+
GetTrimmedStatus(status) {
|
|
130
166
|
// Remove emojis and trim to 50 chars
|
|
131
167
|
const cleaned = status.replace(/[\u{1F600}-\u{1F64F}]/gu, '').trim();
|
|
132
168
|
return cleaned.length > 50 ? cleaned.substring(0, 47) + '...' : cleaned;
|
|
133
169
|
}
|
|
134
|
-
|
|
170
|
+
/** @deprecated Use {@link GetTrimmedStatus}. */
|
|
171
|
+
getTrimmedStatus(status) {
|
|
172
|
+
return this.GetTrimmedStatus(status);
|
|
173
|
+
}
|
|
174
|
+
GetElapsedTime(task) {
|
|
135
175
|
const elapsed = Date.now() - task.startTime;
|
|
136
176
|
const seconds = Math.floor(elapsed / 1000);
|
|
137
177
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -146,8 +186,12 @@ export class GlobalTasksPanelComponent {
|
|
|
146
186
|
return `${seconds}s`;
|
|
147
187
|
}
|
|
148
188
|
}
|
|
189
|
+
/** @deprecated Use {@link GetElapsedTime}. */
|
|
190
|
+
getElapsedTime(task) {
|
|
191
|
+
return this.GetElapsedTime(task);
|
|
192
|
+
}
|
|
149
193
|
static ɵfac = function GlobalTasksPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || GlobalTasksPanelComponent)(i0.ɵɵdirectiveInject(i1.ActiveTasksService)); };
|
|
150
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GlobalTasksPanelComponent, selectors: [["mj-global-tasks-panel"]], outputs: { taskClicked: "taskClicked" }, standalone: false, decls: 1, vars: 1, consts: [[1, "global-tasks-panel"], ["title", "View active tasks", 1, "minimized-badge"], [1, "expanded-panel"], ["title", "View active tasks", 1, "minimized-badge", 3, "click"], [1, "fas", "fa-bolt"], [1, "task-count"], [1, "panel-header"], [1, "header-left"], [1, "fas", "fa-circle-notch", "fa-spin"], ["title", "Minimize", 1, "minimize-btn", 3, "click"], [1, "fas", "fa-minus"], [1, "panel-content"], [1, "task-item"], [1, "task-item", 3, "click"], [1, "task-header"], [1, "fas", "fa-robot"], [1, "task-agent"], [1, "task-conversation"], [1, "task-status"], [1, "status-indicator", "active"], [1, "status-text"], [1, "task-elapsed"], [1, "fas", "fa-message"]], template: function GlobalTasksPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
194
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GlobalTasksPanelComponent, selectors: [["mj-global-tasks-panel"]], outputs: { TaskClicked: "TaskClicked", taskClicked: "taskClicked" }, standalone: false, decls: 1, vars: 1, consts: [[1, "global-tasks-panel"], ["title", "View active tasks", 1, "minimized-badge"], [1, "expanded-panel"], ["title", "View active tasks", 1, "minimized-badge", 3, "click"], [1, "fas", "fa-bolt"], [1, "task-count"], [1, "panel-header"], [1, "header-left"], [1, "fas", "fa-circle-notch", "fa-spin"], ["title", "Minimize", 1, "minimize-btn", 3, "click"], [1, "fas", "fa-minus"], [1, "panel-content"], [1, "task-item"], [1, "task-item", 3, "click"], [1, "task-header"], [1, "fas", "fa-robot"], [1, "task-agent"], [1, "task-conversation"], [1, "task-status"], [1, "status-indicator", "active"], [1, "status-text"], [1, "task-elapsed"], [1, "fas", "fa-message"]], template: function GlobalTasksPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
151
195
|
i0.ɵɵconditionalCreate(0, GlobalTasksPanelComponent_Conditional_0_Template, 3, 2, "div", 0);
|
|
152
196
|
} if (rf & 2) {
|
|
153
197
|
i0.ɵɵconditional(ctx.tasks.length > 0 ? 0 : -1);
|
|
@@ -206,7 +250,9 @@ export class GlobalTasksPanelComponent {
|
|
|
206
250
|
</div>
|
|
207
251
|
}
|
|
208
252
|
`, styles: ["\n .global-tasks-panel {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 9999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Minimized Badge */\n .minimized-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 50%;\n width: 56px;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.3s ease;\n position: relative;\n animation: pulse 2s ease-in-out infinite;\n }\n\n .minimized-badge:hover {\n transform: scale(1.1);\n box-shadow: var(--mj-shadow-lg);\n }\n\n .minimized-badge i {\n font-size: 20px;\n margin-right: 4px;\n }\n\n .minimized-badge .task-count {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 2px solid var(--mj-bg-surface);\n }\n\n @keyframes pulse {\n 0%, 100% {\n box-shadow: var(--mj-shadow-md);\n }\n 50% {\n box-shadow: var(--mj-shadow-lg);\n }\n }\n\n /* Expanded Panel */\n .expanded-panel {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 360px;\n max-height: 480px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.3s ease-out;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 14px;\n }\n\n .header-left i {\n font-size: 16px;\n }\n\n .minimize-btn {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .minimize-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .panel-content {\n overflow-y: auto;\n max-height: 420px;\n }\n\n .task-item {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .task-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-item:last-child {\n border-bottom: none;\n }\n\n .task-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n }\n\n .task-header i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .task-agent {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .task-conversation {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .task-conversation i {\n font-size: 11px;\n }\n\n .task-status {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.active {\n background: var(--mj-status-success);\n animation: blink 2s ease-in-out infinite;\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n .status-text {\n font-size: 12px;\n color: var(--mj-text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .task-elapsed {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-variant-numeric: tabular-nums;\n }\n\n /* Scrollbar Styling */\n .panel-content::-webkit-scrollbar {\n width: 6px;\n }\n\n .panel-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n }\n\n .panel-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n "] }]
|
|
209
|
-
}], () => [{ type: i1.ActiveTasksService }], {
|
|
253
|
+
}], () => [{ type: i1.ActiveTasksService }], { TaskClicked: [{
|
|
254
|
+
type: Output
|
|
255
|
+
}], taskClicked: [{
|
|
210
256
|
type: Output
|
|
211
257
|
}] }); })();
|
|
212
258
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GlobalTasksPanelComponent, { className: "GlobalTasksPanelComponent", filePath: "src/lib/components/global-tasks/global-tasks-panel.component.ts", lineNumber: 300 }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-tasks-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/global-tasks/global-tasks-panel.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { ActiveTasksService, ActiveTask } from '../../services/active-tasks.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n/**\n * Global floating tasks panel that shows all active tasks across all conversations\n * Appears in bottom-right corner, minimizable, shows only when tasks > 0\n */\n@Component({\n standalone: false,\n selector: 'mj-global-tasks-panel',\n template: `\n @if (tasks.length > 0) {\n <div class=\"global-tasks-panel\">\n <!-- Minimized State -->\n @if (isMinimized) {\n <button\n class=\"minimized-badge\"\n (click)=\"expand()\"\n title=\"View active tasks\">\n <i class=\"fas fa-bolt\"></i>\n <span class=\"task-count\">{{ tasks.length }}</span>\n </button>\n }\n <!-- Expanded State -->\n @if (!isMinimized) {\n <div class=\"expanded-panel\">\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>Active Tasks ({{ tasks.length }})</span>\n </div>\n <button class=\"minimize-btn\" (click)=\"minimize()\" title=\"Minimize\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"panel-content\">\n @for (task of tasks; track task) {\n <div class=\"task-item\" (click)=\"onTaskClick(task)\">\n <div class=\"task-header\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"task-agent\">{{ task.agentName }}</span>\n </div>\n @if (task.conversationName) {\n <div class=\"task-conversation\">\n <i class=\"fas fa-message\"></i>\n <span>{{ task.conversationName }}</span>\n </div>\n }\n <div class=\"task-status\">\n <span class=\"status-indicator active\"></span>\n <span class=\"status-text\">{{ getTrimmedStatus(task.status) }}</span>\n </div>\n <div class=\"task-elapsed\">{{ getElapsedTime(task) }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n .global-tasks-panel {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 9999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Minimized Badge */\n .minimized-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 50%;\n width: 56px;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.3s ease;\n position: relative;\n animation: pulse 2s ease-in-out infinite;\n }\n\n .minimized-badge:hover {\n transform: scale(1.1);\n box-shadow: var(--mj-shadow-lg);\n }\n\n .minimized-badge i {\n font-size: 20px;\n margin-right: 4px;\n }\n\n .minimized-badge .task-count {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 2px solid var(--mj-bg-surface);\n }\n\n @keyframes pulse {\n 0%, 100% {\n box-shadow: var(--mj-shadow-md);\n }\n 50% {\n box-shadow: var(--mj-shadow-lg);\n }\n }\n\n /* Expanded Panel */\n .expanded-panel {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 360px;\n max-height: 480px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.3s ease-out;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 14px;\n }\n\n .header-left i {\n font-size: 16px;\n }\n\n .minimize-btn {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .minimize-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .panel-content {\n overflow-y: auto;\n max-height: 420px;\n }\n\n .task-item {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .task-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-item:last-child {\n border-bottom: none;\n }\n\n .task-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n }\n\n .task-header i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .task-agent {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .task-conversation {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .task-conversation i {\n font-size: 11px;\n }\n\n .task-status {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.active {\n background: var(--mj-status-success);\n animation: blink 2s ease-in-out infinite;\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n .status-text {\n font-size: 12px;\n color: var(--mj-text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .task-elapsed {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-variant-numeric: tabular-nums;\n }\n\n /* Scrollbar Styling */\n .panel-content::-webkit-scrollbar {\n width: 6px;\n }\n\n .panel-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n }\n\n .panel-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class GlobalTasksPanelComponent implements OnInit, OnDestroy {\n public tasks: ActiveTask[] = [];\n public isMinimized: boolean = false;\n\n private destroy$ = new Subject<void>();\n\n @Output() taskClicked = new EventEmitter<ActiveTask>();\n\n constructor(private activeTasksService: ActiveTasksService) {}\n\n ngOnInit() {\n // Subscribe to active tasks\n this.activeTasksService.tasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(tasks => {\n this.tasks = tasks;\n\n // Auto-expand if tasks appear and panel was minimized\n if (this.tasks.length > 0 && this.isMinimized) {\n // Keep minimized, let user expand manually\n }\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n expand() {\n this.isMinimized = false;\n }\n\n minimize() {\n this.isMinimized = true;\n }\n\n onTaskClick(task: ActiveTask) {\n this.taskClicked.emit(task);\n }\n\n getTrimmedStatus(status: string): string {\n // Remove emojis and trim to 50 chars\n const cleaned = status.replace(/[\\u{1F600}-\\u{1F64F}]/gu, '').trim();\n return cleaned.length > 50 ? cleaned.substring(0, 47) + '...' : cleaned;\n }\n\n getElapsedTime(task: ActiveTask): string {\n const elapsed = Date.now() - task.startTime;\n const seconds = Math.floor(elapsed / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"global-tasks-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/global-tasks/global-tasks-panel.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { ActiveTasksService, ActiveTask } from '../../services/active-tasks.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n/**\n * Global floating tasks panel that shows all active tasks across all conversations\n * Appears in bottom-right corner, minimizable, shows only when tasks > 0\n */\n@Component({\n standalone: false,\n selector: 'mj-global-tasks-panel',\n template: `\n @if (tasks.length > 0) {\n <div class=\"global-tasks-panel\">\n <!-- Minimized State -->\n @if (isMinimized) {\n <button\n class=\"minimized-badge\"\n (click)=\"expand()\"\n title=\"View active tasks\">\n <i class=\"fas fa-bolt\"></i>\n <span class=\"task-count\">{{ tasks.length }}</span>\n </button>\n }\n <!-- Expanded State -->\n @if (!isMinimized) {\n <div class=\"expanded-panel\">\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>Active Tasks ({{ tasks.length }})</span>\n </div>\n <button class=\"minimize-btn\" (click)=\"minimize()\" title=\"Minimize\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"panel-content\">\n @for (task of tasks; track task) {\n <div class=\"task-item\" (click)=\"onTaskClick(task)\">\n <div class=\"task-header\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"task-agent\">{{ task.agentName }}</span>\n </div>\n @if (task.conversationName) {\n <div class=\"task-conversation\">\n <i class=\"fas fa-message\"></i>\n <span>{{ task.conversationName }}</span>\n </div>\n }\n <div class=\"task-status\">\n <span class=\"status-indicator active\"></span>\n <span class=\"status-text\">{{ getTrimmedStatus(task.status) }}</span>\n </div>\n <div class=\"task-elapsed\">{{ getElapsedTime(task) }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n .global-tasks-panel {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 9999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n /* Minimized Badge */\n .minimized-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 50%;\n width: 56px;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.3s ease;\n position: relative;\n animation: pulse 2s ease-in-out infinite;\n }\n\n .minimized-badge:hover {\n transform: scale(1.1);\n box-shadow: var(--mj-shadow-lg);\n }\n\n .minimized-badge i {\n font-size: 20px;\n margin-right: 4px;\n }\n\n .minimized-badge .task-count {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 2px solid var(--mj-bg-surface);\n }\n\n @keyframes pulse {\n 0%, 100% {\n box-shadow: var(--mj-shadow-md);\n }\n 50% {\n box-shadow: var(--mj-shadow-lg);\n }\n }\n\n /* Expanded Panel */\n .expanded-panel {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 360px;\n max-height: 480px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.3s ease-out;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 14px;\n }\n\n .header-left i {\n font-size: 16px;\n }\n\n .minimize-btn {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .minimize-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .panel-content {\n overflow-y: auto;\n max-height: 420px;\n }\n\n .task-item {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .task-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-item:last-child {\n border-bottom: none;\n }\n\n .task-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n }\n\n .task-header i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n }\n\n .task-agent {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .task-conversation {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .task-conversation i {\n font-size: 11px;\n }\n\n .task-status {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.active {\n background: var(--mj-status-success);\n animation: blink 2s ease-in-out infinite;\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n .status-text {\n font-size: 12px;\n color: var(--mj-text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .task-elapsed {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-variant-numeric: tabular-nums;\n }\n\n /* Scrollbar Styling */\n .panel-content::-webkit-scrollbar {\n width: 6px;\n }\n\n .panel-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n }\n\n .panel-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class GlobalTasksPanelComponent implements OnInit, OnDestroy {\n public Tasks: ActiveTask[] = [];\n\n /** @deprecated Use {@link Tasks}. */\n public get tasks(): ActiveTask[] {\n return this.Tasks;\n }\n /** @deprecated Use {@link Tasks}. */\n public set tasks(value: ActiveTask[]) {\n this.Tasks = value;\n }\n public IsMinimized: boolean = false;\n\n /** @deprecated Use {@link IsMinimized}. */\n public get isMinimized(): boolean {\n return this.IsMinimized;\n }\n /** @deprecated Use {@link IsMinimized}. */\n public set isMinimized(value: boolean) {\n this.IsMinimized = value;\n }\n\n private destroy$ = new Subject<void>();\n\n @Output() TaskClicked = new EventEmitter<ActiveTask>();\n\n /**\n * @deprecated Use {@link TaskClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() taskClicked = this.TaskClicked;\n\n constructor(private activeTasksService: ActiveTasksService) {}\n\n ngOnInit() {\n // Subscribe to active tasks\n this.activeTasksService.tasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(tasks => {\n this.Tasks = tasks;\n\n // Auto-expand if tasks appear and panel was minimized\n if (this.Tasks.length > 0 && this.IsMinimized) {\n // Keep minimized, let user expand manually\n }\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n Expand() {\n this.IsMinimized = false;\n }\n\n /** @deprecated Use {@link Expand}. */\n expand() {\n return this.Expand();\n }\n\n Minimize() {\n this.IsMinimized = true;\n }\n\n /** @deprecated Use {@link Minimize}. */\n minimize() {\n return this.Minimize();\n }\n\n OnTaskClick(task: ActiveTask) {\n this.TaskClicked.emit(task);\n }\n\n /** @deprecated Use {@link OnTaskClick}. */\n onTaskClick(task: ActiveTask) {\n return this.OnTaskClick(task);\n }\n\n GetTrimmedStatus(status: string): string {\n // Remove emojis and trim to 50 chars\n const cleaned = status.replace(/[\\u{1F600}-\\u{1F64F}]/gu, '').trim();\n return cleaned.length > 50 ? cleaned.substring(0, 47) + '...' : cleaned;\n }\n\n /** @deprecated Use {@link GetTrimmedStatus}. */\n getTrimmedStatus(status: string): string {\n return this.GetTrimmedStatus(status);\n }\n\n GetElapsedTime(task: ActiveTask): string {\n const elapsed = Date.now() - task.startTime;\n const seconds = Math.floor(elapsed / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n /** @deprecated Use {@link GetElapsedTime}. */\n getElapsedTime(task: ActiveTask): string {\n return this.GetElapsedTime(task);\n }\n}\n"]}
|
|
@@ -8,30 +8,79 @@ import * as i0 from "@angular/core";
|
|
|
8
8
|
* Replaces the main content area when Collections tab is selected
|
|
9
9
|
*/
|
|
10
10
|
export declare class LibraryFullViewComponent extends BaseAngularComponent implements OnInit {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
EnvironmentId: string;
|
|
12
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
13
|
+
set environmentId(value: string);
|
|
14
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
15
|
+
get environmentId(): string;
|
|
16
|
+
CurrentUser: UserInfo;
|
|
17
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
18
|
+
set currentUser(value: UserInfo);
|
|
19
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
20
|
+
get currentUser(): UserInfo;
|
|
21
|
+
Collections: MJCollectionEntity[];
|
|
22
|
+
/** @deprecated Use {@link Collections}. */
|
|
23
|
+
get collections(): MJCollectionEntity[];
|
|
24
|
+
/** @deprecated Use {@link Collections}. */
|
|
25
|
+
set collections(value: MJCollectionEntity[]);
|
|
26
|
+
FilteredCollections: MJCollectionEntity[];
|
|
27
|
+
/** @deprecated Use {@link FilteredCollections}. */
|
|
28
|
+
get filteredCollections(): MJCollectionEntity[];
|
|
29
|
+
/** @deprecated Use {@link FilteredCollections}. */
|
|
30
|
+
set filteredCollections(value: MJCollectionEntity[]);
|
|
31
|
+
SearchQuery: string;
|
|
32
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
33
|
+
get searchQuery(): string;
|
|
34
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
35
|
+
set searchQuery(value: string);
|
|
16
36
|
isLoading: boolean;
|
|
17
|
-
|
|
37
|
+
Breadcrumbs: Array<{
|
|
18
38
|
id: string;
|
|
19
39
|
name: string;
|
|
20
40
|
}>;
|
|
21
|
-
|
|
41
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
42
|
+
get breadcrumbs(): Array<{
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
}>;
|
|
46
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
47
|
+
set breadcrumbs(value: Array<{
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
}>);
|
|
51
|
+
CurrentCollectionId: string | null;
|
|
52
|
+
/** @deprecated Use {@link CurrentCollectionId}. */
|
|
53
|
+
get currentCollectionId(): string | null;
|
|
54
|
+
/** @deprecated Use {@link CurrentCollectionId}. */
|
|
55
|
+
set currentCollectionId(value: string | null);
|
|
22
56
|
constructor();
|
|
23
57
|
ngOnInit(): void;
|
|
58
|
+
LoadCollections(): Promise<void>;
|
|
59
|
+
/** @deprecated Use {@link LoadCollections}. */
|
|
24
60
|
loadCollections(): Promise<void>;
|
|
61
|
+
OnSearchChange(query: string): void;
|
|
62
|
+
/** @deprecated Use {@link OnSearchChange}. */
|
|
25
63
|
onSearchChange(query: string): void;
|
|
26
64
|
private applySearch;
|
|
65
|
+
OpenCollection(collection: MJCollectionEntity): void;
|
|
66
|
+
/** @deprecated Use {@link OpenCollection}. */
|
|
27
67
|
openCollection(collection: MJCollectionEntity): void;
|
|
68
|
+
NavigateTo(crumb: {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
}): void;
|
|
72
|
+
/** @deprecated Use {@link NavigateTo}. */
|
|
28
73
|
navigateTo(crumb: {
|
|
29
74
|
id: string;
|
|
30
75
|
name: string;
|
|
31
76
|
}): void;
|
|
77
|
+
NavigateToRoot(): void;
|
|
78
|
+
/** @deprecated Use {@link NavigateToRoot}. */
|
|
32
79
|
navigateToRoot(): void;
|
|
80
|
+
Refresh(): void;
|
|
81
|
+
/** @deprecated Use {@link Refresh}. */
|
|
33
82
|
refresh(): void;
|
|
34
83
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibraryFullViewComponent, never>;
|
|
35
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LibraryFullViewComponent, "mj-library-full-view", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; }, {}, never, never, false, never>;
|
|
84
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LibraryFullViewComponent, "mj-library-full-view", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; }, {}, never, never, false, never>;
|
|
36
85
|
}
|
|
37
86
|
//# sourceMappingURL=library-full-view.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/library/library-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAEnE;;;GAGG;AACH,qBA+Qa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM;IACzE,aAAa,EAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"library-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/library/library-full-view.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,35 +83,91 @@ function LibraryFullViewComponent_Conditional_17_Template(rf, ctx) { if (rf & 1)
|
|
|
83
83
|
* Replaces the main content area when Collections tab is selected
|
|
84
84
|
*/
|
|
85
85
|
export class LibraryFullViewComponent extends BaseAngularComponent {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
EnvironmentId;
|
|
87
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
88
|
+
set environmentId(value) {
|
|
89
|
+
this.EnvironmentId = value;
|
|
90
|
+
}
|
|
91
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
92
|
+
get environmentId() {
|
|
93
|
+
return this.EnvironmentId;
|
|
94
|
+
}
|
|
95
|
+
CurrentUser;
|
|
96
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
97
|
+
set currentUser(value) {
|
|
98
|
+
this.CurrentUser = value;
|
|
99
|
+
}
|
|
100
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
101
|
+
get currentUser() {
|
|
102
|
+
return this.CurrentUser;
|
|
103
|
+
}
|
|
104
|
+
Collections = [];
|
|
105
|
+
/** @deprecated Use {@link Collections}. */
|
|
106
|
+
get collections() {
|
|
107
|
+
return this.Collections;
|
|
108
|
+
}
|
|
109
|
+
/** @deprecated Use {@link Collections}. */
|
|
110
|
+
set collections(value) {
|
|
111
|
+
this.Collections = value;
|
|
112
|
+
}
|
|
113
|
+
FilteredCollections = [];
|
|
114
|
+
/** @deprecated Use {@link FilteredCollections}. */
|
|
115
|
+
get filteredCollections() {
|
|
116
|
+
return this.FilteredCollections;
|
|
117
|
+
}
|
|
118
|
+
/** @deprecated Use {@link FilteredCollections}. */
|
|
119
|
+
set filteredCollections(value) {
|
|
120
|
+
this.FilteredCollections = value;
|
|
121
|
+
}
|
|
122
|
+
SearchQuery = '';
|
|
123
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
124
|
+
get searchQuery() {
|
|
125
|
+
return this.SearchQuery;
|
|
126
|
+
}
|
|
127
|
+
/** @deprecated Use {@link SearchQuery}. */
|
|
128
|
+
set searchQuery(value) {
|
|
129
|
+
this.SearchQuery = value;
|
|
130
|
+
}
|
|
91
131
|
isLoading = false;
|
|
92
|
-
|
|
93
|
-
|
|
132
|
+
Breadcrumbs = [];
|
|
133
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
134
|
+
get breadcrumbs() {
|
|
135
|
+
return this.Breadcrumbs;
|
|
136
|
+
}
|
|
137
|
+
/** @deprecated Use {@link Breadcrumbs}. */
|
|
138
|
+
set breadcrumbs(value) {
|
|
139
|
+
this.Breadcrumbs = value;
|
|
140
|
+
}
|
|
141
|
+
CurrentCollectionId = null;
|
|
142
|
+
/** @deprecated Use {@link CurrentCollectionId}. */
|
|
143
|
+
get currentCollectionId() {
|
|
144
|
+
return this.CurrentCollectionId;
|
|
145
|
+
}
|
|
146
|
+
/** @deprecated Use {@link CurrentCollectionId}. */
|
|
147
|
+
set currentCollectionId(value) {
|
|
148
|
+
this.CurrentCollectionId = value;
|
|
149
|
+
}
|
|
94
150
|
constructor() {
|
|
95
151
|
super();
|
|
96
152
|
}
|
|
97
153
|
ngOnInit() {
|
|
98
|
-
this.
|
|
154
|
+
this.LoadCollections();
|
|
99
155
|
}
|
|
100
|
-
async
|
|
156
|
+
async LoadCollections() {
|
|
101
157
|
this.isLoading = true;
|
|
102
158
|
try {
|
|
103
159
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
104
|
-
const filter = `EnvironmentID='${this.
|
|
105
|
-
(this.
|
|
160
|
+
const filter = `EnvironmentID='${this.EnvironmentId}'` +
|
|
161
|
+
(this.CurrentCollectionId ? ` AND ParentID='${this.CurrentCollectionId}'` : ' AND ParentID IS NULL');
|
|
106
162
|
const result = await rv.RunView({
|
|
107
163
|
EntityName: 'MJ: Collections',
|
|
108
164
|
ExtraFilter: filter,
|
|
109
165
|
OrderBy: 'Name ASC',
|
|
110
166
|
MaxRows: 1000,
|
|
111
167
|
ResultType: 'entity_object'
|
|
112
|
-
}, this.
|
|
168
|
+
}, this.CurrentUser);
|
|
113
169
|
if (result.Success) {
|
|
114
|
-
this.
|
|
170
|
+
this.Collections = result.Results || [];
|
|
115
171
|
this.applySearch();
|
|
116
172
|
}
|
|
117
173
|
}
|
|
@@ -122,45 +178,69 @@ export class LibraryFullViewComponent extends BaseAngularComponent {
|
|
|
122
178
|
this.isLoading = false;
|
|
123
179
|
}
|
|
124
180
|
}
|
|
125
|
-
|
|
181
|
+
/** @deprecated Use {@link LoadCollections}. */
|
|
182
|
+
async loadCollections() {
|
|
183
|
+
return this.LoadCollections();
|
|
184
|
+
}
|
|
185
|
+
OnSearchChange(query) {
|
|
126
186
|
this.applySearch();
|
|
127
187
|
}
|
|
188
|
+
/** @deprecated Use {@link OnSearchChange}. */
|
|
189
|
+
onSearchChange(query) {
|
|
190
|
+
return this.OnSearchChange(query);
|
|
191
|
+
}
|
|
128
192
|
applySearch() {
|
|
129
|
-
if (!this.
|
|
130
|
-
this.
|
|
193
|
+
if (!this.SearchQuery.trim()) {
|
|
194
|
+
this.FilteredCollections = [...this.Collections];
|
|
131
195
|
}
|
|
132
196
|
else {
|
|
133
|
-
const query = this.
|
|
134
|
-
this.
|
|
197
|
+
const query = this.SearchQuery.toLowerCase();
|
|
198
|
+
this.FilteredCollections = this.Collections.filter(c => c.Name.toLowerCase().includes(query) ||
|
|
135
199
|
(c.Description && c.Description.toLowerCase().includes(query)));
|
|
136
200
|
}
|
|
137
201
|
}
|
|
202
|
+
OpenCollection(collection) {
|
|
203
|
+
this.Breadcrumbs.push({ id: collection.ID, name: collection.Name });
|
|
204
|
+
this.CurrentCollectionId = collection.ID;
|
|
205
|
+
this.SearchQuery = '';
|
|
206
|
+
this.LoadCollections();
|
|
207
|
+
}
|
|
208
|
+
/** @deprecated Use {@link OpenCollection}. */
|
|
138
209
|
openCollection(collection) {
|
|
139
|
-
this.
|
|
140
|
-
this.currentCollectionId = collection.ID;
|
|
141
|
-
this.searchQuery = '';
|
|
142
|
-
this.loadCollections();
|
|
210
|
+
return this.OpenCollection(collection);
|
|
143
211
|
}
|
|
144
|
-
|
|
145
|
-
const index = this.
|
|
212
|
+
NavigateTo(crumb) {
|
|
213
|
+
const index = this.Breadcrumbs.findIndex(b => b.id === crumb.id);
|
|
146
214
|
if (index !== -1) {
|
|
147
|
-
this.
|
|
148
|
-
this.
|
|
149
|
-
this.
|
|
150
|
-
this.
|
|
215
|
+
this.Breadcrumbs = this.Breadcrumbs.slice(0, index + 1);
|
|
216
|
+
this.CurrentCollectionId = crumb.id;
|
|
217
|
+
this.SearchQuery = '';
|
|
218
|
+
this.LoadCollections();
|
|
151
219
|
}
|
|
152
220
|
}
|
|
221
|
+
/** @deprecated Use {@link NavigateTo}. */
|
|
222
|
+
navigateTo(crumb) {
|
|
223
|
+
return this.NavigateTo(crumb);
|
|
224
|
+
}
|
|
225
|
+
NavigateToRoot() {
|
|
226
|
+
this.Breadcrumbs = [];
|
|
227
|
+
this.CurrentCollectionId = null;
|
|
228
|
+
this.SearchQuery = '';
|
|
229
|
+
this.LoadCollections();
|
|
230
|
+
}
|
|
231
|
+
/** @deprecated Use {@link NavigateToRoot}. */
|
|
153
232
|
navigateToRoot() {
|
|
154
|
-
this.
|
|
155
|
-
this.currentCollectionId = null;
|
|
156
|
-
this.searchQuery = '';
|
|
157
|
-
this.loadCollections();
|
|
233
|
+
return this.NavigateToRoot();
|
|
158
234
|
}
|
|
235
|
+
Refresh() {
|
|
236
|
+
this.LoadCollections();
|
|
237
|
+
}
|
|
238
|
+
/** @deprecated Use {@link Refresh}. */
|
|
159
239
|
refresh() {
|
|
160
|
-
this.
|
|
240
|
+
return this.Refresh();
|
|
161
241
|
}
|
|
162
242
|
static ɵfac = function LibraryFullViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LibraryFullViewComponent)(); };
|
|
163
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LibraryFullViewComponent, selectors: [["mj-library-full-view"]], inputs: { environmentId: "environmentId", currentUser: "currentUser" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 18, vars: 5, consts: [[1, "collections-view"], [1, "collections-header"], [1, "collections-breadcrumb"], [1, "breadcrumb-item"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], [1, "breadcrumb-path"], [1, "collections-search"], [1, "fas", "fa-search"], ["type", "text", "placeholder", "Search collections and artifacts...", 1, "library-search-input", 3, "ngModelChange", "ngModel"], [1, "collections-actions"], ["title", "Refresh", 1, "btn-secondary", 3, "click"], [1, "fas", "fa-sync"], [1, "collections-content"], [1, "loading-state"], ["Icon", "fa-solid fa-folder-open", 3, "Variant", "Title"], [1, "library-folders"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], ["text", "Loading collections...", "size", "large"], [1, "library-folder"], [1, "library-folder", 3, "click"], [1, "folder-icon"], [1, "fas", "fa-folder"], [1, "folder-info"], [1, "folder-name"], [1, "folder-meta"]], template: function LibraryFullViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
243
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LibraryFullViewComponent, selectors: [["mj-library-full-view"]], inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 18, vars: 5, consts: [[1, "collections-view"], [1, "collections-header"], [1, "collections-breadcrumb"], [1, "breadcrumb-item"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], [1, "breadcrumb-path"], [1, "collections-search"], [1, "fas", "fa-search"], ["type", "text", "placeholder", "Search collections and artifacts...", 1, "library-search-input", 3, "ngModelChange", "ngModel"], [1, "collections-actions"], ["title", "Refresh", 1, "btn-secondary", 3, "click"], [1, "fas", "fa-sync"], [1, "collections-content"], [1, "loading-state"], ["Icon", "fa-solid fa-folder-open", 3, "Variant", "Title"], [1, "library-folders"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], ["text", "Loading collections...", "size", "large"], [1, "library-folder"], [1, "library-folder", 3, "click"], [1, "folder-icon"], [1, "fas", "fa-folder"], [1, "folder-info"], [1, "folder-name"], [1, "folder-meta"]], template: function LibraryFullViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
164
244
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
|
|
165
245
|
i0.ɵɵelement(4, "i", 4);
|
|
166
246
|
i0.ɵɵelementStart(5, "a", 5);
|
|
@@ -270,7 +350,11 @@ export class LibraryFullViewComponent extends BaseAngularComponent {
|
|
|
270
350
|
</div>
|
|
271
351
|
</div>
|
|
272
352
|
`, styles: ["\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n }\n\n .collections-header {\n display: flex;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .breadcrumb-item i {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n }\n\n .breadcrumb-link:hover {\n color: #1e40af;\n }\n\n .breadcrumb-link.active {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-search {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n padding: 8px 12px;\n min-width: 300px;\n }\n\n .collections-search i {\n color: #9CA3AF;\n font-size: 14px;\n }\n\n .library-search-input {\n border: none;\n background: transparent;\n outline: none;\n font-size: 14px;\n flex: 1;\n color: #111827;\n }\n\n .library-search-input::placeholder {\n color: #9CA3AF;\n }\n\n .collections-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-secondary {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n }\n\n .btn-secondary:hover {\n background: #F9FAFB;\n color: #111827;\n }\n\n .collections-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n }\n\n .collections-content mj-empty-state {\n height: 100%;\n }\n\n .library-folders {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .library-folder {\n display: flex;\n align-items: start;\n gap: 16px;\n padding: 20px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .library-folder:hover {\n border-color: #1e40af;\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n }\n\n .folder-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #EFF6FF;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n .folder-icon i {\n font-size: 20px;\n color: #1e40af;\n }\n\n .folder-info {\n flex: 1;\n min-width: 0;\n }\n\n .folder-name {\n font-size: 15px;\n font-weight: 500;\n color: #111827;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .folder-meta {\n font-size: 13px;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n "] }]
|
|
273
|
-
}], () => [], {
|
|
353
|
+
}], () => [], { EnvironmentId: [{
|
|
354
|
+
type: Input
|
|
355
|
+
}], environmentId: [{
|
|
356
|
+
type: Input
|
|
357
|
+
}], CurrentUser: [{
|
|
274
358
|
type: Input
|
|
275
359
|
}], currentUser: [{
|
|
276
360
|
type: Input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/library/library-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\n\n/**\n * Full-panel Collections view component\n * Replaces the main content area when Collections tab is selected\n */\n@Component({\n standalone: false,\n selector: 'mj-library-full-view',\n template: `\n <div class=\"collections-view\">\n <div class=\"collections-header\">\n <div class=\"collections-breadcrumb\">\n <div class=\"breadcrumb-item\">\n <i class=\"fas fa-home\"></i>\n <a class=\"breadcrumb-link\" (click)=\"navigateToRoot()\">Collections</a>\n </div>\n @if (breadcrumbs.length > 0) {\n <span class=\"breadcrumb-path\">\n @for (crumb of breadcrumbs; track crumb; let last = $last) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <a class=\"breadcrumb-link\"\n [class.active]=\"last\"\n (click)=\"navigateTo(crumb)\">\n {{ crumb.name }}\n </a>\n }\n </span>\n }\n </div>\n <div class=\"collections-search\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search collections and artifacts...\"\n class=\"library-search-input\">\n </div>\n <div class=\"collections-actions\">\n <button class=\"btn-secondary\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fas fa-sync\"></i>\n </button>\n </div>\n </div>\n <div class=\"collections-content\">\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"large\"></mj-loading>\n </div>\n }\n @if (!isLoading && filteredCollections.length === 0) {\n <mj-empty-state\n [Variant]=\"searchQuery ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-folder-open\"\n [Title]=\"searchQuery ? 'No collections found' : 'No collections yet'\" />\n }\n @if (!isLoading && filteredCollections.length > 0) {\n <div class=\"library-folders\">\n @for (collection of filteredCollections; track collection) {\n <div\n class=\"library-folder\"\n (click)=\"openCollection(collection)\">\n <div class=\"folder-icon\">\n <i class=\"fas fa-folder\"></i>\n </div>\n <div class=\"folder-info\">\n <div class=\"folder-name\">{{ collection.Name }}</div>\n @if (collection.Description) {\n <div class=\"folder-meta\">\n {{ collection.Description }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n }\n\n .collections-header {\n display: flex;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .breadcrumb-item i {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n }\n\n .breadcrumb-link:hover {\n color: #1e40af;\n }\n\n .breadcrumb-link.active {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-search {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n padding: 8px 12px;\n min-width: 300px;\n }\n\n .collections-search i {\n color: #9CA3AF;\n font-size: 14px;\n }\n\n .library-search-input {\n border: none;\n background: transparent;\n outline: none;\n font-size: 14px;\n flex: 1;\n color: #111827;\n }\n\n .library-search-input::placeholder {\n color: #9CA3AF;\n }\n\n .collections-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-secondary {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n }\n\n .btn-secondary:hover {\n background: #F9FAFB;\n color: #111827;\n }\n\n .collections-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n }\n\n .collections-content mj-empty-state {\n height: 100%;\n }\n\n .library-folders {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .library-folder {\n display: flex;\n align-items: start;\n gap: 16px;\n padding: 20px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .library-folder:hover {\n border-color: #1e40af;\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n }\n\n .folder-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #EFF6FF;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n .folder-icon i {\n font-size: 20px;\n color: #1e40af;\n }\n\n .folder-info {\n flex: 1;\n min-width: 0;\n }\n\n .folder-name {\n font-size: 15px;\n font-weight: 500;\n color: #111827;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .folder-meta {\n font-size: 13px;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n `]\n})\nexport class LibraryFullViewComponent extends BaseAngularComponent implements OnInit {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n public collections: MJCollectionEntity[] = [];\n public filteredCollections: MJCollectionEntity[] = [];\n public searchQuery: string = '';\n public isLoading: boolean = false;\n public breadcrumbs: Array<{ id: string; name: string }> = [];\n public currentCollectionId: string | null = null;\n\n constructor() {\n super();}\n\n ngOnInit() {\n this.loadCollections();\n }\n\n async loadCollections(): Promise<void> {\n this.isLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = `EnvironmentID='${this.environmentId}'` +\n (this.currentCollectionId ? ` AND ParentID='${this.currentCollectionId}'` : ' AND ParentID IS NULL');\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n this.collections = result.Results || [];\n this.applySearch();\n }\n } catch (error) {\n console.error('Failed to load collections:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n onSearchChange(query: string): void {\n this.applySearch();\n }\n\n private applySearch(): void {\n if (!this.searchQuery.trim()) {\n this.filteredCollections = [...this.collections];\n } else {\n const query = this.searchQuery.toLowerCase();\n this.filteredCollections = this.collections.filter(c =>\n c.Name.toLowerCase().includes(query) ||\n (c.Description && c.Description.toLowerCase().includes(query))\n );\n }\n }\n\n openCollection(collection: MJCollectionEntity): void {\n this.breadcrumbs.push({ id: collection.ID, name: collection.Name });\n this.currentCollectionId = collection.ID;\n this.searchQuery = '';\n this.loadCollections();\n }\n\n navigateTo(crumb: { id: string; name: string }): void {\n const index = this.breadcrumbs.findIndex(b => b.id === crumb.id);\n if (index !== -1) {\n this.breadcrumbs = this.breadcrumbs.slice(0, index + 1);\n this.currentCollectionId = crumb.id;\n this.searchQuery = '';\n this.loadCollections();\n }\n }\n\n navigateToRoot(): void {\n this.breadcrumbs = [];\n this.currentCollectionId = null;\n this.searchQuery = '';\n this.loadCollections();\n }\n\n refresh(): void {\n this.loadCollections();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"library-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/library/library-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJCollectionEntity } from '@memberjunction/core-entities';\n\n/**\n * Full-panel Collections view component\n * Replaces the main content area when Collections tab is selected\n */\n@Component({\n standalone: false,\n selector: 'mj-library-full-view',\n template: `\n <div class=\"collections-view\">\n <div class=\"collections-header\">\n <div class=\"collections-breadcrumb\">\n <div class=\"breadcrumb-item\">\n <i class=\"fas fa-home\"></i>\n <a class=\"breadcrumb-link\" (click)=\"navigateToRoot()\">Collections</a>\n </div>\n @if (breadcrumbs.length > 0) {\n <span class=\"breadcrumb-path\">\n @for (crumb of breadcrumbs; track crumb; let last = $last) {\n <i class=\"fas fa-chevron-right breadcrumb-separator\"></i>\n <a class=\"breadcrumb-link\"\n [class.active]=\"last\"\n (click)=\"navigateTo(crumb)\">\n {{ crumb.name }}\n </a>\n }\n </span>\n }\n </div>\n <div class=\"collections-search\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search collections and artifacts...\"\n class=\"library-search-input\">\n </div>\n <div class=\"collections-actions\">\n <button class=\"btn-secondary\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fas fa-sync\"></i>\n </button>\n </div>\n </div>\n <div class=\"collections-content\">\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading collections...\" size=\"large\"></mj-loading>\n </div>\n }\n @if (!isLoading && filteredCollections.length === 0) {\n <mj-empty-state\n [Variant]=\"searchQuery ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-folder-open\"\n [Title]=\"searchQuery ? 'No collections found' : 'No collections yet'\" />\n }\n @if (!isLoading && filteredCollections.length > 0) {\n <div class=\"library-folders\">\n @for (collection of filteredCollections; track collection) {\n <div\n class=\"library-folder\"\n (click)=\"openCollection(collection)\">\n <div class=\"folder-icon\">\n <i class=\"fas fa-folder\"></i>\n </div>\n <div class=\"folder-info\">\n <div class=\"folder-name\">{{ collection.Name }}</div>\n @if (collection.Description) {\n <div class=\"folder-meta\">\n {{ collection.Description }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n }\n\n .collections-header {\n display: flex;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .breadcrumb-item i {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n }\n\n .breadcrumb-link:hover {\n color: #1e40af;\n }\n\n .breadcrumb-link.active {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-search {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n padding: 8px 12px;\n min-width: 300px;\n }\n\n .collections-search i {\n color: #9CA3AF;\n font-size: 14px;\n }\n\n .library-search-input {\n border: none;\n background: transparent;\n outline: none;\n font-size: 14px;\n flex: 1;\n color: #111827;\n }\n\n .library-search-input::placeholder {\n color: #9CA3AF;\n }\n\n .collections-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-secondary {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n }\n\n .btn-secondary:hover {\n background: #F9FAFB;\n color: #111827;\n }\n\n .collections-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n }\n\n .collections-content mj-empty-state {\n height: 100%;\n }\n\n .library-folders {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .library-folder {\n display: flex;\n align-items: start;\n gap: 16px;\n padding: 20px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .library-folder:hover {\n border-color: #1e40af;\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n }\n\n .folder-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #EFF6FF;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n .folder-icon i {\n font-size: 20px;\n color: #1e40af;\n }\n\n .folder-info {\n flex: 1;\n min-width: 0;\n }\n\n .folder-name {\n font-size: 15px;\n font-weight: 500;\n color: #111827;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .folder-meta {\n font-size: 13px;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n `]\n})\nexport class LibraryFullViewComponent extends BaseAngularComponent implements OnInit {\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n\n public Collections: MJCollectionEntity[] = [];\n\n /** @deprecated Use {@link Collections}. */\n public get collections(): MJCollectionEntity[] {\n return this.Collections;\n }\n /** @deprecated Use {@link Collections}. */\n public set collections(value: MJCollectionEntity[]) {\n this.Collections = value;\n }\n public FilteredCollections: MJCollectionEntity[] = [];\n\n /** @deprecated Use {@link FilteredCollections}. */\n public get filteredCollections(): MJCollectionEntity[] {\n return this.FilteredCollections;\n }\n /** @deprecated Use {@link FilteredCollections}. */\n public set filteredCollections(value: MJCollectionEntity[]) {\n this.FilteredCollections = value;\n }\n public SearchQuery: string = '';\n\n /** @deprecated Use {@link SearchQuery}. */\n public get searchQuery(): string {\n return this.SearchQuery;\n }\n /** @deprecated Use {@link SearchQuery}. */\n public set searchQuery(value: string) {\n this.SearchQuery = value;\n }\n public isLoading: boolean = false;\n public Breadcrumbs: Array<{ id: string; name: string }> = [];\n\n /** @deprecated Use {@link Breadcrumbs}. */\n public get breadcrumbs(): Array<{ id: string; name: string }> {\n return this.Breadcrumbs;\n }\n /** @deprecated Use {@link Breadcrumbs}. */\n public set breadcrumbs(value: Array<{ id: string; name: string }>) {\n this.Breadcrumbs = value;\n }\n public CurrentCollectionId: string | null = null;\n\n /** @deprecated Use {@link CurrentCollectionId}. */\n public get currentCollectionId(): string | null {\n return this.CurrentCollectionId;\n }\n /** @deprecated Use {@link CurrentCollectionId}. */\n public set currentCollectionId(value: string | null) {\n this.CurrentCollectionId = value;\n }\n\n constructor() {\n super();}\n\n ngOnInit() {\n this.LoadCollections();\n }\n\n async LoadCollections(): Promise<void> {\n this.isLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = `EnvironmentID='${this.EnvironmentId}'` +\n (this.CurrentCollectionId ? ` AND ParentID='${this.CurrentCollectionId}'` : ' AND ParentID IS NULL');\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.CurrentUser\n );\n\n if (result.Success) {\n this.Collections = result.Results || [];\n this.applySearch();\n }\n } catch (error) {\n console.error('Failed to load collections:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n /** @deprecated Use {@link LoadCollections}. */\n async loadCollections(): Promise<void> {\n return this.LoadCollections();\n }\n\n OnSearchChange(query: string): void {\n this.applySearch();\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n onSearchChange(query: string): void {\n return this.OnSearchChange(query);\n }\n\n private applySearch(): void {\n if (!this.SearchQuery.trim()) {\n this.FilteredCollections = [...this.Collections];\n } else {\n const query = this.SearchQuery.toLowerCase();\n this.FilteredCollections = this.Collections.filter(c =>\n c.Name.toLowerCase().includes(query) ||\n (c.Description && c.Description.toLowerCase().includes(query))\n );\n }\n }\n\n OpenCollection(collection: MJCollectionEntity): void {\n this.Breadcrumbs.push({ id: collection.ID, name: collection.Name });\n this.CurrentCollectionId = collection.ID;\n this.SearchQuery = '';\n this.LoadCollections();\n }\n\n /** @deprecated Use {@link OpenCollection}. */\n openCollection(collection: MJCollectionEntity): void {\n return this.OpenCollection(collection);\n }\n\n NavigateTo(crumb: { id: string; name: string }): void {\n const index = this.Breadcrumbs.findIndex(b => b.id === crumb.id);\n if (index !== -1) {\n this.Breadcrumbs = this.Breadcrumbs.slice(0, index + 1);\n this.CurrentCollectionId = crumb.id;\n this.SearchQuery = '';\n this.LoadCollections();\n }\n }\n\n /** @deprecated Use {@link NavigateTo}. */\n navigateTo(crumb: { id: string; name: string }): void {\n return this.NavigateTo(crumb);\n }\n\n NavigateToRoot(): void {\n this.Breadcrumbs = [];\n this.CurrentCollectionId = null;\n this.SearchQuery = '';\n this.LoadCollections();\n }\n\n /** @deprecated Use {@link NavigateToRoot}. */\n navigateToRoot(): void {\n return this.NavigateToRoot();\n }\n\n Refresh(): void {\n this.LoadCollections();\n }\n\n /** @deprecated Use {@link Refresh}. */\n refresh(): void {\n return this.Refresh();\n }\n}\n"]}
|