@memberjunction/ng-conversations 5.42.0 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
- 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 +56 -52
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +37 -41
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +41 -45
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +22 -36
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +134 -166
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +73 -8
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +487 -123
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +20 -24
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +10 -11
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +65 -26
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +31 -10
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +11 -16
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +52 -46
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +83 -18
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +238 -151
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +15 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +90 -15
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.js +6 -9
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +3 -0
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
- package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
- package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
- package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
- package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
- package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.js +253 -0
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
- package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
- package/dist/lib/components/search/search-panel.component.d.ts +2 -0
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +92 -101
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +10 -11
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +12 -15
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +18 -7
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +29 -26
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +37 -6
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +6 -3
- 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/services/conversation-agent.service.d.ts +2 -2
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +6 -2
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +41 -5
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +143 -19
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
- package/dist/lib/services/realtime-audio-recorder.js +379 -0
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
- package/dist/lib/services/realtime-pcm-wav.js +205 -0
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
- package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session-review.service.js +12 -3
- package/dist/lib/services/realtime-session-review.service.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +210 -20
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +452 -21
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/realtime-sessions-adapter.js +1 -1
- package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +6 -2
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
- package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
- package/dist/lib/utils/plan-mode-preference.js +130 -0
- package/dist/lib/utils/plan-mode-preference.js.map +1 -0
- package/dist/public-api.d.ts +6 -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 +28 -26
- package/dist/__tests__/attachment-badge.test.d.ts +0 -2
- package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
- package/dist/__tests__/attachment-badge.test.js +0 -66
- package/dist/__tests__/attachment-badge.test.js.map +0 -1
- package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
- package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
- package/dist/__tests__/channel-optional-surface.test.js +0 -53
- package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
- package/dist/__tests__/chat-events.test.d.ts +0 -14
- package/dist/__tests__/chat-events.test.d.ts.map +0 -1
- package/dist/__tests__/chat-events.test.js +0 -109
- package/dist/__tests__/chat-events.test.js.map +0 -1
- package/dist/__tests__/collections-full-view.test.d.ts +0 -2
- package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
- package/dist/__tests__/collections-full-view.test.js +0 -225
- package/dist/__tests__/collections-full-view.test.js.map +0 -1
- package/dist/__tests__/conversation-cache.test.d.ts +0 -2
- package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
- package/dist/__tests__/conversation-cache.test.js +0 -233
- package/dist/__tests__/conversation-cache.test.js.map +0 -1
- package/dist/__tests__/conversation-naming.test.d.ts +0 -2
- package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
- package/dist/__tests__/conversation-naming.test.js +0 -110
- package/dist/__tests__/conversation-naming.test.js.map +0 -1
- package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
- package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
- package/dist/__tests__/delegation-result-parser.test.js +0 -107
- package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
- package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
- package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
- package/dist/__tests__/distinct-artifacts.test.js +0 -56
- package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
- package/dist/__tests__/event-wiring.test.d.ts +0 -15
- package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
- package/dist/__tests__/event-wiring.test.js +0 -100
- package/dist/__tests__/event-wiring.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/narration-template.test.d.ts +0 -2
- package/dist/__tests__/narration-template.test.d.ts.map +0 -1
- package/dist/__tests__/narration-template.test.js +0 -76
- package/dist/__tests__/narration-template.test.js.map +0 -1
- package/dist/__tests__/notification-model.test.d.ts +0 -2
- package/dist/__tests__/notification-model.test.d.ts.map +0 -1
- package/dist/__tests__/notification-model.test.js +0 -68
- package/dist/__tests__/notification-model.test.js.map +0 -1
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
- package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
- package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
- package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
- package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
- package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
- package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
- package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-disclosure.test.js +0 -164
- package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
- package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
- package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-pairing.test.js +0 -207
- package/dist/__tests__/realtime-pairing.test.js.map +0 -1
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
- package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
- package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
- package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-channels.test.js +0 -252
- package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
- package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
- package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
- package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-minimized.test.js +0 -32
- package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
- package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-mint.test.js +0 -69
- package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
- package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-policy.test.js +0 -303
- package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
- package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-review.service.test.js +0 -743
- package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
- package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-state.test.js +0 -83
- package/dist/__tests__/realtime-session-state.test.js.map +0 -1
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
- package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
- package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-timeline.test.js +0 -142
- package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
- package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
- package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
- package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
- package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
- package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
- package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
- package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
- package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
- package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
- package/dist/__tests__/remote-browser-channel.test.js +0 -585
- package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
- package/dist/__tests__/search-service.test.d.ts +0 -2
- package/dist/__tests__/search-service.test.d.ts.map +0 -1
- package/dist/__tests__/search-service.test.js +0 -114
- package/dist/__tests__/search-service.test.js.map +0 -1
- package/dist/__tests__/slot-defaults.test.d.ts +0 -24
- package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
- package/dist/__tests__/slot-defaults.test.js +0 -63
- package/dist/__tests__/slot-defaults.test.js.map +0 -1
- package/dist/__tests__/toast-service.test.d.ts +0 -2
- package/dist/__tests__/toast-service.test.d.ts.map +0 -1
- package/dist/__tests__/toast-service.test.js +0 -143
- package/dist/__tests__/toast-service.test.js.map +0 -1
- package/dist/__tests__/user-authorization.test.d.ts +0 -2
- package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
- package/dist/__tests__/user-authorization.test.js +0 -97
- package/dist/__tests__/user-authorization.test.js.map +0 -1
- package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
- package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
- package/dist/__tests__/voice-session-narration.test.js +0 -609
- package/dist/__tests__/voice-session-narration.test.js.map +0 -1
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
- package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
- package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-channel.test.js +0 -260
- package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
- package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
- package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public highlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>Search across all your conversations, messages, artifacts, collections, and tasks</p>\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </div>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search-minus empty-icon\"></i>\n <p>No results found for \"{{ searchQuery }}\"</p>\n <p class=\"no-results-hint\">Try adjusting your filters or search terms</p>\n </div>\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAGT,MAAM,EACN,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,SAAS,EAEV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;;ICGtD,kCAKC;IAFC,uMAAS,oBAAa,KAAC;IAGvB,wBAAiC;IACnC,iBAAS;;;;IAqFT,kCAKC;IAFC,wMAAS,uBAAgB,KAAC;IAG1B,wBAAwC;IAC1C,iBAAS;;;IAQX,+BAA4B;IAC1B,iCAA2D;IAC7D,iBAAM;;;;IAkBE,kCAIC;IADC,wPAAS,iCAAuB,KAAC;IAEjC,wBAAmC;IACnC,4BAAM;IAAA,YAAY;IACpB,AADoB,iBAAO,EAClB;;;IADD,eAAY;IAAZ,+BAAY;;;;IAlBtB,AADF,AADF,+BAA6B,cACS,SAC9B;IAAA,+BAAe;IAAA,iBAAK;IACxB,kCAKC;IAFC,sNAAS,4BAAqB,KAAC;IAG/B,uBACF;IACF,AADE,iBAAS,EACL;IACN,+BAAkC;IAChC,wJASC;IAEL,AADE,iBAAM,EACF;;;IAXF,eASC;IATD,oCASC;;;IAvBP,oHAAiC;IAiC7B,AADF,AAHF,0CAE8F,cACnE,SACnB;IAAA,qBAAK;IAAA,iBAAK;IAEZ,AADF,0BAAI,SACE;IAAA,6CAA6B;IAAA,iBAAK;IACtC,0BAAI;IAAA,qDAAqC;IAAA,iBAAK;IAC9C,2BAAI;IAAA,mDAAkC;IAG5C,AADE,AADE,AADwC,iBAAK,EACxC,EACD,EACS;;;IAxCjB,2DA0BC;;;IAiBD,qCAGyD;;;IADvD,+CAA0B;;;IA8Bd,0BAA8F;;;;IAApE,+GAA6D;;;;IAb7F,kCAKC;IADC,wPAAS,8BAAoB,KAAC;IAE9B,+BAAyB;IACvB,wBAA6D;IAC/D,iBAAM;IACN,+BAA4B;IAE1B,AADA,0BAAwF,cACI;IAC5F,wIAA0B;IAG5B,iBAAM;IAEJ,AADF,+BAAyB,eACG;IAAA,YAAkC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACC;;;;IAhBP,8DAA2C;IAIrB,eAAoC;IAApC,mDAAoC;IAG9B,eAAuD;IAAvD,yGAAuD;IACrD,cAAyD;IAAzD,2GAAyD;IACrF,cAEC;IAFD,gDAEC;IAGyB,eAAkC;IAAlC,4DAAkC;;;IAvBpE,AADF,+BAA2B,aACO;IAC9B,wBAAoC;IACpC,YACF;IAAA,iBAAK;IACL,+BAA0B;IACxB,uIAqBC;IAEL,AADE,iBAAM,EACF;;;IA1BF,eACF;IADE,oFACF;IAEE,eAqBC;IArBD,2CAqBC;;;IAyBO,+BAAiC;IAC/B,wBAAoC;IACpC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,4DACF;;;IAIA,0BAA8F;;;;IAApE,gHAA6D;;;;IAlB7F,kCAKC;IADC,0PAAS,+BAAoB,KAAC;IAE9B,+BAAyB;IACvB,wBAA6D;IAC/D,iBAAM;IACN,+BAA4B;IAC1B,wIAA+B;IAM/B,0BAA4F;IAC5F,wIAA0B;IAG5B,iBAAM;IAEJ,AADF,+BAAyB,eACG;IAAA,YAAkC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACC;;;;IArBP,+DAA2C;IAIrB,eAAoC;IAApC,oDAAoC;IAGxD,eAKC;IALD,sDAKC;IAC2B,cAAyD;IAAzD,4GAAyD;IACrF,cAEC;IAFD,iDAEC;IAGyB,eAAkC;IAAlC,6DAAkC;;;IA5BpE,AADF,+BAA2B,aACO;IAC9B,wBAAmC;IACnC,YACF;IAAA,iBAAK;IACL,+BAA0B;IACxB,uIA0BC;IAEL,AADE,iBAAM,EACF;;;IA/BF,eACF;IADE,0EACF;IAEE,eA0BC;IA1BD,sCA0BC;;;IA2BS,AADF,+BAAyB,eACE;IAAA,YAAyB;IACpD,AADoD,iBAAO,EACrD;;;IADqB,eAAyB;IAAzB,6CAAyB;;;IAIpD,+BAAiC;IAC/B,wBAAoC;IACpC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,4DACF;;;IAIA,0BAA8F;;;;IAApE,gHAA6D;;;;IAxB7F,kCAKC;IADC,0PAAS,+BAAoB,KAAC;IAE9B,+BAAyB;IACvB,wBAA6D;IAC/D,iBAAM;IACN,+BAA4B;IAC1B,0BAAwF;IACxF,wIAA2B;IAK3B,wIAA+B;IAM/B,0BAA4F;IAC5F,wIAA0B;IAG5B,iBAAM;IAEJ,AADF,+BAAyB,gBACG;IAAA,aAAkC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACC;;;;IA3BP,+DAA2C;IAIrB,eAAoC;IAApC,oDAAoC;IAG9B,eAAuD;IAAvD,0GAAuD;IACjF,cAIC;IAJD,kDAIC;IACD,cAKC;IALD,sDAKC;IAC2B,cAAyD;IAAzD,4GAAyD;IACrF,cAEC;IAFD,iDAEC;IAGyB,eAAkC;IAAlC,6DAAkC;;;IAlCpE,AADF,+BAA2B,aACO;IAC9B,wBAAoC;IACpC,YACF;IAAA,iBAAK;IACL,+BAA0B;IACxB,wIAgCC;IAEL,AADE,iBAAM,EACF;;;IArCF,eACF;IADE,4EACF;IAEE,eAgCC;IAhCD,uCAgCC;;;IA2BO,0BAA8F;;;;IAApE,gHAA6D;;;;IAb7F,kCAKC;IADC,0PAAS,+BAAoB,KAAC;IAE9B,+BAAyB;IACvB,wBAA6D;IAC/D,iBAAM;IACN,+BAA4B;IAE1B,AADA,0BAAwF,cACI;IAC5F,wIAA0B;IAG5B,iBAAM;IAEJ,AADF,+BAAyB,eACG;IAAA,YAAkC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACC;;;;IAhBP,+DAA2C;IAIrB,eAAoC;IAApC,oDAAoC;IAG9B,eAAuD;IAAvD,0GAAuD;IACrD,cAAyD;IAAzD,4GAAyD;IACrF,cAEC;IAFD,iDAEC;IAGyB,eAAkC;IAAlC,6DAAkC;;;IAvBpE,AADF,+BAA2B,aACO;IAC9B,wBAAkC;IAClC,YACF;IAAA,iBAAK;IACL,+BAA0B;IACxB,uIAqBC;IAEL,AADE,iBAAM,EACF;;;IA1BF,eACF;IADE,gFACF;IAEE,eAqBC;IArBD,yCAqBC;;;IA2BO,0BAA8F;;;;IAApE,gHAA6D;;;;IAb7F,kCAKC;IADC,0PAAS,+BAAoB,KAAC;IAE9B,+BAAyB;IACvB,wBAA6D;IAC/D,iBAAM;IACN,+BAA4B;IAE1B,AADA,0BAAwF,cACI;IAC5F,wIAA0B;IAG5B,iBAAM;IAEJ,AADF,+BAAyB,eACG;IAAA,YAAkC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACC;;;;IAhBP,+DAA2C;IAIrB,eAAoC;IAApC,oDAAoC;IAG9B,eAAuD;IAAvD,0GAAuD;IACrD,cAAyD;IAAzD,4GAAyD;IACrF,cAEC;IAFD,iDAEC;IAGyB,eAAkC;IAAlC,6DAAkC;;;IAvBpE,AADF,+BAA2B,aACO;IAC9B,wBAAiC;IACjC,YACF;IAAA,iBAAK;IACL,+BAA0B;IACxB,uIAqBC;IAEL,AADE,iBAAM,EACF;;;IA1BF,eACF;IADE,oEACF;IAEE,eAqBC;IArBD,mCAqBC;;;IAzLP,+BAA6B;IAC3B,YACF;IAAA,iBAAM;IAGN,oHAAwC;IAkCxC,oHAAmC;IAuCnC,oHAAoC;IA6CpC,oHAAsC;IAkCtC,oHAAgC;;;IA5J9B,cACF;IADE,6GACF;IAGA,cA+BC;IA/BD,kEA+BC;IAGD,cAoCC;IApCD,6DAoCC;IAGD,cA0CC;IA1CD,8DA0CC;IAGD,cA+BC;IA/BD,gEA+BC;IAGD,cA+BC;IA/BD,0DA+BC;;;;IA7WT,8BAAyD;IAAvB,qLAAS,mBAAY,KAAC;IACtD,8BAA6D;IAAnC,wJAAS,wBAAwB,KAAC;IAGxD,AADF,8BAA2B,aACS;IAChC,uBAA8C;IAC9C,mCAQE;IAHA,kTAAyB;IACzB,uLAAS,sBAAe,KAAC;IAN3B,iBAQE;IACF,uGAAmB;IAUrB,iBAAM;IAEN,iCAKC;IAFC,wLAAS,mBAAY,KAAC;IAGtB,wBAAiC;IAErC,AADE,iBAAS,EACL;IAKF,AADF,AADF,gCAA4B,eACE,kBAMzB;IADC,yLAAS,iBAAU,KAAK,CAAC,KAAC;IAE1B,sBACF;IAAA,iBAAS;IACT,mCAKC;IADC,yLAAS,iBAAU,eAAe,CAAC,KAAC;IAEpC,yBAAoC;IACpC,gCACF;IAAA,iBAAS;IACT,mCAKC;IADC,yLAAS,iBAAU,UAAU,CAAC,KAAC;IAE/B,yBAAmC;IACnC,2BACF;IAAA,iBAAS;IACT,mCAKC;IADC,yLAAS,iBAAU,WAAW,CAAC,KAAC;IAEhC,yBAAoC;IACpC,4BACF;IAAA,iBAAS;IACT,mCAKC;IADC,yLAAS,iBAAU,aAAa,CAAC,KAAC;IAElC,yBAAkC;IAClC,8BACF;IAAA,iBAAS;IACT,mCAKC;IADC,yLAAS,iBAAU,OAAO,CAAC,KAAC;IAE5B,yBAAiC;IACjC,wBACF;IACF,AADE,iBAAS,EACL;IAIJ,AADF,gCAAyB,yBAKtB;IAHC,mUAA6B;IAC7B,gNAAiB,0BAAmB,KAAC;IAEtC,iBAAgB;IACjB,0CAIC;IAHC,+TAA2B;IAC3B,gNAAiB,0BAAmB,KAAC;IAEtC,iBAAgB;IACjB,0GAAwC;IAW5C,AADE,iBAAM,EACF;IAGN,gCAA4B;IAsDxB,AANA,AA3CA,AAJF,uGAAmB,uEAIQ,4FA2CO,sEAMzB;IAgMX,iBAAM;IAKiB,AAAnB,AADF,AADF,gCAA2B,eACG,gBACP,WAAK;IAAA,uBAAC;IAAA,iBAAM;IAAA,4BAAK;IAAA,uBAAC;IAAA,iBAAM;IAAC,0BAAQ;IAAA,iBAAO;IACxC,AAAnB,iCAAmB,WAAK;IAAA,uBAAC;IAAA,iBAAM;IAAC,wBAAM;IAAA,iBAAO;IAC1B,AAAnB,iCAAmB,WAAK;IAAA,oBAAG;IAAA,iBAAM;IAAC,uBAAK;IAI/C,AADE,AADE,AADE,AADyC,iBAAO,EAC1C,EACF,EACF,EACF;;;IA/WI,eAAyB;IAAzB,kDAAyB;IAI3B,eASC;IATD,6CASC;IAmBC,eAAuC;IAAvC,uDAAuC;IAQvC,eAAiD;IAAjD,iEAAiD;IASjD,eAA4C;IAA5C,4DAA4C;IAS5C,eAA6C;IAA7C,6DAA6C;IAS7C,eAA+C;IAA/C,+DAA+C;IAS/C,eAAyC;IAAzC,yDAAyC;IAWzC,eAA6B;IAA7B,sDAA6B;IAK7B,cAA2B;IAA3B,oDAA2B;IAI7B,cASC;IATD,0EASC;IAMH,eAoPC;IApPD,2GAoPC;;ADxVP;;;;GAIG;AAOH,MAAM,OAAO,oBAAoB;IAgCX;IA/BX,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,MAAM,GAAY,KAAK,CAAC;IAEvB,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IACjC,cAAc,GAAG,IAAI,YAAY,EAAgB,CAAC;IAElC,WAAW,CAAgC;IAE9D,WAAW,GAAW,EAAE,CAAC;IACzB,YAAY,GAAiB,KAAK,CAAC;IACnC,SAAS,GAAc,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAClD,WAAW,GAAY,KAAK,CAAC;IAC7B,OAAO,GAAyB;QACrC,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;KACT,CAAC;IACK,cAAc,GAAa,EAAE,CAAC;IAC9B,aAAa,GAAW,CAAC,CAAC,CAAC;IAElC,yEAAyE;IACzE,IAAW,gBAAgB;QACzB,OAAO,yBAAyB,IAAI,CAAC,WAAW,GAAG,CAAC;IACtD,CAAC;IAEO,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEvC,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,QAAQ;QACN,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC,aAAa,CAAC,YAAY;aAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,WAAW,CAAC,EAAE;YACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACjC,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,aAAa,CAAC,cAAc;aAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,OAAO,CAAC,EAAE;YACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,aAAa,CAAC,aAAa;aAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,MAAM,CAAC,EAAE;YAClB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,aAAa,CAAC,UAAU;aAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;IAC/D,CAAC;IAED;;OAEG;IACI,aAAa;QAClB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAC7B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,WAAW,CACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,MAAoB;QACnC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,WAAW;QAChB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAoB;QACtC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,KAAa;QAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,mBAAmB;QACxB,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;OAEG;IAEI,cAAc,CAAC,KAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE5C,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,MAAM;YAER,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC/E,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM;YAER,KAAK,OAAO;gBACV,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,OAAO;YACL,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;YAC7B,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;YACxB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;YACzB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;YAC3B,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,MAAoB;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QACtF,OAAO,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,IAAY;QAC/B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc;gBACjB,OAAO,aAAa,CAAC;YACvB,KAAK,SAAS;gBACZ,OAAO,YAAY,CAAC;YACtB,KAAK,UAAU;gBACb,OAAO,aAAa,CAAC;YACvB,KAAK,YAAY;gBACf,OAAO,WAAW,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,UAAU,CAAC;YACpB;gBACE,OAAO,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,MAAoB;QACvC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC;YACf,KAAK,eAAe;gBAClB,OAAO,eAAe,CAAC;YACzB,KAAK,UAAU;gBACb,OAAO,UAAU,CAAC;YACpB,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC;YACrB,KAAK,aAAa;gBAChB,OAAO,aAAa,CAAC;YACvB,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC;YACjB;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,IAAU;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAC/B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,WAAW,CAAC;QACxC,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC;QAC1D,IAAI,IAAI,GAAG,GAAG;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC;QAC7D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC;IAC/C,CAAC;IAED,0FAA0F;IACnF,cAAc,CAAC,IAAY,EAAE,KAAa;QAC/C,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,cAAc;QACnB,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;8GA3TU,oBAAoB;6DAApB,oBAAoB;;;;;;YAApB,mGAAA,0BAAsB,IAAF;;YClCjC,wFAAc;;YAAd,qCA4XC;;;iFD1VY,oBAAoB;cANhC,SAAS;6BACI,KAAK,YACP,iBAAiB;;kBAK1B,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kBAEN,SAAS;mBAAC,aAAa;;kBA6JvB,YAAY;mBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;kFArKxB,oBAAoB","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n /** Message for the \"no results\" empty state, echoing the search term. */\n public get NoResultsMessage(): string {\n return `No results found for \"${this.searchQuery}\"`;\n }\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public highlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAA4C,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;;AAE5D,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,
|
|
1
|
+
{"version":3,"file":"share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAA4C,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;;AAE5D,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,qBA2Ha,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM;IAqB3E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAtBJ,YAAY,EAAG,oBAAoB,CAAC;IACpC,WAAW,EAAG,QAAQ,CAAC;IACvB,MAAM,EAAE,OAAO,CAAS;IAEvB,MAAM,qBAA4B;IAErC,WAAW,EAAE,eAAe,EAAE,CAAM;IACpC,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,OAAO,CAAS;IAC9B,SAAS,EAAE,MAAM,CAAM;IAEvB,YAAY;;;QAIjB;IAEF,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAA0C;gBAG/E,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;YAOM,eAAe;IA2C7B,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM;IAI7C,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD1B,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YA8BhD,cAAc;IAkCtB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzC,OAAO,CAAC,eAAe;IAUjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,OAAO,IAAI,IAAI;yCAxOJ,mBAAmB;2CAAnB,mBAAmB;CA2O/B"}
|
|
@@ -8,9 +8,7 @@ import * as i3 from "@angular/forms";
|
|
|
8
8
|
import * as i4 from "@memberjunction/ng-ui-components";
|
|
9
9
|
const _forTrack0 = ($index, $item) => $item.value;
|
|
10
10
|
function ShareModalComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
11
|
-
i0.ɵɵ
|
|
12
|
-
i0.ɵɵtext(2, "No one has been given access yet");
|
|
13
|
-
i0.ɵɵelementEnd()();
|
|
11
|
+
i0.ɵɵelement(0, "mj-empty-state", 9);
|
|
14
12
|
} }
|
|
15
13
|
function ShareModalComponent_Conditional_0_For_15_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
16
14
|
i0.ɵɵelementStart(0, "option", 23);
|
|
@@ -84,7 +82,7 @@ function ShareModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
84
82
|
i0.ɵɵtext(11, "People with Access");
|
|
85
83
|
i0.ɵɵelementEnd();
|
|
86
84
|
i0.ɵɵelementStart(12, "div", 8);
|
|
87
|
-
i0.ɵɵconditionalCreate(13, ShareModalComponent_Conditional_0_Conditional_13_Template,
|
|
85
|
+
i0.ɵɵconditionalCreate(13, ShareModalComponent_Conditional_0_Conditional_13_Template, 1, 0, "mj-empty-state", 9);
|
|
88
86
|
i0.ɵɵrepeaterCreate(14, ShareModalComponent_Conditional_0_For_15_Template, 14, 3, "div", 10, i0.ɵɵrepeaterTrackByIdentity);
|
|
89
87
|
i0.ɵɵelementEnd()();
|
|
90
88
|
i0.ɵɵelementStart(16, "div", 11)(17, "h4");
|
|
@@ -335,11 +333,11 @@ export class ShareModalComponent extends BaseAngularComponent {
|
|
|
335
333
|
this.closed.emit();
|
|
336
334
|
}
|
|
337
335
|
static ɵfac = function ShareModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ShareModalComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.ToastService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
338
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ShareModalComponent, selectors: [["mj-share-modal"]], inputs: { conversation: "conversation", currentUser: "currentUser", isOpen: "isOpen" }, outputs: { closed: "closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "share-content"], [1, "add-user-section"], [1, "add-user-form"], ["type", "text", "placeholder", "Enter email address", 1, "mj-textbox", 2, "flex", "1", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "permissions-section"], [1, "permission-list"], [
|
|
336
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ShareModalComponent, selectors: [["mj-share-modal"]], inputs: { conversation: "conversation", currentUser: "currentUser", isOpen: "isOpen" }, outputs: { closed: "closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "share-content"], [1, "add-user-section"], [1, "add-user-form"], ["type", "text", "placeholder", "Enter email address", 1, "mj-textbox", 2, "flex", "1", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "permissions-section"], [1, "permission-list"], ["Icon", "fa-solid fa-user-group", "Title", "No one has been given access yet", "Size", "compact"], [1, "permission-item"], [1, "link-section"], [1, "link-controls"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "link-display"], ["mjButton", "", 3, "click"], [1, "user-info"], [1, "fas", "fa-user-circle"], [1, "user-details"], [1, "user-name"], [1, "user-email"], [1, "permission-controls"], [1, "mj-select", 2, "width", "120px", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Remove access", 1, "btn-remove", 3, "click"], [1, "fas", "fa-times"], ["type", "text", "readonly", "", 1, "mj-textbox", 2, "flex", "1", 3, "value"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", "fa-copy"]], template: function ShareModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
339
337
|
i0.ɵɵconditionalCreate(0, ShareModalComponent_Conditional_0_Template, 27, 8, "mj-dialog", 0);
|
|
340
338
|
} if (rf & 2) {
|
|
341
339
|
i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
|
|
342
|
-
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent], styles: [".share-content[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .permissions-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .link-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form[_ngcontent-%COMP%] { display: flex; gap: 8px; }\n\n .permission-list[_ngcontent-%COMP%] { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item[_ngcontent-%COMP%] { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n .user-info[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 32px; color: #999; }\n .user-details[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .user-name[_ngcontent-%COMP%] { font-size: 14px; font-weight: 500; }\n .user-email[_ngcontent-%COMP%] { font-size: 12px; color: #666; }\n\n .permission-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; }\n .btn-remove[_ngcontent-%COMP%] { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove[_ngcontent-%COMP%]:hover { background: #FFEBEE; color: #D32F2F; }\n\n .
|
|
340
|
+
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent, i4.MJEmptyStateComponent], styles: [".share-content[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .permissions-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .link-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form[_ngcontent-%COMP%] { display: flex; gap: 8px; }\n\n .permission-list[_ngcontent-%COMP%] { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item[_ngcontent-%COMP%] { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n .user-info[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 32px; color: #999; }\n .user-details[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .user-name[_ngcontent-%COMP%] { font-size: 14px; font-weight: 500; }\n .user-email[_ngcontent-%COMP%] { font-size: 12px; color: #666; }\n\n .permission-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; }\n .btn-remove[_ngcontent-%COMP%] { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove[_ngcontent-%COMP%]:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%] { font-size: 13px; }\n\n .link-display[_ngcontent-%COMP%] { display: flex; gap: 8px; }"] });
|
|
343
341
|
}
|
|
344
342
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ShareModalComponent, [{
|
|
345
343
|
type: Component,
|
|
@@ -370,9 +368,10 @@ export class ShareModalComponent extends BaseAngularComponent {
|
|
|
370
368
|
<h4>People with Access</h4>
|
|
371
369
|
<div class="permission-list">
|
|
372
370
|
@if (permissions.length === 0) {
|
|
373
|
-
<
|
|
374
|
-
|
|
375
|
-
|
|
371
|
+
<mj-empty-state
|
|
372
|
+
Icon="fa-solid fa-user-group"
|
|
373
|
+
Title="No one has been given access yet"
|
|
374
|
+
Size="compact" />
|
|
376
375
|
}
|
|
377
376
|
@for (permission of permissions; track permission) {
|
|
378
377
|
<div class="permission-item">
|
|
@@ -432,7 +431,7 @@ export class ShareModalComponent extends BaseAngularComponent {
|
|
|
432
431
|
</mj-dialog-actions>
|
|
433
432
|
</mj-dialog>
|
|
434
433
|
}
|
|
435
|
-
`, styles: ["\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .
|
|
434
|
+
`, styles: ["\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n "] }]
|
|
436
435
|
}], () => [{ type: i1.DialogService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }], { conversation: [{
|
|
437
436
|
type: Input
|
|
438
437
|
}], currentUser: [{
|
|
@@ -442,5 +441,5 @@ export class ShareModalComponent extends BaseAngularComponent {
|
|
|
442
441
|
}], closed: [{
|
|
443
442
|
type: Output
|
|
444
443
|
}] }); })();
|
|
445
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ShareModalComponent, { className: "ShareModalComponent", filePath: "src/lib/components/share/share-modal.component.ts", lineNumber:
|
|
444
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ShareModalComponent, { className: "ShareModalComponent", filePath: "src/lib/components/share/share-modal.component.ts", lineNumber: 139 }); })();
|
|
446
445
|
//# sourceMappingURL=share-modal.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAA6B,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAY,OAAO,EAAY,MAAM,sBAAsB,CAAC;;;;;;;;IA2CjD,AADF,8BAAyB,QACpB;IAAA,gDAAgC;IACrC,AADqC,iBAAI,EACnC;;;IAiBE,kCAA8B;IAAA,YAAiB;IAAA,iBAAS;;;IAAhD,sCAAqB;IAAC,cAAiB;IAAjB,oCAAiB;;;;IAbrD,AADF,+BAA6B,cACJ;IACrB,wBAAkC;IAEhC,AADF,+BAA0B,cACD;IAAA,YAAyB;IAAA,iBAAM;IACtD,+BAAwB;IAAA,YAA0B;IAEtD,AADE,AADoD,iBAAM,EACpD,EACF;IAEJ,AADF,+BAAiC,iBAIW;IADxC,qPAAiB,iDAAuC,KAAC;IAEzD,iHAEC;IACH,iBAAS;IACT,mCAGwB;IADtB,gOAAS,kCAAwB,KAAC;IAElC,yBAA4B;IAGlC,AADE,AADE,iBAAS,EACL,EACF;;;;IApBuB,eAAyB;IAAzB,4CAAyB;IACxB,eAA0B;IAA1B,6CAA0B;IAKlD,eAAsC;IAAtC,uDAAsC;IAGtC,cAEC;IAFD,kCAEC;;;;IAuBT,+BAA0B;IACxB,4BAKmB;IACnB,kCAAuD;IAAvB,uMAAS,mBAAY,KAAC;IACpD,wBAA2B;IAAC,sBAC9B;IACF,AADE,iBAAS,EACL;;;IAPF,cAAmB;IAAnB,wCAAmB;;;;IAvE/B,oCAKsB;IAApB,0LAAS,gBAAS,KAAC;IAGf,AADF,AADF,8BAA2B,aACK,SACxB;IAAA,0BAAU;IAAA,iBAAK;IAEjB,AADF,8BAA2B,eAMN;IAHjB,mTAA0B;IAF5B,iBAKmB;IACnB,iCAAyD;IAAtB,uLAAS,kBAAW,KAAC;IACtD,qBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAEJ,AADF,8BAAiC,UAC3B;IAAA,mCAAkB;IAAA,iBAAK;IAC3B,+BAA6B;IAC3B,qGAAgC;IAKhC,0HA0BC;IAEL,AADE,iBAAM,EACF;IAEJ,AADF,gCAA0B,UACpB;IAAA,2BAAU;IAAA,iBAAK;IAEjB,AADF,gCAA2B,iBAIgB;IADvC,oTAA0B;IAC1B,uMAAiB,2BAAoB,KAAC;IAHxC,iBAGyC;IACzC,8BAAO;IAAA,8CAA6B;IACtC,AADsC,iBAAQ,EACxC;IACN,sGAAoB;IAcxB,AADE,iBAAM,EACF;IAEJ,AADF,0CAAmB,kBACoB;IAApB,wLAAS,gBAAS,KAAC;IAAC,sBAAK;IAE9C,AADE,AAD4C,iBAAS,EACjC,EACV;;;IAjFV,AADA,AADA,AADA,oEAA+C,cAClC,eACC,iBACE;IAQR,eAA0B;IAA1B,mDAA0B;IAY5B,eAIC;IAJD,2DAIC;IACD,cA0BC;IA1BD,iCA0BC;IAQC,eAA0B;IAA1B,mDAA0B;IAI9B,eAYC;IAZD,+CAYC;;AAyCb,MAAM,OAAO,mBAAoB,SAAQ,oBAAoB;IAqBjD;IACA;IACA;IAtBD,YAAY,CAAwB;IACpC,WAAW,CAAY;IACvB,MAAM,GAAY,KAAK,CAAC;IAEvB,MAAM,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErC,WAAW,GAAsB,EAAE,CAAC;IACpC,YAAY,GAAW,EAAE,CAAC;IAC1B,YAAY,GAAY,KAAK,CAAC;IAC9B,SAAS,GAAW,EAAE,CAAC;IAEvB,YAAY,GAAG;QACpB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;QACpC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;QACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;KACnC,CAAC;IAEe,8BAA8B,GAAG,sCAAsC,CAAC;IAEzF,YACU,aAA4B,EAC5B,YAA0B,EAC1B,GAAsB;QAEhC,KAAK,EAAE,CAAC;QAJE,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,QAAG,GAAH,GAAG,CAAmB;IAExB,CAAC;IAET,QAAQ;QACN,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA6B;gBAC1D,UAAU,EAAE,0BAA0B;gBACtC,WAAW,EAAE,mBAAmB,IAAI,CAAC,8BAA8B,2BAA2B,IAAI,CAAC,YAAY,CAAC,EAAE,yBAAyB;gBAC3I,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAChE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAe;4BACpD,UAAU,EAAE,WAAW;4BACvB,WAAW,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG;4BAClC,UAAU,EAAE,eAAe;yBAC5B,CAAC,CAAC;wBAEH,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9E,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BACnC,OAAO;gCACL,YAAY,EAAE,IAAI,CAAC,EAAE;gCACrB,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,SAAS,EAAE,IAAI,CAAC,KAAK;gCACrB,QAAQ,EAAE,IAAI,CAAC,IAAI;gCACnB,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,MAAM;6BAC7B,CAAC;wBACvB,CAAC;oBACH,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAClE,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAsB,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,cAAc,CAAC,UAA2B;QACxC,OAAO,UAAU,CAAC,eAAe,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,UAA2B,EAAE,KAAgC;QACrF,UAAU,CAAC,eAAe,GAAG,KAAK,CAAC;QACnC,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,0BAA0B;QAC1B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,yBAAyB,EAAE,8BAA8B,CAAC,CAAC;YAC1F,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBAChD,UAAU,EAAE,WAAW;gBACvB,WAAW,EAAE,UAAU,KAAK,GAAG;gBAC/B,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClF,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,EAAE,uCAAuC,CAAC,CAAC;gBAC1F,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,aAAa,GAAoB;gBACrC,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,SAAS,EAAE,IAAI,CAAC,KAAK;gBACrB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,eAAe,EAAE,MAAM;aACxB,CAAC;YAEF,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,qBAAqB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAA2B;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,qBAAqB,UAAU,CAAC,SAAS,GAAG;YACrD,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC9B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAA6B,0BAA0B,CAAC,CAAC;gBACpG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBAE/C,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,sBAAsB,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,UAA2B;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAA6B,0BAA0B,CAAC,CAAC;YAEpG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,6BAA6B;gBAC7B,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC/C,UAAU,CAAC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,wBAAwB;gBACxB,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,8BAA8B,CAAC;gBAChE,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnD,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;gBACzB,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;gBACtC,UAAU,CAAC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;gBACxD,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC;YACjC,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,sDAAsD;YACtD,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC7B,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,qEAAqE;YACrE,iFAAiF;YACjF,qGAAqG;YACrG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,mCAAmC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,0BAA0B;YAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,SAAS,GAAG,GAAG,OAAO,SAAS,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;6GA1OU,mBAAmB;6DAAnB,mBAAmB;YAzH5B,4FAAc;;YAAd,qCAuFC;;;iFAkCQ,mBAAmB;cA7H/B,SAAS;6BACI,KAAK,YACP,gBAAgB,YAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyFP;;kBAkCF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kFALI,mBAAmB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJConversationEntity, MJResourcePermissionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\ninterface SharePermission {\n permissionId: string | null;\n userId: string;\n userEmail: string;\n userName: string;\n permissionLevel: 'View' | 'Edit' | 'Owner';\n}\n\n@Component({\n standalone: false,\n selector: 'mj-share-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"'Share: ' + (conversation.Name || '')\"\n [Width]=\"500\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onClose()\">\n <div class=\"share-content\">\n <div class=\"add-user-section\">\n <h4>Add People</h4>\n <div class=\"add-user-form\">\n <input\n type=\"text\"\n [(ngModel)]=\"newUserEmail\"\n placeholder=\"Enter email address\"\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"primary\" (click)=\"onAddUser()\">\n Add\n </button>\n </div>\n </div>\n <div class=\"permissions-section\">\n <h4>People with Access</h4>\n <div class=\"permission-list\">\n @if (permissions.length === 0) {\n <div class=\"empty-state\">\n <p>No one has been given access yet</p>\n </div>\n }\n @for (permission of permissions; track permission) {\n <div class=\"permission-item\">\n <div class=\"user-info\">\n <i class=\"fas fa-user-circle\"></i>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ permission.userName }}</div>\n <div class=\"user-email\">{{ permission.userEmail }}</div>\n </div>\n </div>\n <div class=\"permission-controls\">\n <select\n [ngModel]=\"permission.permissionLevel\"\n (ngModelChange)=\"onAccessLevelChange(permission, $event)\"\n style=\"width: 120px;\" class=\"mj-select\">\n @for (level of accessLevels; track level.value) {\n <option [value]=\"level.value\">{{ level.label }}</option>\n }\n </select>\n <button\n class=\"btn-remove\"\n (click)=\"onRemoveUser(permission)\"\n title=\"Remove access\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"link-section\">\n <h4>Share Link</h4>\n <div class=\"link-controls\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isPublicLink\"\n (ngModelChange)=\"onTogglePublicLink()\">\n <label>Anyone with the link can view</label>\n </div>\n @if (isPublicLink) {\n <div class=\"link-display\">\n <input\n type=\"text\"\n [value]=\"shareLink\"\n readonly\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"flat\" (click)=\"onCopyLink()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onClose()\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .empty-state { padding: 24px; text-align: center; color: #999; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n `]\n})\nexport class ShareModalComponent extends BaseAngularComponent implements OnInit {\n @Input() conversation!: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public permissions: SharePermission[] = [];\n public newUserEmail: string = '';\n public isPublicLink: boolean = false;\n public shareLink: string = '';\n\n public accessLevels = [\n { label: 'Can View', value: 'View' },\n { label: 'Can Edit', value: 'Edit' },\n { label: 'Owner', value: 'Owner' }\n ];\n\n private readonly CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n if (this.conversation) {\n this.loadPermissions();\n this.updateShareLink();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJResourcePermissionEntity>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter: `ResourceTypeID='${this.CONVERSATIONS_RESOURCE_TYPE_ID}' AND ResourceRecordID='${this.conversation.ID}' AND Status='Approved'`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n const permissionPromises = result.Results.map(async (perm) => {\n if (perm.UserID) {\n const userRv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await userRv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID='${perm.UserID}'`,\n ResultType: 'entity_object'\n });\n\n if (userResult.Success && userResult.Results && userResult.Results.length > 0) {\n const user = userResult.Results[0];\n return {\n permissionId: perm.ID,\n userId: perm.UserID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: perm.PermissionLevel || 'View'\n } as SharePermission;\n }\n }\n return null;\n });\n\n const resolvedPermissions = await Promise.all(permissionPromises);\n this.permissions = resolvedPermissions.filter(p => p !== null) as SharePermission[];\n }\n } catch (error) {\n console.error('Failed to load permissions:', error);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getAccessLevel(permission: SharePermission): string {\n return permission.permissionLevel;\n }\n\n async onAccessLevelChange(permission: SharePermission, level: 'View' | 'Edit' | 'Owner'): Promise<void> {\n permission.permissionLevel = level;\n await this.savePermission(permission);\n }\n\n async onAddUser(): Promise<void> {\n const email = this.newUserEmail.trim();\n if (!email) return;\n\n // Simple email validation\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n await this.dialogService.alert('Invalid Email', 'Please enter a valid email address');\n return;\n }\n\n // Check if user already has access\n if (this.permissions.some(p => p.userEmail === email)) {\n await this.dialogService.alert('User Already Has Access', 'This user already has access');\n return;\n }\n\n try {\n // Look up user by email\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `Email='${email}'`,\n ResultType: 'entity_object'\n });\n\n if (!userResult.Success || !userResult.Results || userResult.Results.length === 0) {\n await this.dialogService.alert('User Not Found', 'No user found with that email address');\n return;\n }\n\n const user = userResult.Results[0];\n const newPermission: SharePermission = {\n permissionId: null,\n userId: user.ID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: 'View'\n };\n\n await this.savePermission(newPermission);\n this.permissions.push(newPermission);\n this.newUserEmail = '';\n this.toastService.success(`Access granted to ${user.Email}`);\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to add user:', error);\n this.toastService.error('Failed to add user');\n }\n }\n\n async onRemoveUser(permission: SharePermission): Promise<void> {\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Access',\n message: `Remove access for ${permission.userEmail}?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (!confirmed) return;\n\n try {\n if (permission.permissionId) {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n await permEntity.Load(permission.permissionId);\n\n const deleteResult = await permEntity.Delete();\n if (!deleteResult) {\n throw new Error('Failed to delete permission');\n }\n }\n\n this.permissions = this.permissions.filter(p => p.userId !== permission.userId);\n this.toastService.success(`Access removed for ${permission.userEmail}`);\n } catch (error) {\n console.error('Failed to remove user:', error);\n this.toastService.error('Failed to remove user');\n }\n }\n\n private async savePermission(permission: SharePermission): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n\n if (permission.permissionId) {\n // Update existing permission\n await permEntity.Load(permission.permissionId);\n permEntity.PermissionLevel = permission.permissionLevel;\n } else {\n // Create new permission\n permEntity.ResourceTypeID = this.CONVERSATIONS_RESOURCE_TYPE_ID;\n permEntity.ResourceRecordID = this.conversation.ID;\n permEntity.Type = 'User';\n permEntity.UserID = permission.userId;\n permEntity.PermissionLevel = permission.permissionLevel;\n permEntity.Status = 'Approved';\n }\n\n const saveResult = await permEntity.Save();\n if (!saveResult) {\n throw new Error('Failed to save permission');\n }\n\n // Update the permission ID if it was a new permission\n if (!permission.permissionId) {\n permission.permissionId = permEntity.ID;\n }\n } catch (error) {\n console.error('Failed to save permission:', error);\n throw error;\n }\n }\n\n async onTogglePublicLink(): Promise<void> {\n try {\n // Note: Public link functionality uses the conversation ID directly.\n // For enhanced security with unique tokens, password protection, and expiration,\n // future migration should add: PublicAccessToken, PublicAccessPassword, PublicAccessExpiresAt fields\n this.updateShareLink();\n } catch (error) {\n console.error('Failed to toggle public link:', error);\n await this.dialogService.alert('Error', 'Failed to update sharing settings');\n }\n }\n\n private updateShareLink(): void {\n if (this.isPublicLink && this.conversation) {\n // Generate shareable link\n const baseUrl = window.location.origin;\n this.shareLink = `${baseUrl}/chat/${this.conversation.ID}`;\n } else {\n this.shareLink = '';\n }\n }\n\n async onCopyLink(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.shareLink);\n this.toastService.success('Link copied to clipboard');\n } catch (err) {\n console.error('Failed to copy link:', err);\n this.toastService.error('Failed to copy link');\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJConversationEntity, MJResourcePermissionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\ninterface SharePermission {\n permissionId: string | null;\n userId: string;\n userEmail: string;\n userName: string;\n permissionLevel: 'View' | 'Edit' | 'Owner';\n}\n\n@Component({\n standalone: false,\n selector: 'mj-share-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"'Share: ' + (conversation.Name || '')\"\n [Width]=\"500\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onClose()\">\n <div class=\"share-content\">\n <div class=\"add-user-section\">\n <h4>Add People</h4>\n <div class=\"add-user-form\">\n <input\n type=\"text\"\n [(ngModel)]=\"newUserEmail\"\n placeholder=\"Enter email address\"\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"primary\" (click)=\"onAddUser()\">\n Add\n </button>\n </div>\n </div>\n <div class=\"permissions-section\">\n <h4>People with Access</h4>\n <div class=\"permission-list\">\n @if (permissions.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-user-group\"\n Title=\"No one has been given access yet\"\n Size=\"compact\" />\n }\n @for (permission of permissions; track permission) {\n <div class=\"permission-item\">\n <div class=\"user-info\">\n <i class=\"fas fa-user-circle\"></i>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ permission.userName }}</div>\n <div class=\"user-email\">{{ permission.userEmail }}</div>\n </div>\n </div>\n <div class=\"permission-controls\">\n <select\n [ngModel]=\"permission.permissionLevel\"\n (ngModelChange)=\"onAccessLevelChange(permission, $event)\"\n style=\"width: 120px;\" class=\"mj-select\">\n @for (level of accessLevels; track level.value) {\n <option [value]=\"level.value\">{{ level.label }}</option>\n }\n </select>\n <button\n class=\"btn-remove\"\n (click)=\"onRemoveUser(permission)\"\n title=\"Remove access\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"link-section\">\n <h4>Share Link</h4>\n <div class=\"link-controls\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isPublicLink\"\n (ngModelChange)=\"onTogglePublicLink()\">\n <label>Anyone with the link can view</label>\n </div>\n @if (isPublicLink) {\n <div class=\"link-display\">\n <input\n type=\"text\"\n [value]=\"shareLink\"\n readonly\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"flat\" (click)=\"onCopyLink()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onClose()\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n `]\n})\nexport class ShareModalComponent extends BaseAngularComponent implements OnInit {\n @Input() conversation!: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public permissions: SharePermission[] = [];\n public newUserEmail: string = '';\n public isPublicLink: boolean = false;\n public shareLink: string = '';\n\n public accessLevels = [\n { label: 'Can View', value: 'View' },\n { label: 'Can Edit', value: 'Edit' },\n { label: 'Owner', value: 'Owner' }\n ];\n\n private readonly CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n if (this.conversation) {\n this.loadPermissions();\n this.updateShareLink();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJResourcePermissionEntity>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter: `ResourceTypeID='${this.CONVERSATIONS_RESOURCE_TYPE_ID}' AND ResourceRecordID='${this.conversation.ID}' AND Status='Approved'`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n const permissionPromises = result.Results.map(async (perm) => {\n if (perm.UserID) {\n const userRv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await userRv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID='${perm.UserID}'`,\n ResultType: 'entity_object'\n });\n\n if (userResult.Success && userResult.Results && userResult.Results.length > 0) {\n const user = userResult.Results[0];\n return {\n permissionId: perm.ID,\n userId: perm.UserID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: perm.PermissionLevel || 'View'\n } as SharePermission;\n }\n }\n return null;\n });\n\n const resolvedPermissions = await Promise.all(permissionPromises);\n this.permissions = resolvedPermissions.filter(p => p !== null) as SharePermission[];\n }\n } catch (error) {\n console.error('Failed to load permissions:', error);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getAccessLevel(permission: SharePermission): string {\n return permission.permissionLevel;\n }\n\n async onAccessLevelChange(permission: SharePermission, level: 'View' | 'Edit' | 'Owner'): Promise<void> {\n permission.permissionLevel = level;\n await this.savePermission(permission);\n }\n\n async onAddUser(): Promise<void> {\n const email = this.newUserEmail.trim();\n if (!email) return;\n\n // Simple email validation\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n await this.dialogService.alert('Invalid Email', 'Please enter a valid email address');\n return;\n }\n\n // Check if user already has access\n if (this.permissions.some(p => p.userEmail === email)) {\n await this.dialogService.alert('User Already Has Access', 'This user already has access');\n return;\n }\n\n try {\n // Look up user by email\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `Email='${email}'`,\n ResultType: 'entity_object'\n });\n\n if (!userResult.Success || !userResult.Results || userResult.Results.length === 0) {\n await this.dialogService.alert('User Not Found', 'No user found with that email address');\n return;\n }\n\n const user = userResult.Results[0];\n const newPermission: SharePermission = {\n permissionId: null,\n userId: user.ID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: 'View'\n };\n\n await this.savePermission(newPermission);\n this.permissions.push(newPermission);\n this.newUserEmail = '';\n this.toastService.success(`Access granted to ${user.Email}`);\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to add user:', error);\n this.toastService.error('Failed to add user');\n }\n }\n\n async onRemoveUser(permission: SharePermission): Promise<void> {\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Access',\n message: `Remove access for ${permission.userEmail}?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (!confirmed) return;\n\n try {\n if (permission.permissionId) {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n await permEntity.Load(permission.permissionId);\n\n const deleteResult = await permEntity.Delete();\n if (!deleteResult) {\n throw new Error('Failed to delete permission');\n }\n }\n\n this.permissions = this.permissions.filter(p => p.userId !== permission.userId);\n this.toastService.success(`Access removed for ${permission.userEmail}`);\n } catch (error) {\n console.error('Failed to remove user:', error);\n this.toastService.error('Failed to remove user');\n }\n }\n\n private async savePermission(permission: SharePermission): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n\n if (permission.permissionId) {\n // Update existing permission\n await permEntity.Load(permission.permissionId);\n permEntity.PermissionLevel = permission.permissionLevel;\n } else {\n // Create new permission\n permEntity.ResourceTypeID = this.CONVERSATIONS_RESOURCE_TYPE_ID;\n permEntity.ResourceRecordID = this.conversation.ID;\n permEntity.Type = 'User';\n permEntity.UserID = permission.userId;\n permEntity.PermissionLevel = permission.permissionLevel;\n permEntity.Status = 'Approved';\n }\n\n const saveResult = await permEntity.Save();\n if (!saveResult) {\n throw new Error('Failed to save permission');\n }\n\n // Update the permission ID if it was a new permission\n if (!permission.permissionId) {\n permission.permissionId = permEntity.ID;\n }\n } catch (error) {\n console.error('Failed to save permission:', error);\n throw error;\n }\n }\n\n async onTogglePublicLink(): Promise<void> {\n try {\n // Note: Public link functionality uses the conversation ID directly.\n // For enhanced security with unique tokens, password protection, and expiration,\n // future migration should add: PublicAccessToken, PublicAccessPassword, PublicAccessExpiresAt fields\n this.updateShareLink();\n } catch (error) {\n console.error('Failed to toggle public link:', error);\n await this.dialogService.alert('Error', 'Failed to update sharing settings');\n }\n }\n\n private updateShareLink(): void {\n if (this.isPublicLink && this.conversation) {\n // Generate shareable link\n const baseUrl = window.location.origin;\n this.shareLink = `${baseUrl}/chat/${this.conversation.ID}`;\n } else {\n this.shareLink = '';\n }\n }\n\n async onCopyLink(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.shareLink);\n this.toastService.success('Link copied to clipboard');\n } catch (err) {\n console.error('Failed to copy link:', err);\n this.toastService.error('Failed to copy link');\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared/user-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"user-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared/user-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;;AAGzD,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAyKa,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAK1E,OAAO,CAAC,GAAG;IAJd,WAAW,EAAG,QAAQ,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9B,WAAW,EAAE,MAAM,CAAwC;gBAEhD,GAAG,EAAE,iBAAiB;IAGhC,YAAY,iCAAwC;IAE9D,WAAW,EAAE,MAAM,CAAM;IACzB,aAAa,EAAE,gBAAgB,EAAE,CAAM;IACvC,WAAW,EAAE,OAAO,CAAS;IAC7B,WAAW,EAAE,OAAO,CAAS;IAE7B,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,kBAAkB;IAO1B,QAAQ,IAAI,IAAI;IAShB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;YAO5B,aAAa;yCA/ClB,mBAAmB;2CAAnB,mBAAmB;CAiH/B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
|
|
4
5
|
import { RunView } from '@memberjunction/core';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/forms";
|
|
@@ -41,11 +42,9 @@ function UserPickerComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
|
41
42
|
i0.ɵɵrepeater(ctx_r2.searchResults);
|
|
42
43
|
} }
|
|
43
44
|
function UserPickerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
-
i0.ɵɵelementStart(0, "div", 6)
|
|
45
|
-
i0.ɵɵelement(
|
|
46
|
-
i0.ɵɵ
|
|
47
|
-
i0.ɵɵtext(4, "No users found");
|
|
48
|
-
i0.ɵɵelementEnd()()();
|
|
45
|
+
i0.ɵɵelementStart(0, "div", 6);
|
|
46
|
+
i0.ɵɵelement(1, "mj-empty-state", 14);
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
49
48
|
} }
|
|
50
49
|
export class UserPickerComponent extends BaseAngularComponent {
|
|
51
50
|
cdr;
|
|
@@ -149,7 +148,7 @@ export class UserPickerComponent extends BaseAngularComponent {
|
|
|
149
148
|
}
|
|
150
149
|
}
|
|
151
150
|
static ɵfac = function UserPickerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || UserPickerComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
152
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserPickerComponent, selectors: [["mj-user-picker"]], inputs: { currentUser: "currentUser", excludeUserIds: "excludeUserIds", placeholder: "placeholder" }, outputs: { userSelected: "userSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 7, consts: [[1, "user-picker"], [1, "search-input-wrapper"], ["type", "text", 1, "user-search-input", 3, "ngModelChange", "keydown.enter", "ngModel", "placeholder", "disabled"], [1, "search-button", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-search"], [1, "search-results-dropdown"], [1, "user-search-item"], [1, "user-search-item", 3, "click"], [1, "user-avatar"], [1, "fa-solid", "fa-user"], [1, "user-info"], [1, "user-name"], [1, "user-email"], [
|
|
151
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserPickerComponent, selectors: [["mj-user-picker"]], inputs: { currentUser: "currentUser", excludeUserIds: "excludeUserIds", placeholder: "placeholder" }, outputs: { userSelected: "userSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 7, consts: [[1, "user-picker"], [1, "search-input-wrapper"], ["type", "text", 1, "user-search-input", 3, "ngModelChange", "keydown.enter", "ngModel", "placeholder", "disabled"], [1, "search-button", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-search"], [1, "search-results-dropdown"], [1, "user-search-item"], [1, "user-search-item", 3, "click"], [1, "user-avatar"], [1, "fa-solid", "fa-user"], [1, "user-info"], [1, "user-name"], [1, "user-email"], ["Variant", "no-results", "Size", "compact", "Icon", "fa-solid fa-user-slash", "Title", "No users found"]], template: function UserPickerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
153
152
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "input", 2);
|
|
154
153
|
i0.ɵɵtwoWayListener("ngModelChange", function UserPickerComponent_Template_input_ngModelChange_2_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchQuery, $event) || (ctx.searchQuery = $event); return $event; });
|
|
155
154
|
i0.ɵɵlistener("keydown.enter", function UserPickerComponent_Template_input_keydown_enter_2_listener() { return ctx.onSearch(); });
|
|
@@ -159,7 +158,7 @@ export class UserPickerComponent extends BaseAngularComponent {
|
|
|
159
158
|
i0.ɵɵconditionalCreate(4, UserPickerComponent_Conditional_4_Template, 1, 0, "i", 4)(5, UserPickerComponent_Conditional_5_Template, 1, 0, "i", 5);
|
|
160
159
|
i0.ɵɵelementEnd()();
|
|
161
160
|
i0.ɵɵconditionalCreate(6, UserPickerComponent_Conditional_6_Template, 3, 0, "div", 6);
|
|
162
|
-
i0.ɵɵconditionalCreate(7, UserPickerComponent_Conditional_7_Template,
|
|
161
|
+
i0.ɵɵconditionalCreate(7, UserPickerComponent_Conditional_7_Template, 2, 0, "div", 6);
|
|
163
162
|
i0.ɵɵelementEnd();
|
|
164
163
|
} if (rf & 2) {
|
|
165
164
|
i0.ɵɵadvance(2);
|
|
@@ -173,11 +172,11 @@ export class UserPickerComponent extends BaseAngularComponent {
|
|
|
173
172
|
i0.ɵɵconditional(ctx.showResults && ctx.searchResults.length > 0 ? 6 : -1);
|
|
174
173
|
i0.ɵɵadvance();
|
|
175
174
|
i0.ɵɵconditional(ctx.showResults && ctx.searchResults.length === 0 && ctx.searchQuery.length >= 2 && !ctx.isSearching ? 7 : -1);
|
|
176
|
-
} }, dependencies: [FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".user-picker[_ngcontent-%COMP%] {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input[_ngcontent-%COMP%]:focus {\n border-color: #6366F1;\n }\n\n .user-search-input[_ngcontent-%COMP%]:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .search-results-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .user-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }
|
|
175
|
+
} }, dependencies: [FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, MJEmptyStateComponent], styles: [".user-picker[_ngcontent-%COMP%] {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input[_ngcontent-%COMP%]:focus {\n border-color: #6366F1;\n }\n\n .user-search-input[_ngcontent-%COMP%]:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .search-results-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .user-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }"] });
|
|
177
176
|
}
|
|
178
177
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserPickerComponent, [{
|
|
179
178
|
type: Component,
|
|
180
|
-
args: [{ selector: 'mj-user-picker', standalone: true, imports: [FormsModule], template: `
|
|
179
|
+
args: [{ selector: 'mj-user-picker', standalone: true, imports: [FormsModule, MJEmptyStateComponent], template: `
|
|
181
180
|
<div class="user-picker">
|
|
182
181
|
<div class="search-input-wrapper">
|
|
183
182
|
<input
|
|
@@ -215,14 +214,12 @@ export class UserPickerComponent extends BaseAngularComponent {
|
|
|
215
214
|
|
|
216
215
|
@if (showResults && searchResults.length === 0 && searchQuery.length >= 2 && !isSearching) {
|
|
217
216
|
<div class="search-results-dropdown">
|
|
218
|
-
<
|
|
219
|
-
|
|
220
|
-
<span>No users found</span>
|
|
221
|
-
</div>
|
|
217
|
+
<mj-empty-state Variant="no-results" Size="compact"
|
|
218
|
+
Icon="fa-solid fa-user-slash" Title="No users found" />
|
|
222
219
|
</div>
|
|
223
220
|
}
|
|
224
221
|
</div>
|
|
225
|
-
`, styles: ["\n .user-picker {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input:focus {\n border-color: #6366F1;\n }\n\n .user-search-input:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button i {\n font-size: 14px;\n }\n\n .search-results-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info {\n flex: 1;\n min-width: 0;\n }\n\n .user-name {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n
|
|
222
|
+
`, styles: ["\n .user-picker {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input:focus {\n border-color: #6366F1;\n }\n\n .user-search-input:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button i {\n font-size: 14px;\n }\n\n .search-results-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info {\n flex: 1;\n min-width: 0;\n }\n\n .user-name {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n "] }]
|
|
226
223
|
}], () => [{ type: i0.ChangeDetectorRef }], { currentUser: [{
|
|
227
224
|
type: Input
|
|
228
225
|
}], excludeUserIds: [{
|
|
@@ -232,5 +229,5 @@ export class UserPickerComponent extends BaseAngularComponent {
|
|
|
232
229
|
}], userSelected: [{
|
|
233
230
|
type: Output
|
|
234
231
|
}] }); })();
|
|
235
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPickerComponent, { className: "UserPickerComponent", filePath: "src/lib/components/shared/user-picker.component.ts", lineNumber:
|
|
232
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPickerComponent, { className: "UserPickerComponent", filePath: "src/lib/components/shared/user-picker.component.ts", lineNumber: 186 }); })();
|
|
236
233
|
//# sourceMappingURL=user-picker.component.js.map
|