@memberjunction/ng-explorer-core 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/generated/lazy-feature-config.d.ts +1 -1
- package/dist/generated/lazy-feature-config.d.ts.map +1 -1
- package/dist/generated/lazy-feature-config.js +14 -3
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/about/about-dialog.component.d.ts +0 -1
- package/dist/lib/about/about-dialog.component.d.ts.map +1 -1
- package/dist/lib/about/about-dialog.component.js +217 -218
- package/dist/lib/about/about-dialog.component.js.map +1 -1
- package/dist/lib/command-palette/command-palette.component.js +8 -14
- package/dist/lib/command-palette/command-palette.component.js.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.js +66 -73
- package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +35 -45
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +2 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +14 -8
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +9 -8
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +62 -2
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +604 -105
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +35 -43
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +10 -2
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js +19 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts +1 -0
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.js +3 -2
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/shell.module.d.ts +1 -1
- package/dist/lib/shell/shell.module.d.ts.map +1 -1
- package/dist/lib/shell/shell.module.js +4 -1
- package/dist/lib/shell/shell.module.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +5 -7
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +17 -27
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts +6 -2
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.js +48 -57
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +17 -22
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +60 -75
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/module.d.ts +1 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +12 -5
- package/dist/module.js.map +1 -1
- package/package.json +47 -47
- package/dist/lib/__tests__/explorer-core.test.d.ts +0 -2
- package/dist/lib/__tests__/explorer-core.test.d.ts.map +0 -1
- package/dist/lib/__tests__/explorer-core.test.js +0 -229
- package/dist/lib/__tests__/explorer-core.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"livekit-room-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/livekit-room-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { RunView } from '@memberjunction/core';\nimport { GraphQLLiveKitClient, GraphQLDataProvider, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { UserHoldsAuthorization, REALTIME_ADVANCED_SESSION_CONTROLS } from '@memberjunction/ng-conversations';\n\n/** A selectable target agent for the pre-join picker. */\ninterface TargetAgentChoice {\n ID: string;\n Name: string;\n Description: string | null;\n}\n\n/** A user shown in the \"Invite people\" search/selection. */\ninterface InviteeChoice {\n ID: string;\n Name: string;\n Email: string | null;\n}\n\n/**\n * LiveKit Room Resource — hosts the MJ-native LiveKit room (`mj-livekit-agent-room`) as an Explorer tab\n * (the **Meet** app's \"Live Room\").\n *\n * Flow: resolve the Realtime **co-agent** (voice front-end), then show a **pre-join picker** to choose\n * the **target** agent you're \"calling\" (the co-agent voices it via `invoke-target-agent` — without a\n * target it sits idle). \"Start call\" joins the room. An explicit `ResourceRecordID` skips the picker and\n * calls that agent directly.\n *\n * Registered via `@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')`.\n */\n@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')\n@Component({\n standalone: false,\n selector: 'mj-livekit-room-resource',\n template: `\n @switch (phase) {\n @case ('live') {\n <mj-livekit-agent-room\n class=\"mj-livekit-room-resource\"\n [Mode]=\"roomMode\"\n [RoomName]=\"joinRoomName\"\n [AgentID]=\"agentId\"\n [TargetAgentID]=\"targetAgentId\"\n [AgentName]=\"targetAgentName\"\n [AvailableAgents]=\"agents\"\n [RealtimeModelID]=\"selectedModelId\"\n [RealtimeVoice]=\"selectedVoice\"\n [CanPickModelVoice]=\"canPickModelVoice\"\n [AvailableModels]=\"realtimeModels\"\n [Provider]=\"ProviderToUse\"\n [ShowAgentState]=\"true\"\n [ShowWhiteboard]=\"true\"\n [EnableLayoutSwitcher]=\"true\"\n [EnablePinning]=\"true\"\n (Connected)=\"NotifyLoadComplete()\"\n (ErrorOccurred)=\"NotifyLoadComplete()\"\n (InvitePeopleRequested)=\"openInvite($event)\"\n ></mj-livekit-agent-room>\n }\n @case ('picking') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card\">\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Start a call</h2>\n <p class=\"mj-lk-prejoin__subtitle\">\n Choose the agent you want to talk to. You can add more agents (and invite people) once\n you're in the room.\n </p>\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-target\">Agent</label>\n <select id=\"mj-lk-target\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onTargetChange($event)\">\n @for (a of agents; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, selectedTargetId)\">{{ a.Name }}</option>\n }\n </select>\n @if (selectedDescription) {\n <p class=\"mj-lk-prejoin__desc\">{{ selectedDescription }}</p>\n }\n @if (canPickModelVoice && realtimeModels.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-model\">Model <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-model\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onModelChange($event)\">\n <option value=\"\">Default model</option>\n @for (m of realtimeModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, selectedModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (selectedModelVoices.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-voice\">Voice <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-voice\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onVoiceChange($event)\">\n <option value=\"\">Default voice</option>\n @for (v of selectedModelVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === selectedVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n }\n <button type=\"button\" class=\"mj-lk-prejoin__start\" [disabled]=\"!selectedTargetId\" (click)=\"startCall()\">\n <i class=\"fa-solid fa-phone\"></i> Start call\n </button>\n </div>\n </div>\n }\n @case ('error') {\n <div class=\"mj-livekit-room-resource__message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ resolveError }}</span>\n </div>\n }\n @default {\n <div class=\"mj-livekit-room-resource__message\">Preparing room…</div>\n }\n }\n\n @if (showInvite) {\n <mj-dialog [Visible]=\"showInvite\" (Close)=\"showInvite = false\" Title=\"Invite people\" Size=\"auto\" [Width]=\"440\">\n <div class=\"mj-lk-invite\">\n <p class=\"mj-lk-invite__hint\">They'll get an in-app notification (and an email if Comms is set up) to join this room.</p>\n <div class=\"mj-lk-invite__search\">\n <input class=\"mj-input\" type=\"text\" [value]=\"userSearch\" placeholder=\"Search people by name or email…\"\n (input)=\"userSearch = $any($event.target).value\" (keydown.enter)=\"searchUsers()\" />\n <button type=\"button\" class=\"mj-lk-invite__searchbtn\" [disabled]=\"searching\" (click)=\"searchUsers()\">\n <i class=\"fa-solid\" [class.fa-magnifying-glass]=\"!searching\" [class.fa-spinner]=\"searching\" [class.fa-spin]=\"searching\"></i>\n </button>\n </div>\n\n @if (selectedInvitees.length) {\n <div class=\"mj-lk-invite__chips\">\n @for (u of selectedInvitees; track u.ID) {\n <span class=\"mj-lk-invite__chip\">\n {{ u.Name }}\n <button type=\"button\" class=\"mj-lk-invite__chipx\" (click)=\"removeInvitee(u.ID)\"><i class=\"fa-solid fa-xmark\"></i></button>\n </span>\n }\n </div>\n }\n\n @if (userResults.length) {\n <div class=\"mj-lk-invite__results\">\n @for (u of userResults; track u.ID) {\n <button type=\"button\" class=\"mj-lk-invite__result\" (click)=\"addInvitee(u)\">\n <span class=\"mj-lk-invite__rname\">{{ u.Name }}</span>\n @if (u.Email) { <span class=\"mj-lk-invite__remail\">{{ u.Email }}</span> }\n </button>\n }\n </div>\n } @else if (searched && !searching) {\n <div class=\"mj-lk-invite__empty\">No matching people.</div>\n }\n\n @if (inviteMessage) {\n <div class=\"mj-lk-invite__msg\">{{ inviteMessage }}</div>\n }\n\n <div class=\"mj-lk-invite__actions\">\n <button type=\"button\" class=\"mj-lk-invite__send\" [disabled]=\"!selectedInvitees.length || inviting\" (click)=\"sendInvites()\">\n <i class=\"fa-solid\" [class.fa-paper-plane]=\"!inviting\" [class.fa-spinner]=\"inviting\" [class.fa-spin]=\"inviting\"></i>\n Invite {{ selectedInvitees.length || '' }}\n </button>\n <button type=\"button\" class=\"mj-lk-invite__cancel\" (click)=\"showInvite = false\">Cancel</button>\n </div>\n </div>\n </mj-dialog>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message i {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search .mj-input {\n flex: 1;\n }\n .mj-lk-invite__searchbtn,\n .mj-lk-invite__send,\n .mj-lk-invite__cancel {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class LiveKitRoomResource extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n /** Render phase: spinner while resolving → pre-join picker → live room (or an error message). */\n public phase: 'loading' | 'picking' | 'live' | 'error' = 'loading';\n\n /** `'agent'` to start/voice an agent (the default), or `'join'` when opened from an invite link. */\n public roomMode: 'agent' | 'join' = 'agent';\n\n /** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */\n public joinRoomName: string | null = null;\n\n /** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */\n public agentId: string | null = null;\n\n /** The TARGET agent the co-agent voices (the one being \"called\"); the bot is named after it. */\n public targetAgentId: string | null = null;\n\n /** The target agent's display name — used as the bot name + addressing word (\"Sage, …\"). */\n public targetAgentName: string | null = null;\n\n /** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */\n public agents: TargetAgentChoice[] = [];\n\n /** The currently-selected target in the picker (defaults to \"Sage\" when present). */\n public selectedTargetId: string | null = null;\n\n // ── Dev model/voice override (gated by the `Realtime: Advanced Session Controls` authorization) ──────\n /** Whether the current user may override the realtime model/voice (drives the dev pickers). */\n public canPickModelVoice = false;\n /** Active Realtime models + their voices (loaded once when the user can override). */\n public realtimeModels: RealtimeModelVoices[] = [];\n /** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedModelId: string | null = null;\n /** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedVoice: string | null = null;\n\n /** Voices for the model chosen in the pre-join picker. */\n public get selectedModelVoices(): RealtimeVoiceOption[] {\n return this.realtimeModels.find((m) => UUIDsEqual(m.ModelID, this.selectedModelId))?.Voices ?? [];\n }\n\n /** Records the pre-join MODEL choice; clears the voice so it can't outlive a model switch. */\n public onModelChange(event: Event): void {\n this.selectedModelId = (event.target as HTMLSelectElement).value || null;\n this.selectedVoice = null;\n }\n\n /** Records the pre-join VOICE choice. */\n public onVoiceChange(event: Event): void {\n this.selectedVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n\n /** Set when no co-agent could be resolved — shown instead of the room. */\n public resolveError: string | null = null;\n\n // ── \"Invite people\" dialog state ─────────────────────────────────────────────────\n /** Whether the invite-people dialog is open. */\n public showInvite = false;\n /** The room the invite targets (the live room name). */\n public inviteRoomName: string | null = null;\n /** Current search text in the people search box. */\n public userSearch = '';\n /** People matching the last search (minus already-selected + the current user). */\n public userResults: InviteeChoice[] = [];\n /** People chosen to invite. */\n public selectedInvitees: InviteeChoice[] = [];\n /** True while a people search is running. */\n public searching = false;\n /** True once a search has run (drives the \"no matches\" empty state). */\n public searched = false;\n /** True while invites are being sent. */\n public inviting = false;\n /** Result/status message under the dialog. */\n public inviteMessage: string | null = null;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Description of the selected target, shown under the picker. */\n public get selectedDescription(): string | null {\n return this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Description ?? null;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.resolve();\n }\n\n /**\n * Resolves the co-agent + target choices. Synchronous when the AI engine is already loaded (the common\n * case — it bootstraps at startup) so the first render is settled (avoids NG0100 from an async branch\n * flip under the app's frequent change-detection); a cold engine takes the async path and flushes.\n */\n private resolve(): void {\n // Invite link (?room=…): join that existing room directly — no agent resolution / picker needed.\n const invitedRoom = this.GetQueryParams()?.['room']?.trim();\n if (invitedRoom) {\n this.roomMode = 'join';\n this.joinRoomName = invitedRoom;\n this.phase = 'live';\n this.NotifyLoadComplete();\n return;\n }\n\n if (AIEngineBase.Instance.Loaded) {\n this.applyResolution();\n return;\n }\n void AIEngineBase.Instance.Config(false, undefined, this.ProviderToUse).then(() => {\n this.applyResolution();\n this.cdr.detectChanges();\n });\n }\n\n /** Resolves the co-agent, builds the target list, and chooses the next phase (live for an explicit record, else picker). */\n private applyResolution(): void {\n const realtimeType = AIEngineBase.Instance.AgentTypes.find((t) => t.Name?.trim().toLowerCase() === 'realtime');\n const coAgent = realtimeType\n ? AIEngineBase.Instance.Agents.find((a) => a.Status === 'Active' && UUIDsEqual(a.TypeID, realtimeType.ID))\n : undefined;\n\n if (!coAgent) {\n this.resolveError =\n 'No active Realtime agent is configured, so the Live Room has no voice to bring in. ' +\n 'Create a Realtime-type AI Agent (e.g. \"Realtime Co-Agent\") and try again.';\n this.phase = 'error';\n this.NotifyLoadComplete();\n return;\n }\n this.agentId = coAgent.ID;\n\n // Dev model/voice override: gate on the `Realtime: Advanced Session Controls` authorization and, when\n // held, load the active models + their voices for the pickers (here and the in-room add-agent control).\n this.canPickModelVoice = UserHoldsAuthorization(\n this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse,\n );\n if (this.canPickModelVoice) {\n void this.loadRealtimeModels();\n }\n\n // Target candidates: every active agent EXCEPT the Realtime co-agents (they voice a target, not themselves).\n this.agents = AIEngineBase.Instance.Agents\n .filter((a) => a.Status === 'Active' && (!realtimeType || !UUIDsEqual(a.TypeID, realtimeType.ID)))\n .map((a) => ({ ID: a.ID, Name: a.Name ?? '(unnamed)', Description: a.Description ?? null }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // An explicit record id (deep link to a specific agent) skips the picker and calls it directly.\n const explicit = this.Data?.ResourceRecordID ? String(this.Data.ResourceRecordID) : null;\n if (explicit) {\n this.selectedTargetId = explicit;\n this.startCall();\n return;\n }\n\n // Default the picker to the general assistant \"Sage\" when present, else the first candidate.\n this.selectedTargetId =\n this.agents.find((a) => a.Name.trim().toLowerCase() === 'sage')?.ID ?? this.agents[0]?.ID ?? null;\n this.phase = 'picking';\n this.NotifyLoadComplete();\n }\n\n /** Picker selection handler (native select; avoids a FormsModule dependency). */\n public onTargetChange(event: Event): void {\n this.selectedTargetId = (event.target as HTMLSelectElement).value || null;\n }\n\n /** Loads active Realtime models + their voices for the dev pickers (best-effort; empty on failure). */\n private async loadRealtimeModels(): Promise<void> {\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.realtimeModels = await client.GetRealtimeModelVoices();\n } catch {\n this.realtimeModels = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Commits the chosen target and switches to the live room. */\n public startCall(): void {\n if (!this.selectedTargetId) {\n return;\n }\n this.targetAgentId = this.selectedTargetId;\n this.targetAgentName = this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Name ?? null;\n this.phase = 'live';\n }\n\n /** Opens the invite-people dialog for the given room. */\n public openInvite(roomName: string): void {\n this.inviteRoomName = roomName || null;\n this.userSearch = '';\n this.userResults = [];\n this.selectedInvitees = [];\n this.searched = false;\n this.inviteMessage = null;\n this.showInvite = true;\n }\n\n /** Searches `MJ: Users` by name/email, excluding the current user + already-selected people. */\n public async searchUsers(): Promise<void> {\n const term = this.userSearch.trim();\n if (!term) {\n return;\n }\n this.searching = true;\n this.cdr.markForCheck();\n try {\n const p = this.ProviderToUse;\n const escaped = term.replace(/'/g, \"''\");\n const excluded = [p.CurrentUser?.ID, ...this.selectedInvitees.map((u) => u.ID)].filter(Boolean) as string[];\n const excludeFilter = excluded.length ? ` AND ID NOT IN (${excluded.map((id) => `'${id}'`).join(',')})` : '';\n const result = await RunView.FromMetadataProvider(p).RunView<{ ID: string; Name: string; Email: string }>({\n EntityName: 'Users',\n ExtraFilter: `IsActive = 1 AND (Name LIKE '%${escaped}%' OR Email LIKE '%${escaped}%')${excludeFilter}`,\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Email'],\n MaxRows: 20,\n ResultType: 'simple',\n });\n this.userResults = (result.Success ? result.Results : []).map((u) => ({\n ID: u.ID,\n Name: u.Name || u.Email || '(unnamed)',\n Email: u.Email ?? null,\n }));\n } finally {\n this.searching = false;\n this.searched = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Adds a person to the invite list (and out of the results). */\n public addInvitee(user: InviteeChoice): void {\n if (!this.selectedInvitees.some((u) => UUIDsEqual(u.ID, user.ID))) {\n this.selectedInvitees = [...this.selectedInvitees, user];\n }\n this.userResults = this.userResults.filter((u) => !UUIDsEqual(u.ID, user.ID));\n }\n\n /** Removes a person from the invite list. */\n public removeInvitee(userId: string): void {\n this.selectedInvitees = this.selectedInvitees.filter((u) => !UUIDsEqual(u.ID, userId));\n }\n\n /** Sends the invites — the server notifies each person (in-app + Comms when configured). */\n public async sendInvites(): Promise<void> {\n if (!this.selectedInvitees.length || !this.inviteRoomName || this.inviting) {\n return;\n }\n this.inviting = true;\n this.inviteMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.InviteUsers(this.inviteRoomName, this.selectedInvitees.map((u) => u.ID));\n if (ok) {\n this.inviteMessage = `Invited ${this.selectedInvitees.length} ${this.selectedInvitees.length === 1 ? 'person' : 'people'}.`;\n this.selectedInvitees = [];\n setTimeout(() => {\n this.showInvite = false;\n this.cdr.markForCheck();\n }, 900);\n } else {\n this.inviteMessage = 'Could not send the invites. Please try again.';\n }\n } catch (err) {\n this.inviteMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.inviting = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n // Clear the shell loading screen even if resolution is slow — the picker/room/message shows its own\n // state, so the loader must not hang on direct URL navigation.\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Live Room';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-video';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"livekit-room-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/livekit-room-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { RunView } from '@memberjunction/core';\nimport { GraphQLLiveKitClient, GraphQLDataProvider, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { UserHoldsAuthorization, REALTIME_ADVANCED_SESSION_CONTROLS } from '@memberjunction/ng-conversations';\n\n/** A selectable target agent for the pre-join picker. */\ninterface TargetAgentChoice {\n ID: string;\n Name: string;\n Description: string | null;\n}\n\n/** A user shown in the \"Invite people\" search/selection. */\ninterface InviteeChoice {\n ID: string;\n Name: string;\n Email: string | null;\n}\n\n/**\n * LiveKit Room Resource — hosts the MJ-native LiveKit room (`mj-livekit-agent-room`) as an Explorer tab\n * (the **Meet** app's \"Live Room\").\n *\n * Flow: resolve the Realtime **co-agent** (voice front-end), then show a **pre-join picker** to choose\n * the **target** agent you're \"calling\" (the co-agent voices it via `invoke-target-agent` — without a\n * target it sits idle). \"Start call\" joins the room. An explicit `ResourceRecordID` skips the picker and\n * calls that agent directly.\n *\n * Registered via `@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')`.\n */\n@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')\n@Component({\n standalone: false,\n selector: 'mj-livekit-room-resource',\n template: `\n @switch (phase) {\n @case ('live') {\n <mj-livekit-agent-room\n class=\"mj-livekit-room-resource\"\n [Mode]=\"roomMode\"\n [RoomName]=\"joinRoomName\"\n [AgentID]=\"agentId\"\n [TargetAgentID]=\"targetAgentId\"\n [AgentName]=\"targetAgentName\"\n [AvailableAgents]=\"agents\"\n [RealtimeModelID]=\"selectedModelId\"\n [RealtimeVoice]=\"selectedVoice\"\n [CanPickModelVoice]=\"canPickModelVoice\"\n [AvailableModels]=\"realtimeModels\"\n [Provider]=\"ProviderToUse\"\n [ShowAgentState]=\"true\"\n [ShowWhiteboard]=\"true\"\n [EnableLayoutSwitcher]=\"true\"\n [EnablePinning]=\"true\"\n (Connected)=\"NotifyLoadComplete()\"\n (Disconnected)=\"onRoomLeft()\"\n (ErrorOccurred)=\"NotifyLoadComplete()\"\n (InvitePeopleRequested)=\"openInvite($event)\"\n ></mj-livekit-agent-room>\n }\n @case ('picking') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Start a call</h2>\n <p class=\"mj-lk-prejoin__subtitle\">\n Choose the agent you want to talk to. You can add more agents (and invite people) once\n you're in the room.\n </p>\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-target\">Agent</label>\n <select id=\"mj-lk-target\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onTargetChange($event)\">\n @for (a of agents; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, selectedTargetId)\">{{ a.Name }}</option>\n }\n </select>\n @if (selectedDescription) {\n <p class=\"mj-lk-prejoin__desc\">{{ selectedDescription }}</p>\n }\n @if (canPickModelVoice && realtimeModels.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-model\">Model <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-model\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onModelChange($event)\">\n <option value=\"\">Default model</option>\n @for (m of realtimeModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, selectedModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (selectedModelVoices.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-voice\">Voice <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-voice\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onVoiceChange($event)\">\n <option value=\"\">Default voice</option>\n @for (v of selectedModelVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === selectedVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n }\n <button type=\"button\" class=\"mj-lk-prejoin__start\" [disabled]=\"!selectedTargetId\" (click)=\"startCall()\">\n <i class=\"fa-solid fa-phone\"></i> Start call\n </button>\n </div>\n </div>\n }\n @case ('landing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Meet</h2>\n <p class=\"mj-lk-prejoin__subtitle\">Start a live room with agents and people, join one that's in progress, or review a past meeting.</p>\n <div class=\"mj-lk-cards\">\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"startNewRoom()\">\n <i class=\"fa-solid fa-circle-plus\"></i>\n <span class=\"mj-lk-card__t\">New room</span>\n <span class=\"mj-lk-card__d\">Pick an agent and start a fresh call.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openExisting()\">\n <i class=\"fa-solid fa-door-open\"></i>\n <span class=\"mj-lk-card__t\">Join existing</span>\n <span class=\"mj-lk-card__d\">Hop into a room that's live right now.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openHistory()\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span class=\"mj-lk-card__t\">History</span>\n <span class=\"mj-lk-card__d\">Read transcripts of past meetings.</span>\n </button>\n </div>\n </div>\n </div>\n }\n @case ('existing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Join a room</h2>\n @if (loadingActive) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Finding active rooms…</div>\n } @else if (activeRooms.length) {\n <div class=\"mj-lk-list\">\n @for (r of activeRooms; track r.RoomName) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"joinExistingRoom(r.RoomName)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-circle mj-lk-livedot\"></i> {{ r.Label }}</span>\n <span class=\"mj-lk-list__meta\">{{ r.AgentCount }} agent{{ r.AgentCount === 1 ? '' : 's' }} · Join</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No rooms are active right now.</p>\n }\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-room\">Or join by name</label>\n <div class=\"mj-lk-joinrow\">\n <input id=\"mj-lk-room\" class=\"mj-input mj-lk-joinrow__input\" type=\"text\" placeholder=\"Room name…\" [value]=\"manualRoomName\"\n (input)=\"manualRoomName = $any($event.target).value\" (keydown.enter)=\"joinExistingRoom(manualRoomName)\" />\n <button type=\"button\" class=\"mj-lk-prejoin__start mj-lk-joinrow__btn\" [disabled]=\"!manualRoomName.trim()\" (click)=\"joinExistingRoom(manualRoomName)\">Join</button>\n </div>\n </div>\n </div>\n }\n @case ('history') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n @if (!openHistoryRoom) {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Past meetings</h2>\n @if (loadingHistory) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…</div>\n } @else if (historyRooms.length) {\n <div class=\"mj-lk-list\">\n @for (h of historyRooms; track h.ConversationID) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"openTranscript(h)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-comments\"></i> {{ h.Name }}</span>\n <span class=\"mj-lk-list__meta\">{{ formatTime(h.At) }}</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No past meetings yet.</p>\n }\n } @else {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"closeTranscript()\"><i class=\"fa-solid fa-arrow-left\"></i> All meetings</button>\n <h2 class=\"mj-lk-prejoin__title\">{{ openHistoryRoom.Name }}</h2>\n @if (loadingTranscript) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading transcript…</div>\n } @else if (historyTranscript.length) {\n <div class=\"mj-lk-transcript\">\n @for (line of historyTranscript; track $index) {\n <div class=\"mj-lk-tline\" [class.mj-lk-tline--agent]=\"line.Kind === 'agent'\" [class.mj-lk-tline--error]=\"line.Kind === 'error'\">\n <span class=\"mj-lk-tline__who\">{{ line.Speaker }}</span>\n <span class=\"mj-lk-tline__msg\">{{ line.Message }}</span>\n </div>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No transcript was captured for this meeting.</p>\n }\n }\n </div>\n </div>\n }\n @case ('error') {\n <div class=\"mj-livekit-room-resource__message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ resolveError }}</span>\n </div>\n }\n @default {\n <div class=\"mj-livekit-room-resource__message\">Preparing room…</div>\n }\n }\n\n @if (showInvite) {\n <mj-dialog [Visible]=\"showInvite\" (Close)=\"showInvite = false\" Title=\"Invite people\" Size=\"auto\" [Width]=\"440\">\n <div class=\"mj-lk-invite\">\n <p class=\"mj-lk-invite__hint\">They'll get an in-app notification (and an email if Comms is set up) to join this room.</p>\n <div class=\"mj-lk-invite__search\">\n <input class=\"mj-input\" type=\"text\" [value]=\"userSearch\" placeholder=\"Search people by name or email…\"\n (input)=\"userSearch = $any($event.target).value\" (keydown.enter)=\"searchUsers()\" />\n <button type=\"button\" class=\"mj-lk-invite__searchbtn\" [disabled]=\"searching\" (click)=\"searchUsers()\">\n <i class=\"fa-solid\" [class.fa-magnifying-glass]=\"!searching\" [class.fa-spinner]=\"searching\" [class.fa-spin]=\"searching\"></i>\n </button>\n </div>\n\n @if (selectedInvitees.length) {\n <div class=\"mj-lk-invite__chips\">\n @for (u of selectedInvitees; track u.ID) {\n <span class=\"mj-lk-invite__chip\">\n {{ u.Name }}\n <button type=\"button\" class=\"mj-lk-invite__chipx\" (click)=\"removeInvitee(u.ID)\"><i class=\"fa-solid fa-xmark\"></i></button>\n </span>\n }\n </div>\n }\n\n @if (userResults.length) {\n <div class=\"mj-lk-invite__results\">\n @for (u of userResults; track u.ID) {\n <button type=\"button\" class=\"mj-lk-invite__result\" (click)=\"addInvitee(u)\">\n <span class=\"mj-lk-invite__rname\">{{ u.Name }}</span>\n @if (u.Email) { <span class=\"mj-lk-invite__remail\">{{ u.Email }}</span> }\n </button>\n }\n </div>\n } @else if (searched && !searching) {\n <div class=\"mj-lk-invite__empty\">No matching people.</div>\n }\n\n @if (inviteMessage) {\n <div class=\"mj-lk-invite__msg\">{{ inviteMessage }}</div>\n }\n\n <div class=\"mj-lk-invite__actions\">\n <button type=\"button\" class=\"mj-lk-invite__send\" [disabled]=\"!selectedInvitees.length || inviting\" (click)=\"sendInvites()\">\n <i class=\"fa-solid\" [class.fa-paper-plane]=\"!inviting\" [class.fa-spinner]=\"inviting\" [class.fa-spin]=\"inviting\"></i>\n Invite {{ selectedInvitees.length || '' }}\n </button>\n <button type=\"button\" class=\"mj-lk-invite__cancel\" (click)=\"showInvite = false\">Cancel</button>\n </div>\n </div>\n </mj-dialog>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message i {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-prejoin__card--wide {\n max-width: 560px;\n text-align: left;\n }\n .mj-lk-back {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 0.75rem;\n padding: 4px 8px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-back:hover { color: var(--mj-text-primary); }\n .mj-lk-cards {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n .mj-lk-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 1.25rem 0.75rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: center;\n }\n .mj-lk-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card));\n }\n .mj-lk-card > i { font-size: 1.4rem; color: var(--mj-brand-primary); }\n .mj-lk-card__t { font-weight: 600; color: var(--mj-text-primary); font-size: 0.9rem; }\n .mj-lk-card__d { color: var(--mj-text-muted); font-size: 0.78rem; line-height: 1.3; }\n .mj-lk-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0.5rem 0 1rem;\n max-height: 320px;\n overflow-y: auto;\n }\n .mj-lk-list__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-list__row:hover { border-color: var(--mj-brand-primary); background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card)); }\n .mj-lk-list__name { color: var(--mj-text-primary); font-size: 0.875rem; display: inline-flex; align-items: center; gap: 8px; }\n .mj-lk-list__meta { color: var(--mj-text-muted); font-size: 0.78rem; white-space: nowrap; }\n .mj-lk-livedot { color: var(--mj-status-success); font-size: 0.5rem; }\n .mj-lk-listmsg { padding: 1rem; color: var(--mj-text-secondary); text-align: center; }\n .mj-lk-joinrow { display: flex; gap: 8px; }\n .mj-lk-joinrow__input { flex: 1; }\n .mj-lk-joinrow__btn { white-space: nowrap; }\n .mj-lk-transcript {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 0.5rem;\n max-height: 60vh;\n overflow-y: auto;\n }\n .mj-lk-tline {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n }\n .mj-lk-tline--agent { background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)); }\n .mj-lk-tline--error { background: var(--mj-status-error-bg, color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface))); }\n .mj-lk-tline__who { font-size: 0.72rem; font-weight: 600; color: var(--mj-text-secondary); }\n .mj-lk-tline__msg { font-size: 0.875rem; color: var(--mj-text-primary); }\n .mj-lk-invite {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search .mj-input {\n flex: 1;\n }\n .mj-lk-invite__searchbtn,\n .mj-lk-invite__send,\n .mj-lk-invite__cancel {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class LiveKitRoomResource extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n /** Render phase: spinner while resolving → landing (new/existing/history) → picker/existing/history → live room. */\n public phase: 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error' = 'loading';\n\n // ── \"Join existing\" state ─────────────────────────────────────────────────────────\n /** Currently-active rooms (a distinct `ExternalConnectionID` with ≥1 connected agent bridge). */\n public activeRooms: { RoomName: string; Label: string; AgentCount: number }[] = [];\n /** True while loading the active-rooms list. */\n public loadingActive = false;\n /** Free-text room name to join directly (the \"join by name/code\" path). */\n public manualRoomName = '';\n\n // ── \"History\" (past meetings) state ───────────────────────────────────────────────\n /** Past meeting rooms (the `MJ: Conversations` of Type='Meeting Room' the bridge recorded). */\n public historyRooms: { ConversationID: string; Name: string; At: Date }[] = [];\n /** True while loading the history list. */\n public loadingHistory = false;\n /** The history room whose transcript is open (drill-in), or null for the list. */\n public openHistoryRoom: { ConversationID: string; Name: string } | null = null;\n /** The opened room's transcript lines. */\n public historyTranscript: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] = [];\n /** True while loading a room's transcript. */\n public loadingTranscript = false;\n\n /** `'agent'` to start/voice an agent (the default), or `'join'` when opened from an invite link. */\n public roomMode: 'agent' | 'join' = 'agent';\n\n /** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */\n public joinRoomName: string | null = null;\n\n /** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */\n public agentId: string | null = null;\n\n /** The TARGET agent the co-agent voices (the one being \"called\"); the bot is named after it. */\n public targetAgentId: string | null = null;\n\n /** The target agent's display name — used as the bot name + addressing word (\"Sage, …\"). */\n public targetAgentName: string | null = null;\n\n /** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */\n public agents: TargetAgentChoice[] = [];\n\n /** The currently-selected target in the picker (defaults to \"Sage\" when present). */\n public selectedTargetId: string | null = null;\n\n // ── Dev model/voice override (gated by the `Realtime: Advanced Session Controls` authorization) ──────\n /** Whether the current user may override the realtime model/voice (drives the dev pickers). */\n public canPickModelVoice = false;\n /** Active Realtime models + their voices (loaded once when the user can override). */\n public realtimeModels: RealtimeModelVoices[] = [];\n /** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedModelId: string | null = null;\n /** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedVoice: string | null = null;\n\n /** Voices for the model chosen in the pre-join picker. */\n public get selectedModelVoices(): RealtimeVoiceOption[] {\n return this.realtimeModels.find((m) => UUIDsEqual(m.ModelID, this.selectedModelId))?.Voices ?? [];\n }\n\n /** Records the pre-join MODEL choice; clears the voice so it can't outlive a model switch. */\n public onModelChange(event: Event): void {\n this.selectedModelId = (event.target as HTMLSelectElement).value || null;\n this.selectedVoice = null;\n }\n\n /** Records the pre-join VOICE choice. */\n public onVoiceChange(event: Event): void {\n this.selectedVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n\n /** Set when no co-agent could be resolved — shown instead of the room. */\n public resolveError: string | null = null;\n\n // ── \"Invite people\" dialog state ─────────────────────────────────────────────────\n /** Whether the invite-people dialog is open. */\n public showInvite = false;\n /** The room the invite targets (the live room name). */\n public inviteRoomName: string | null = null;\n /** Current search text in the people search box. */\n public userSearch = '';\n /** People matching the last search (minus already-selected + the current user). */\n public userResults: InviteeChoice[] = [];\n /** People chosen to invite. */\n public selectedInvitees: InviteeChoice[] = [];\n /** True while a people search is running. */\n public searching = false;\n /** True once a search has run (drives the \"no matches\" empty state). */\n public searched = false;\n /** True while invites are being sent. */\n public inviting = false;\n /** Result/status message under the dialog. */\n public inviteMessage: string | null = null;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Description of the selected target, shown under the picker. */\n public get selectedDescription(): string | null {\n return this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Description ?? null;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.resolve();\n }\n\n /**\n * Resolves the co-agent + target choices. Synchronous when the AI engine is already loaded (the common\n * case — it bootstraps at startup) so the first render is settled (avoids NG0100 from an async branch\n * flip under the app's frequent change-detection); a cold engine takes the async path and flushes.\n */\n private resolve(): void {\n // Invite link (?room=…): join that existing room directly — no agent resolution / picker needed.\n const invitedRoom = this.GetQueryParams()?.['room']?.trim();\n if (invitedRoom) {\n this.roomMode = 'join';\n this.joinRoomName = invitedRoom;\n this.phase = 'live';\n this.NotifyLoadComplete();\n return;\n }\n\n if (AIEngineBase.Instance.Loaded) {\n this.applyResolution();\n return;\n }\n void AIEngineBase.Instance.Config(false, undefined, this.ProviderToUse).then(() => {\n this.applyResolution();\n this.cdr.detectChanges();\n });\n }\n\n /** Resolves the co-agent, builds the target list, and chooses the next phase (live for an explicit record, else picker). */\n private applyResolution(): void {\n const realtimeType = AIEngineBase.Instance.AgentTypes.find((t) => t.Name?.trim().toLowerCase() === 'realtime');\n const coAgent = realtimeType\n ? AIEngineBase.Instance.Agents.find((a) => a.Status === 'Active' && UUIDsEqual(a.TypeID, realtimeType.ID))\n : undefined;\n\n if (!coAgent) {\n this.resolveError =\n 'No active Realtime agent is configured, so the Live Room has no voice to bring in. ' +\n 'Create a Realtime-type AI Agent (e.g. \"Realtime Co-Agent\") and try again.';\n this.phase = 'error';\n this.NotifyLoadComplete();\n return;\n }\n this.agentId = coAgent.ID;\n\n // Dev model/voice override: gate on the `Realtime: Advanced Session Controls` authorization and, when\n // held, load the active models + their voices for the pickers (here and the in-room add-agent control).\n this.canPickModelVoice = UserHoldsAuthorization(\n this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse,\n );\n if (this.canPickModelVoice) {\n void this.loadRealtimeModels();\n }\n\n // Target candidates: every active agent EXCEPT the Realtime co-agents (they voice a target, not themselves).\n this.agents = AIEngineBase.Instance.Agents\n .filter((a) => a.Status === 'Active' && (!realtimeType || !UUIDsEqual(a.TypeID, realtimeType.ID)))\n .map((a) => ({ ID: a.ID, Name: a.Name ?? '(unnamed)', Description: a.Description ?? null }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // An explicit record id (deep link to a specific agent) skips the picker and calls it directly.\n const explicit = this.Data?.ResourceRecordID ? String(this.Data.ResourceRecordID) : null;\n if (explicit) {\n this.selectedTargetId = explicit;\n this.startCall();\n return;\n }\n\n // Default the picker to the general assistant \"Sage\" when present, else the first candidate.\n this.selectedTargetId =\n this.agents.find((a) => a.Name.trim().toLowerCase() === 'sage')?.ID ?? this.agents[0]?.ID ?? null;\n // Land on the Meet home (start new / join existing / history) rather than jumping straight into the picker.\n this.phase = 'landing';\n this.NotifyLoadComplete();\n }\n\n // ── Meet landing navigation ─────────────────────────────────────────────────────────\n\n /**\n * The room disconnected (the user clicked **Leave** or **End meeting**, or the room dropped). Return to the\n * Meet landing so they can start a new room, join another, or review history — rather than being stranded\n * on a dead room. Resets the join state so the next \"New room\" / \"Join existing\" starts clean.\n */\n public onRoomLeft(): void {\n this.roomMode = 'agent';\n this.joinRoomName = null;\n this.phase = 'landing';\n this.cdr.detectChanges();\n }\n\n /** Go to the \"start a new room\" picker. */\n public startNewRoom(): void {\n this.phase = 'picking';\n }\n\n /** Open the \"join existing room\" view and load the active rooms. */\n public openExisting(): void {\n this.phase = 'existing';\n void this.loadActiveRooms();\n }\n\n /** Open the \"past meetings\" history view and load the list. */\n public openHistory(): void {\n this.phase = 'history';\n this.openHistoryRoom = null;\n void this.loadHistory();\n }\n\n /** Back to the Meet home. */\n public backToLanding(): void {\n this.phase = 'landing';\n }\n\n /** Joins an existing room by its LiveKit room name (the bridge `ExternalConnectionID`). */\n public joinExistingRoom(roomName: string): void {\n const name = roomName.trim();\n if (!name) {\n return;\n }\n this.roomMode = 'join';\n this.joinRoomName = name;\n this.phase = 'live';\n }\n\n /** Loads currently-active rooms: distinct rooms that have a Connected/Connecting agent bridge. */\n private async loadActiveRooms(): Promise<void> {\n this.loadingActive = true;\n this.activeRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ExternalConnectionID: string; Agent: string }>(\n {\n EntityName: 'MJ: AI Agent Session Bridges',\n ExtraFilter: `Status IN ('Connected','Connecting') AND ExternalConnectionID IS NOT NULL`,\n Fields: ['ExternalConnectionID', 'Agent'],\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n const byRoom = new Map<string, { count: number; agents: Set<string> }>();\n for (const r of res.Results) {\n const room = String(r['ExternalConnectionID'] ?? '');\n if (!room) {\n continue;\n }\n const entry = byRoom.get(room) ?? { count: 0, agents: new Set<string>() };\n entry.count += 1;\n if (r['Agent']) {\n entry.agents.add(String(r['Agent']));\n }\n byRoom.set(room, entry);\n }\n this.activeRooms = [...byRoom.entries()].map(([room, info]) => ({\n RoomName: room,\n Label: info.agents.size ? [...info.agents].join(', ') : room,\n AgentCount: info.count,\n }));\n }\n } finally {\n this.loadingActive = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Loads past meetings: the `Meeting Room` conversations the bridge recorded, newest first. */\n private async loadHistory(): Promise<void> {\n this.loadingHistory = true;\n this.historyRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ID: string; Name: string; __mj_UpdatedAt: string }>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: `Type='Meeting Room'`,\n Fields: ['ID', 'Name', '__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.historyRooms = res.Results.map((r) => ({\n ConversationID: String(r['ID']),\n Name: String(r['Name'] ?? 'Meeting'),\n At: new Date(String(r['__mj_UpdatedAt'] ?? '')),\n }));\n }\n } finally {\n this.loadingHistory = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Opens a past meeting's transcript (drill-in). */\n public async openTranscript(room: { ConversationID: string; Name: string }): Promise<void> {\n this.openHistoryRoom = room;\n this.historyTranscript = [];\n this.loadingTranscript = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ Role: string; Message: string; AgentID: string; Error: string }>(\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ConversationID='${room.ConversationID.replace(/'/g, \"''\")}'`,\n Fields: ['Role', 'Message', 'AgentID', 'Error', '__mj_CreatedAt'],\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 5000,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.historyTranscript = res.Results.map((d) => {\n const role = String(d['Role'] ?? 'User');\n if (role === 'Error') {\n return { Kind: 'error' as const, Speaker: 'Error', Message: String(d['Error'] ?? d['Message'] ?? '') };\n }\n if (role === 'AI') {\n const agentId = String(d['AgentID'] ?? '').toLowerCase();\n const name = AIEngineBase.Instance.Agents.find((a) => a.ID.toLowerCase() === agentId)?.Name ?? 'Agent';\n return { Kind: 'agent' as const, Speaker: name, Message: String(d['Message'] ?? '') };\n }\n return { Kind: 'human' as const, Speaker: 'Participant', Message: String(d['Message'] ?? '') };\n });\n }\n } finally {\n this.loadingTranscript = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Back to the history list from a transcript drill-in. */\n public closeTranscript(): void {\n this.openHistoryRoom = null;\n }\n\n /** Formats a meeting timestamp for the history list (avoids a `date` pipe / CommonModule dependency). */\n public formatTime(d: Date): string {\n return d && !isNaN(d.getTime()) ? d.toLocaleString() : '';\n }\n\n /** Picker selection handler (native select; avoids a FormsModule dependency). */\n public onTargetChange(event: Event): void {\n this.selectedTargetId = (event.target as HTMLSelectElement).value || null;\n }\n\n /** Loads active Realtime models + their voices for the dev pickers (best-effort; empty on failure). */\n private async loadRealtimeModels(): Promise<void> {\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.realtimeModels = await client.GetRealtimeModelVoices();\n } catch {\n this.realtimeModels = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Commits the chosen target and switches to the live room. */\n public startCall(): void {\n if (!this.selectedTargetId) {\n return;\n }\n this.targetAgentId = this.selectedTargetId;\n this.targetAgentName = this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Name ?? null;\n this.phase = 'live';\n }\n\n /** Opens the invite-people dialog for the given room. */\n public openInvite(roomName: string): void {\n this.inviteRoomName = roomName || null;\n this.userSearch = '';\n this.userResults = [];\n this.selectedInvitees = [];\n this.searched = false;\n this.inviteMessage = null;\n this.showInvite = true;\n }\n\n /** Searches `MJ: Users` by name/email, excluding the current user + already-selected people. */\n public async searchUsers(): Promise<void> {\n const term = this.userSearch.trim();\n if (!term) {\n return;\n }\n this.searching = true;\n this.cdr.markForCheck();\n try {\n const p = this.ProviderToUse;\n const escaped = term.replace(/'/g, \"''\");\n const excluded = [p.CurrentUser?.ID, ...this.selectedInvitees.map((u) => u.ID)].filter(Boolean) as string[];\n const excludeFilter = excluded.length ? ` AND ID NOT IN (${excluded.map((id) => `'${id}'`).join(',')})` : '';\n const result = await RunView.FromMetadataProvider(p).RunView<{ ID: string; Name: string; Email: string }>({\n EntityName: 'Users',\n ExtraFilter: `IsActive = 1 AND (Name LIKE '%${escaped}%' OR Email LIKE '%${escaped}%')${excludeFilter}`,\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Email'],\n MaxRows: 20,\n ResultType: 'simple',\n });\n this.userResults = (result.Success ? result.Results : []).map((u) => ({\n ID: u.ID,\n Name: u.Name || u.Email || '(unnamed)',\n Email: u.Email ?? null,\n }));\n } finally {\n this.searching = false;\n this.searched = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Adds a person to the invite list (and out of the results). */\n public addInvitee(user: InviteeChoice): void {\n if (!this.selectedInvitees.some((u) => UUIDsEqual(u.ID, user.ID))) {\n this.selectedInvitees = [...this.selectedInvitees, user];\n }\n this.userResults = this.userResults.filter((u) => !UUIDsEqual(u.ID, user.ID));\n }\n\n /** Removes a person from the invite list. */\n public removeInvitee(userId: string): void {\n this.selectedInvitees = this.selectedInvitees.filter((u) => !UUIDsEqual(u.ID, userId));\n }\n\n /** Sends the invites — the server notifies each person (in-app + Comms when configured). */\n public async sendInvites(): Promise<void> {\n if (!this.selectedInvitees.length || !this.inviteRoomName || this.inviting) {\n return;\n }\n this.inviting = true;\n this.inviteMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.InviteUsers(this.inviteRoomName, this.selectedInvitees.map((u) => u.ID));\n if (ok) {\n this.inviteMessage = `Invited ${this.selectedInvitees.length} ${this.selectedInvitees.length === 1 ? 'person' : 'people'}.`;\n this.selectedInvitees = [];\n setTimeout(() => {\n this.showInvite = false;\n this.cdr.markForCheck();\n }, 900);\n } else {\n this.inviteMessage = 'Could not send the invites. Please try again.';\n }\n } catch (err) {\n this.inviteMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.inviting = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n // Clear the shell loading screen even if resolution is slow — the picker/room/message shows its own\n // state, so the loader must not hang on direct URL navigation.\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Live Room';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-video';\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-results-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/search-results-resource.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAEH,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EAGvB,yBAAyB,EACzB,uBAAuB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAElF,
|
|
1
|
+
{"version":3,"file":"search-results-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/search-results-resource.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAEH,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EAGvB,yBAAyB,EACzB,uBAAuB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAElF,qBAgXa,qBAAsB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,eAAe,CAA2B;IAElD,YAAY,SAAM;IAClB,WAAW,UAAS;IACpB,WAAW,UAAS;IACpB,UAAU,SAAK;IACf,SAAS,SAAK;IACd,OAAO,EAAE,YAAY,EAAE,CAAM;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAC7C,eAAe,EAAE,gBAAgB,EAAE,CAAM;IACzC,eAAe,SAAM;IACrB;iFAC6E;IAC7E,qBAAqB,SAAM;IAC3B,0EAA0E;IAC1E,iBAAiB,SAAK;IACtB,eAAe,UAAQ;IACvB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAW;IAClD,gBAAgB,SAAM;IACtB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAU;IACpC,UAAU,EAAE,aAAa,EAAE,CAAM;IACjC,cAAc,UAAS;IAEvB,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAA0B;IAE5C,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;;OAKG;IACH,eAAe,UAAS;IAExB,sFAAsF;IACtF,kBAAkB,EAAE,uBAAuB,EAAE,CAAM;IAEnD,8EAA8E;IAC9E,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,CAAC,UAAU,CAAS;IAI3B,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IACD,IAAa,IAAI,IAAI,YAAY,CAEhC;YAEa,YAAY;IAsDjB,WAAW,IAAI,IAAI;IAMtB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,eAAe,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI;IAQrD,gBAAgB,IAAI,IAAI;IAOxB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAYxC;;;;OAIG;cACgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAe/G,gBAAgB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAIxD,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAItC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,iBAAiB,IAAI,IAAI;IAazB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK5C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IASzC,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAKlD;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;YAgBV,aAAa;IAqC3B;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IA6D9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,oBAAoB;IA4B5B;;;OAGG;IACH;;;;OAIG;YACW,eAAe;IAsE7B,kDAAkD;IAClD,OAAO,CAAC,gBAAgB;IAwBxB,uEAAuE;IACvE,OAAO,CAAC,kBAAkB;yCA7iBjB,qBAAqB;2CAArB,qBAAqB;CAgpBjC;AAED,wBAAgB,yBAAyB,SAExC"}
|
|
@@ -15,6 +15,7 @@ import * as i1 from "@angular/forms";
|
|
|
15
15
|
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
16
16
|
import * as i3 from "@memberjunction/ng-search";
|
|
17
17
|
import * as i4 from "@memberjunction/ng-word-cloud";
|
|
18
|
+
import * as i5 from "@memberjunction/ng-ui-components";
|
|
18
19
|
const _forTrack0 = ($index, $item) => $item.Name;
|
|
19
20
|
function SearchResultsResource_Conditional_1_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
20
21
|
i0.ɵɵelement(0, "i", 9);
|
|
@@ -160,26 +161,19 @@ function SearchResultsResource_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
|
160
161
|
i0.ɵɵelementEnd();
|
|
161
162
|
} }
|
|
162
163
|
function SearchResultsResource_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
163
|
-
i0.ɵɵ
|
|
164
|
-
i0.ɵɵelement(1, "i", 39);
|
|
165
|
-
i0.ɵɵelementStart(2, "h3");
|
|
166
|
-
i0.ɵɵtext(3, "No results found");
|
|
167
|
-
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(4, "p");
|
|
169
|
-
i0.ɵɵtext(5, "Try different keywords or broaden your search.");
|
|
170
|
-
i0.ɵɵelementEnd()();
|
|
164
|
+
i0.ɵɵelement(0, "mj-empty-state", 4);
|
|
171
165
|
} }
|
|
172
166
|
function SearchResultsResource_Conditional_5_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
173
|
-
i0.ɵɵelementStart(0, "div",
|
|
174
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
167
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
168
|
+
i0.ɵɵelement(1, "mj-loading", 42);
|
|
175
169
|
i0.ɵɵelementEnd();
|
|
176
170
|
} }
|
|
177
171
|
function SearchResultsResource_Conditional_5_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
172
|
+
i0.ɵɵelement(0, "mj-loading", 43);
|
|
179
173
|
} }
|
|
180
174
|
function SearchResultsResource_Conditional_5_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
181
175
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
182
|
-
i0.ɵɵelementStart(0, "mj-word-cloud",
|
|
176
|
+
i0.ɵɵelementStart(0, "mj-word-cloud", 45);
|
|
183
177
|
i0.ɵɵlistener("ItemClick", function SearchResultsResource_Conditional_5_Conditional_2_Conditional_2_Template_mj_word_cloud_ItemClick_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnCloudItemClick($event)); });
|
|
184
178
|
i0.ɵɵelementEnd();
|
|
185
179
|
} if (rf & 2) {
|
|
@@ -187,8 +181,8 @@ function SearchResultsResource_Conditional_5_Conditional_2_Conditional_2_Templat
|
|
|
187
181
|
i0.ɵɵproperty("Items", ctx_r1.CloudItems)("MaxItems", 80)("Interactive", true);
|
|
188
182
|
} }
|
|
189
183
|
function SearchResultsResource_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
190
|
-
i0.ɵɵelementStart(0, "div",
|
|
191
|
-
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_2_Conditional_1_Template, 1, 0, "mj-loading",
|
|
184
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
185
|
+
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_2_Conditional_1_Template, 1, 0, "mj-loading", 43)(2, SearchResultsResource_Conditional_5_Conditional_2_Conditional_2_Template, 1, 3, "mj-word-cloud", 44);
|
|
192
186
|
i0.ɵɵelementEnd();
|
|
193
187
|
} if (rf & 2) {
|
|
194
188
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -197,7 +191,7 @@ function SearchResultsResource_Conditional_5_Conditional_2_Template(rf, ctx) { i
|
|
|
197
191
|
} }
|
|
198
192
|
function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
199
193
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
200
|
-
i0.ɵɵelementStart(0, "mj-search-filter",
|
|
194
|
+
i0.ɵɵelementStart(0, "mj-search-filter", 49);
|
|
201
195
|
i0.ɵɵlistener("FilterChanged", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template_mj_search_filter_FilterChanged_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnFilterChanged($event)); })("FiltersCleared", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template_mj_search_filter_FiltersCleared_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnFiltersCleared()); })("CloseRequested", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template_mj_search_filter_CloseRequested_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleFilterPanel()); })("MinScoreChanged", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template_mj_search_filter_MinScoreChanged_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMinScoreChanged($event)); });
|
|
202
196
|
i0.ɵɵelementEnd();
|
|
203
197
|
} if (rf & 2) {
|
|
@@ -206,7 +200,7 @@ function SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Templat
|
|
|
206
200
|
} }
|
|
207
201
|
function SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
208
202
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
209
|
-
i0.ɵɵelementStart(0, "mj-search-results",
|
|
203
|
+
i0.ɵɵelementStart(0, "mj-search-results", 50);
|
|
210
204
|
i0.ɵɵlistener("ResultSelected", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Template_mj_search_results_ResultSelected_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnResultSelected($event)); })("OpenRecordRequested", function SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Template_mj_search_results_OpenRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnOpenRecord($event)); });
|
|
211
205
|
i0.ɵɵelementEnd();
|
|
212
206
|
} if (rf & 2) {
|
|
@@ -214,16 +208,12 @@ function SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Templat
|
|
|
214
208
|
i0.ɵɵproperty("FlatResults", ctx_r1.FilteredResults)("HighlightText", ctx_r1.ClientFilterText)("ShowScores", true)("ShowTags", true)("ShowSummary", false)("PageSize", 20);
|
|
215
209
|
} }
|
|
216
210
|
function SearchResultsResource_Conditional_5_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
217
|
-
i0.ɵɵ
|
|
218
|
-
i0.ɵɵelement(1, "i", 52);
|
|
219
|
-
i0.ɵɵelementStart(2, "p");
|
|
220
|
-
i0.ɵɵtext(3, "No results match current filters. Try lowering the minimum relevance.");
|
|
221
|
-
i0.ɵɵelementEnd()();
|
|
211
|
+
i0.ɵɵelement(0, "mj-empty-state", 48);
|
|
222
212
|
} }
|
|
223
213
|
function SearchResultsResource_Conditional_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
224
|
-
i0.ɵɵelementStart(0, "div",
|
|
225
|
-
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template, 1, 5, "mj-search-filter",
|
|
226
|
-
i0.ɵɵconditionalCreate(2, SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Template, 1, 6, "mj-search-results",
|
|
214
|
+
i0.ɵɵelementStart(0, "div", 41);
|
|
215
|
+
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_3_Conditional_1_Template, 1, 5, "mj-search-filter", 46);
|
|
216
|
+
i0.ɵɵconditionalCreate(2, SearchResultsResource_Conditional_5_Conditional_3_Conditional_2_Template, 1, 6, "mj-search-results", 47)(3, SearchResultsResource_Conditional_5_Conditional_3_Conditional_3_Template, 1, 0, "mj-empty-state", 48);
|
|
227
217
|
i0.ɵɵelementEnd();
|
|
228
218
|
} if (rf & 2) {
|
|
229
219
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -234,8 +224,8 @@ function SearchResultsResource_Conditional_5_Conditional_3_Template(rf, ctx) { i
|
|
|
234
224
|
} }
|
|
235
225
|
function SearchResultsResource_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
236
226
|
i0.ɵɵelementStart(0, "div", 5);
|
|
237
|
-
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_1_Template, 2, 0, "div",
|
|
238
|
-
i0.ɵɵconditionalCreate(2, SearchResultsResource_Conditional_5_Conditional_2_Template, 3, 1, "div",
|
|
227
|
+
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_5_Conditional_1_Template, 2, 0, "div", 39);
|
|
228
|
+
i0.ɵɵconditionalCreate(2, SearchResultsResource_Conditional_5_Conditional_2_Template, 3, 1, "div", 40)(3, SearchResultsResource_Conditional_5_Conditional_3_Template, 4, 2, "div", 41);
|
|
239
229
|
i0.ɵɵelementEnd();
|
|
240
230
|
} if (rf & 2) {
|
|
241
231
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -339,7 +329,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
339
329
|
}
|
|
340
330
|
catch { /* ignore — server-side render or odd URL */ }
|
|
341
331
|
// Sync min relevance to URL query param
|
|
342
|
-
this.
|
|
332
|
+
this.UpdateQueryParams({ minRelevance: String(this.MinScorePercent) });
|
|
343
333
|
if (this.CurrentQuery) {
|
|
344
334
|
await this.ExecuteSearch(this.CurrentQuery);
|
|
345
335
|
}
|
|
@@ -375,12 +365,12 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
375
365
|
OnFiltersCleared() {
|
|
376
366
|
this.ActiveFilters = {};
|
|
377
367
|
this.MinScorePercent = 30;
|
|
378
|
-
this.
|
|
368
|
+
this.UpdateQueryParams({ minRelevance: '30' });
|
|
379
369
|
this.applyClientFilters();
|
|
380
370
|
}
|
|
381
371
|
OnMinScoreChanged(percent) {
|
|
382
372
|
this.MinScorePercent = percent;
|
|
383
|
-
this.
|
|
373
|
+
this.UpdateQueryParams({ minRelevance: String(percent) });
|
|
384
374
|
if (percent < this.serverMinScorePercent && this.CurrentQuery) {
|
|
385
375
|
// User lowered below what server filtered — need to re-query with lower threshold
|
|
386
376
|
this.ExecuteSearch(this.CurrentQuery);
|
|
@@ -845,12 +835,12 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
845
835
|
]);
|
|
846
836
|
}
|
|
847
837
|
static ɵfac = /*@__PURE__*/ (() => { let ɵSearchResultsResource_BaseFactory; return function SearchResultsResource_Factory(__ngFactoryType__) { return (ɵSearchResultsResource_BaseFactory || (ɵSearchResultsResource_BaseFactory = i0.ɵɵgetInheritedFactory(SearchResultsResource)))(__ngFactoryType__ || SearchResultsResource); }; })();
|
|
848
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SearchResultsResource, selectors: [["mj-search-results-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 6, vars: 5, consts: [[1, "search-results-page"], ["aria-live", "polite", 1, "streaming-status-strip"], [1, "search-header"], [1, "search-loading"], [1, "search-no-results"], [1, "search-results-body-wrapper"], [1, "streaming-chip", 3, "streaming-chip-error", "streaming-chip-completed"], [1, "streaming-chip", "streaming-chip-pending"], [1, "streaming-chip"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "streaming-chip-name"], [1, "streaming-chip-time"], [1, "streaming-chip-count"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "search-header-left"], ["title", "Show filters", 1, "sr-icon-btn"], [1, "search-meta"], [1, "search-header-right"], [1, "sr-refine-wrapper"], [1, "fa-solid", "fa-filter-list", "sr-refine-icon"], ["placeholder", "Filter within results...", 1, "mj-input", "sr-refine-input", 3, "input", "value"], [1, "sr-refine-clear"], [1, "mj-input", "sr-sort-select", 3, "change", "value"], ["value", "score"], ["value", "title"], ["value", "entity"], [1, "sr-view-toggle"], ["title", "List view", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Tag cloud view", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-cloud"], ["title", "Refresh search", 1, "sr-icon-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrows-rotate"], ["title", "Show filters", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "sr-refine-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Searching...", "size", "medium"], [1, "
|
|
838
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SearchResultsResource, selectors: [["mj-search-results-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 6, vars: 5, consts: [[1, "search-results-page"], ["aria-live", "polite", 1, "streaming-status-strip"], [1, "search-header"], [1, "search-loading"], ["Variant", "no-results", "Icon", "fa-solid fa-magnifying-glass-minus", "Title", "No results found", "Message", "Try different keywords or broaden your search.", 1, "search-no-results"], [1, "search-results-body-wrapper"], [1, "streaming-chip", 3, "streaming-chip-error", "streaming-chip-completed"], [1, "streaming-chip", "streaming-chip-pending"], [1, "streaming-chip"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "streaming-chip-name"], [1, "streaming-chip-time"], [1, "streaming-chip-count"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "search-header-left"], ["title", "Show filters", 1, "sr-icon-btn"], [1, "search-meta"], [1, "search-header-right"], [1, "sr-refine-wrapper"], [1, "fa-solid", "fa-filter-list", "sr-refine-icon"], ["placeholder", "Filter within results...", 1, "mj-input", "sr-refine-input", 3, "input", "value"], [1, "sr-refine-clear"], [1, "mj-input", "sr-sort-select", 3, "change", "value"], ["value", "score"], ["value", "title"], ["value", "entity"], [1, "sr-view-toggle"], ["title", "List view", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Tag cloud view", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-cloud"], ["title", "Refresh search", 1, "sr-icon-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrows-rotate"], ["title", "Show filters", 1, "sr-icon-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "sr-refine-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Searching...", "size", "medium"], [1, "search-requery-overlay"], [1, "search-cloud-wrapper"], [1, "search-body"], ["text", "Updating results...", "size", "medium"], ["text", "Loading tag cloud...", "size", "medium"], ["ColorMode", "weight-gradient", 3, "Items", "MaxItems", "Interactive"], ["ColorMode", "weight-gradient", 3, "ItemClick", "Items", "MaxItems", "Interactive"], [3, "Filters", "ActiveFilters", "ShowRelevanceSlider", "MinScorePercent", "ServerMinScorePercent"], [3, "FlatResults", "HighlightText", "ShowScores", "ShowTags", "ShowSummary", "PageSize"], ["Variant", "no-results", "Icon", "fa-solid fa-filter-circle-xmark", "Title", "No results match current filters. Try lowering the minimum relevance.", 1, "search-no-results-inline"], [3, "FilterChanged", "FiltersCleared", "CloseRequested", "MinScoreChanged", "Filters", "ActiveFilters", "ShowRelevanceSlider", "MinScorePercent", "ServerMinScorePercent"], [3, "ResultSelected", "OpenRecordRequested", "FlatResults", "HighlightText", "ShowScores", "ShowTags", "ShowSummary", "PageSize"]], template: function SearchResultsResource_Template(rf, ctx) { if (rf & 1) {
|
|
849
839
|
i0.ɵɵelementStart(0, "div", 0);
|
|
850
840
|
i0.ɵɵconditionalCreate(1, SearchResultsResource_Conditional_1_Template, 4, 1, "div", 1);
|
|
851
841
|
i0.ɵɵconditionalCreate(2, SearchResultsResource_Conditional_2_Template, 24, 16, "div", 2);
|
|
852
842
|
i0.ɵɵconditionalCreate(3, SearchResultsResource_Conditional_3_Template, 2, 0, "div", 3);
|
|
853
|
-
i0.ɵɵconditionalCreate(4, SearchResultsResource_Conditional_4_Template,
|
|
843
|
+
i0.ɵɵconditionalCreate(4, SearchResultsResource_Conditional_4_Template, 1, 0, "mj-empty-state", 4);
|
|
854
844
|
i0.ɵɵconditionalCreate(5, SearchResultsResource_Conditional_5_Template, 4, 2, "div", 5);
|
|
855
845
|
i0.ɵɵelementEnd();
|
|
856
846
|
} if (rf & 2) {
|
|
@@ -864,7 +854,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
864
854
|
i0.ɵɵconditional(!ctx.IsSearching && ctx.ServerResultCount === 0 && ctx.HasSearched ? 4 : -1);
|
|
865
855
|
i0.ɵɵadvance();
|
|
866
856
|
i0.ɵɵconditional(ctx.ServerResultCount > 0 ? 5 : -1);
|
|
867
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i2.LoadingComponent, i3.SearchResultsComponent, i3.SearchFilterComponent, i4.MJWordCloudComponent], styles: [".search-results-page[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n }\n .search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n .search-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n white-space: nowrap;\n }\n .sr-icon-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-size: 13px;\n flex-shrink: 0;\n }\n .sr-icon-btn[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .sr-icon-btn[_ngcontent-%COMP%]:disabled { opacity: 0.4; cursor: default; }\n .sr-refine-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n }\n .sr-refine-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 8px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n }\n .sr-refine-input[_ngcontent-%COMP%] {\n padding: 5px 28px 5px 26px;\n font-size: 12px;\n width: 180px;\n border-radius: 6px;\n }\n .sr-refine-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 2px;\n }\n .sr-refine-clear[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n .sr-sort-select[_ngcontent-%COMP%] {\n padding: 5px 24px 5px 8px;\n font-size: 12px;\n border-radius: 6px;\n min-width: 130px;\n }\n .search-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 60px 0;\n }\n .search-body[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n gap: 16px;\n padding: 16px 24px;\n overflow: hidden;\n }\n .search-body[_ngcontent-%COMP%] mj-search-filter[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 240px;\n overflow-y: auto;\n }\n .search-body[_ngcontent-%COMP%] mj-search-results[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n }\n .search-
|
|
857
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i2.LoadingComponent, i3.SearchResultsComponent, i3.SearchFilterComponent, i4.MJWordCloudComponent, i5.MJEmptyStateComponent], styles: [".search-results-page[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n }\n .search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n .search-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-meta[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n white-space: nowrap;\n }\n .sr-icon-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-size: 13px;\n flex-shrink: 0;\n }\n .sr-icon-btn[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .sr-icon-btn[_ngcontent-%COMP%]:disabled { opacity: 0.4; cursor: default; }\n .sr-refine-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n }\n .sr-refine-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 8px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n }\n .sr-refine-input[_ngcontent-%COMP%] {\n padding: 5px 28px 5px 26px;\n font-size: 12px;\n width: 180px;\n border-radius: 6px;\n }\n .sr-refine-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 2px;\n }\n .sr-refine-clear[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n .sr-sort-select[_ngcontent-%COMP%] {\n padding: 5px 24px 5px 8px;\n font-size: 12px;\n border-radius: 6px;\n min-width: 130px;\n }\n .search-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 60px 0;\n }\n .search-body[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n gap: 16px;\n padding: 16px 24px;\n overflow: hidden;\n }\n .search-body[_ngcontent-%COMP%] mj-search-filter[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 240px;\n overflow-y: auto;\n }\n .search-body[_ngcontent-%COMP%] mj-search-results[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n }\n .search-results-body-wrapper[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .search-requery-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-page) 75%, transparent);\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .search-no-results-inline[_ngcontent-%COMP%] {\n flex: 1;\n }\n .sr-view-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 2px;\n background: var(--mj-bg-surface-sunken);\n }\n .sr-view-toggle[_ngcontent-%COMP%] .sr-icon-btn[_ngcontent-%COMP%] {\n border: none;\n border-radius: 4px;\n width: 28px;\n height: 26px;\n font-size: 12px;\n background: transparent;\n }\n .sr-view-toggle[_ngcontent-%COMP%] .sr-icon-btn.sr-view-active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n .search-cloud-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n padding: 24px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .search-cloud-wrapper[_ngcontent-%COMP%] mj-word-cloud[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n max-height: 600px;\n }\n .streaming-status-strip[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n .streaming-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n }\n .streaming-chip-pending[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n }\n .streaming-chip-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n }\n .streaming-chip-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n }\n .streaming-chip-name[_ngcontent-%COMP%] { font-weight: 500; }\n .streaming-chip-count[_ngcontent-%COMP%] { opacity: 0.7; }\n .streaming-chip-time[_ngcontent-%COMP%] { opacity: 0.6; font-size: 0.7rem; }"] });
|
|
868
858
|
};
|
|
869
859
|
SearchResultsResource = __decorate([
|
|
870
860
|
RegisterClass(BaseResourceComponent, 'SearchResultsResource')
|
|
@@ -970,11 +960,12 @@ export { SearchResultsResource };
|
|
|
970
960
|
|
|
971
961
|
<!-- No server results -->
|
|
972
962
|
@if (!IsSearching && ServerResultCount === 0 && HasSearched) {
|
|
973
|
-
<
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
963
|
+
<mj-empty-state
|
|
964
|
+
class="search-no-results"
|
|
965
|
+
Variant="no-results"
|
|
966
|
+
Icon="fa-solid fa-magnifying-glass-minus"
|
|
967
|
+
Title="No results found"
|
|
968
|
+
Message="Try different keywords or broaden your search." />
|
|
978
969
|
}
|
|
979
970
|
<!-- Results body (visible when server returned results) -->
|
|
980
971
|
@if (ServerResultCount > 0) {
|
|
@@ -1027,19 +1018,20 @@ export { SearchResultsResource };
|
|
|
1027
1018
|
(OpenRecordRequested)="OnOpenRecord($event)">
|
|
1028
1019
|
</mj-search-results>
|
|
1029
1020
|
} @else {
|
|
1030
|
-
<
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1021
|
+
<mj-empty-state
|
|
1022
|
+
class="search-no-results-inline"
|
|
1023
|
+
Variant="no-results"
|
|
1024
|
+
Icon="fa-solid fa-filter-circle-xmark"
|
|
1025
|
+
Title="No results match current filters. Try lowering the minimum relevance." />
|
|
1034
1026
|
}
|
|
1035
1027
|
</div>
|
|
1036
1028
|
}
|
|
1037
1029
|
</div>
|
|
1038
1030
|
}
|
|
1039
1031
|
</div>
|
|
1040
|
-
`, styles: ["\n .search-results-page {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n }\n .search-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n .search-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-meta {\n color: var(--mj-text-muted);\n font-size: 13px;\n white-space: nowrap;\n }\n .sr-icon-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-size: 13px;\n flex-shrink: 0;\n }\n .sr-icon-btn:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .sr-icon-btn:disabled { opacity: 0.4; cursor: default; }\n .sr-refine-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n .sr-refine-icon {\n position: absolute;\n left: 8px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n }\n .sr-refine-input {\n padding: 5px 28px 5px 26px;\n font-size: 12px;\n width: 180px;\n border-radius: 6px;\n }\n .sr-refine-clear {\n position: absolute;\n right: 6px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 2px;\n }\n .sr-refine-clear:hover { color: var(--mj-text-primary); }\n .sr-sort-select {\n padding: 5px 24px 5px 8px;\n font-size: 12px;\n border-radius: 6px;\n min-width: 130px;\n }\n .search-loading {\n display: flex;\n justify-content: center;\n padding: 60px 0;\n }\n .search-body {\n flex: 1;\n display: flex;\n gap: 16px;\n padding: 16px 24px;\n overflow: hidden;\n }\n .search-body mj-search-filter {\n flex-shrink: 0;\n width: 240px;\n overflow-y: auto;\n }\n .search-body mj-search-results {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n }\n .search-
|
|
1032
|
+
`, styles: ["\n .search-results-page {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n }\n .search-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n .search-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-meta {\n color: var(--mj-text-muted);\n font-size: 13px;\n white-space: nowrap;\n }\n .sr-icon-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-size: 13px;\n flex-shrink: 0;\n }\n .sr-icon-btn:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .sr-icon-btn:disabled { opacity: 0.4; cursor: default; }\n .sr-refine-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n .sr-refine-icon {\n position: absolute;\n left: 8px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n }\n .sr-refine-input {\n padding: 5px 28px 5px 26px;\n font-size: 12px;\n width: 180px;\n border-radius: 6px;\n }\n .sr-refine-clear {\n position: absolute;\n right: 6px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 2px;\n }\n .sr-refine-clear:hover { color: var(--mj-text-primary); }\n .sr-sort-select {\n padding: 5px 24px 5px 8px;\n font-size: 12px;\n border-radius: 6px;\n min-width: 130px;\n }\n .search-loading {\n display: flex;\n justify-content: center;\n padding: 60px 0;\n }\n .search-body {\n flex: 1;\n display: flex;\n gap: 16px;\n padding: 16px 24px;\n overflow: hidden;\n }\n .search-body mj-search-filter {\n flex-shrink: 0;\n width: 240px;\n overflow-y: auto;\n }\n .search-body mj-search-results {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n }\n .search-results-body-wrapper {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .search-requery-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-page) 75%, transparent);\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .search-no-results-inline {\n flex: 1;\n }\n .sr-view-toggle {\n display: flex;\n gap: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 2px;\n background: var(--mj-bg-surface-sunken);\n }\n .sr-view-toggle .sr-icon-btn {\n border: none;\n border-radius: 4px;\n width: 28px;\n height: 26px;\n font-size: 12px;\n background: transparent;\n }\n .sr-view-toggle .sr-icon-btn.sr-view-active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n .search-cloud-wrapper {\n flex: 1;\n padding: 24px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .search-cloud-wrapper mj-word-cloud {\n width: 100%;\n height: 100%;\n max-height: 600px;\n }\n .streaming-status-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n .streaming-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n }\n .streaming-chip-pending {\n color: var(--mj-text-muted);\n }\n .streaming-chip-completed {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n }\n .streaming-chip-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n }\n .streaming-chip-name { font-weight: 500; }\n .streaming-chip-count { opacity: 0.7; }\n .streaming-chip-time { opacity: 0.6; font-size: 0.7rem; }\n "] }]
|
|
1041
1033
|
}], null, null); })();
|
|
1042
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SearchResultsResource, { className: "SearchResultsResource", filePath: "src/lib/resource-wrappers/search-results-resource.component.ts", lineNumber:
|
|
1034
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SearchResultsResource, { className: "SearchResultsResource", filePath: "src/lib/resource-wrappers/search-results-resource.component.ts", lineNumber: 388 }); })();
|
|
1043
1035
|
export function LoadSearchResultsResource() {
|
|
1044
1036
|
// Tree-shaking prevention
|
|
1045
1037
|
}
|