@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.2
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 +43 -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 +1191 -124
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2816 -785
- 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 +42 -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 +93 -21
- 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 +49 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +140 -26
- 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 +613 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1390 -422
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +490 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +1088 -244
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +297 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +598 -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 +891 -292
- 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 +113 -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 +47 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +85 -20
- 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-liveness-dom.service.d.ts +42 -0
- package/dist/lib/services/conversation-liveness-dom.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-liveness-dom.service.js +74 -0
- package/dist/lib/services/conversation-liveness-dom.service.js.map +1 -0
- 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 +56 -5
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +113 -16
- 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 +70 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +84 -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/decision-routing.d.ts +68 -0
- package/dist/lib/utils/decision-routing.d.ts.map +1 -0
- package/dist/lib/utils/decision-routing.js +101 -0
- package/dist/lib/utils/decision-routing.js.map +1 -0
- 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 +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +8 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/project/project-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { MJProjectEntity } from '@memberjunction/core-entities';\nimport { UserInfo, Metadata } from '@memberjunction/core';\n\nexport interface ProjectFormData {\n name: string;\n description: string;\n color: string;\n icon: string;\n}\n\nconst DEFAULT_PROJECT_COLORS = [\n '#0076B6', // MJ Blue\n '#F44336', // Red\n '#E91E63', // Pink\n '#9C27B0', // Purple\n '#673AB7', // Deep Purple\n '#3F51B5', // Indigo\n '#2196F3', // Blue\n '#03A9F4', // Light Blue\n '#00BCD4', // Cyan\n '#009688', // Teal\n '#4CAF50', // Green\n '#8BC34A', // Light Green\n '#CDDC39', // Lime\n '#FFEB3B', // Yellow\n '#FFC107', // Amber\n '#FF9800', // Orange\n '#FF5722', // Deep Orange\n '#795548', // Brown\n '#607D8B', // Blue Grey\n '#9E9E9E' // Grey\n];\n\nconst DEFAULT_PROJECT_ICONS = [\n 'fa-folder',\n 'fa-folder-open',\n 'fa-briefcase',\n 'fa-project-diagram',\n 'fa-chart-line',\n 'fa-tasks',\n 'fa-clipboard-list',\n 'fa-bullseye',\n 'fa-rocket',\n 'fa-lightbulb',\n 'fa-brain',\n 'fa-cogs',\n 'fa-code',\n 'fa-database',\n 'fa-server',\n 'fa-cloud',\n 'fa-mobile-alt',\n 'fa-desktop',\n 'fa-globe',\n 'fa-users'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-project-form-modal',\n template: `\n <mj-dialog\n [Title]=\"isEditMode ? 'Edit Folder' : 'New Folder'\"\n [Width]=\"560\"\n [MinWidth]=\"400\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n\n <div class=\"project-form\">\n <!-- Live preview chip -->\n <div class=\"folder-preview\">\n <span class=\"folder-preview-chip\" [style.backgroundColor]=\"chipBackground\" [style.color]=\"formData.color\">\n <i class=\"fa-solid {{ formData.icon }}\"></i>\n </span>\n <span class=\"folder-preview-name\">{{ formData.name.trim() || 'Untitled folder' }}</span>\n </div>\n\n <!-- Name Input -->\n <div class=\"form-field\">\n <label for=\"projectName\" class=\"required\">\n Folder Name\n </label>\n <input\n id=\"projectName\"\n type=\"text\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"e.g. Client work, Research, Ideas\"\n class=\"mj-input full-width\"\n (keydown.enter)=\"onSave()\"\n autofocus />\n @if (showNameError) {\n <div class=\"error-message\">Folder name is required</div>\n }\n </div>\n\n <!-- Description Textarea -->\n <div class=\"form-field\">\n <label for=\"projectDescription\">\n Description\n </label>\n <textarea\n id=\"projectDescription\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"What goes in this folder? (optional)\"\n class=\"mj-textarea full-width\"\n rows=\"2\"></textarea>\n </div>\n\n <!-- Color Picker -->\n <div class=\"form-field\">\n <label>Color</label>\n <div class=\"color-picker-section\">\n <div class=\"color-palette\">\n @for (color of availableColors; track color) {\n <button\n type=\"button\"\n class=\"color-swatch\"\n [class.selected]=\"formData.color === color\"\n [style.backgroundColor]=\"color\"\n (click)=\"selectColor(color)\"\n [title]=\"color\">\n </button>\n }\n </div>\n <div class=\"custom-color-input\">\n <label for=\"customColor\">Custom:</label>\n <input\n id=\"customColor\"\n type=\"color\"\n [(ngModel)]=\"formData.color\"\n class=\"custom-color-picker\" />\n <span class=\"color-value\">{{ formData.color }}</span>\n </div>\n </div>\n </div>\n\n <!-- Icon Selector -->\n <div class=\"form-field\">\n <label>Icon</label>\n <div class=\"icon-grid\">\n @for (icon of availableIcons; track icon) {\n <button\n type=\"button\"\n class=\"icon-option\"\n [class.selected]=\"formData.icon === icon\"\n [style.color]=\"formData.icon === icon ? formData.color : null\"\n (click)=\"selectIcon(icon)\"\n [title]=\"icon\">\n <i class=\"fa-solid {{ icon }}\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onSave()\">\n {{ isEditMode ? 'Save Changes' : 'Create Folder' }}\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n `,\n styles: [`\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class ProjectFormModalComponent extends BaseAngularComponent implements OnInit {\n @Input() dialogRef!: MJDialogRef;\n @Input() project: MJProjectEntity | null = null;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n /** When creating a new folder, the parent folder ID for nesting (null = top level). */\n @Input() parentId: string | null = null;\n\n @Output() projectSaved = new EventEmitter<MJProjectEntity>();\n\n public formData: ProjectFormData = {\n name: '',\n description: '',\n color: '#0076B6',\n icon: 'fa-folder'\n };\n\n public showNameError = false;\n public isEditMode = false;\n public availableColors = DEFAULT_PROJECT_COLORS;\n public availableIcons = DEFAULT_PROJECT_ICONS;\n\n /** Translucent tint of the selected color, used behind the preview/icon glyph. */\n public get chipBackground(): string {\n const hex = this.formData.color || '#0076B6';\n // 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color\n return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnInit(): void {\n this.isEditMode = this.project != null;\n\n if (this.project) {\n this.loadProjectData();\n }\n }\n\n private loadProjectData(): void {\n if (!this.project) return;\n\n this.formData = {\n name: this.project.Name || '',\n description: this.project.Description || '',\n color: this.project.Color || '#0076B6',\n icon: this.project.Icon || 'fa-folder'\n };\n }\n\n selectColor(color: string): void {\n this.formData.color = color;\n this.cdr.detectChanges();\n }\n\n selectIcon(icon: string): void {\n this.formData.icon = icon;\n this.cdr.detectChanges();\n }\n\n async onSave(): Promise<void> {\n // Validate\n if (!this.formData.name.trim()) {\n this.showNameError = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.showNameError = false;\n\n try {\n const md = this.ProviderToUse;\n const project = this.project || await md.GetEntityObject<MJProjectEntity>('MJ: Projects', this.currentUser);\n\n project.Name = this.formData.name.trim();\n project.Description = this.formData.description.trim() || null;\n project.Color = this.formData.color;\n project.Icon = this.formData.icon;\n\n if (!this.isEditMode) {\n project.EnvironmentID = this.environmentId;\n project.IsArchived = false;\n if (this.parentId) {\n project.ParentID = this.parentId;\n }\n }\n\n const saved = await project.Save();\n if (saved) {\n this.projectSaved.emit(project);\n this.dialogRef.Close();\n } else {\n throw new Error('Failed to save project');\n }\n } catch (error) {\n console.error('Error saving project:', error);\n alert('Failed to save project. Please try again.');\n }\n }\n\n onCancel(): void {\n this.dialogRef.Close();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"project-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/project/project-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { MJProjectEntity } from '@memberjunction/core-entities';\nimport { UserInfo, Metadata } from '@memberjunction/core';\n\nexport interface ProjectFormData {\n name: string;\n description: string;\n color: string;\n icon: string;\n /** true = only the owner sees it; false = everyone in the environment does. */\n isPersonal: boolean;\n}\n\nconst DEFAULT_PROJECT_COLORS = [\n '#0076B6', // MJ Blue\n '#F44336', // Red\n '#E91E63', // Pink\n '#9C27B0', // Purple\n '#673AB7', // Deep Purple\n '#3F51B5', // Indigo\n '#2196F3', // Blue\n '#03A9F4', // Light Blue\n '#00BCD4', // Cyan\n '#009688', // Teal\n '#4CAF50', // Green\n '#8BC34A', // Light Green\n '#CDDC39', // Lime\n '#FFEB3B', // Yellow\n '#FFC107', // Amber\n '#FF9800', // Orange\n '#FF5722', // Deep Orange\n '#795548', // Brown\n '#607D8B', // Blue Grey\n '#9E9E9E' // Grey\n];\n\nconst DEFAULT_PROJECT_ICONS = [\n 'fa-folder',\n 'fa-folder-open',\n 'fa-briefcase',\n 'fa-project-diagram',\n 'fa-chart-line',\n 'fa-tasks',\n 'fa-clipboard-list',\n 'fa-bullseye',\n 'fa-rocket',\n 'fa-lightbulb',\n 'fa-brain',\n 'fa-cogs',\n 'fa-code',\n 'fa-database',\n 'fa-server',\n 'fa-cloud',\n 'fa-mobile-alt',\n 'fa-desktop',\n 'fa-globe',\n 'fa-users'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-project-form-modal',\n template: `\n <mj-dialog\n [Title]=\"isEditMode ? 'Edit Folder' : 'New Folder'\"\n [Width]=\"560\"\n [MinWidth]=\"400\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n\n <div class=\"project-form\">\n <!-- Live preview chip -->\n <div class=\"folder-preview\">\n <span class=\"folder-preview-chip\" [style.backgroundColor]=\"chipBackground\" [style.color]=\"formData.color\">\n <i class=\"fa-solid {{ formData.icon }}\"></i>\n </span>\n <span class=\"folder-preview-name\">{{ formData.name.trim() || 'Untitled folder' }}</span>\n </div>\n\n <!-- Name Input -->\n <div class=\"form-field\">\n <label for=\"projectName\" class=\"required\">\n Folder Name\n </label>\n <input\n id=\"projectName\"\n type=\"text\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"e.g. Client work, Research, Ideas\"\n class=\"mj-input full-width\"\n (keydown.enter)=\"onSave()\"\n autofocus />\n @if (showNameError) {\n <div class=\"error-message\">Folder name is required</div>\n }\n </div>\n\n <!-- Description Textarea -->\n <div class=\"form-field\">\n <label for=\"projectDescription\">\n Description\n </label>\n <textarea\n id=\"projectDescription\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"What goes in this folder? (optional)\"\n class=\"mj-textarea full-width\"\n rows=\"2\"></textarea>\n </div>\n\n <!-- Visibility. TWO NAMED OPTIONS, not a checkbox: with a checkbox the unchecked\n meaning lives only in the helper text, so the shared state is never actually\n named. A fieldset/legend also gives the group a real accessible name, which a\n bare <label>Visibility</label> did not, and the hint is a sibling of the\n options rather than inside one — inside, a screen reader read the whole hint\n as part of the option's name.\n\n A SHARED folder shows a statement instead of the control. Visibility is a\n create-time choice in one direction only: personal -> shared stays available,\n because it only ever adds. See VisibilityIsLocked for why the reverse is not\n offered. -->\n <div class=\"form-field\">\n @if (VisibilityIsLocked) {\n <fieldset class=\"visibility-set\" aria-describedby=\"projectVisibilityHint\">\n <legend>Visibility</legend>\n <p class=\"visibility-locked\">\n <i class=\"fa-solid fa-users\" aria-hidden=\"true\"></i>\n Shared with everyone\n </p>\n <p class=\"visibility-hint\" id=\"projectVisibilityHint\">\n A shared folder stays shared. To keep something to yourself, create a new\n private folder and move it there.\n </p>\n </fieldset>\n } @else {\n <fieldset class=\"visibility-set\" aria-describedby=\"projectVisibilityHint\">\n <legend>Visibility</legend>\n <label class=\"visibility-choice\">\n <input type=\"radio\" name=\"projectVisibility\" [value]=\"true\"\n [(ngModel)]=\"FormData.isPersonal\" />\n <span>Only me</span>\n </label>\n <label class=\"visibility-choice\">\n <input type=\"radio\" name=\"projectVisibility\" [value]=\"false\"\n [(ngModel)]=\"FormData.isPersonal\" />\n <span>Everyone</span>\n </label>\n <p class=\"visibility-hint\" id=\"projectVisibilityHint\">\n {{ FormData.isPersonal\n ? 'Only you can see this folder.'\n : 'Everyone can see this folder and its name. They will not see the conversations you keep in it.' }}\n </p>\n </fieldset>\n }\n </div>\n\n <!-- Color Picker -->\n <div class=\"form-field\">\n <label>Color</label>\n <div class=\"color-picker-section\">\n <div class=\"color-palette\">\n @for (color of availableColors; track color) {\n <button\n type=\"button\"\n class=\"color-swatch\"\n [class.selected]=\"formData.color === color\"\n [style.backgroundColor]=\"color\"\n (click)=\"selectColor(color)\"\n [title]=\"color\">\n </button>\n }\n </div>\n <div class=\"custom-color-input\">\n <label for=\"customColor\">Custom:</label>\n <input\n id=\"customColor\"\n type=\"color\"\n [(ngModel)]=\"formData.color\"\n class=\"custom-color-picker\" />\n <span class=\"color-value\">{{ formData.color }}</span>\n </div>\n </div>\n </div>\n\n <!-- Icon Selector -->\n <div class=\"form-field\">\n <label>Icon</label>\n <div class=\"icon-grid\">\n @for (icon of availableIcons; track icon) {\n <button\n type=\"button\"\n class=\"icon-option\"\n [class.selected]=\"formData.icon === icon\"\n [style.color]=\"formData.icon === icon ? formData.color : null\"\n (click)=\"selectIcon(icon)\"\n [title]=\"icon\">\n <i class=\"fa-solid {{ icon }}\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onSave()\">\n {{ isEditMode ? 'Save Changes' : 'Create Folder' }}\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n `,\n styles: [`\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .visibility-set {\n border: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n /* A <legend> is not matched by the .form-field label rule, so it inherited 16px/400\n and read larger and lighter than every other field label. Restated here rather than\n widening that selector, which would also catch the option labels below.\n (No backticks in this block: it is a template literal.) */\n .visibility-set legend {\n padding: 0;\n margin-bottom: 0.15rem;\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n /* Scoped as .form-field .visibility-choice (0,2,1) so it deliberately outranks the\n .form-field label rule (0,1,1) this sits inside — at equal specificity that rule\n won on source order and rendered the option text bold.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-choice {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-weight: 400;\n font-size: 13px;\n margin: 0;\n /* The rows were the height of the radio alone (~16px). The checkbox this replaced\n sat in a 31px row, so the tap target got smaller when the control got clearer. */\n padding: 0.25rem 0;\n }\n\n .visibility-choice input {\n flex: 0 0 auto;\n margin: 0;\n }\n\n /* The shared-folder statement that stands in for the radios. Matches the option rows\n it replaces — same size, same weight, same 0.25rem row padding — so the dialog does\n not visibly reflow between a folder that offers the choice and one that does not.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-locked {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n padding: 0.25rem 0;\n font-weight: 400;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .visibility-locked i {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .visibility-hint {\n margin: 0.15rem 0 0;\n /* Unsized it inherited 16px and read LARGER than the options it describes. */\n font-size: 12px;\n line-height: 1.4;\n color: var(--mj-text-muted);\n }\n\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class ProjectFormModalComponent extends BaseAngularComponent implements OnInit {\n @Input() DialogRef!: MJDialogRef;\n\n /** @deprecated Use {@link DialogRef}. */\n @Input() set dialogRef(value: MJDialogRef) {\n this.DialogRef = value;\n }\n /** @deprecated Use {@link DialogRef}. */\n get dialogRef(): MJDialogRef {\n return this.DialogRef;\n }\n @Input() Project: MJProjectEntity | null = null;\n\n /** @deprecated Use {@link Project}. */\n @Input() set project(value: MJProjectEntity | null) {\n this.Project = value;\n }\n /** @deprecated Use {@link Project}. */\n get project(): MJProjectEntity | null {\n return this.Project;\n }\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 /** When creating a new folder, the parent folder ID for nesting (null = top level). */\n @Input() ParentId: string | null = null;\n\n /** @deprecated Use {@link ParentId}. */\n @Input() set parentId(value: string | null) {\n this.ParentId = value;\n }\n /** @deprecated Use {@link ParentId}. */\n get parentId(): string | null {\n return this.ParentId;\n }\n\n @Output() ProjectSaved = new EventEmitter<MJProjectEntity>();\n\n /**\n * @deprecated Use {@link ProjectSaved}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (projectSaved) keeps working. Must stay AFTER ProjectSaved: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() projectSaved = this.ProjectSaved;\n\n public FormData: ProjectFormData = {\n name: '',\n description: '',\n color: '#0076B6',\n icon: 'fa-folder',\n // A NEW folder is personal by default. The conversation sidebar is a personal\n // surface — the conversations in it are already bound to their owner — so a\n // folder everyone can see is the surprising option, not the private one. Folder\n // NAMES are user-authored free text, and before OwnerUserID existed every one of\n // them was readable by every user of the environment, which is what prompted\n // this. Existing folders are untouched: they carry NULL, which still means shared.\n isPersonal: true\n };\n\n /** @deprecated Use {@link FormData}. */\n public get formData(): ProjectFormData {\n return this.FormData;\n }\n /** @deprecated Use {@link FormData}. */\n public set formData(value: ProjectFormData) {\n this.FormData = value;\n }\n\n public ShowNameError = false;\n\n /** @deprecated Use {@link ShowNameError}. */\n public get showNameError() {\n return this.ShowNameError;\n }\n /** @deprecated Use {@link ShowNameError}. */\n public set showNameError(value) {\n this.ShowNameError = value;\n }\n public IsEditMode = false;\n\n /** @deprecated Use {@link IsEditMode}. */\n public get isEditMode() {\n return this.IsEditMode;\n }\n /** @deprecated Use {@link IsEditMode}. */\n public set isEditMode(value) {\n this.IsEditMode = value;\n }\n public AvailableColors = DEFAULT_PROJECT_COLORS;\n\n /** @deprecated Use {@link AvailableColors}. */\n public get availableColors() {\n return this.AvailableColors;\n }\n /** @deprecated Use {@link AvailableColors}. */\n public set availableColors(value) {\n this.AvailableColors = value;\n }\n public AvailableIcons = DEFAULT_PROJECT_ICONS;\n\n /** @deprecated Use {@link AvailableIcons}. */\n public get availableIcons() {\n return this.AvailableIcons;\n }\n /** @deprecated Use {@link AvailableIcons}. */\n public set availableIcons(value) {\n this.AvailableIcons = value;\n }\n\n /**\n * True when this dialog is editing a folder that is currently SHARED — in which case\n * visibility is shown as a statement rather than a control.\n *\n * Sharing is one-way by design, and the reason is in the data model rather than the UI.\n * NULL-means-shared conflates \"shared\" with \"unowned\": the moment a folder is shared its\n * `OwnerUserID` goes to NULL and there is no column anywhere recording who created it\n * (`Project` has `__mj_CreatedAt`, but no created-by). So `OwnerUserID = currentUser.ID`\n * on a shared folder is indistinguishable from any other user claiming it — the system\n * cannot tell reclaiming from appropriating, which makes \"take it back\" an affordance\n * that was never really there.\n *\n * What that would cost on day one is the deciding argument. Every folder that exists\n * today carries NULL, so without this the whole team's folder structure — subfolders\n * included — is one radio button away from belonging to whichever person opens its\n * settings first. A confirm does not fix that; it only narrates it.\n *\n * Personal -> shared stays available, because it only ever adds. Someone who wants a\n * private copy makes a private folder. If personal folders later grow features that need\n * a stable creator (sharing with named users, transfer, recovering a departed employee's\n * folders), the fix is a separate IsShared flag so ownership stops being erased by\n * sharing — a bigger change, and deliberately not this one.\n */\n public get VisibilityIsLocked(): boolean {\n return this.IsEditMode && !this.Project?.OwnerUserID;\n }\n\n /** Translucent tint of the selected color, used behind the preview/icon glyph. */\n public get ChipBackground(): string {\n const hex = this.FormData.color || '#0076B6';\n // 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color\n return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;\n }\n\n /** @deprecated Use {@link ChipBackground}. */\n public get chipBackground(): string {\n return this.ChipBackground;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnInit(): void {\n this.IsEditMode = this.Project != null;\n\n if (this.Project) {\n this.loadProjectData();\n }\n }\n\n private loadProjectData(): void {\n if (!this.Project) return;\n\n this.FormData = {\n name: this.Project.Name || '',\n description: this.Project.Description || '',\n color: this.Project.Color || '#0076B6',\n icon: this.Project.Icon || 'fa-folder',\n // Reflect what the folder IS, not the create-time default — otherwise opening\n // a shared folder's settings and pressing Save would silently make it private.\n isPersonal: !!this.Project.OwnerUserID\n };\n }\n\n SelectColor(color: string): void {\n this.FormData.color = color;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SelectColor}. */\n selectColor(color: string): void {\n return this.SelectColor(color);\n }\n\n SelectIcon(icon: string): void {\n this.FormData.icon = icon;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SelectIcon}. */\n selectIcon(icon: string): void {\n return this.SelectIcon(icon);\n }\n\n async OnSave(): Promise<void> {\n // Validate\n if (!this.FormData.name.trim()) {\n this.ShowNameError = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.ShowNameError = false;\n\n try {\n const md = this.ProviderToUse;\n\n // A shared folder cannot be taken private — the control is not rendered for one\n // (see VisibilityIsLocked). This is the same rule expressed where the write happens,\n // so a future template change, a stale `formData` from a reopened dialog, or anything\n // else that sets the flag cannot quietly appropriate a folder the whole team uses.\n // It resolves to the folder's CURRENT state, so it is a no-op in every other case.\n const isPersonal = this.VisibilityIsLocked ? false : this.FormData.isPersonal;\n\n const project = this.Project || await md.GetEntityObject<MJProjectEntity>('MJ: Projects', this.CurrentUser);\n\n project.Name = this.FormData.name.trim();\n project.Description = this.FormData.description.trim() || null;\n project.Color = this.FormData.color;\n project.Icon = this.FormData.icon;\n\n // Settable on edit, in one direction: a personal folder can be shared with the team.\n // Null means shared, which is what every folder created before this column existed\n // carries — and, because sharing erases the owner, is also why the reverse is not on\n // offer. See VisibilityIsLocked.\n project.OwnerUserID = isPersonal ? this.CurrentUser.ID : null;\n\n if (!this.IsEditMode) {\n project.EnvironmentID = this.EnvironmentId;\n project.IsArchived = false;\n if (this.ParentId) {\n project.ParentID = this.ParentId;\n }\n }\n\n const saved = await project.Save();\n if (saved) {\n this.ProjectSaved.emit(project);\n this.DialogRef.Close();\n } else {\n // Save() records WHY it refused on LatestResult and returns false — a\n // server refusal, a constraint violation, a failed validation. Reporting\n // a generic message here would throw the only copy of that reason away.\n throw new Error(project.LatestResult?.CompleteMessage || 'The save was refused with no reason given.');\n }\n } catch (error) {\n console.error('Error saving project:', error);\n const reason = error instanceof Error ? error.message : String(error);\n alert(`Failed to save folder.\\n\\n${reason}`);\n }\n }\n\n /** @deprecated Use {@link OnSave}. */\n async onSave(): Promise<void> {\n return this.OnSave();\n }\n\n onCancel(): void {\n this.DialogRef.Close();\n }\n}\n"]}
|
|
@@ -12,27 +12,97 @@ export declare class ProjectSelectorComponent extends BaseAngularComponent imple
|
|
|
12
12
|
private dialogService;
|
|
13
13
|
private mjDialogService;
|
|
14
14
|
private viewContainerRef;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
EnvironmentId: string;
|
|
16
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
17
|
+
set environmentId(value: string);
|
|
18
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
19
|
+
get environmentId(): string;
|
|
20
|
+
CurrentUser: UserInfo;
|
|
21
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
22
|
+
set currentUser(value: UserInfo);
|
|
23
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
24
|
+
get currentUser(): UserInfo;
|
|
25
|
+
SelectedProjectId: string | null;
|
|
26
|
+
/** @deprecated Use {@link SelectedProjectId}. */
|
|
27
|
+
set selectedProjectId(value: string | null);
|
|
28
|
+
/** @deprecated Use {@link SelectedProjectId}. */
|
|
29
|
+
get selectedProjectId(): string | null;
|
|
30
|
+
Disabled: boolean;
|
|
31
|
+
/** @deprecated Use {@link Disabled}. */
|
|
32
|
+
set disabled(value: boolean);
|
|
33
|
+
/** @deprecated Use {@link Disabled}. */
|
|
34
|
+
get disabled(): boolean;
|
|
35
|
+
ShowStats: boolean;
|
|
36
|
+
/** @deprecated Use {@link ShowStats}. */
|
|
37
|
+
set showStats(value: boolean);
|
|
38
|
+
/** @deprecated Use {@link ShowStats}. */
|
|
39
|
+
get showStats(): boolean;
|
|
40
|
+
ProjectSelected: EventEmitter<MJProjectEntity | null>;
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated Use {@link ProjectSelected}.
|
|
43
|
+
*
|
|
44
|
+
* The same emitter under the old binding name, so a template still binding
|
|
45
|
+
* (projectSelected) keeps working. Must stay AFTER ProjectSelected: class fields
|
|
46
|
+
* initialise in order, and the other way round this captures undefined.
|
|
47
|
+
*/
|
|
20
48
|
projectSelected: EventEmitter<MJProjectEntity | null>;
|
|
49
|
+
ProjectCreated: EventEmitter<MJProjectEntity>;
|
|
50
|
+
/**
|
|
51
|
+
* @deprecated Use {@link ProjectCreated}.
|
|
52
|
+
*
|
|
53
|
+
* The same emitter under the old binding name, so a template still binding
|
|
54
|
+
* (projectCreated) keeps working. Must stay AFTER ProjectCreated: class fields
|
|
55
|
+
* initialise in order, and the other way round this captures undefined.
|
|
56
|
+
*/
|
|
21
57
|
projectCreated: EventEmitter<MJProjectEntity>;
|
|
58
|
+
ProjectUpdated: EventEmitter<MJProjectEntity>;
|
|
59
|
+
/**
|
|
60
|
+
* @deprecated Use {@link ProjectUpdated}.
|
|
61
|
+
*
|
|
62
|
+
* The same emitter under the old binding name, so a template still binding
|
|
63
|
+
* (projectUpdated) keeps working. Must stay AFTER ProjectUpdated: class fields
|
|
64
|
+
* initialise in order, and the other way round this captures undefined.
|
|
65
|
+
*/
|
|
22
66
|
projectUpdated: EventEmitter<MJProjectEntity>;
|
|
67
|
+
ProjectDeleted: EventEmitter<string>;
|
|
68
|
+
/**
|
|
69
|
+
* @deprecated Use {@link ProjectDeleted}.
|
|
70
|
+
*
|
|
71
|
+
* The same emitter under the old binding name, so a template still binding
|
|
72
|
+
* (projectDeleted) keeps working. Must stay AFTER ProjectDeleted: class fields
|
|
73
|
+
* initialise in order, and the other way round this captures undefined.
|
|
74
|
+
*/
|
|
23
75
|
projectDeleted: EventEmitter<string>;
|
|
24
|
-
|
|
25
|
-
|
|
76
|
+
ProjectsWithStats: ProjectWithStats[];
|
|
77
|
+
/** @deprecated Use {@link ProjectsWithStats}. */
|
|
78
|
+
get projectsWithStats(): ProjectWithStats[];
|
|
79
|
+
/** @deprecated Use {@link ProjectsWithStats}. */
|
|
80
|
+
set projectsWithStats(value: ProjectWithStats[]);
|
|
81
|
+
SelectedProject: MJProjectEntity | null;
|
|
82
|
+
/** @deprecated Use {@link SelectedProject}. */
|
|
83
|
+
get selectedProject(): MJProjectEntity | null;
|
|
84
|
+
/** @deprecated Use {@link SelectedProject}. */
|
|
85
|
+
set selectedProject(value: MJProjectEntity | null);
|
|
26
86
|
constructor(dialogService: DialogService, mjDialogService: MJDialogService, viewContainerRef: ViewContainerRef);
|
|
27
87
|
ngOnInit(): void;
|
|
28
88
|
private loadProjects;
|
|
29
89
|
private calculateConversationCounts;
|
|
90
|
+
OnProjectChange(project: MJProjectEntity | null): void;
|
|
91
|
+
/** @deprecated Use {@link OnProjectChange}. */
|
|
30
92
|
onProjectChange(project: MJProjectEntity | null): void;
|
|
93
|
+
OnProjectSelectChange(projectId: string): void;
|
|
94
|
+
/** @deprecated Use {@link OnProjectSelectChange}. */
|
|
31
95
|
onProjectSelectChange(projectId: string): void;
|
|
96
|
+
OnCreateProject(): void;
|
|
97
|
+
/** @deprecated Use {@link OnCreateProject}. */
|
|
32
98
|
onCreateProject(): void;
|
|
99
|
+
OnEditProject(): void;
|
|
100
|
+
/** @deprecated Use {@link OnEditProject}. */
|
|
33
101
|
onEditProject(): void;
|
|
102
|
+
OnDeleteProject(): Promise<void>;
|
|
103
|
+
/** @deprecated Use {@link OnDeleteProject}. */
|
|
34
104
|
onDeleteProject(): Promise<void>;
|
|
35
105
|
static ɵfac: i0.ɵɵFactoryDeclaration<ProjectSelectorComponent, never>;
|
|
36
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ProjectSelectorComponent, "mj-project-selector", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "selectedProjectId": { "alias": "selectedProjectId"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showStats": { "alias": "showStats"; "required": false; }; }, { "projectSelected": "projectSelected"; "projectCreated": "projectCreated"; "projectUpdated": "projectUpdated"; "projectDeleted": "projectDeleted"; }, never, never, false, never>;
|
|
106
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ProjectSelectorComponent, "mj-project-selector", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "SelectedProjectId": { "alias": "SelectedProjectId"; "required": false; }; "selectedProjectId": { "alias": "selectedProjectId"; "required": false; }; "Disabled": { "alias": "Disabled"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ShowStats": { "alias": "ShowStats"; "required": false; }; "showStats": { "alias": "showStats"; "required": false; }; }, { "ProjectSelected": "ProjectSelected"; "projectSelected": "projectSelected"; "ProjectCreated": "ProjectCreated"; "projectCreated": "projectCreated"; "ProjectUpdated": "ProjectUpdated"; "projectUpdated": "projectUpdated"; "ProjectDeleted": "ProjectDeleted"; "projectDeleted": "projectDeleted"; }, never, never, false, never>;
|
|
37
107
|
}
|
|
38
108
|
//# sourceMappingURL=project-selector.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/project/project-selector.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"project-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/project/project-selector.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
+
import { BuildProjectVisibilityFilter } from '@memberjunction/core-entities';
|
|
3
4
|
import { RunView } from '@memberjunction/core';
|
|
4
5
|
import { ProjectFormModalComponent } from './project-form-modal.component';
|
|
5
6
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
@@ -39,17 +40,105 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
39
40
|
dialogService;
|
|
40
41
|
mjDialogService;
|
|
41
42
|
viewContainerRef;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
EnvironmentId;
|
|
44
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
45
|
+
set environmentId(value) {
|
|
46
|
+
this.EnvironmentId = value;
|
|
47
|
+
}
|
|
48
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
49
|
+
get environmentId() {
|
|
50
|
+
return this.EnvironmentId;
|
|
51
|
+
}
|
|
52
|
+
CurrentUser;
|
|
53
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
54
|
+
set currentUser(value) {
|
|
55
|
+
this.CurrentUser = value;
|
|
56
|
+
}
|
|
57
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
58
|
+
get currentUser() {
|
|
59
|
+
return this.CurrentUser;
|
|
60
|
+
}
|
|
61
|
+
SelectedProjectId = null;
|
|
62
|
+
/** @deprecated Use {@link SelectedProjectId}. */
|
|
63
|
+
set selectedProjectId(value) {
|
|
64
|
+
this.SelectedProjectId = value;
|
|
65
|
+
}
|
|
66
|
+
/** @deprecated Use {@link SelectedProjectId}. */
|
|
67
|
+
get selectedProjectId() {
|
|
68
|
+
return this.SelectedProjectId;
|
|
69
|
+
}
|
|
70
|
+
Disabled = false;
|
|
71
|
+
/** @deprecated Use {@link Disabled}. */
|
|
72
|
+
set disabled(value) {
|
|
73
|
+
this.Disabled = value;
|
|
74
|
+
}
|
|
75
|
+
/** @deprecated Use {@link Disabled}. */
|
|
76
|
+
get disabled() {
|
|
77
|
+
return this.Disabled;
|
|
78
|
+
}
|
|
79
|
+
ShowStats = true;
|
|
80
|
+
/** @deprecated Use {@link ShowStats}. */
|
|
81
|
+
set showStats(value) {
|
|
82
|
+
this.ShowStats = value;
|
|
83
|
+
}
|
|
84
|
+
/** @deprecated Use {@link ShowStats}. */
|
|
85
|
+
get showStats() {
|
|
86
|
+
return this.ShowStats;
|
|
87
|
+
}
|
|
88
|
+
ProjectSelected = new EventEmitter();
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated Use {@link ProjectSelected}.
|
|
91
|
+
*
|
|
92
|
+
* The same emitter under the old binding name, so a template still binding
|
|
93
|
+
* (projectSelected) keeps working. Must stay AFTER ProjectSelected: class fields
|
|
94
|
+
* initialise in order, and the other way round this captures undefined.
|
|
95
|
+
*/
|
|
96
|
+
projectSelected = this.ProjectSelected;
|
|
97
|
+
ProjectCreated = new EventEmitter();
|
|
98
|
+
/**
|
|
99
|
+
* @deprecated Use {@link ProjectCreated}.
|
|
100
|
+
*
|
|
101
|
+
* The same emitter under the old binding name, so a template still binding
|
|
102
|
+
* (projectCreated) keeps working. Must stay AFTER ProjectCreated: class fields
|
|
103
|
+
* initialise in order, and the other way round this captures undefined.
|
|
104
|
+
*/
|
|
105
|
+
projectCreated = this.ProjectCreated;
|
|
106
|
+
ProjectUpdated = new EventEmitter();
|
|
107
|
+
/**
|
|
108
|
+
* @deprecated Use {@link ProjectUpdated}.
|
|
109
|
+
*
|
|
110
|
+
* The same emitter under the old binding name, so a template still binding
|
|
111
|
+
* (projectUpdated) keeps working. Must stay AFTER ProjectUpdated: class fields
|
|
112
|
+
* initialise in order, and the other way round this captures undefined.
|
|
113
|
+
*/
|
|
114
|
+
projectUpdated = this.ProjectUpdated;
|
|
115
|
+
ProjectDeleted = new EventEmitter();
|
|
116
|
+
/**
|
|
117
|
+
* @deprecated Use {@link ProjectDeleted}.
|
|
118
|
+
*
|
|
119
|
+
* The same emitter under the old binding name, so a template still binding
|
|
120
|
+
* (projectDeleted) keeps working. Must stay AFTER ProjectDeleted: class fields
|
|
121
|
+
* initialise in order, and the other way round this captures undefined.
|
|
122
|
+
*/
|
|
123
|
+
projectDeleted = this.ProjectDeleted;
|
|
124
|
+
ProjectsWithStats = [];
|
|
125
|
+
/** @deprecated Use {@link ProjectsWithStats}. */
|
|
126
|
+
get projectsWithStats() {
|
|
127
|
+
return this.ProjectsWithStats;
|
|
128
|
+
}
|
|
129
|
+
/** @deprecated Use {@link ProjectsWithStats}. */
|
|
130
|
+
set projectsWithStats(value) {
|
|
131
|
+
this.ProjectsWithStats = value;
|
|
132
|
+
}
|
|
133
|
+
SelectedProject = null;
|
|
134
|
+
/** @deprecated Use {@link SelectedProject}. */
|
|
135
|
+
get selectedProject() {
|
|
136
|
+
return this.SelectedProject;
|
|
137
|
+
}
|
|
138
|
+
/** @deprecated Use {@link SelectedProject}. */
|
|
139
|
+
set selectedProject(value) {
|
|
140
|
+
this.SelectedProject = value;
|
|
141
|
+
}
|
|
53
142
|
constructor(dialogService, mjDialogService, viewContainerRef) {
|
|
54
143
|
super();
|
|
55
144
|
this.dialogService = dialogService;
|
|
@@ -66,29 +155,33 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
66
155
|
const [projectsResult, conversationsResult] = await rv.RunViews([
|
|
67
156
|
{
|
|
68
157
|
EntityName: 'MJ: Projects',
|
|
69
|
-
|
|
158
|
+
// Shared folders plus this user's own — the SAME rule the sidebar uses. Without
|
|
159
|
+
// it this modal listed every personal folder in the environment by name, which
|
|
160
|
+
// is the exposure OwnerUserID exists to close.
|
|
161
|
+
ExtraFilter: `EnvironmentID='${this.EnvironmentId}' AND IsArchived=0`
|
|
162
|
+
+ ` AND ${BuildProjectVisibilityFilter(this.CurrentUser?.ID)}`,
|
|
70
163
|
OrderBy: 'Name ASC',
|
|
71
164
|
ResultType: 'entity_object'
|
|
72
165
|
},
|
|
73
166
|
{
|
|
74
167
|
EntityName: 'MJ: Conversations',
|
|
75
|
-
ExtraFilter: `EnvironmentID='${this.
|
|
168
|
+
ExtraFilter: `EnvironmentID='${this.EnvironmentId}'`,
|
|
76
169
|
ResultType: 'entity_object'
|
|
77
170
|
}
|
|
78
|
-
], this.
|
|
171
|
+
], this.CurrentUser);
|
|
79
172
|
if (projectsResult.Success && conversationsResult.Success) {
|
|
80
173
|
const projects = projectsResult.Results || [];
|
|
81
174
|
const conversations = conversationsResult.Results || [];
|
|
82
175
|
// Calculate conversation counts per project
|
|
83
176
|
const conversationCounts = this.calculateConversationCounts(conversations);
|
|
84
177
|
// Merge projects with stats
|
|
85
|
-
this.
|
|
178
|
+
this.ProjectsWithStats = projects.map(p => {
|
|
86
179
|
const projectWithStats = p;
|
|
87
180
|
projectWithStats.conversationCount = conversationCounts.get(p.ID) || 0;
|
|
88
181
|
return projectWithStats;
|
|
89
182
|
});
|
|
90
|
-
if (this.
|
|
91
|
-
this.
|
|
183
|
+
if (this.SelectedProjectId) {
|
|
184
|
+
this.SelectedProject = this.ProjectsWithStats.find(p => UUIDsEqual(p.ID, this.SelectedProjectId)) || null;
|
|
92
185
|
}
|
|
93
186
|
}
|
|
94
187
|
}
|
|
@@ -105,15 +198,23 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
105
198
|
}
|
|
106
199
|
return counts;
|
|
107
200
|
}
|
|
201
|
+
OnProjectChange(project) {
|
|
202
|
+
this.SelectedProject = project;
|
|
203
|
+
this.ProjectSelected.emit(project);
|
|
204
|
+
}
|
|
205
|
+
/** @deprecated Use {@link OnProjectChange}. */
|
|
108
206
|
onProjectChange(project) {
|
|
109
|
-
this.
|
|
110
|
-
this.projectSelected.emit(project);
|
|
207
|
+
return this.OnProjectChange(project);
|
|
111
208
|
}
|
|
209
|
+
OnProjectSelectChange(projectId) {
|
|
210
|
+
const project = this.ProjectsWithStats.find(p => UUIDsEqual(p.ID, projectId)) || null;
|
|
211
|
+
this.OnProjectChange(project);
|
|
212
|
+
}
|
|
213
|
+
/** @deprecated Use {@link OnProjectSelectChange}. */
|
|
112
214
|
onProjectSelectChange(projectId) {
|
|
113
|
-
|
|
114
|
-
this.onProjectChange(project);
|
|
215
|
+
return this.OnProjectSelectChange(projectId);
|
|
115
216
|
}
|
|
116
|
-
|
|
217
|
+
OnCreateProject() {
|
|
117
218
|
const dialogRef = this.mjDialogService.open({
|
|
118
219
|
content: ProjectFormModalComponent,
|
|
119
220
|
width: 600,
|
|
@@ -121,17 +222,21 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
121
222
|
});
|
|
122
223
|
const modalInstance = dialogRef.Content.instance;
|
|
123
224
|
modalInstance.dialogRef = dialogRef;
|
|
124
|
-
modalInstance.environmentId = this.
|
|
125
|
-
modalInstance.currentUser = this.
|
|
225
|
+
modalInstance.environmentId = this.EnvironmentId;
|
|
226
|
+
modalInstance.currentUser = this.CurrentUser;
|
|
126
227
|
modalInstance.projectSaved.subscribe(async (project) => {
|
|
127
|
-
this.
|
|
228
|
+
this.ProjectCreated.emit(project);
|
|
128
229
|
await this.loadProjects();
|
|
129
|
-
this.
|
|
130
|
-
this.
|
|
230
|
+
this.SelectedProject = project;
|
|
231
|
+
this.ProjectSelected.emit(project);
|
|
131
232
|
});
|
|
132
233
|
}
|
|
133
|
-
|
|
134
|
-
|
|
234
|
+
/** @deprecated Use {@link OnCreateProject}. */
|
|
235
|
+
onCreateProject() {
|
|
236
|
+
return this.OnCreateProject();
|
|
237
|
+
}
|
|
238
|
+
OnEditProject() {
|
|
239
|
+
if (!this.SelectedProject)
|
|
135
240
|
return;
|
|
136
241
|
const dialogRef = this.mjDialogService.open({
|
|
137
242
|
content: ProjectFormModalComponent,
|
|
@@ -140,22 +245,26 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
140
245
|
});
|
|
141
246
|
const modalInstance = dialogRef.Content.instance;
|
|
142
247
|
modalInstance.dialogRef = dialogRef;
|
|
143
|
-
modalInstance.project = this.
|
|
144
|
-
modalInstance.environmentId = this.
|
|
145
|
-
modalInstance.currentUser = this.
|
|
248
|
+
modalInstance.project = this.SelectedProject;
|
|
249
|
+
modalInstance.environmentId = this.EnvironmentId;
|
|
250
|
+
modalInstance.currentUser = this.CurrentUser;
|
|
146
251
|
modalInstance.projectSaved.subscribe(async (project) => {
|
|
147
|
-
this.
|
|
252
|
+
this.ProjectUpdated.emit(project);
|
|
148
253
|
await this.loadProjects();
|
|
149
|
-
this.
|
|
150
|
-
this.
|
|
254
|
+
this.SelectedProject = project;
|
|
255
|
+
this.ProjectSelected.emit(project);
|
|
151
256
|
});
|
|
152
257
|
}
|
|
153
|
-
|
|
154
|
-
|
|
258
|
+
/** @deprecated Use {@link OnEditProject}. */
|
|
259
|
+
onEditProject() {
|
|
260
|
+
return this.OnEditProject();
|
|
261
|
+
}
|
|
262
|
+
async OnDeleteProject() {
|
|
263
|
+
if (!this.SelectedProject)
|
|
155
264
|
return;
|
|
156
|
-
const projectName = this.
|
|
157
|
-
const projectId = this.
|
|
158
|
-
const conversationCount = this.
|
|
265
|
+
const projectName = this.SelectedProject.Name;
|
|
266
|
+
const projectId = this.SelectedProject.ID;
|
|
267
|
+
const conversationCount = this.SelectedProject.conversationCount || 0;
|
|
159
268
|
let message = `Are you sure you want to delete the project "${projectName}"?`;
|
|
160
269
|
if (conversationCount > 0) {
|
|
161
270
|
message += `\n\nThis project has ${conversationCount} conversation(s). The conversations will not be deleted, but will be unassigned from this project.`;
|
|
@@ -171,14 +280,14 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
171
280
|
return;
|
|
172
281
|
try {
|
|
173
282
|
const md = this.ProviderToUse;
|
|
174
|
-
const project = await md.GetEntityObject('MJ: Projects', this.
|
|
283
|
+
const project = await md.GetEntityObject('MJ: Projects', this.CurrentUser);
|
|
175
284
|
await project.Load(projectId);
|
|
176
285
|
const deleted = await project.Delete();
|
|
177
286
|
if (deleted) {
|
|
178
|
-
this.
|
|
287
|
+
this.ProjectDeleted.emit(projectId);
|
|
179
288
|
await this.loadProjects();
|
|
180
|
-
this.
|
|
181
|
-
this.
|
|
289
|
+
this.SelectedProject = null;
|
|
290
|
+
this.ProjectSelected.emit(null);
|
|
182
291
|
}
|
|
183
292
|
else {
|
|
184
293
|
throw new Error('Delete operation returned false');
|
|
@@ -189,8 +298,12 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
189
298
|
await this.dialogService.alert('Error', 'Failed to delete project. Please try again.');
|
|
190
299
|
}
|
|
191
300
|
}
|
|
301
|
+
/** @deprecated Use {@link OnDeleteProject}. */
|
|
302
|
+
async onDeleteProject() {
|
|
303
|
+
return this.OnDeleteProject();
|
|
304
|
+
}
|
|
192
305
|
static ɵfac = function ProjectSelectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProjectSelectorComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.MJDialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
|
|
193
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectSelectorComponent, selectors: [["mj-project-selector"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", selectedProjectId: "selectedProjectId", disabled: "disabled", showStats: "showStats" }, outputs: { projectSelected: "projectSelected", projectCreated: "projectCreated", projectUpdated: "projectUpdated", projectDeleted: "projectDeleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 4, consts: [[1, "project-selector"], [1, "mj-select", "project-dropdown", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], [1, "project-actions"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Create New Project", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit Project", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Delete Project", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"]], template: function ProjectSelectorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
306
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectSelectorComponent, selectors: [["mj-project-selector"]], inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", SelectedProjectId: "SelectedProjectId", selectedProjectId: "selectedProjectId", Disabled: "Disabled", disabled: "disabled", ShowStats: "ShowStats", showStats: "showStats" }, outputs: { ProjectSelected: "ProjectSelected", projectSelected: "projectSelected", ProjectCreated: "ProjectCreated", projectCreated: "projectCreated", ProjectUpdated: "ProjectUpdated", projectUpdated: "projectUpdated", ProjectDeleted: "ProjectDeleted", projectDeleted: "projectDeleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 4, consts: [[1, "project-selector"], [1, "mj-select", "project-dropdown", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], [1, "project-actions"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Create New Project", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit Project", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Delete Project", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"]], template: function ProjectSelectorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
194
307
|
i0.ɵɵelementStart(0, "div", 0)(1, "select", 1);
|
|
195
308
|
i0.ɵɵlistener("ngModelChange", function ProjectSelectorComponent_Template_select_ngModelChange_1_listener($event) { return ctx.onProjectSelectChange($event); });
|
|
196
309
|
i0.ɵɵelementStart(2, "option", 2);
|
|
@@ -260,22 +373,40 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
|
|
|
260
373
|
</div>
|
|
261
374
|
</div>
|
|
262
375
|
`, styles: ["\n .project-selector {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .project-dropdown {\n flex: 1;\n min-width: 200px;\n }\n .project-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n .project-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .project-name {\n font-weight: 500;\n color: #333;\n }\n .project-stats {\n font-size: 12px;\n color: #666;\n }\n .project-actions {\n display: flex;\n gap: 4px;\n }\n .btn-icon {\n min-width: auto;\n padding: 6px 8px;\n }\n .btn-danger:hover:not(:disabled) {\n background-color: #F44336;\n border-color: #F44336;\n color: white;\n }\n "] }]
|
|
263
|
-
}], () => [{ type: i1.DialogService }, { type: i2.MJDialogService }, { type: i0.ViewContainerRef }], {
|
|
376
|
+
}], () => [{ type: i1.DialogService }, { type: i2.MJDialogService }, { type: i0.ViewContainerRef }], { EnvironmentId: [{
|
|
377
|
+
type: Input
|
|
378
|
+
}], environmentId: [{
|
|
379
|
+
type: Input
|
|
380
|
+
}], CurrentUser: [{
|
|
264
381
|
type: Input
|
|
265
382
|
}], currentUser: [{
|
|
266
383
|
type: Input
|
|
384
|
+
}], SelectedProjectId: [{
|
|
385
|
+
type: Input
|
|
267
386
|
}], selectedProjectId: [{
|
|
268
387
|
type: Input
|
|
388
|
+
}], Disabled: [{
|
|
389
|
+
type: Input
|
|
269
390
|
}], disabled: [{
|
|
270
391
|
type: Input
|
|
392
|
+
}], ShowStats: [{
|
|
393
|
+
type: Input
|
|
271
394
|
}], showStats: [{
|
|
272
395
|
type: Input
|
|
396
|
+
}], ProjectSelected: [{
|
|
397
|
+
type: Output
|
|
273
398
|
}], projectSelected: [{
|
|
274
399
|
type: Output
|
|
400
|
+
}], ProjectCreated: [{
|
|
401
|
+
type: Output
|
|
275
402
|
}], projectCreated: [{
|
|
276
403
|
type: Output
|
|
404
|
+
}], ProjectUpdated: [{
|
|
405
|
+
type: Output
|
|
277
406
|
}], projectUpdated: [{
|
|
278
407
|
type: Output
|
|
408
|
+
}], ProjectDeleted: [{
|
|
409
|
+
type: Output
|
|
279
410
|
}], projectDeleted: [{
|
|
280
411
|
type: Output
|
|
281
412
|
}] }); })();
|