@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
|
@@ -8,32 +8,75 @@ function ProjectFormModalComponent_Conditional_11_Template(rf, ctx) { if (rf & 1
|
|
|
8
8
|
i0.ɵɵtext(1, "Folder name is required");
|
|
9
9
|
i0.ɵɵelementEnd();
|
|
10
10
|
} }
|
|
11
|
-
function
|
|
11
|
+
function ProjectFormModalComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
+
i0.ɵɵelementStart(0, "fieldset", 11)(1, "legend");
|
|
13
|
+
i0.ɵɵtext(2, "Visibility");
|
|
14
|
+
i0.ɵɵelementEnd();
|
|
15
|
+
i0.ɵɵelementStart(3, "p", 23);
|
|
16
|
+
i0.ɵɵelement(4, "i", 24);
|
|
17
|
+
i0.ɵɵtext(5, " Shared with everyone ");
|
|
18
|
+
i0.ɵɵelementEnd();
|
|
19
|
+
i0.ɵɵelementStart(6, "p", 25);
|
|
20
|
+
i0.ɵɵtext(7, " A shared folder stays shared. To keep something to yourself, create a new private folder and move it there. ");
|
|
21
|
+
i0.ɵɵelementEnd()();
|
|
22
|
+
} }
|
|
23
|
+
function ProjectFormModalComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
12
24
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
13
|
-
i0.ɵɵelementStart(0, "
|
|
14
|
-
i0.ɵɵ
|
|
25
|
+
i0.ɵɵelementStart(0, "fieldset", 11)(1, "legend");
|
|
26
|
+
i0.ɵɵtext(2, "Visibility");
|
|
27
|
+
i0.ɵɵelementEnd();
|
|
28
|
+
i0.ɵɵelementStart(3, "label", 26)(4, "input", 27);
|
|
29
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Conditional_18_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormData.isPersonal, $event) || (ctx_r1.FormData.isPersonal = $event); return i0.ɵɵresetView($event); });
|
|
15
30
|
i0.ɵɵelementEnd();
|
|
31
|
+
i0.ɵɵelementStart(5, "span");
|
|
32
|
+
i0.ɵɵtext(6, "Only me");
|
|
33
|
+
i0.ɵɵelementEnd()();
|
|
34
|
+
i0.ɵɵelementStart(7, "label", 26)(8, "input", 27);
|
|
35
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Conditional_18_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormData.isPersonal, $event) || (ctx_r1.FormData.isPersonal = $event); return i0.ɵɵresetView($event); });
|
|
36
|
+
i0.ɵɵelementEnd();
|
|
37
|
+
i0.ɵɵelementStart(9, "span");
|
|
38
|
+
i0.ɵɵtext(10, "Everyone");
|
|
39
|
+
i0.ɵɵelementEnd()();
|
|
40
|
+
i0.ɵɵelementStart(11, "p", 25);
|
|
41
|
+
i0.ɵɵtext(12);
|
|
42
|
+
i0.ɵɵelementEnd()();
|
|
16
43
|
} if (rf & 2) {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
i0.ɵɵ
|
|
20
|
-
i0.ɵɵ
|
|
21
|
-
i0.ɵɵ
|
|
44
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
45
|
+
i0.ɵɵadvance(4);
|
|
46
|
+
i0.ɵɵproperty("value", true);
|
|
47
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormData.isPersonal);
|
|
48
|
+
i0.ɵɵadvance(4);
|
|
49
|
+
i0.ɵɵproperty("value", false);
|
|
50
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormData.isPersonal);
|
|
51
|
+
i0.ɵɵadvance(4);
|
|
52
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.FormData.isPersonal ? "Only you can see this folder." : "Everyone can see this folder and its name. They will not see the conversations you keep in it.", " ");
|
|
22
53
|
} }
|
|
23
|
-
function
|
|
24
|
-
const
|
|
25
|
-
i0.ɵɵelementStart(0, "button",
|
|
26
|
-
i0.ɵɵlistener("click", function
|
|
54
|
+
function ProjectFormModalComponent_For_25_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
56
|
+
i0.ɵɵelementStart(0, "button", 28);
|
|
57
|
+
i0.ɵɵlistener("click", function ProjectFormModalComponent_For_25_Template_button_click_0_listener() { const color_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectColor(color_r4)); });
|
|
58
|
+
i0.ɵɵelementEnd();
|
|
59
|
+
} if (rf & 2) {
|
|
60
|
+
const color_r4 = ctx.$implicit;
|
|
61
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
62
|
+
i0.ɵɵstyleProp("background-color", color_r4);
|
|
63
|
+
i0.ɵɵclassProp("selected", ctx_r1.formData.color === color_r4);
|
|
64
|
+
i0.ɵɵproperty("title", color_r4);
|
|
65
|
+
} }
|
|
66
|
+
function ProjectFormModalComponent_For_37_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
68
|
+
i0.ɵɵelementStart(0, "button", 29);
|
|
69
|
+
i0.ɵɵlistener("click", function ProjectFormModalComponent_For_37_Template_button_click_0_listener() { const icon_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectIcon(icon_r6)); });
|
|
27
70
|
i0.ɵɵelement(1, "i");
|
|
28
71
|
i0.ɵɵelementEnd();
|
|
29
72
|
} if (rf & 2) {
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
i0.ɵɵstyleProp("color",
|
|
33
|
-
i0.ɵɵclassProp("selected",
|
|
34
|
-
i0.ɵɵproperty("title",
|
|
73
|
+
const icon_r6 = ctx.$implicit;
|
|
74
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
75
|
+
i0.ɵɵstyleProp("color", ctx_r1.formData.icon === icon_r6 ? ctx_r1.formData.color : null);
|
|
76
|
+
i0.ɵɵclassProp("selected", ctx_r1.formData.icon === icon_r6);
|
|
77
|
+
i0.ɵɵproperty("title", icon_r6);
|
|
35
78
|
i0.ɵɵadvance();
|
|
36
|
-
i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ",
|
|
79
|
+
i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", icon_r6));
|
|
37
80
|
} }
|
|
38
81
|
const DEFAULT_PROJECT_COLORS = [
|
|
39
82
|
'#0076B6', // MJ Blue
|
|
@@ -81,98 +124,253 @@ const DEFAULT_PROJECT_ICONS = [
|
|
|
81
124
|
];
|
|
82
125
|
export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
83
126
|
cdr;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
127
|
+
DialogRef;
|
|
128
|
+
/** @deprecated Use {@link DialogRef}. */
|
|
129
|
+
set dialogRef(value) {
|
|
130
|
+
this.DialogRef = value;
|
|
131
|
+
}
|
|
132
|
+
/** @deprecated Use {@link DialogRef}. */
|
|
133
|
+
get dialogRef() {
|
|
134
|
+
return this.DialogRef;
|
|
135
|
+
}
|
|
136
|
+
Project = null;
|
|
137
|
+
/** @deprecated Use {@link Project}. */
|
|
138
|
+
set project(value) {
|
|
139
|
+
this.Project = value;
|
|
140
|
+
}
|
|
141
|
+
/** @deprecated Use {@link Project}. */
|
|
142
|
+
get project() {
|
|
143
|
+
return this.Project;
|
|
144
|
+
}
|
|
145
|
+
EnvironmentId;
|
|
146
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
147
|
+
set environmentId(value) {
|
|
148
|
+
this.EnvironmentId = value;
|
|
149
|
+
}
|
|
150
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
151
|
+
get environmentId() {
|
|
152
|
+
return this.EnvironmentId;
|
|
153
|
+
}
|
|
154
|
+
CurrentUser;
|
|
155
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
156
|
+
set currentUser(value) {
|
|
157
|
+
this.CurrentUser = value;
|
|
158
|
+
}
|
|
159
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
160
|
+
get currentUser() {
|
|
161
|
+
return this.CurrentUser;
|
|
162
|
+
}
|
|
88
163
|
/** When creating a new folder, the parent folder ID for nesting (null = top level). */
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
164
|
+
ParentId = null;
|
|
165
|
+
/** @deprecated Use {@link ParentId}. */
|
|
166
|
+
set parentId(value) {
|
|
167
|
+
this.ParentId = value;
|
|
168
|
+
}
|
|
169
|
+
/** @deprecated Use {@link ParentId}. */
|
|
170
|
+
get parentId() {
|
|
171
|
+
return this.ParentId;
|
|
172
|
+
}
|
|
173
|
+
ProjectSaved = new EventEmitter();
|
|
174
|
+
/**
|
|
175
|
+
* @deprecated Use {@link ProjectSaved}.
|
|
176
|
+
*
|
|
177
|
+
* The same emitter under the old binding name, so a template still binding
|
|
178
|
+
* (projectSaved) keeps working. Must stay AFTER ProjectSaved: class fields
|
|
179
|
+
* initialise in order, and the other way round this captures undefined.
|
|
180
|
+
*/
|
|
181
|
+
projectSaved = this.ProjectSaved;
|
|
182
|
+
FormData = {
|
|
92
183
|
name: '',
|
|
93
184
|
description: '',
|
|
94
185
|
color: '#0076B6',
|
|
95
|
-
icon: 'fa-folder'
|
|
186
|
+
icon: 'fa-folder',
|
|
187
|
+
// A NEW folder is personal by default. The conversation sidebar is a personal
|
|
188
|
+
// surface — the conversations in it are already bound to their owner — so a
|
|
189
|
+
// folder everyone can see is the surprising option, not the private one. Folder
|
|
190
|
+
// NAMES are user-authored free text, and before OwnerUserID existed every one of
|
|
191
|
+
// them was readable by every user of the environment, which is what prompted
|
|
192
|
+
// this. Existing folders are untouched: they carry NULL, which still means shared.
|
|
193
|
+
isPersonal: true
|
|
96
194
|
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
195
|
+
/** @deprecated Use {@link FormData}. */
|
|
196
|
+
get formData() {
|
|
197
|
+
return this.FormData;
|
|
198
|
+
}
|
|
199
|
+
/** @deprecated Use {@link FormData}. */
|
|
200
|
+
set formData(value) {
|
|
201
|
+
this.FormData = value;
|
|
202
|
+
}
|
|
203
|
+
ShowNameError = false;
|
|
204
|
+
/** @deprecated Use {@link ShowNameError}. */
|
|
205
|
+
get showNameError() {
|
|
206
|
+
return this.ShowNameError;
|
|
207
|
+
}
|
|
208
|
+
/** @deprecated Use {@link ShowNameError}. */
|
|
209
|
+
set showNameError(value) {
|
|
210
|
+
this.ShowNameError = value;
|
|
211
|
+
}
|
|
212
|
+
IsEditMode = false;
|
|
213
|
+
/** @deprecated Use {@link IsEditMode}. */
|
|
214
|
+
get isEditMode() {
|
|
215
|
+
return this.IsEditMode;
|
|
216
|
+
}
|
|
217
|
+
/** @deprecated Use {@link IsEditMode}. */
|
|
218
|
+
set isEditMode(value) {
|
|
219
|
+
this.IsEditMode = value;
|
|
220
|
+
}
|
|
221
|
+
AvailableColors = DEFAULT_PROJECT_COLORS;
|
|
222
|
+
/** @deprecated Use {@link AvailableColors}. */
|
|
223
|
+
get availableColors() {
|
|
224
|
+
return this.AvailableColors;
|
|
225
|
+
}
|
|
226
|
+
/** @deprecated Use {@link AvailableColors}. */
|
|
227
|
+
set availableColors(value) {
|
|
228
|
+
this.AvailableColors = value;
|
|
229
|
+
}
|
|
230
|
+
AvailableIcons = DEFAULT_PROJECT_ICONS;
|
|
231
|
+
/** @deprecated Use {@link AvailableIcons}. */
|
|
232
|
+
get availableIcons() {
|
|
233
|
+
return this.AvailableIcons;
|
|
234
|
+
}
|
|
235
|
+
/** @deprecated Use {@link AvailableIcons}. */
|
|
236
|
+
set availableIcons(value) {
|
|
237
|
+
this.AvailableIcons = value;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* True when this dialog is editing a folder that is currently SHARED — in which case
|
|
241
|
+
* visibility is shown as a statement rather than a control.
|
|
242
|
+
*
|
|
243
|
+
* Sharing is one-way by design, and the reason is in the data model rather than the UI.
|
|
244
|
+
* NULL-means-shared conflates "shared" with "unowned": the moment a folder is shared its
|
|
245
|
+
* `OwnerUserID` goes to NULL and there is no column anywhere recording who created it
|
|
246
|
+
* (`Project` has `__mj_CreatedAt`, but no created-by). So `OwnerUserID = currentUser.ID`
|
|
247
|
+
* on a shared folder is indistinguishable from any other user claiming it — the system
|
|
248
|
+
* cannot tell reclaiming from appropriating, which makes "take it back" an affordance
|
|
249
|
+
* that was never really there.
|
|
250
|
+
*
|
|
251
|
+
* What that would cost on day one is the deciding argument. Every folder that exists
|
|
252
|
+
* today carries NULL, so without this the whole team's folder structure — subfolders
|
|
253
|
+
* included — is one radio button away from belonging to whichever person opens its
|
|
254
|
+
* settings first. A confirm does not fix that; it only narrates it.
|
|
255
|
+
*
|
|
256
|
+
* Personal -> shared stays available, because it only ever adds. Someone who wants a
|
|
257
|
+
* private copy makes a private folder. If personal folders later grow features that need
|
|
258
|
+
* a stable creator (sharing with named users, transfer, recovering a departed employee's
|
|
259
|
+
* folders), the fix is a separate IsShared flag so ownership stops being erased by
|
|
260
|
+
* sharing — a bigger change, and deliberately not this one.
|
|
261
|
+
*/
|
|
262
|
+
get VisibilityIsLocked() {
|
|
263
|
+
return this.IsEditMode && !this.Project?.OwnerUserID;
|
|
264
|
+
}
|
|
101
265
|
/** Translucent tint of the selected color, used behind the preview/icon glyph. */
|
|
102
|
-
get
|
|
103
|
-
const hex = this.
|
|
266
|
+
get ChipBackground() {
|
|
267
|
+
const hex = this.FormData.color || '#0076B6';
|
|
104
268
|
// 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color
|
|
105
269
|
return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;
|
|
106
270
|
}
|
|
271
|
+
/** @deprecated Use {@link ChipBackground}. */
|
|
272
|
+
get chipBackground() {
|
|
273
|
+
return this.ChipBackground;
|
|
274
|
+
}
|
|
107
275
|
constructor(cdr) {
|
|
108
276
|
super();
|
|
109
277
|
this.cdr = cdr;
|
|
110
278
|
}
|
|
111
279
|
ngOnInit() {
|
|
112
|
-
this.
|
|
113
|
-
if (this.
|
|
280
|
+
this.IsEditMode = this.Project != null;
|
|
281
|
+
if (this.Project) {
|
|
114
282
|
this.loadProjectData();
|
|
115
283
|
}
|
|
116
284
|
}
|
|
117
285
|
loadProjectData() {
|
|
118
|
-
if (!this.
|
|
286
|
+
if (!this.Project)
|
|
119
287
|
return;
|
|
120
|
-
this.
|
|
121
|
-
name: this.
|
|
122
|
-
description: this.
|
|
123
|
-
color: this.
|
|
124
|
-
icon: this.
|
|
288
|
+
this.FormData = {
|
|
289
|
+
name: this.Project.Name || '',
|
|
290
|
+
description: this.Project.Description || '',
|
|
291
|
+
color: this.Project.Color || '#0076B6',
|
|
292
|
+
icon: this.Project.Icon || 'fa-folder',
|
|
293
|
+
// Reflect what the folder IS, not the create-time default — otherwise opening
|
|
294
|
+
// a shared folder's settings and pressing Save would silently make it private.
|
|
295
|
+
isPersonal: !!this.Project.OwnerUserID
|
|
125
296
|
};
|
|
126
297
|
}
|
|
298
|
+
SelectColor(color) {
|
|
299
|
+
this.FormData.color = color;
|
|
300
|
+
this.cdr.detectChanges();
|
|
301
|
+
}
|
|
302
|
+
/** @deprecated Use {@link SelectColor}. */
|
|
127
303
|
selectColor(color) {
|
|
128
|
-
this.
|
|
304
|
+
return this.SelectColor(color);
|
|
305
|
+
}
|
|
306
|
+
SelectIcon(icon) {
|
|
307
|
+
this.FormData.icon = icon;
|
|
129
308
|
this.cdr.detectChanges();
|
|
130
309
|
}
|
|
310
|
+
/** @deprecated Use {@link SelectIcon}. */
|
|
131
311
|
selectIcon(icon) {
|
|
132
|
-
this.
|
|
133
|
-
this.cdr.detectChanges();
|
|
312
|
+
return this.SelectIcon(icon);
|
|
134
313
|
}
|
|
135
|
-
async
|
|
314
|
+
async OnSave() {
|
|
136
315
|
// Validate
|
|
137
|
-
if (!this.
|
|
138
|
-
this.
|
|
316
|
+
if (!this.FormData.name.trim()) {
|
|
317
|
+
this.ShowNameError = true;
|
|
139
318
|
this.cdr.detectChanges();
|
|
140
319
|
return;
|
|
141
320
|
}
|
|
142
|
-
this.
|
|
321
|
+
this.ShowNameError = false;
|
|
143
322
|
try {
|
|
144
323
|
const md = this.ProviderToUse;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
324
|
+
// A shared folder cannot be taken private — the control is not rendered for one
|
|
325
|
+
// (see VisibilityIsLocked). This is the same rule expressed where the write happens,
|
|
326
|
+
// so a future template change, a stale `formData` from a reopened dialog, or anything
|
|
327
|
+
// else that sets the flag cannot quietly appropriate a folder the whole team uses.
|
|
328
|
+
// It resolves to the folder's CURRENT state, so it is a no-op in every other case.
|
|
329
|
+
const isPersonal = this.VisibilityIsLocked ? false : this.FormData.isPersonal;
|
|
330
|
+
const project = this.Project || await md.GetEntityObject('MJ: Projects', this.CurrentUser);
|
|
331
|
+
project.Name = this.FormData.name.trim();
|
|
332
|
+
project.Description = this.FormData.description.trim() || null;
|
|
333
|
+
project.Color = this.FormData.color;
|
|
334
|
+
project.Icon = this.FormData.icon;
|
|
335
|
+
// Settable on edit, in one direction: a personal folder can be shared with the team.
|
|
336
|
+
// Null means shared, which is what every folder created before this column existed
|
|
337
|
+
// carries — and, because sharing erases the owner, is also why the reverse is not on
|
|
338
|
+
// offer. See VisibilityIsLocked.
|
|
339
|
+
project.OwnerUserID = isPersonal ? this.CurrentUser.ID : null;
|
|
340
|
+
if (!this.IsEditMode) {
|
|
341
|
+
project.EnvironmentID = this.EnvironmentId;
|
|
152
342
|
project.IsArchived = false;
|
|
153
|
-
if (this.
|
|
154
|
-
project.ParentID = this.
|
|
343
|
+
if (this.ParentId) {
|
|
344
|
+
project.ParentID = this.ParentId;
|
|
155
345
|
}
|
|
156
346
|
}
|
|
157
347
|
const saved = await project.Save();
|
|
158
348
|
if (saved) {
|
|
159
|
-
this.
|
|
160
|
-
this.
|
|
349
|
+
this.ProjectSaved.emit(project);
|
|
350
|
+
this.DialogRef.Close();
|
|
161
351
|
}
|
|
162
352
|
else {
|
|
163
|
-
|
|
353
|
+
// Save() records WHY it refused on LatestResult and returns false — a
|
|
354
|
+
// server refusal, a constraint violation, a failed validation. Reporting
|
|
355
|
+
// a generic message here would throw the only copy of that reason away.
|
|
356
|
+
throw new Error(project.LatestResult?.CompleteMessage || 'The save was refused with no reason given.');
|
|
164
357
|
}
|
|
165
358
|
}
|
|
166
359
|
catch (error) {
|
|
167
360
|
console.error('Error saving project:', error);
|
|
168
|
-
|
|
361
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
362
|
+
alert(`Failed to save folder.\n\n${reason}`);
|
|
169
363
|
}
|
|
170
364
|
}
|
|
365
|
+
/** @deprecated Use {@link OnSave}. */
|
|
366
|
+
async onSave() {
|
|
367
|
+
return this.OnSave();
|
|
368
|
+
}
|
|
171
369
|
onCancel() {
|
|
172
|
-
this.
|
|
370
|
+
this.DialogRef.Close();
|
|
173
371
|
}
|
|
174
372
|
static ɵfac = function ProjectFormModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProjectFormModalComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
175
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectFormModalComponent, selectors: [["mj-project-form-modal"]], inputs: { dialogRef: "dialogRef", project: "project", environmentId: "environmentId", currentUser: "currentUser", parentId: "parentId" }, outputs: { projectSaved: "projectSaved" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
373
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectFormModalComponent, selectors: [["mj-project-form-modal"]], inputs: { DialogRef: "DialogRef", dialogRef: "dialogRef", Project: "Project", project: "project", EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", ParentId: "ParentId", parentId: "parentId" }, outputs: { ProjectSaved: "ProjectSaved", projectSaved: "projectSaved" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 43, vars: 19, consts: [[3, "Close", "Title", "Width", "MinWidth", "Visible"], [1, "project-form"], [1, "folder-preview"], [1, "folder-preview-chip"], [1, "folder-preview-name"], [1, "form-field"], ["for", "projectName", 1, "required"], ["id", "projectName", "type", "text", "placeholder", "e.g. Client work, Research, Ideas", "autofocus", "", 1, "mj-input", "full-width", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "error-message"], ["for", "projectDescription"], ["id", "projectDescription", "placeholder", "What goes in this folder? (optional)", "rows", "2", 1, "mj-textarea", "full-width", 3, "ngModelChange", "ngModel"], ["aria-describedby", "projectVisibilityHint", 1, "visibility-set"], [1, "color-picker-section"], [1, "color-palette"], ["type", "button", 1, "color-swatch", 3, "selected", "backgroundColor", "title"], [1, "custom-color-input"], ["for", "customColor"], ["id", "customColor", "type", "color", 1, "custom-color-picker", 3, "ngModelChange", "ngModel"], [1, "color-value"], [1, "icon-grid"], ["type", "button", 1, "icon-option", 3, "selected", "color", "title"], ["mjButton", "", "variant", "primary", 3, "click"], ["mjButton", "", 3, "click"], [1, "visibility-locked"], ["aria-hidden", "true", 1, "fa-solid", "fa-users"], ["id", "projectVisibilityHint", 1, "visibility-hint"], [1, "visibility-choice"], ["type", "radio", "name", "projectVisibility", 3, "ngModelChange", "value", "ngModel"], ["type", "button", 1, "color-swatch", 3, "click", "title"], ["type", "button", 1, "icon-option", 3, "click", "title"]], template: function ProjectFormModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
176
374
|
i0.ɵɵelementStart(0, "mj-dialog", 0);
|
|
177
375
|
i0.ɵɵlistener("Close", function ProjectFormModalComponent_Template_mj_dialog_Close_0_listener() { return ctx.onCancel(); });
|
|
178
376
|
i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "span", 3);
|
|
@@ -196,34 +394,37 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
|
196
394
|
i0.ɵɵelementStart(15, "textarea", 10);
|
|
197
395
|
i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Template_textarea_ngModelChange_15_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.formData.description, $event) || (ctx.formData.description = $event); return $event; });
|
|
198
396
|
i0.ɵɵelementEnd()();
|
|
199
|
-
i0.ɵɵelementStart(16, "div", 5)
|
|
200
|
-
i0.ɵɵ
|
|
397
|
+
i0.ɵɵelementStart(16, "div", 5);
|
|
398
|
+
i0.ɵɵconditionalCreate(17, ProjectFormModalComponent_Conditional_17_Template, 8, 0, "fieldset", 11)(18, ProjectFormModalComponent_Conditional_18_Template, 13, 5, "fieldset", 11);
|
|
201
399
|
i0.ɵɵelementEnd();
|
|
202
|
-
i0.ɵɵelementStart(19, "div",
|
|
203
|
-
i0.ɵɵ
|
|
400
|
+
i0.ɵɵelementStart(19, "div", 5)(20, "label");
|
|
401
|
+
i0.ɵɵtext(21, "Color");
|
|
204
402
|
i0.ɵɵelementEnd();
|
|
205
|
-
i0.ɵɵelementStart(
|
|
206
|
-
i0.ɵɵ
|
|
403
|
+
i0.ɵɵelementStart(22, "div", 12)(23, "div", 13);
|
|
404
|
+
i0.ɵɵrepeaterCreate(24, ProjectFormModalComponent_For_25_Template, 1, 5, "button", 14, i0.ɵɵrepeaterTrackByIdentity);
|
|
207
405
|
i0.ɵɵelementEnd();
|
|
208
|
-
i0.ɵɵelementStart(26, "
|
|
209
|
-
i0.ɵɵ
|
|
406
|
+
i0.ɵɵelementStart(26, "div", 15)(27, "label", 16);
|
|
407
|
+
i0.ɵɵtext(28, "Custom:");
|
|
210
408
|
i0.ɵɵelementEnd();
|
|
211
|
-
i0.ɵɵelementStart(
|
|
212
|
-
i0.ɵɵ
|
|
409
|
+
i0.ɵɵelementStart(29, "input", 17);
|
|
410
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Template_input_ngModelChange_29_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.formData.color, $event) || (ctx.formData.color = $event); return $event; });
|
|
411
|
+
i0.ɵɵelementEnd();
|
|
412
|
+
i0.ɵɵelementStart(30, "span", 18);
|
|
413
|
+
i0.ɵɵtext(31);
|
|
213
414
|
i0.ɵɵelementEnd()()()();
|
|
214
|
-
i0.ɵɵelementStart(
|
|
215
|
-
i0.ɵɵtext(
|
|
415
|
+
i0.ɵɵelementStart(32, "div", 5)(33, "label");
|
|
416
|
+
i0.ɵɵtext(34, "Icon");
|
|
216
417
|
i0.ɵɵelementEnd();
|
|
217
|
-
i0.ɵɵelementStart(
|
|
218
|
-
i0.ɵɵrepeaterCreate(
|
|
418
|
+
i0.ɵɵelementStart(35, "div", 19);
|
|
419
|
+
i0.ɵɵrepeaterCreate(36, ProjectFormModalComponent_For_37_Template, 2, 8, "button", 20, i0.ɵɵrepeaterTrackByIdentity);
|
|
219
420
|
i0.ɵɵelementEnd()()();
|
|
220
|
-
i0.ɵɵelementStart(
|
|
221
|
-
i0.ɵɵlistener("click", function
|
|
222
|
-
i0.ɵɵtext(
|
|
421
|
+
i0.ɵɵelementStart(38, "mj-dialog-actions")(39, "button", 21);
|
|
422
|
+
i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_39_listener() { return ctx.onSave(); });
|
|
423
|
+
i0.ɵɵtext(40);
|
|
223
424
|
i0.ɵɵelementEnd();
|
|
224
|
-
i0.ɵɵelementStart(
|
|
225
|
-
i0.ɵɵlistener("click", function
|
|
226
|
-
i0.ɵɵtext(
|
|
425
|
+
i0.ɵɵelementStart(41, "button", 22);
|
|
426
|
+
i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_41_listener() { return ctx.onCancel(); });
|
|
427
|
+
i0.ɵɵtext(42, "Cancel");
|
|
227
428
|
i0.ɵɵelementEnd()()();
|
|
228
429
|
} if (rf & 2) {
|
|
229
430
|
i0.ɵɵproperty("Title", ctx.isEditMode ? "Edit Folder" : "New Folder")("Width", 560)("MinWidth", 400)("Visible", true);
|
|
@@ -239,7 +440,9 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
|
239
440
|
i0.ɵɵconditional(ctx.showNameError ? 11 : -1);
|
|
240
441
|
i0.ɵɵadvance(4);
|
|
241
442
|
i0.ɵɵtwoWayProperty("ngModel", ctx.formData.description);
|
|
242
|
-
i0.ɵɵadvance(
|
|
443
|
+
i0.ɵɵadvance(2);
|
|
444
|
+
i0.ɵɵconditional(ctx.VisibilityIsLocked ? 17 : 18);
|
|
445
|
+
i0.ɵɵadvance(7);
|
|
243
446
|
i0.ɵɵrepeater(ctx.availableColors);
|
|
244
447
|
i0.ɵɵadvance(5);
|
|
245
448
|
i0.ɵɵtwoWayProperty("ngModel", ctx.formData.color);
|
|
@@ -249,7 +452,7 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
|
249
452
|
i0.ɵɵrepeater(ctx.availableIcons);
|
|
250
453
|
i0.ɵɵadvance(4);
|
|
251
454
|
i0.ɵɵtextInterpolate1(" ", ctx.isEditMode ? "Save Changes" : "Create Folder", " ");
|
|
252
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent], styles: [".project-form[_ngcontent-%COMP%] {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n \n .folder-preview[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width[_ngcontent-%COMP%] { width: 100%; }\n\n .error-message[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n \n .color-picker-section[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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 \n .icon-grid[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 17px; }\n\n \n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }"] });
|
|
455
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent], styles: [".project-form[_ngcontent-%COMP%] {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n \n .folder-preview[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width[_ngcontent-%COMP%] { width: 100%; }\n\n .error-message[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n \n .visibility-set[_ngcontent-%COMP%] {\n border: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n \n\n\n\n .visibility-set[_ngcontent-%COMP%] legend[_ngcontent-%COMP%] {\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 \n\n\n\n .form-field[_ngcontent-%COMP%] .visibility-choice[_ngcontent-%COMP%] {\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 \n\n padding: 0.25rem 0;\n }\n\n .visibility-choice[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n margin: 0;\n }\n\n \n\n\n\n .form-field[_ngcontent-%COMP%] .visibility-locked[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .visibility-hint[_ngcontent-%COMP%] {\n margin: 0.15rem 0 0;\n \n font-size: 12px;\n line-height: 1.4;\n color: var(--mj-text-muted);\n }\n\n .color-picker-section[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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 \n .icon-grid[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 17px; }\n\n \n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }"] });
|
|
253
456
|
}
|
|
254
457
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProjectFormModalComponent, [{
|
|
255
458
|
type: Component,
|
|
@@ -301,6 +504,52 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
|
301
504
|
rows="2"></textarea>
|
|
302
505
|
</div>
|
|
303
506
|
|
|
507
|
+
<!-- Visibility. TWO NAMED OPTIONS, not a checkbox: with a checkbox the unchecked
|
|
508
|
+
meaning lives only in the helper text, so the shared state is never actually
|
|
509
|
+
named. A fieldset/legend also gives the group a real accessible name, which a
|
|
510
|
+
bare <label>Visibility</label> did not, and the hint is a sibling of the
|
|
511
|
+
options rather than inside one — inside, a screen reader read the whole hint
|
|
512
|
+
as part of the option's name.
|
|
513
|
+
|
|
514
|
+
A SHARED folder shows a statement instead of the control. Visibility is a
|
|
515
|
+
create-time choice in one direction only: personal -> shared stays available,
|
|
516
|
+
because it only ever adds. See VisibilityIsLocked for why the reverse is not
|
|
517
|
+
offered. -->
|
|
518
|
+
<div class="form-field">
|
|
519
|
+
@if (VisibilityIsLocked) {
|
|
520
|
+
<fieldset class="visibility-set" aria-describedby="projectVisibilityHint">
|
|
521
|
+
<legend>Visibility</legend>
|
|
522
|
+
<p class="visibility-locked">
|
|
523
|
+
<i class="fa-solid fa-users" aria-hidden="true"></i>
|
|
524
|
+
Shared with everyone
|
|
525
|
+
</p>
|
|
526
|
+
<p class="visibility-hint" id="projectVisibilityHint">
|
|
527
|
+
A shared folder stays shared. To keep something to yourself, create a new
|
|
528
|
+
private folder and move it there.
|
|
529
|
+
</p>
|
|
530
|
+
</fieldset>
|
|
531
|
+
} @else {
|
|
532
|
+
<fieldset class="visibility-set" aria-describedby="projectVisibilityHint">
|
|
533
|
+
<legend>Visibility</legend>
|
|
534
|
+
<label class="visibility-choice">
|
|
535
|
+
<input type="radio" name="projectVisibility" [value]="true"
|
|
536
|
+
[(ngModel)]="FormData.isPersonal" />
|
|
537
|
+
<span>Only me</span>
|
|
538
|
+
</label>
|
|
539
|
+
<label class="visibility-choice">
|
|
540
|
+
<input type="radio" name="projectVisibility" [value]="false"
|
|
541
|
+
[(ngModel)]="FormData.isPersonal" />
|
|
542
|
+
<span>Everyone</span>
|
|
543
|
+
</label>
|
|
544
|
+
<p class="visibility-hint" id="projectVisibilityHint">
|
|
545
|
+
{{ FormData.isPersonal
|
|
546
|
+
? 'Only you can see this folder.'
|
|
547
|
+
: 'Everyone can see this folder and its name. They will not see the conversations you keep in it.' }}
|
|
548
|
+
</p>
|
|
549
|
+
</fieldset>
|
|
550
|
+
}
|
|
551
|
+
</div>
|
|
552
|
+
|
|
304
553
|
<!-- Color Picker -->
|
|
305
554
|
<div class="form-field">
|
|
306
555
|
<label>Color</label>
|
|
@@ -355,19 +604,31 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
|
|
|
355
604
|
<button mjButton (click)="onCancel()">Cancel</button>
|
|
356
605
|
</mj-dialog-actions>
|
|
357
606
|
</mj-dialog>
|
|
358
|
-
`, 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 "] }]
|
|
359
|
-
}], () => [{ type: i0.ChangeDetectorRef }], {
|
|
607
|
+
`, 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 \u2014 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 \u2014 same size, same weight, same 0.25rem row padding \u2014 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 "] }]
|
|
608
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { DialogRef: [{
|
|
609
|
+
type: Input
|
|
610
|
+
}], dialogRef: [{
|
|
611
|
+
type: Input
|
|
612
|
+
}], Project: [{
|
|
360
613
|
type: Input
|
|
361
614
|
}], project: [{
|
|
362
615
|
type: Input
|
|
616
|
+
}], EnvironmentId: [{
|
|
617
|
+
type: Input
|
|
363
618
|
}], environmentId: [{
|
|
364
619
|
type: Input
|
|
620
|
+
}], CurrentUser: [{
|
|
621
|
+
type: Input
|
|
365
622
|
}], currentUser: [{
|
|
366
623
|
type: Input
|
|
624
|
+
}], ParentId: [{
|
|
625
|
+
type: Input
|
|
367
626
|
}], parentId: [{
|
|
368
627
|
type: Input
|
|
628
|
+
}], ProjectSaved: [{
|
|
629
|
+
type: Output
|
|
369
630
|
}], projectSaved: [{
|
|
370
631
|
type: Output
|
|
371
632
|
}] }); })();
|
|
372
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProjectFormModalComponent, { className: "ProjectFormModalComponent", filePath: "src/lib/components/project/project-form-modal.component.ts", lineNumber:
|
|
633
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProjectFormModalComponent, { className: "ProjectFormModalComponent", filePath: "src/lib/components/project/project-form-modal.component.ts", lineNumber: 470 }); })();
|
|
373
634
|
//# sourceMappingURL=project-form-modal.component.js.map
|