@memberjunction/ng-explorer-core 6.1.0-edge.5 → 6.1.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/generated/lazy-feature-config.js +3 -3
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/about/about-dialog.component.js +4 -4
- package/dist/lib/about/about-dialog.component.js.map +1 -1
- package/dist/lib/command-palette/command-palette.component.js +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.js +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +1 -1
- package/dist/lib/oauth/oauth-callback.component.js +1 -1
- package/dist/lib/omnibar/omnibar-palette.component.d.ts.map +1 -1
- package/dist/lib/omnibar/omnibar-palette.component.js +9 -3
- package/dist/lib/omnibar/omnibar-palette.component.js.map +1 -1
- package/dist/lib/omnibar/providers/omnibar-record.provider.d.ts.map +1 -1
- package/dist/lib/omnibar/providers/omnibar-record.provider.js +9 -3
- package/dist/lib/omnibar/providers/omnibar-record.provider.js.map +1 -1
- package/dist/lib/profile/profile-dialog.component.js +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +6 -14
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/list-detail-resource.component.js +1 -1
- package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/query-resource.component.js +1 -1
- package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/record-resource.component.d.ts +3 -0
- package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/record-resource.component.js +18 -4
- package/dist/lib/resource-wrappers/record-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 +6 -2
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +6 -3
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +2 -2
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +82 -83
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/components/record-open/record-bar.component.js +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
- package/dist/lib/shell/components/record-open/record-switcher-sheet.component.js +1 -1
- package/dist/lib/shell/components/record-open/records-hub-pill.component.js +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts +25 -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 +88 -4
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/services/sharing-center-dialog-host.component.js +2 -2
- package/dist/lib/shell/services/sharing-center-dialog-host.component.js.map +1 -1
- package/dist/lib/shell/shell-chrome-policy.d.ts +54 -0
- package/dist/lib/shell/shell-chrome-policy.d.ts.map +1 -0
- package/dist/lib/shell/shell-chrome-policy.js +62 -0
- package/dist/lib/shell/shell-chrome-policy.js.map +1 -0
- package/dist/lib/shell/shell.component.d.ts +19 -0
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +190 -119
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts +9 -0
- 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 +34 -15
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +10 -0
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +23 -3
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +5 -2
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +11 -12
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +62 -62
|
@@ -785,7 +785,7 @@ let ConversationFeedbackResource = class ConversationFeedbackResource extends Ba
|
|
|
785
785
|
i0.ɵɵclassProp("open", !!ctx.selectedRow);
|
|
786
786
|
i0.ɵɵadvance();
|
|
787
787
|
i0.ɵɵconditional((tmp_4_0 = ctx.selectedRow) ? 5 : -1, tmp_4_0);
|
|
788
|
-
} }, dependencies: [i1.NgClass, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i4.PaginationComponent, i3.MJEmptyStateComponent, i3.MJAlertComponent, i1.DecimalPipe, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.feedback-container[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n overflow: hidden;\n}\n\n\n\n\n\n.sticky-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n z-index: 10;\n}\n\n\n\n\n\n.page-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem 1.5rem;\n}\n\n.page-title-area[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 0.75rem; }\n\n.page-icon[_ngcontent-%COMP%] {\n width: 40px; height: 40px;\n display: flex; align-items: center; justify-content: center;\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n border-radius: var(--mj-radius-md);\n font-size: 1.125rem;\n}\n\n.page-title[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n font-weight: 700;\n margin: 0;\n letter-spacing: -0.02em;\n color: var(--mj-text-primary);\n}\n\n.page-subtitle[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.page-actions[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 0.5rem; }\n\n.btn-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.875rem;\n font-size: 0.8125rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 180ms, border-color 180ms, color 180ms;\n}\n.btn-action[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n.btn-action[_ngcontent-%COMP%]:disabled { opacity: 0.5; cursor: default; }\n\n\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n padding: 0 1.5rem 1rem;\n}\n\n@media (min-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n }\n}\n\n.stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n padding: 1rem 1.25rem;\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-lg);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n.stat-icon-total[_ngcontent-%COMP%] {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n.stat-icon-avg[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-tertiary) 16%, transparent);\n color: var(--mj-brand-tertiary);\n}\n.stat-icon-positive[_ngcontent-%COMP%] {\n background: var(--rating-high-bg, #ecfdf5);\n color: var(--rating-high, #10b981);\n}\n.stat-icon-negative[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.stat-content[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: var(--mj-text-primary);\n line-height: 1.1;\n}\n.stat-unit[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-left: 2px;\n}\n.stat-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n margin-top: 0.125rem;\n}\n\n.rating-high-text[_ngcontent-%COMP%] { color: var(--rating-high, #10b981); }\n.rating-low-text[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n\n\n\n\n.filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 0.75rem 1.5rem 1rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.filter-row[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.3rem;\n}\n\n.filter-search[_ngcontent-%COMP%] {\n flex: 0 1 auto;\n width: 280px;\n min-width: 200px;\n max-width: 360px;\n}\n\n.filter-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n}\n\n.btn-group[_ngcontent-%COMP%] { display: flex; gap: 0; }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:first-child { border-radius: var(--mj-radius-sm) 0 0 var(--mj-radius-sm); }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:last-child { border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0; }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:not(:first-child) { margin-left: -1px; }\n\n.btn-filter[_ngcontent-%COMP%] {\n padding: 0.4rem 0.75rem;\n font-size: 0.8125rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 180ms, color 180ms, border-color 180ms;\n white-space: nowrap;\n}\n.btn-filter[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n.btn-filter.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n z-index: 1;\n position: relative;\n}\n.btn-filter.band-high.active[_ngcontent-%COMP%] {\n background: var(--rating-high, #10b981);\n border-color: var(--rating-high, #10b981);\n color: var(--mj-text-inverse);\n}\n.btn-filter.band-mid.active[_ngcontent-%COMP%] {\n background: var(--rating-mid, #f59e0b);\n border-color: var(--rating-mid, #f59e0b);\n color: var(--mj-text-inverse);\n}\n.btn-filter.band-low.active[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.input-search[_ngcontent-%COMP%] {\n padding: 0.45rem 0.75rem;\n font-size: 0.875rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n width: 100%;\n}\n.input-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n\n.diagnostic-line[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n\n\n\n\n.feedback-error-spacing[_ngcontent-%COMP%] { margin: 0 1.5rem 0.75rem; }\n\n\n\n\n\n.scrollable-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 1.25rem 1.5rem 1.5rem;\n}\n\n.loading-overlay[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.625rem;\n padding: 3rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 500;\n}\n.spinner[_ngcontent-%COMP%] {\n width: 20px; height: 20px;\n border: 2px solid var(--mj-border-default);\n border-top-color: var(--mj-brand-primary);\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.6s linear infinite;\n}\n@keyframes _ngcontent-%COMP%_spin { to { transform: rotate(360deg); } }\n\n\n\n\n\n.feedback-empty-state[_ngcontent-%COMP%] {\n display: block;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n}\n\n\n\n\n\n.feedback-table-wrapper[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n overflow: auto;\n}\n\n.feedback-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8125rem;\n table-layout: fixed;\n}\n\n.feedback-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n.feedback-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n padding: 0.75rem 0.875rem;\n}\n.feedback-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.875rem;\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n vertical-align: top;\n}\n\n.feedback-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 180ms;\n}\n.feedback-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.feedback-row.expanded[_ngcontent-%COMP%] { background: var(--mj-brand-accent-subtle); }\n\n.col-rating[_ngcontent-%COMP%] { width: 90px; }\n.col-comment[_ngcontent-%COMP%] { width: 28%; }\n.col-agent[_ngcontent-%COMP%] { width: 14%; }\n.col-message[_ngcontent-%COMP%] { width: 26%; }\n.col-rater[_ngcontent-%COMP%] { width: 16%; }\n.col-when[_ngcontent-%COMP%] { width: 12%; }\n\n.rating-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: baseline;\n gap: 2px;\n padding: 0.35rem 0.625rem;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n}\n.rating-badge[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 500;\n opacity: 0.7;\n}\n.rating-badge.rating-high[_ngcontent-%COMP%] { background: var(--rating-high-bg, #ecfdf5); color: var(--rating-high, #10b981); }\n.rating-badge.rating-mid[_ngcontent-%COMP%] { background: var(--rating-mid-bg, #fffbeb); color: var(--rating-mid, #f59e0b); }\n.rating-badge.rating-low[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.comment-text[_ngcontent-%COMP%] {\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n.comment-text.clamped[_ngcontent-%COMP%] {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-clamp: 2;\n overflow: hidden;\n}\n.message-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-clamp: 2;\n overflow: hidden;\n}\n\n\n\n.pagination-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-top: 0.5rem;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n.pagination-summary[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-secondary);\n padding: 0.5rem 0;\n}\n.feedback-pagination[_ngcontent-%COMP%] {\n display: block;\n flex: 1;\n min-width: 0;\n}\n\n.page-size-control[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n.page-size-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n}\n.page-size-select[_ngcontent-%COMP%] {\n padding: 0.3rem 0.5rem;\n font-size: 0.8125rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n.page-size-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n\n.agent-name[_ngcontent-%COMP%] { font-weight: 500; color: var(--mj-text-primary); }\n.rater-name[_ngcontent-%COMP%] { font-weight: 500; color: var(--mj-text-primary); }\n.rater-email[_ngcontent-%COMP%] { font-size: 0.6875rem; color: var(--mj-text-secondary); margin-top: 2px; }\n.when[_ngcontent-%COMP%] { color: var(--mj-text-secondary); font-size: 0.75rem; white-space: nowrap; }\n.muted[_ngcontent-%COMP%] { color: var(--mj-text-secondary); font-style: italic; }\n\n\n\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay, rgba(28, 28, 34, 0.45));\n z-index: 100;\n animation: _ngcontent-%COMP%_feedback-fadeIn 0.2s ease;\n}\n@keyframes _ngcontent-%COMP%_feedback-fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n width: 560px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay, rgba(0, 0, 0, 0.25));\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n.slideout-panel.open[_ngcontent-%COMP%] { transform: translateX(0); }\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n padding: 20px 24px;\n background: var(--mj-brand-accent-subtle);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.slideout-title[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 22px;\n flex-shrink: 0;\n line-height: 1.2;\n}\n.slideout-title-text[_ngcontent-%COMP%] { min-width: 0; }\n.slideout-title-line[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: 17px;\n color: var(--mj-text-primary);\n margin: 0 0 6px;\n line-height: 1.3;\n word-break: break-word;\n}\n.slideout-subtitle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n flex-wrap: wrap;\n}\n.slideout-subtitle[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; }\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-hover);\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n background: var(--mj-bg-surface);\n}\n.slideout-section[_ngcontent-%COMP%] {\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.slideout-section[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n.section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n margin-bottom: 0.5rem;\n}\n.comment-body[_ngcontent-%COMP%] {\n font-size: 14px;\n line-height: 1.55;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n.comment-body.muted[_ngcontent-%COMP%] { font-style: italic; color: var(--mj-text-secondary); }\n\n.meta-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n}\n.meta-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 0.75rem 0.875rem;\n}\n.meta-label[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n.meta-value[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-word;\n}\n\n.message-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n overflow: hidden;\n}\n.message-card-header[_ngcontent-%COMP%] {\n padding: 0.75rem 1.125rem;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n font-size: 0.8125rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.message-card-body[_ngcontent-%COMP%] {\n padding: 1rem 1.125rem;\n font-size: 0.875rem;\n line-height: 1.55;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 320px;\n overflow-y: auto;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.slideout-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] { min-width: 96px; }\n.slideout-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 6px; }"] });
|
|
788
|
+
} }, dependencies: [i1.NgClass, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i4.PaginationComponent, i3.MJEmptyStateComponent, i3.MJAlertComponent, i1.DecimalPipe, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.feedback-container[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n overflow: hidden;\n}\n\n\n\n\n.sticky-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n z-index: 10;\n}\n\n\n\n\n.page-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem 1.5rem;\n}\n\n.page-title-area[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 0.75rem; }\n\n.page-icon[_ngcontent-%COMP%] {\n width: 40px; height: 40px;\n display: flex; align-items: center; justify-content: center;\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n border-radius: var(--mj-radius-md);\n font-size: 1.125rem;\n}\n\n.page-title[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n font-weight: 700;\n margin: 0;\n letter-spacing: -0.02em;\n color: var(--mj-text-primary);\n}\n\n.page-subtitle[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.page-actions[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 0.5rem; }\n\n.btn-action[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.875rem;\n font-size: 0.8125rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 180ms, border-color 180ms, color 180ms;\n}\n.btn-action[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n.btn-action[_ngcontent-%COMP%]:disabled { opacity: 0.5; cursor: default; }\n\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n padding: 0 1.5rem 1rem;\n}\n\n@media (min-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n }\n}\n\n.stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n padding: 1rem 1.25rem;\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-lg);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n.stat-icon-total[_ngcontent-%COMP%] {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n.stat-icon-avg[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-tertiary) 16%, transparent);\n color: var(--mj-brand-tertiary);\n}\n.stat-icon-positive[_ngcontent-%COMP%] {\n background: var(--rating-high-bg, #ecfdf5);\n color: var(--rating-high, #10b981);\n}\n.stat-icon-negative[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.stat-content[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: var(--mj-text-primary);\n line-height: 1.1;\n}\n.stat-unit[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n font-weight: 500;\n margin-left: 2px;\n}\n.stat-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n margin-top: 0.125rem;\n}\n\n.rating-high-text[_ngcontent-%COMP%] { color: var(--rating-high, #10b981); }\n.rating-low-text[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n\n\n\n.filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 0.75rem 1.5rem 1rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.filter-row[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.3rem;\n}\n\n.filter-search[_ngcontent-%COMP%] {\n flex: 0 1 auto;\n width: 280px;\n min-width: 200px;\n max-width: 360px;\n}\n\n.filter-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n}\n\n.btn-group[_ngcontent-%COMP%] { display: flex; gap: 0; }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:first-child { border-radius: var(--mj-radius-sm) 0 0 var(--mj-radius-sm); }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:last-child { border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0; }\n.btn-group[_ngcontent-%COMP%] .btn-filter[_ngcontent-%COMP%]:not(:first-child) { margin-left: -1px; }\n\n.btn-filter[_ngcontent-%COMP%] {\n padding: 0.4rem 0.75rem;\n font-size: 0.8125rem;\n font-weight: 500;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 180ms, color 180ms, border-color 180ms;\n white-space: nowrap;\n}\n.btn-filter[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n.btn-filter.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n z-index: 1;\n position: relative;\n}\n.btn-filter.band-high.active[_ngcontent-%COMP%] {\n background: var(--rating-high, #10b981);\n border-color: var(--rating-high, #10b981);\n color: var(--mj-text-inverse);\n}\n.btn-filter.band-mid.active[_ngcontent-%COMP%] {\n background: var(--rating-mid, #f59e0b);\n border-color: var(--rating-mid, #f59e0b);\n color: var(--mj-text-inverse);\n}\n.btn-filter.band-low.active[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.input-search[_ngcontent-%COMP%] {\n padding: 0.45rem 0.75rem;\n font-size: 0.875rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n width: 100%;\n}\n.input-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n\n.diagnostic-line[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n\n\n\n.feedback-error-spacing[_ngcontent-%COMP%] { margin: 0 1.5rem 0.75rem; }\n\n\n\n\n.scrollable-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 1.25rem 1.5rem 1.5rem;\n}\n\n.loading-overlay[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.625rem;\n padding: 3rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 500;\n}\n.spinner[_ngcontent-%COMP%] {\n width: 20px; height: 20px;\n border: 2px solid var(--mj-border-default);\n border-top-color: var(--mj-brand-primary);\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.6s linear infinite;\n}\n@keyframes _ngcontent-%COMP%_spin { to { transform: rotate(360deg); } }\n\n\n\n\n.feedback-empty-state[_ngcontent-%COMP%] {\n display: block;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n}\n\n\n\n\n.feedback-table-wrapper[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n overflow: auto;\n}\n\n.feedback-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8125rem;\n table-layout: fixed;\n}\n\n.feedback-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n.feedback-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n padding: 0.75rem 0.875rem;\n}\n.feedback-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0.875rem;\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n vertical-align: top;\n}\n\n.feedback-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 180ms;\n}\n.feedback-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.feedback-row.expanded[_ngcontent-%COMP%] { background: var(--mj-brand-accent-subtle); }\n\n.col-rating[_ngcontent-%COMP%] { width: 90px; }\n.col-comment[_ngcontent-%COMP%] { width: 28%; }\n.col-agent[_ngcontent-%COMP%] { width: 14%; }\n.col-message[_ngcontent-%COMP%] { width: 26%; }\n.col-rater[_ngcontent-%COMP%] { width: 16%; }\n.col-when[_ngcontent-%COMP%] { width: 12%; }\n\n.rating-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: baseline;\n gap: 2px;\n padding: 0.35rem 0.625rem;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n}\n.rating-badge[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n font-weight: 500;\n opacity: 0.7;\n}\n.rating-badge.rating-high[_ngcontent-%COMP%] { background: var(--rating-high-bg, #ecfdf5); color: var(--rating-high, #10b981); }\n.rating-badge.rating-mid[_ngcontent-%COMP%] { background: var(--rating-mid-bg, #fffbeb); color: var(--rating-mid, #f59e0b); }\n.rating-badge.rating-low[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error); }\n\n.comment-text[_ngcontent-%COMP%] {\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n}\n.comment-text.clamped[_ngcontent-%COMP%] {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-clamp: 2;\n overflow: hidden;\n}\n.message-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-clamp: 2;\n overflow: hidden;\n}\n\n\n.pagination-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-top: 0.5rem;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n.pagination-summary[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-secondary);\n padding: 0.5rem 0;\n}\n.feedback-pagination[_ngcontent-%COMP%] {\n display: block;\n flex: 1;\n min-width: 0;\n}\n\n.page-size-control[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n flex-shrink: 0;\n}\n.page-size-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n}\n.page-size-select[_ngcontent-%COMP%] {\n padding: 0.3rem 0.5rem;\n font-size: 0.8125rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n.page-size-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n\n.agent-name[_ngcontent-%COMP%] { font-weight: 500; color: var(--mj-text-primary); }\n.rater-name[_ngcontent-%COMP%] { font-weight: 500; color: var(--mj-text-primary); }\n.rater-email[_ngcontent-%COMP%] { font-size: 0.6875rem; color: var(--mj-text-secondary); margin-top: 2px; }\n.when[_ngcontent-%COMP%] { color: var(--mj-text-secondary); font-size: 0.75rem; white-space: nowrap; }\n.muted[_ngcontent-%COMP%] { color: var(--mj-text-secondary); font-style: italic; }\n\n\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay, rgba(28, 28, 34, 0.45));\n z-index: 100;\n animation: _ngcontent-%COMP%_feedback-fadeIn 0.2s ease;\n}\n@keyframes _ngcontent-%COMP%_feedback-fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n width: 560px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px var(--mj-bg-overlay, rgba(0, 0, 0, 0.25));\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n.slideout-panel.open[_ngcontent-%COMP%] { transform: translateX(0); }\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n padding: 20px 24px;\n background: var(--mj-brand-accent-subtle);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.slideout-title[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 22px;\n flex-shrink: 0;\n line-height: 1.2;\n}\n.slideout-title-text[_ngcontent-%COMP%] { min-width: 0; }\n.slideout-title-line[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: 17px;\n color: var(--mj-text-primary);\n margin: 0 0 6px;\n line-height: 1.3;\n word-break: break-word;\n}\n.slideout-subtitle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n flex-wrap: wrap;\n}\n.slideout-subtitle[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; }\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-hover);\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n background: var(--mj-bg-surface);\n}\n.slideout-section[_ngcontent-%COMP%] {\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.slideout-section[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n.section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n margin-bottom: 0.5rem;\n}\n.comment-body[_ngcontent-%COMP%] {\n font-size: 14px;\n line-height: 1.55;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n.comment-body.muted[_ngcontent-%COMP%] { font-style: italic; color: var(--mj-text-secondary); }\n\n.meta-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n}\n.meta-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 0.75rem 0.875rem;\n}\n.meta-label[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary);\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n.meta-value[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-word;\n}\n\n.message-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n overflow: hidden;\n}\n.message-card-header[_ngcontent-%COMP%] {\n padding: 0.75rem 1.125rem;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n font-size: 0.8125rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.message-card-body[_ngcontent-%COMP%] {\n padding: 1rem 1.125rem;\n font-size: 0.875rem;\n line-height: 1.55;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 320px;\n overflow-y: auto;\n}\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.slideout-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] { min-width: 96px; }\n.slideout-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 6px; }"] });
|
|
789
789
|
};
|
|
790
790
|
ConversationFeedbackResource = __decorate([
|
|
791
791
|
RegisterClass(BaseResourceComponent, 'ConversationFeedbackResource')
|
|
@@ -547,7 +547,7 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
547
547
|
i0.ɵɵproperty("disabled", !ctx.hasChanges || ctx.saving);
|
|
548
548
|
i0.ɵɵadvance();
|
|
549
549
|
i0.ɵɵconditional(ctx.saving ? 19 : 20);
|
|
550
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CdkDropList, i2.CdkDrag, i3.LoadingComponent, i4.MJDialogComponent, i4.MJDialogActionsComponent, i4.MJEmptyStateComponent], styles: [".dashboard-preferences-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] {\n margin-top: 12px;\n display: flex;\n gap: 20px;\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n flex-direction: column;\n gap: 12px;\n}\n\n.preferences-panels[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n height: 100%;\n}\n\n.panel[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.dashboard-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n\n.dashboard-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n cursor: move;\n}\n\n.dashboard-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.dashboard-item.cdk-drag-preview[_ngcontent-%COMP%] {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: rotate(2deg);\n}\n\n.dashboard-item.cdk-drag-placeholder[_ngcontent-%COMP%] {\n opacity: 0.3;\n border-style: dashed;\n}\n\n.dashboard-item-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px;\n gap: 12px;\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n cursor: move;\n font-size: 14px;\n}\n\n.order-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: var(--mj-brand-primary);\n color: white;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.dashboard-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dashboard-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n}\n\n.dashboard-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n}\n\n.add-button[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-success);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n opacity: 0.7;\n}\n\n.add-button[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n opacity: 1;\n}\n\n.remove-button[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-error);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n}\n\n.remove-button[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n}\n\n.cdk-drop-list-dragging[_ngcontent-%COMP%] .dashboard-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.dialog-footer[_ngcontent-%COMP%] {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n}\n\n.btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-text-muted);\n color: white;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: white;\n border-color: var(--mj-brand-primary);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n
|
|
550
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CdkDropList, i2.CdkDrag, i3.LoadingComponent, i4.MJDialogComponent, i4.MJDialogActionsComponent, i4.MJEmptyStateComponent], styles: [".dashboard-preferences-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] {\n margin-top: 12px;\n display: flex;\n gap: 20px;\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.preference-mode-selector[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n flex-direction: column;\n gap: 12px;\n}\n\n.preferences-panels[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n height: 100%;\n}\n\n.panel[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.dashboard-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n\n.dashboard-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n cursor: move;\n}\n\n.dashboard-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.dashboard-item.cdk-drag-preview[_ngcontent-%COMP%] {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: rotate(2deg);\n}\n\n.dashboard-item.cdk-drag-placeholder[_ngcontent-%COMP%] {\n opacity: 0.3;\n border-style: dashed;\n}\n\n.dashboard-item-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px;\n gap: 12px;\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n cursor: move;\n font-size: 14px;\n}\n\n.order-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: var(--mj-brand-primary);\n color: white;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.dashboard-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dashboard-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n}\n\n.dashboard-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n}\n\n.add-button[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-success);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n opacity: 0.7;\n}\n\n.add-button[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n opacity: 1;\n}\n\n.remove-button[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-status-error);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n}\n\n.remove-button[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n}\n\n.cdk-drop-list-dragging[_ngcontent-%COMP%] .dashboard-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.dialog-footer[_ngcontent-%COMP%] {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n background: var(--mj-bg-surface-card);\n}\n\n.btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-text-muted);\n color: white;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: white;\n border-color: var(--mj-brand-primary);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n@media (max-width: 768px) {\n .dashboard-preferences-dialog[_ngcontent-%COMP%] {\n width: 95vw;\n max-height: 90vh;\n }\n\n .preferences-panels[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .panel[_ngcontent-%COMP%] {\n min-height: 200px;\n }\n\n .dashboard-list[_ngcontent-%COMP%] {\n min-height: 150px;\n }\n}"] });
|
|
551
551
|
}
|
|
552
552
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardPreferencesDialogComponent, [{
|
|
553
553
|
type: Component,
|
|
@@ -399,7 +399,7 @@ export class OAuthCallbackComponent extends BaseAngularComponent {
|
|
|
399
399
|
i0.ɵɵconditional(ctx.HasError ? 3 : -1);
|
|
400
400
|
i0.ɵɵadvance();
|
|
401
401
|
i0.ɵɵconditional(!ctx.IsLoading && !ctx.HasError ? 4 : -1);
|
|
402
|
-
} }, dependencies: [i2.LoadingComponent, i3.MJButtonDirective], styles: [".oauth-callback-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n background: var(--mj-brand-primary);\n padding: 1rem;\n}\n\n.oauth-callback-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 3rem;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n text-align: center;\n max-width: 450px;\n width: 100%;\n}\n\n.oauth-status[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n}\n\n.oauth-status[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n}\n\n.oauth-status[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-muted);\n line-height: 1.6;\n}\n\n\n
|
|
402
|
+
} }, dependencies: [i2.LoadingComponent, i3.MJButtonDirective], styles: [".oauth-callback-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n background: var(--mj-brand-primary);\n padding: 1rem;\n}\n\n.oauth-callback-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 3rem;\n border-radius: 1rem;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n text-align: center;\n max-width: 450px;\n width: 100%;\n}\n\n.oauth-status[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n}\n\n.oauth-status[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n}\n\n.oauth-status[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-muted);\n line-height: 1.6;\n}\n\n\n.icon-container[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n}\n\n.success-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.success-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.error-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.error-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.oauth-status.success[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n.oauth-status.error[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.error-code[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 0.5rem 1rem;\n border-radius: 0.5rem;\n font-family: monospace;\n font-size: 0.875rem;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n padding: 1rem;\n border-radius: 0.5rem;\n font-size: 0.9rem;\n color: var(--mj-text-secondary);\n width: 100%;\n}\n\n\n.button-group[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n margin-top: 1rem;\n}\n\n.button-group[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n\n.oauth-status.loading[_ngcontent-%COMP%] {\n padding: 2rem 0;\n}\n\n\n@media (max-width: 480px) {\n .oauth-callback-card[_ngcontent-%COMP%] {\n padding: 2rem 1.5rem;\n }\n\n .button-group[_ngcontent-%COMP%] {\n flex-direction: column;\n width: 100%;\n }\n\n .button-group[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}"] });
|
|
403
403
|
}
|
|
404
404
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OAuthCallbackComponent, [{
|
|
405
405
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnibar-palette.component.d.ts","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-palette.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACgE,YAAY,EAC/E,SAAS,EACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAiB,eAAe,EAAE,MAAM,2BAA2B,CAAC;;AAS3E,qEAAqE;AACrE,UAAU,UAAU;IAChB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAgBD;;;;;;;GAOG;AACH,qBAOa,uBAAwB,YAAW,SAAS;IACrD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,IAAI,CAA+C;IAC3D,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAA2B;IAEhB,OAAO,CAAC,QAAQ,CAAC,CAA+B;IAE3E,yEAAyE;IAClE,MAAM,UAAS;IACtB,yDAAyD;IAClD,KAAK,SAAM;IACX,IAAI,EAAE,UAAU,EAAE,CAAM;IACxB,UAAU,EAAE,UAAU,EAAE,CAAM;IAC9B,aAAa,SAAK;IAClB,SAAS,UAAS;IAClB,MAAM,EAAE,eAAe,EAAE,CAAM;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAE7B,MAAM,qBAA4B;IAClC,MAAM,qBAA4B;IAC5C;;qEAEiE;IACvD,iBAAiB,qBAA4B;IAEvD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAA8C;IACpE,4EAA4E;IAC5E,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,UAAU,CAA6B;IAM/C,iEAAiE;IACjE,IAAW,iBAAiB,IAAI,MAAM,CAGrC;IAED,iDAAiD;IACjD,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,8DAA8D;IAC9D,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,0EAA0E;IACnE,eAAe,IAAI,IAAI;IAK9B,qEAAqE;IACrE,IAAW,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAIhE;IAED,kFAAkF;IAClF,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,OAAO,KAAK,cAAc,GAGzB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED;;;OAGG;IACH,IAAW,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAE7C;IAED,2EAA2E;IAC3E,IAAW,UAAU,IAAI,OAAO,CAE/B;IAMD,uFAAuF;IAChF,IAAI,CAAC,YAAY,SAAK,GAAG,IAAI;IAkB7B,KAAK,IAAI,IAAI;IAgBb,MAAM,CAAC,YAAY,SAAK,GAAG,IAAI;IAQtC,WAAW,IAAI,IAAI;IAWZ,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlC,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAyBjD;;;;;;;OAOG;IACI,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IA8CnD,oFAAoF;IAC7E,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAiB9E;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAcrB,0DAA0D;IACnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/B,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO7B,WAAW,IAAI,IAAI;IAS1B,uFAAuF;IAChF,OAAO,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"omnibar-palette.component.d.ts","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-palette.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -609,9 +609,15 @@ export class OmnibarPaletteComponent {
|
|
|
609
609
|
this.search.RecordRecentSearch(typed);
|
|
610
610
|
}
|
|
611
611
|
switch (nav.kind) {
|
|
612
|
-
case 'record':
|
|
613
|
-
|
|
612
|
+
case 'record': {
|
|
613
|
+
// `recordId` is a compact CompositeKey segment (bare value for a single-column key,
|
|
614
|
+
// "F1|v1||F2|v2" for a composite one) on an ARBITRARY entity, so the key column can
|
|
615
|
+
// have any name. `FromID` hardcoded `ID` and broke record-open for every entity whose
|
|
616
|
+
// key is called something else; resolve against the entity's metadata instead.
|
|
617
|
+
const entityInfo = this.search.Provider.EntityByName(nav.entityName);
|
|
618
|
+
this.navigation.OpenEntityRecord(nav.entityName, CompositeKey.FromURLSegment(entityInfo, nav.recordId));
|
|
614
619
|
break;
|
|
620
|
+
}
|
|
615
621
|
case 'entity-list':
|
|
616
622
|
this.navigation.OpenDynamicView(nav.entityName);
|
|
617
623
|
break;
|
|
@@ -817,7 +823,7 @@ export class OmnibarPaletteComponent {
|
|
|
817
823
|
i0.ɵɵconditionalCreate(0, OmnibarPaletteComponent_Conditional_0_Template, 36, 10);
|
|
818
824
|
} if (rf & 2) {
|
|
819
825
|
i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
|
|
820
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n\n\n.omnibar-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1400;\n}\n\n\n\n\n.omnibar-palette[_ngcontent-%COMP%] {\n position: fixed;\n left: 50%;\n top: calc(60px + var(--mj-connectivity-banner-height, 0px) + var(--mj-space-6));\n transform: translateX(-50%);\n width: min(680px, 92vw);\n \n\n\n\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 60px - var(--mj-connectivity-banner-height, 0px) - var(--mj-space-12));\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-xl);\n z-index: 1401;\n overflow: hidden;\n animation: _ngcontent-%COMP%_ob-pop .13s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_ob-pop {\n from { opacity: 0; transform: translateX(-50%) scale(.985) translateY(-4px); }\n to { opacity: 1; transform: translateX(-50%) scale(1); }\n}\n\n.ob-input-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-4) var(--mj-space-4) var(--mj-space-2);\n}\n\n\n\n.ob-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2-5);\n flex: 1;\n min-width: 0;\n height: 46px;\n padding: 0 var(--mj-space-3-5);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n transition: border-color var(--mj-transition-fast);\n}\n.ob-field[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.ob-lead[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 15px;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.ob-lead--trigger[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.ob-lead[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { font-family: ui-monospace, monospace; }\n\n.ob-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: 16px;\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n.ob-input[_ngcontent-%COMP%]::placeholder { color: var(--mj-text-muted); }\n\n.ob-mode-badge[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: .4px;\n text-transform: uppercase;\n padding: 3px 9px;\n border-radius: var(--mj-radius-full, 999px);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n white-space: nowrap;\n}\n\n.ob-kbd[_ngcontent-%COMP%] {\n font-family: inherit;\n font-size: 10.5px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-bottom-width: 2px;\n border-radius: 5px;\n padding: 1.5px 6px;\n}\n\n.ob-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-base);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n.ob-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.ob-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n}\n\n.ob-scopes[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n padding: 9px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-wrap: wrap;\n}\n\n.ob-scope[_ngcontent-%COMP%] {\n font-size: 11px;\n padding: 3px 10px;\n border-radius: var(--mj-radius-full, 999px);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n background: transparent;\n}\n\n.ob-scope--on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.ob-body[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n padding: 6px 0;\n}\n\n.ob-loading[_ngcontent-%COMP%], \n.ob-empty[_ngcontent-%COMP%] {\n padding: 18px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.ob-group-label[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: .6px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n padding: 10px 18px 5px;\n}\n\n.ob-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 9px 18px;\n cursor: pointer;\n}\n\n\n\n\n.ob-row[_ngcontent-%COMP%]:focus { outline: none; }\n.ob-row[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--mj-border-focus); outline-offset: -2px; }\n\n\n\n\n.ob-row--sel[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.ob-ric[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.ob-row--sel[_ngcontent-%COMP%] .ob-ric[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.ob-rmain[_ngcontent-%COMP%] { flex: 1; min-width: 0; display: flex; flex-direction: column; }\n\n.ob-rname[_ngcontent-%COMP%] {\n font-size: 13.5px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--mj-text-primary);\n}\n\n.ob-rsub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 1px;\n}\n\n.ob-raux[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }\n\n.ob-rtype[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: var(--mj-radius-full, 999px);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-transform: capitalize;\n}\n\n.ob-score[_ngcontent-%COMP%] {\n width: 52px;\n height: 4px;\n border-radius: 2px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.ob-score[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { display: block; height: 100%; background: var(--mj-brand-primary); }\n\n.ob-go[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n opacity: 0;\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.ob-row--sel[_ngcontent-%COMP%] .ob-go[_ngcontent-%COMP%] { opacity: 1; }\n\n.ob-hintbar[_ngcontent-%COMP%] { display: flex; gap: 8px; padding: 12px 18px; flex-wrap: wrap; }\n\n.ob-hint-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 9px 13px;\n border: 1px dashed var(--mj-border-strong);\n border-radius: 10px;\n cursor: pointer;\n background: transparent;\n}\n\n.ob-hint-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.ob-hint-chip[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { font-family: ui-monospace, monospace; color: var(--mj-brand-primary); font-size: 14px; }\n.ob-hint-chip[_ngcontent-%COMP%] span[_ngcontent-%COMP%] { font-size: 12px; color: var(--mj-text-secondary); }\n\n.ob-foot[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n font-size: 11.5px;\n color: var(--mj-text-muted);\n}\n\n.ob-k[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 5px; }\n\n\n\n\n\n.ob-settings[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n margin-left: auto;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-family: inherit;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n padding: var(--mj-space-1-5) var(--mj-space-2);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: background var(--mj-transition-fast), color var(--mj-transition-fast);\n}\n.ob-settings[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.ob-settings[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .omnibar-palette[_ngcontent-%COMP%] {\n animation: none;\n }\n}\n\n\n\n\n\n\n@media (max-width: 640px) {\n .omnibar-palette[_ngcontent-%COMP%] {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n width: 100%;\n height: 100dvh;\n max-height: none; \n\n border-radius: 0;\n animation: none; \n\n display: flex;\n flex-direction: column;\n }\n\n \n\n .ob-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n max-height: none;\n }\n\n \n\n\n\n\n .ob-kbd[_ngcontent-%COMP%], \n .ob-go[_ngcontent-%COMP%], \n .ob-k[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n .ob-close[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-base);\n }\n .ob-settings[_ngcontent-%COMP%] {\n min-height: 40px;\n font-size: var(--mj-text-base);\n }\n}"], changeDetection: 0 });
|
|
826
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n\n.omnibar-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1400;\n}\n\n\n\n.omnibar-palette[_ngcontent-%COMP%] {\n position: fixed;\n left: 50%;\n top: calc(60px + var(--mj-connectivity-banner-height, 0px) + var(--mj-space-6));\n transform: translateX(-50%);\n width: min(680px, 92vw);\n \n\n\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 60px - var(--mj-connectivity-banner-height, 0px) - var(--mj-space-12));\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-xl);\n z-index: 1401;\n overflow: hidden;\n animation: _ngcontent-%COMP%_ob-pop .13s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_ob-pop {\n from { opacity: 0; transform: translateX(-50%) scale(.985) translateY(-4px); }\n to { opacity: 1; transform: translateX(-50%) scale(1); }\n}\n\n.ob-input-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-4) var(--mj-space-4) var(--mj-space-2);\n}\n\n\n.ob-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2-5);\n flex: 1;\n min-width: 0;\n height: 46px;\n padding: 0 var(--mj-space-3-5);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n transition: border-color var(--mj-transition-fast);\n}\n.ob-field[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.ob-lead[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 15px;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.ob-lead--trigger[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.ob-lead[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { font-family: ui-monospace, monospace; }\n\n.ob-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: 16px;\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n.ob-input[_ngcontent-%COMP%]::placeholder { color: var(--mj-text-muted); }\n\n.ob-mode-badge[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: .4px;\n text-transform: uppercase;\n padding: 3px 9px;\n border-radius: var(--mj-radius-full, 999px);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n white-space: nowrap;\n}\n\n.ob-kbd[_ngcontent-%COMP%] {\n font-family: inherit;\n font-size: 10.5px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-bottom-width: 2px;\n border-radius: 5px;\n padding: 1.5px 6px;\n}\n\n.ob-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-base);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n.ob-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.ob-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n}\n\n.ob-scopes[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n padding: 9px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n flex-wrap: wrap;\n}\n\n.ob-scope[_ngcontent-%COMP%] {\n font-size: 11px;\n padding: 3px 10px;\n border-radius: var(--mj-radius-full, 999px);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n background: transparent;\n}\n\n.ob-scope--on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.ob-body[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n padding: 6px 0;\n}\n\n.ob-loading[_ngcontent-%COMP%], \n.ob-empty[_ngcontent-%COMP%] {\n padding: 18px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.ob-group-label[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: .6px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n padding: 10px 18px 5px;\n}\n\n.ob-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 9px 18px;\n cursor: pointer;\n}\n\n\n\n.ob-row[_ngcontent-%COMP%]:focus { outline: none; }\n.ob-row[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--mj-border-focus); outline-offset: -2px; }\n\n\n\n.ob-row--sel[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.ob-ric[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.ob-row--sel[_ngcontent-%COMP%] .ob-ric[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.ob-rmain[_ngcontent-%COMP%] { flex: 1; min-width: 0; display: flex; flex-direction: column; }\n\n.ob-rname[_ngcontent-%COMP%] {\n font-size: 13.5px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--mj-text-primary);\n}\n\n.ob-rsub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 1px;\n}\n\n.ob-raux[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }\n\n.ob-rtype[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: var(--mj-radius-full, 999px);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-transform: capitalize;\n}\n\n.ob-score[_ngcontent-%COMP%] {\n width: 52px;\n height: 4px;\n border-radius: 2px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.ob-score[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { display: block; height: 100%; background: var(--mj-brand-primary); }\n\n.ob-go[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n opacity: 0;\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.ob-row--sel[_ngcontent-%COMP%] .ob-go[_ngcontent-%COMP%] { opacity: 1; }\n\n.ob-hintbar[_ngcontent-%COMP%] { display: flex; gap: 8px; padding: 12px 18px; flex-wrap: wrap; }\n\n.ob-hint-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 9px 13px;\n border: 1px dashed var(--mj-border-strong);\n border-radius: 10px;\n cursor: pointer;\n background: transparent;\n}\n\n.ob-hint-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.ob-hint-chip[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { font-family: ui-monospace, monospace; color: var(--mj-brand-primary); font-size: 14px; }\n.ob-hint-chip[_ngcontent-%COMP%] span[_ngcontent-%COMP%] { font-size: 12px; color: var(--mj-text-secondary); }\n\n.ob-foot[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n font-size: 11.5px;\n color: var(--mj-text-muted);\n}\n\n.ob-k[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 5px; }\n\n\n\n\n.ob-settings[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n margin-left: auto;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-family: inherit;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n padding: var(--mj-space-1-5) var(--mj-space-2);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: background var(--mj-transition-fast), color var(--mj-transition-fast);\n}\n.ob-settings[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.ob-settings[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .omnibar-palette[_ngcontent-%COMP%] {\n animation: none;\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .omnibar-palette[_ngcontent-%COMP%] {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n width: 100%;\n height: 100dvh;\n max-height: none; \n border-radius: 0;\n animation: none; \n display: flex;\n flex-direction: column;\n }\n\n \n .ob-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n max-height: none;\n }\n\n \n\n\n\n .ob-kbd[_ngcontent-%COMP%], \n .ob-go[_ngcontent-%COMP%], \n .ob-k[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n .ob-close[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-base);\n }\n .ob-settings[_ngcontent-%COMP%] {\n min-height: 40px;\n font-size: var(--mj-text-base);\n }\n}"], changeDetection: 0 });
|
|
821
827
|
}
|
|
822
828
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OmnibarPaletteComponent, [{
|
|
823
829
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnibar-palette.component.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-palette.component.ts","../../../src/lib/omnibar/omnibar-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter,\n OnDestroy, Output, ViewChild, inject,\n} from '@angular/core';\nimport { CompositeKey, UserInfo } from '@memberjunction/core';\nimport { Metadata } from '@memberjunction/core';\nimport { MentionSuggestion } from '@memberjunction/ng-composer';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { SearchService, SearchScopeInfo } from '@memberjunction/ng-search';\nimport { FileOpenService } from '@memberjunction/ng-file-storage';\nimport { Subscription, firstValueFrom, skip } from 'rxjs';\nimport { CommandPaletteService } from '../command-palette/command-palette.service';\nimport {\n DiscoverOmnibarProviders, GetOmnibarNavPayload, OmnibarProvider,\n} from './omnibar-provider';\nimport { LoadOmnibarProviders } from './index';\n\n/** One rendered result row: the suggestion + presentation extras. */\ninterface OmnibarRow {\n Suggestion: MentionSuggestion;\n /** Set only on the FIRST row of each group — drives the section header. */\n GroupLabel: string | null;\n /** 0-100 relevance bar (search mode only). */\n ScorePercent: number | null;\n}\n\n/** Debounce for the default (network-backed) search mode; trigger modes serve warm caches. */\nconst SEARCH_DEBOUNCE_MS = 300;\n\n/**\n * Debounce for trigger modes (e.g. '#' jump-to-record). Entity-name matching is in-memory,\n * but the record-suggestion path issues a RunView per keystroke — firing on every character\n * floods MJAPI during a typing burst. A short debounce collapses rapid typing into a single\n * backend query while keeping the picker responsive.\n */\nconst TRIGGER_DEBOUNCE_MS = 150;\n\n/** Max suggestions requested per keystroke. */\nconst MAX_RESULTS = 9;\n\n/**\n * The unified Explorer command palette (Ctrl/Cmd+K): one surface for global\n * cross-source search (plain text), jump-to-record ('#'), commands & apps ('/'),\n * and agents ('@') — every mode a pluggable {@link OmnibarProvider}, discovered via\n * the MJ ClassFactory so OpenApps can add modes without touching this component.\n *\n * Design source of truth: plans/composer-adoption/mockups/omnibar-command-palette.html.\n */\n@Component({\n standalone: false,\n selector: 'mj-omnibar-palette',\n templateUrl: './omnibar-palette.component.html',\n styleUrls: ['./omnibar-palette.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OmnibarPaletteComponent implements OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private host = inject<ElementRef<HTMLElement>>(ElementRef);\n private navigation = inject(NavigationService);\n private appManager = inject(ApplicationManager);\n private search = inject(SearchService);\n private paletteService = inject(CommandPaletteService);\n private fileOpen = inject(FileOpenService);\n\n @ViewChild('paletteInput') private inputRef?: ElementRef<HTMLInputElement>;\n\n /** Palette visibility (open via {@link Open}; Escape/backdrop close). */\n public IsOpen = false;\n /** Raw input text including any leading trigger char. */\n public Query = '';\n public Rows: OmnibarRow[] = [];\n public RecentRows: OmnibarRow[] = [];\n public SelectedIndex = 0;\n public IsLoading = false;\n public Scopes: SearchScopeInfo[] = [];\n public SelectedScopeIDs: string[] = [];\n\n @Output() Opened = new EventEmitter<void>();\n @Output() Closed = new EventEmitter<void>();\n /** Footer gear clicked — the host opens its settings surface (Explorer: My\n Profile, where the Command Palette opt-in section lives). The palette\n closes first so the settings dialog isn't buried under it. */\n @Output() SettingsRequested = new EventEmitter<void>();\n\n private providers: OmnibarProvider[] = [];\n private defaultProvider: OmnibarProvider | null = null;\n private byTrigger = new Map<string, OmnibarProvider>();\n private queryGeneration = 0;\n private debounceHandle: ReturnType<typeof setTimeout> | null = null;\n /** Element focused before the palette opened — restored on close (a11y). */\n private previousFocus: HTMLElement | null = null;\n private recentsSub: Subscription | null = null;\n\n // ---------------------------------------------------------------\n // Derived view state\n // ---------------------------------------------------------------\n\n /** The active trigger char ('' = default/global-search mode). */\n public get ActiveTriggerChar(): string {\n const first = this.Query.charAt(0);\n return this.byTrigger.has(first) ? first : '';\n }\n\n /** Query text with the trigger char stripped. */\n public get EffectiveQuery(): string {\n return this.ActiveTriggerChar ? this.Query.substring(1) : this.Query;\n }\n\n public get ActiveModeLabel(): string {\n return this.activeProvider?.ModeLabel ?? 'Search';\n }\n\n public get ActivePlaceholder(): string {\n return this.activeProvider?.Placeholder ?? 'Search everything — or type #, /, @ …';\n }\n\n /** Scope pills only apply to the cross-source search mode. */\n public get ShowScopes(): boolean {\n return this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 0;\n }\n\n /** Footer gear: close, then let the host present its settings surface. */\n public RequestSettings(): void {\n this.Close();\n this.SettingsRequested.emit();\n }\n\n /** Hint chips for the empty state — one per non-default provider. */\n public get TriggerHints(): Array<{ Char: string; Label: string }> {\n return this.providers\n .filter((p) => p.TriggerChar !== '')\n .map((p) => ({ Char: p.TriggerChar, Label: p.ModeLabel }));\n }\n\n /** RecentRows render after the hint bar; selection indexes continue into them. */\n public get RecentBaseIndex(): number {\n return 0;\n }\n\n private get activeProvider(): OmnibarProvider | null {\n const char = this.ActiveTriggerChar;\n return char ? (this.byTrigger.get(char) ?? null) : this.defaultProvider;\n }\n\n private get selectableRows(): OmnibarRow[] {\n return this.Rows.length > 0 ? this.Rows : this.RecentRows;\n }\n\n /**\n * ARIA combobox wiring: the input keeps DOM focus while this points at the\n * virtually-highlighted option row, so screen readers announce selection moves.\n */\n public get ActiveDescendantId(): string | null {\n return this.selectableRows.length > 0 ? `ob-opt-${this.SelectedIndex}` : null;\n }\n\n /** Whether any option rows exist — drives the combobox's aria-expanded. */\n public get HasOptions(): boolean {\n return this.selectableRows.length > 0;\n }\n\n // ---------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------\n\n /** Opens the palette, optionally pre-seeded (e.g. '/' from the legacy Ctrl+/ path). */\n public Open(initialQuery = ''): void {\n this.ensureProviders();\n this.previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n this.IsOpen = true;\n this.Query = initialQuery;\n this.Rows = [];\n this.SelectedIndex = 0;\n void this.loadScopes();\n void this.loadRecents();\n if (initialQuery.length > 0) {\n this.runQuery();\n }\n this.Opened.emit();\n this.cdr.markForCheck();\n // Input mounts via @if — focus next tick.\n setTimeout(() => this.inputRef?.nativeElement.focus(), 30);\n }\n\n public Close(): void {\n if (!this.IsOpen) {\n return;\n }\n this.IsOpen = false;\n this.Query = '';\n this.Rows = [];\n this.Closed.emit();\n this.cdr.markForCheck();\n // Return focus to where the user was (skip if that element left the DOM).\n if (this.previousFocus?.isConnected) {\n this.previousFocus.focus();\n }\n this.previousFocus = null;\n }\n\n public Toggle(initialQuery = ''): void {\n if (this.IsOpen) {\n this.Close();\n } else {\n this.Open(initialQuery);\n }\n }\n\n ngOnDestroy(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n }\n this.recentsSub?.unsubscribe();\n }\n\n // ---------------------------------------------------------------\n // Input handling\n // ---------------------------------------------------------------\n\n public OnQueryChange(value: string): void {\n this.Query = value;\n this.SelectedIndex = 0;\n this.runQuery();\n }\n\n public OnInputKeydown(event: KeyboardEvent): void {\n const rows = this.selectableRows;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1);\n break;\n case 'Enter': {\n event.preventDefault();\n const row = rows[this.SelectedIndex];\n if (row) {\n this.Execute(row.Suggestion);\n } else if (this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 1) {\n // No rows yet (still loading / no matches): honest escape hatch to full search.\n this.openFullSearch(this.EffectiveQuery.trim());\n }\n break;\n }\n }\n }\n\n /**\n * Dialog-level keys (bubbled from anywhere inside the palette):\n * - Escape closes from any focused element, not just the input.\n * - Tab follows the natural visual order — input → scope pills → mode chips →\n * the selected result row (roving tabindex) — and TRAPS at the ends so focus\n * cycles inside the dialog instead of escaping to the page underneath.\n * (Design review: Tab must reach the three mode chips, not skip them.)\n */\n public OnPaletteKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.Close();\n return;\n }\n if (event.key !== 'Tab') {\n return;\n }\n // On a result row, Tab / Shift+Tab step through the RESULTS themselves\n // (mirrors ArrowDown/Up) until walking off either end of the list — then\n // the trap logic below takes over. Same model as mj-search-overlay.\n const activeEl = document.activeElement as HTMLElement | null;\n if (activeEl?.classList.contains('ob-row')) {\n const last = this.selectableRows.length - 1;\n if (!event.shiftKey && this.SelectedIndex < last) {\n event.preventDefault();\n this.moveSelection(1, true);\n return;\n }\n if (event.shiftKey && this.SelectedIndex > 0) {\n event.preventDefault();\n this.moveSelection(-1, true);\n return;\n }\n // At either end: fall through so Tab leaves the list naturally.\n }\n const root = this.host.nativeElement.querySelector('.omnibar-palette') as HTMLElement | null;\n if (!root) {\n return;\n }\n const focusables = Array.from(root.querySelectorAll<HTMLElement>('input, button, .ob-row[tabindex=\"0\"]'))\n .filter((el) => el.offsetParent !== null);\n if (focusables.length === 0) {\n return;\n }\n const active = document.activeElement as HTMLElement | null;\n if (!event.shiftKey && active === focusables[focusables.length - 1]) {\n event.preventDefault();\n focusables[0].focus();\n } else if (event.shiftKey && active === focusables[0]) {\n event.preventDefault();\n focusables[focusables.length - 1].focus();\n }\n }\n\n /** Keys on a focused result row (rows are real focus stops via roving tabindex). */\n public OnRowKeydown(event: KeyboardEvent, suggestion: MentionSuggestion): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, true);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, true);\n break;\n case 'Enter':\n event.preventDefault();\n this.Execute(suggestion);\n break;\n }\n }\n\n /**\n * Keyboard-driven selection move: wraps at both ends (standard picker behavior)\n * and keeps the highlighted row visible. Mouse hover sets SelectedIndex directly\n * in the template and deliberately does NOT scroll — auto-scrolling under the\n * pointer would fight the user's hand. When the move originates from a focused\n * row (roving tabindex), DOM focus follows the selection.\n */\n private moveSelection(delta: 1 | -1, focusRow = false): void {\n const count = this.selectableRows.length;\n if (count === 0) {\n return;\n }\n this.SelectedIndex = (this.SelectedIndex + delta + count) % count;\n this.cdr.markForCheck();\n const row = this.host.nativeElement.querySelector<HTMLElement>(`#ob-opt-${this.SelectedIndex}`);\n row?.scrollIntoView({ block: 'nearest' });\n if (focusRow) {\n row?.focus();\n }\n }\n\n /** Hint-chip click: seed the trigger char and refocus. */\n public SeedTrigger(char: string): void {\n this.Query = char;\n this.SelectedIndex = 0;\n this.runQuery();\n this.inputRef?.nativeElement.focus();\n }\n\n // ---------------------------------------------------------------\n // Scopes\n // ---------------------------------------------------------------\n\n public IsScopeSelected(id: string): boolean {\n return this.SelectedScopeIDs.includes(id);\n }\n\n public ToggleScope(id: string): void {\n this.SelectedScopeIDs = this.IsScopeSelected(id)\n ? this.SelectedScopeIDs.filter((s) => s !== id)\n : [...this.SelectedScopeIDs, id];\n this.cdr.markForCheck();\n }\n\n public ClearScopes(): void {\n this.SelectedScopeIDs = [];\n this.cdr.markForCheck();\n }\n\n // ---------------------------------------------------------------\n // Execution\n // ---------------------------------------------------------------\n\n /** Executes a suggestion: navigate per its payload, or re-seed for entity drill-in. */\n public Execute(suggestion: MentionSuggestion): void {\n const nav = GetOmnibarNavPayload(suggestion);\n if (!nav) {\n return; // foreign suggestion with no navigation — nothing to execute\n }\n // Default-mode queries count as \"searches\" even when the user executes a\n // suggestion that navigates directly (no full ExecuteSearch downstream to\n // record them). Trigger-mode fragments ('#accounts ac…') are NOT searches —\n // recording those would pollute recents. 'search' payloads skip too: the\n // results page records them with the real result count.\n const typed = this.EffectiveQuery.trim();\n if (this.ActiveTriggerChar === '' && typed.length > 0 && nav.kind !== 'search') {\n this.search.RecordRecentSearch(typed);\n }\n switch (nav.kind) {\n case 'record':\n this.navigation.OpenEntityRecord(nav.entityName, CompositeKey.FromID(nav.recordId));\n break;\n case 'entity-list':\n this.navigation.OpenDynamicView(nav.entityName);\n break;\n case 'search':\n this.openFullSearch(nav.query);\n return; // openFullSearch closes\n case 'app':\n void this.paletteService.TrackAppAccess(nav.appId);\n void this.navigation.SwitchToApp(nav.appId);\n break;\n case 'nav':\n void this.navigation.SwitchToApp(nav.appId, nav.navItemName);\n break;\n case 'agent':\n void this.openAgentChat(nav.agentName);\n break;\n case 'file':\n if (!this.fileOpen.OpenPreviewFromSearchResult(nav.rawMetadata)) {\n void this.fileOpen.OpenFileFromSearchResult(nav.rawMetadata);\n }\n break;\n }\n this.Close();\n }\n\n private openFullSearch(query: string): void {\n const opts = this.SelectedScopeIDs.length > 0 ? { scopeIDs: [...this.SelectedScopeIDs] } : undefined;\n this.navigation.OpenSearch(query, opts);\n this.Close();\n }\n\n /** '@' selection: switch to the Chat app pre-addressed to the agent. */\n private async openAgentChat(agentName: string): Promise<void> {\n const apps = await firstValueFrom(this.appManager.Applications).catch(() => []);\n const chat = apps.find((a) => a.Name.trim().toLowerCase() === 'chat');\n if (chat) {\n // agentReq is a one-shot request nonce: the chat wrapper applies each\n // agent|nonce instruction exactly once, so URL↔tab-config sync echoes\n // of an already-consumed param can never re-stage the pre-address (and\n // wipe an in-progress composer draft), while a genuine re-tag of the\n // SAME agent still applies because it carries a fresh nonce.\n await this.navigation.SwitchToApp(chat.ID, undefined, {\n agent: agentName,\n agentReq: Date.now().toString(36),\n });\n }\n }\n\n // ---------------------------------------------------------------\n // Query execution\n // ---------------------------------------------------------------\n\n private ensureProviders(): void {\n if (this.providers.length > 0) {\n return;\n }\n // Kick off the persisted-recents load (idempotent; resolves via LoggedIn\n // replay). The legacy search composite used to be the only caller — with\n // the omnibar enabled it never renders, so prior-session recents were\n // invisible until the palette started requesting them itself.\n void this.search.LoadRecentSearches();\n // Refresh the empty-state Recent rows whenever recents change while the\n // palette is idle-open (skip(1): BehaviorSubject replays its current\n // value on subscribe, which loadRecents already read directly).\n this.recentsSub = this.search.RecentSearches$.pipe(skip(1)).subscribe(() => {\n if (this.IsOpen && this.Query.length === 0) {\n void this.loadRecents();\n }\n });\n LoadOmnibarProviders();\n this.providers = DiscoverOmnibarProviders();\n const context = {\n Search: this.search,\n Apps: this.appManager,\n PaletteService: this.paletteService,\n Navigation: this.navigation,\n };\n for (const provider of this.providers) {\n provider.Attach(context);\n if (provider.TriggerChar === '') {\n this.defaultProvider = this.defaultProvider ?? provider;\n } else if (!this.byTrigger.has(provider.TriggerChar)) {\n this.byTrigger.set(provider.TriggerChar, provider);\n }\n }\n }\n\n private runQuery(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n this.debounceHandle = null;\n }\n const generation = ++this.queryGeneration;\n const provider = this.activeProvider;\n const query = this.EffectiveQuery;\n const isTriggerMode = this.ActiveTriggerChar !== '';\n\n if (!provider || (query.trim().length === 0 && !isTriggerMode)) {\n this.Rows = [];\n this.IsLoading = false;\n this.cdr.markForCheck();\n return;\n }\n\n const fire = () => void this.fetchSuggestions(provider, query, generation);\n if (isTriggerMode) {\n // Short debounce: entity matching is in-memory, but record suggestions issue a\n // RunView per keystroke — debouncing collapses a typing burst into one backend query.\n this.debounceHandle = setTimeout(fire, TRIGGER_DEBOUNCE_MS);\n } else {\n this.IsLoading = this.Rows.length === 0;\n this.cdr.markForCheck();\n this.debounceHandle = setTimeout(fire, SEARCH_DEBOUNCE_MS);\n }\n }\n\n private async fetchSuggestions(provider: OmnibarProvider, query: string, generation: number): Promise<void> {\n const request = {\n Query: query,\n MaxResults: MAX_RESULTS,\n ContextUser: this.currentUser,\n Provider: null,\n };\n const suggestions = query.trim().length === 0\n ? await provider.EmptyStateSuggestions(request)\n : await provider.GetSuggestions(request);\n if (generation !== this.queryGeneration) {\n return; // stale response — a newer keystroke superseded it\n }\n this.Rows = this.toRows(suggestions);\n this.SelectedIndex = 0;\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n\n private toRows(suggestions: MentionSuggestion[]): OmnibarRow[] {\n let lastGroup: string | null = null;\n return suggestions.map((s) => {\n const group = typeof s.data?.['group'] === 'string' ? (s.data['group'] as string) : '';\n const isNewGroup = group.length > 0 && group !== lastGroup;\n if (group.length > 0) {\n lastGroup = group;\n }\n const score = typeof s.data?.['score'] === 'number' ? (s.data['score'] as number) : null;\n return {\n Suggestion: s,\n GroupLabel: isNewGroup ? group : null,\n ScorePercent: score != null ? Math.round(Math.max(0, Math.min(1, score)) * 100) : null,\n };\n });\n }\n\n private async loadScopes(): Promise<void> {\n try {\n this.Scopes = await this.search.LoadScopes();\n this.cdr.markForCheck();\n } catch {\n this.Scopes = [];\n }\n }\n\n /** Empty-state recents: recent searches + recent apps (best-effort). */\n private async loadRecents(): Promise<void> {\n const rows: OmnibarRow[] = [];\n try {\n const recentSearches = this.search.RecentSearches$.value.slice(0, 3);\n for (const recent of recentSearches) {\n rows.push({\n Suggestion: {\n type: 'search',\n id: `recent-search:${recent.Query}`,\n name: recent.Query,\n displayName: recent.Query,\n description: 'Recent search',\n icon: 'fa-solid fa-clock-rotate-left',\n data: { nav: { kind: 'search', query: recent.Query } },\n },\n GroupLabel: null,\n ScorePercent: null,\n });\n }\n } catch {\n // recents are decorative — never block the palette\n }\n try {\n const commandProvider = this.byTrigger.get('/');\n if (commandProvider) {\n const apps = await commandProvider.EmptyStateSuggestions({\n Query: '', MaxResults: 3, ContextUser: this.currentUser, Provider: null,\n });\n rows.push(...apps.map((s) => ({ Suggestion: s, GroupLabel: null, ScorePercent: null })));\n }\n } catch {\n // ditto\n }\n this.RecentRows = rows;\n this.cdr.markForCheck();\n }\n\n private get currentUser(): UserInfo | null {\n return Metadata.Provider?.CurrentUser ?? null; // global-provider-ok: Explorer shell palette is app chrome bound to the session's default provider\n }\n}\n\n/** Tree-shaking guard for the palette component. */\nexport function LoadOmnibarPaletteComponent(): void {\n // intentional no-op\n}\n","@if (IsOpen) {\n <div class=\"omnibar-overlay\" (click)=\"Close()\"></div>\n <div class=\"omnibar-palette\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\"\n (keydown)=\"OnPaletteKeydown($event)\">\n\n <div class=\"ob-input-row\">\n <div class=\"ob-field\">\n <span class=\"ob-lead\" [class.ob-lead--trigger]=\"ActiveTriggerChar.length > 0\">\n @if (ActiveTriggerChar.length > 0) {\n <b>{{ ActiveTriggerChar }}</b>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n }\n </span>\n <input #paletteInput class=\"ob-input\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\"\n role=\"combobox\" aria-controls=\"ob-listbox\" aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"HasOptions\"\n [attr.aria-activedescendant]=\"ActiveDescendantId\"\n [placeholder]=\"ActivePlaceholder\"\n [ngModel]=\"Query\" (ngModelChange)=\"OnQueryChange($event)\"\n (keydown)=\"OnInputKeydown($event)\" />\n <span class=\"ob-mode-badge\">{{ ActiveModeLabel }}</span>\n <kbd class=\"ob-kbd\">esc</kbd>\n </div>\n <button type=\"button\" class=\"ob-close\" aria-label=\"Close\" title=\"Close\" (click)=\"Close()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (ShowScopes && Scopes.length > 0) {\n <div class=\"ob-scopes\">\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"SelectedScopeIDs.length === 0\"\n (click)=\"ClearScopes()\">All sources</button>\n @for (scope of Scopes; track scope.ID) {\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"IsScopeSelected(scope.ID)\"\n (click)=\"ToggleScope(scope.ID)\">{{ scope.Name }}</button>\n }\n </div>\n }\n\n <div class=\"ob-body\">\n @if (IsLoading) {\n <div class=\"ob-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Searching…</div>\n } @else if (Rows.length === 0 && Query.length === 0) {\n <div class=\"ob-hintbar\">\n @for (hint of TriggerHints; track hint.Char) {\n <button type=\"button\" class=\"ob-hint-chip\" (click)=\"SeedTrigger(hint.Char)\">\n <b>{{ hint.Char }}</b><span>{{ hint.Label }}</span>\n </button>\n }\n </div>\n @if (RecentRows.length > 0) {\n <div class=\"ob-group-label\" role=\"presentation\">Recent</div>\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of RecentRows; track row.Suggestion.id; let i = $index) {\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + (RecentBaseIndex + i)\"\n [attr.tabindex]=\"RecentBaseIndex + i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"RecentBaseIndex + i === SelectedIndex\"\n [class.ob-row--sel]=\"RecentBaseIndex + i === SelectedIndex\"\n (focus)=\"SelectedIndex = RecentBaseIndex + i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = RecentBaseIndex + i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-clock-rotate-left'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n </span>\n <span class=\"ob-raux\"><span class=\"ob-rtype\">{{ row.Suggestion.type }}</span></span>\n </div>\n }\n </div>\n }\n } @else if (Rows.length === 0) {\n <div class=\"ob-empty\">No matches — press <kbd class=\"ob-kbd\">↵</kbd> to search everything for “{{ EffectiveQuery }}”.</div>\n } @else {\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of Rows; track row.Suggestion.id; let i = $index) {\n @if (row.GroupLabel) {\n <div class=\"ob-group-label\" role=\"presentation\">{{ row.GroupLabel }}</div>\n }\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + i\"\n [attr.tabindex]=\"i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"i === SelectedIndex\"\n [class.ob-row--sel]=\"i === SelectedIndex\"\n (focus)=\"SelectedIndex = i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-circle'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n @if (row.Suggestion.description) {\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n }\n </span>\n <span class=\"ob-raux\">\n @if (row.ScorePercent != null) {\n <span class=\"ob-score\"><i [style.width.%]=\"row.ScorePercent\"></i></span>\n }\n <span class=\"ob-rtype\">{{ row.Suggestion.type }}</span>\n <span class=\"ob-go\">open <kbd class=\"ob-kbd\">↵</kbd></span>\n </span>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"ob-foot\">\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↑</kbd><kbd class=\"ob-kbd\">↓</kbd> navigate</span>\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↵</kbd> open</span>\n <button type=\"button\" class=\"ob-settings\" aria-label=\"Command Palette settings\"\n title=\"Command Palette settings\" (click)=\"RequestSettings()\">\n <i class=\"fa-solid fa-gear\" aria-hidden=\"true\"></i>\n <span>Settings</span>\n </button>\n </div>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"omnibar-palette.component.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-palette.component.ts","../../../src/lib/omnibar/omnibar-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter,\n OnDestroy, Output, ViewChild, inject,\n} from '@angular/core';\nimport { CompositeKey, UserInfo } from '@memberjunction/core';\nimport { Metadata } from '@memberjunction/core';\nimport { MentionSuggestion } from '@memberjunction/ng-composer';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { SearchService, SearchScopeInfo } from '@memberjunction/ng-search';\nimport { FileOpenService } from '@memberjunction/ng-file-storage';\nimport { Subscription, firstValueFrom, skip } from 'rxjs';\nimport { CommandPaletteService } from '../command-palette/command-palette.service';\nimport {\n DiscoverOmnibarProviders, GetOmnibarNavPayload, OmnibarProvider,\n} from './omnibar-provider';\nimport { LoadOmnibarProviders } from './index';\n\n/** One rendered result row: the suggestion + presentation extras. */\ninterface OmnibarRow {\n Suggestion: MentionSuggestion;\n /** Set only on the FIRST row of each group — drives the section header. */\n GroupLabel: string | null;\n /** 0-100 relevance bar (search mode only). */\n ScorePercent: number | null;\n}\n\n/** Debounce for the default (network-backed) search mode; trigger modes serve warm caches. */\nconst SEARCH_DEBOUNCE_MS = 300;\n\n/**\n * Debounce for trigger modes (e.g. '#' jump-to-record). Entity-name matching is in-memory,\n * but the record-suggestion path issues a RunView per keystroke — firing on every character\n * floods MJAPI during a typing burst. A short debounce collapses rapid typing into a single\n * backend query while keeping the picker responsive.\n */\nconst TRIGGER_DEBOUNCE_MS = 150;\n\n/** Max suggestions requested per keystroke. */\nconst MAX_RESULTS = 9;\n\n/**\n * The unified Explorer command palette (Ctrl/Cmd+K): one surface for global\n * cross-source search (plain text), jump-to-record ('#'), commands & apps ('/'),\n * and agents ('@') — every mode a pluggable {@link OmnibarProvider}, discovered via\n * the MJ ClassFactory so OpenApps can add modes without touching this component.\n *\n * Design source of truth: plans/composer-adoption/mockups/omnibar-command-palette.html.\n */\n@Component({\n standalone: false,\n selector: 'mj-omnibar-palette',\n templateUrl: './omnibar-palette.component.html',\n styleUrls: ['./omnibar-palette.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OmnibarPaletteComponent implements OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private host = inject<ElementRef<HTMLElement>>(ElementRef);\n private navigation = inject(NavigationService);\n private appManager = inject(ApplicationManager);\n private search = inject(SearchService);\n private paletteService = inject(CommandPaletteService);\n private fileOpen = inject(FileOpenService);\n\n @ViewChild('paletteInput') private inputRef?: ElementRef<HTMLInputElement>;\n\n /** Palette visibility (open via {@link Open}; Escape/backdrop close). */\n public IsOpen = false;\n /** Raw input text including any leading trigger char. */\n public Query = '';\n public Rows: OmnibarRow[] = [];\n public RecentRows: OmnibarRow[] = [];\n public SelectedIndex = 0;\n public IsLoading = false;\n public Scopes: SearchScopeInfo[] = [];\n public SelectedScopeIDs: string[] = [];\n\n @Output() Opened = new EventEmitter<void>();\n @Output() Closed = new EventEmitter<void>();\n /** Footer gear clicked — the host opens its settings surface (Explorer: My\n Profile, where the Command Palette opt-in section lives). The palette\n closes first so the settings dialog isn't buried under it. */\n @Output() SettingsRequested = new EventEmitter<void>();\n\n private providers: OmnibarProvider[] = [];\n private defaultProvider: OmnibarProvider | null = null;\n private byTrigger = new Map<string, OmnibarProvider>();\n private queryGeneration = 0;\n private debounceHandle: ReturnType<typeof setTimeout> | null = null;\n /** Element focused before the palette opened — restored on close (a11y). */\n private previousFocus: HTMLElement | null = null;\n private recentsSub: Subscription | null = null;\n\n // ---------------------------------------------------------------\n // Derived view state\n // ---------------------------------------------------------------\n\n /** The active trigger char ('' = default/global-search mode). */\n public get ActiveTriggerChar(): string {\n const first = this.Query.charAt(0);\n return this.byTrigger.has(first) ? first : '';\n }\n\n /** Query text with the trigger char stripped. */\n public get EffectiveQuery(): string {\n return this.ActiveTriggerChar ? this.Query.substring(1) : this.Query;\n }\n\n public get ActiveModeLabel(): string {\n return this.activeProvider?.ModeLabel ?? 'Search';\n }\n\n public get ActivePlaceholder(): string {\n return this.activeProvider?.Placeholder ?? 'Search everything — or type #, /, @ …';\n }\n\n /** Scope pills only apply to the cross-source search mode. */\n public get ShowScopes(): boolean {\n return this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 0;\n }\n\n /** Footer gear: close, then let the host present its settings surface. */\n public RequestSettings(): void {\n this.Close();\n this.SettingsRequested.emit();\n }\n\n /** Hint chips for the empty state — one per non-default provider. */\n public get TriggerHints(): Array<{ Char: string; Label: string }> {\n return this.providers\n .filter((p) => p.TriggerChar !== '')\n .map((p) => ({ Char: p.TriggerChar, Label: p.ModeLabel }));\n }\n\n /** RecentRows render after the hint bar; selection indexes continue into them. */\n public get RecentBaseIndex(): number {\n return 0;\n }\n\n private get activeProvider(): OmnibarProvider | null {\n const char = this.ActiveTriggerChar;\n return char ? (this.byTrigger.get(char) ?? null) : this.defaultProvider;\n }\n\n private get selectableRows(): OmnibarRow[] {\n return this.Rows.length > 0 ? this.Rows : this.RecentRows;\n }\n\n /**\n * ARIA combobox wiring: the input keeps DOM focus while this points at the\n * virtually-highlighted option row, so screen readers announce selection moves.\n */\n public get ActiveDescendantId(): string | null {\n return this.selectableRows.length > 0 ? `ob-opt-${this.SelectedIndex}` : null;\n }\n\n /** Whether any option rows exist — drives the combobox's aria-expanded. */\n public get HasOptions(): boolean {\n return this.selectableRows.length > 0;\n }\n\n // ---------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------\n\n /** Opens the palette, optionally pre-seeded (e.g. '/' from the legacy Ctrl+/ path). */\n public Open(initialQuery = ''): void {\n this.ensureProviders();\n this.previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n this.IsOpen = true;\n this.Query = initialQuery;\n this.Rows = [];\n this.SelectedIndex = 0;\n void this.loadScopes();\n void this.loadRecents();\n if (initialQuery.length > 0) {\n this.runQuery();\n }\n this.Opened.emit();\n this.cdr.markForCheck();\n // Input mounts via @if — focus next tick.\n setTimeout(() => this.inputRef?.nativeElement.focus(), 30);\n }\n\n public Close(): void {\n if (!this.IsOpen) {\n return;\n }\n this.IsOpen = false;\n this.Query = '';\n this.Rows = [];\n this.Closed.emit();\n this.cdr.markForCheck();\n // Return focus to where the user was (skip if that element left the DOM).\n if (this.previousFocus?.isConnected) {\n this.previousFocus.focus();\n }\n this.previousFocus = null;\n }\n\n public Toggle(initialQuery = ''): void {\n if (this.IsOpen) {\n this.Close();\n } else {\n this.Open(initialQuery);\n }\n }\n\n ngOnDestroy(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n }\n this.recentsSub?.unsubscribe();\n }\n\n // ---------------------------------------------------------------\n // Input handling\n // ---------------------------------------------------------------\n\n public OnQueryChange(value: string): void {\n this.Query = value;\n this.SelectedIndex = 0;\n this.runQuery();\n }\n\n public OnInputKeydown(event: KeyboardEvent): void {\n const rows = this.selectableRows;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1);\n break;\n case 'Enter': {\n event.preventDefault();\n const row = rows[this.SelectedIndex];\n if (row) {\n this.Execute(row.Suggestion);\n } else if (this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 1) {\n // No rows yet (still loading / no matches): honest escape hatch to full search.\n this.openFullSearch(this.EffectiveQuery.trim());\n }\n break;\n }\n }\n }\n\n /**\n * Dialog-level keys (bubbled from anywhere inside the palette):\n * - Escape closes from any focused element, not just the input.\n * - Tab follows the natural visual order — input → scope pills → mode chips →\n * the selected result row (roving tabindex) — and TRAPS at the ends so focus\n * cycles inside the dialog instead of escaping to the page underneath.\n * (Design review: Tab must reach the three mode chips, not skip them.)\n */\n public OnPaletteKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.Close();\n return;\n }\n if (event.key !== 'Tab') {\n return;\n }\n // On a result row, Tab / Shift+Tab step through the RESULTS themselves\n // (mirrors ArrowDown/Up) until walking off either end of the list — then\n // the trap logic below takes over. Same model as mj-search-overlay.\n const activeEl = document.activeElement as HTMLElement | null;\n if (activeEl?.classList.contains('ob-row')) {\n const last = this.selectableRows.length - 1;\n if (!event.shiftKey && this.SelectedIndex < last) {\n event.preventDefault();\n this.moveSelection(1, true);\n return;\n }\n if (event.shiftKey && this.SelectedIndex > 0) {\n event.preventDefault();\n this.moveSelection(-1, true);\n return;\n }\n // At either end: fall through so Tab leaves the list naturally.\n }\n const root = this.host.nativeElement.querySelector('.omnibar-palette') as HTMLElement | null;\n if (!root) {\n return;\n }\n const focusables = Array.from(root.querySelectorAll<HTMLElement>('input, button, .ob-row[tabindex=\"0\"]'))\n .filter((el) => el.offsetParent !== null);\n if (focusables.length === 0) {\n return;\n }\n const active = document.activeElement as HTMLElement | null;\n if (!event.shiftKey && active === focusables[focusables.length - 1]) {\n event.preventDefault();\n focusables[0].focus();\n } else if (event.shiftKey && active === focusables[0]) {\n event.preventDefault();\n focusables[focusables.length - 1].focus();\n }\n }\n\n /** Keys on a focused result row (rows are real focus stops via roving tabindex). */\n public OnRowKeydown(event: KeyboardEvent, suggestion: MentionSuggestion): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, true);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, true);\n break;\n case 'Enter':\n event.preventDefault();\n this.Execute(suggestion);\n break;\n }\n }\n\n /**\n * Keyboard-driven selection move: wraps at both ends (standard picker behavior)\n * and keeps the highlighted row visible. Mouse hover sets SelectedIndex directly\n * in the template and deliberately does NOT scroll — auto-scrolling under the\n * pointer would fight the user's hand. When the move originates from a focused\n * row (roving tabindex), DOM focus follows the selection.\n */\n private moveSelection(delta: 1 | -1, focusRow = false): void {\n const count = this.selectableRows.length;\n if (count === 0) {\n return;\n }\n this.SelectedIndex = (this.SelectedIndex + delta + count) % count;\n this.cdr.markForCheck();\n const row = this.host.nativeElement.querySelector<HTMLElement>(`#ob-opt-${this.SelectedIndex}`);\n row?.scrollIntoView({ block: 'nearest' });\n if (focusRow) {\n row?.focus();\n }\n }\n\n /** Hint-chip click: seed the trigger char and refocus. */\n public SeedTrigger(char: string): void {\n this.Query = char;\n this.SelectedIndex = 0;\n this.runQuery();\n this.inputRef?.nativeElement.focus();\n }\n\n // ---------------------------------------------------------------\n // Scopes\n // ---------------------------------------------------------------\n\n public IsScopeSelected(id: string): boolean {\n return this.SelectedScopeIDs.includes(id);\n }\n\n public ToggleScope(id: string): void {\n this.SelectedScopeIDs = this.IsScopeSelected(id)\n ? this.SelectedScopeIDs.filter((s) => s !== id)\n : [...this.SelectedScopeIDs, id];\n this.cdr.markForCheck();\n }\n\n public ClearScopes(): void {\n this.SelectedScopeIDs = [];\n this.cdr.markForCheck();\n }\n\n // ---------------------------------------------------------------\n // Execution\n // ---------------------------------------------------------------\n\n /** Executes a suggestion: navigate per its payload, or re-seed for entity drill-in. */\n public Execute(suggestion: MentionSuggestion): void {\n const nav = GetOmnibarNavPayload(suggestion);\n if (!nav) {\n return; // foreign suggestion with no navigation — nothing to execute\n }\n // Default-mode queries count as \"searches\" even when the user executes a\n // suggestion that navigates directly (no full ExecuteSearch downstream to\n // record them). Trigger-mode fragments ('#accounts ac…') are NOT searches —\n // recording those would pollute recents. 'search' payloads skip too: the\n // results page records them with the real result count.\n const typed = this.EffectiveQuery.trim();\n if (this.ActiveTriggerChar === '' && typed.length > 0 && nav.kind !== 'search') {\n this.search.RecordRecentSearch(typed);\n }\n switch (nav.kind) {\n case 'record': {\n // `recordId` is a compact CompositeKey segment (bare value for a single-column key,\n // \"F1|v1||F2|v2\" for a composite one) on an ARBITRARY entity, so the key column can\n // have any name. `FromID` hardcoded `ID` and broke record-open for every entity whose\n // key is called something else; resolve against the entity's metadata instead.\n const entityInfo = this.search.Provider.EntityByName(nav.entityName);\n this.navigation.OpenEntityRecord(nav.entityName, CompositeKey.FromURLSegment(entityInfo, nav.recordId));\n break;\n }\n case 'entity-list':\n this.navigation.OpenDynamicView(nav.entityName);\n break;\n case 'search':\n this.openFullSearch(nav.query);\n return; // openFullSearch closes\n case 'app':\n void this.paletteService.TrackAppAccess(nav.appId);\n void this.navigation.SwitchToApp(nav.appId);\n break;\n case 'nav':\n void this.navigation.SwitchToApp(nav.appId, nav.navItemName);\n break;\n case 'agent':\n void this.openAgentChat(nav.agentName);\n break;\n case 'file':\n if (!this.fileOpen.OpenPreviewFromSearchResult(nav.rawMetadata)) {\n void this.fileOpen.OpenFileFromSearchResult(nav.rawMetadata);\n }\n break;\n }\n this.Close();\n }\n\n private openFullSearch(query: string): void {\n const opts = this.SelectedScopeIDs.length > 0 ? { scopeIDs: [...this.SelectedScopeIDs] } : undefined;\n this.navigation.OpenSearch(query, opts);\n this.Close();\n }\n\n /** '@' selection: switch to the Chat app pre-addressed to the agent. */\n private async openAgentChat(agentName: string): Promise<void> {\n const apps = await firstValueFrom(this.appManager.Applications).catch(() => []);\n const chat = apps.find((a) => a.Name.trim().toLowerCase() === 'chat');\n if (chat) {\n // agentReq is a one-shot request nonce: the chat wrapper applies each\n // agent|nonce instruction exactly once, so URL↔tab-config sync echoes\n // of an already-consumed param can never re-stage the pre-address (and\n // wipe an in-progress composer draft), while a genuine re-tag of the\n // SAME agent still applies because it carries a fresh nonce.\n await this.navigation.SwitchToApp(chat.ID, undefined, {\n agent: agentName,\n agentReq: Date.now().toString(36),\n });\n }\n }\n\n // ---------------------------------------------------------------\n // Query execution\n // ---------------------------------------------------------------\n\n private ensureProviders(): void {\n if (this.providers.length > 0) {\n return;\n }\n // Kick off the persisted-recents load (idempotent; resolves via LoggedIn\n // replay). The legacy search composite used to be the only caller — with\n // the omnibar enabled it never renders, so prior-session recents were\n // invisible until the palette started requesting them itself.\n void this.search.LoadRecentSearches();\n // Refresh the empty-state Recent rows whenever recents change while the\n // palette is idle-open (skip(1): BehaviorSubject replays its current\n // value on subscribe, which loadRecents already read directly).\n this.recentsSub = this.search.RecentSearches$.pipe(skip(1)).subscribe(() => {\n if (this.IsOpen && this.Query.length === 0) {\n void this.loadRecents();\n }\n });\n LoadOmnibarProviders();\n this.providers = DiscoverOmnibarProviders();\n const context = {\n Search: this.search,\n Apps: this.appManager,\n PaletteService: this.paletteService,\n Navigation: this.navigation,\n };\n for (const provider of this.providers) {\n provider.Attach(context);\n if (provider.TriggerChar === '') {\n this.defaultProvider = this.defaultProvider ?? provider;\n } else if (!this.byTrigger.has(provider.TriggerChar)) {\n this.byTrigger.set(provider.TriggerChar, provider);\n }\n }\n }\n\n private runQuery(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n this.debounceHandle = null;\n }\n const generation = ++this.queryGeneration;\n const provider = this.activeProvider;\n const query = this.EffectiveQuery;\n const isTriggerMode = this.ActiveTriggerChar !== '';\n\n if (!provider || (query.trim().length === 0 && !isTriggerMode)) {\n this.Rows = [];\n this.IsLoading = false;\n this.cdr.markForCheck();\n return;\n }\n\n const fire = () => void this.fetchSuggestions(provider, query, generation);\n if (isTriggerMode) {\n // Short debounce: entity matching is in-memory, but record suggestions issue a\n // RunView per keystroke — debouncing collapses a typing burst into one backend query.\n this.debounceHandle = setTimeout(fire, TRIGGER_DEBOUNCE_MS);\n } else {\n this.IsLoading = this.Rows.length === 0;\n this.cdr.markForCheck();\n this.debounceHandle = setTimeout(fire, SEARCH_DEBOUNCE_MS);\n }\n }\n\n private async fetchSuggestions(provider: OmnibarProvider, query: string, generation: number): Promise<void> {\n const request = {\n Query: query,\n MaxResults: MAX_RESULTS,\n ContextUser: this.currentUser,\n Provider: null,\n };\n const suggestions = query.trim().length === 0\n ? await provider.EmptyStateSuggestions(request)\n : await provider.GetSuggestions(request);\n if (generation !== this.queryGeneration) {\n return; // stale response — a newer keystroke superseded it\n }\n this.Rows = this.toRows(suggestions);\n this.SelectedIndex = 0;\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n\n private toRows(suggestions: MentionSuggestion[]): OmnibarRow[] {\n let lastGroup: string | null = null;\n return suggestions.map((s) => {\n const group = typeof s.data?.['group'] === 'string' ? (s.data['group'] as string) : '';\n const isNewGroup = group.length > 0 && group !== lastGroup;\n if (group.length > 0) {\n lastGroup = group;\n }\n const score = typeof s.data?.['score'] === 'number' ? (s.data['score'] as number) : null;\n return {\n Suggestion: s,\n GroupLabel: isNewGroup ? group : null,\n ScorePercent: score != null ? Math.round(Math.max(0, Math.min(1, score)) * 100) : null,\n };\n });\n }\n\n private async loadScopes(): Promise<void> {\n try {\n this.Scopes = await this.search.LoadScopes();\n this.cdr.markForCheck();\n } catch {\n this.Scopes = [];\n }\n }\n\n /** Empty-state recents: recent searches + recent apps (best-effort). */\n private async loadRecents(): Promise<void> {\n const rows: OmnibarRow[] = [];\n try {\n const recentSearches = this.search.RecentSearches$.value.slice(0, 3);\n for (const recent of recentSearches) {\n rows.push({\n Suggestion: {\n type: 'search',\n id: `recent-search:${recent.Query}`,\n name: recent.Query,\n displayName: recent.Query,\n description: 'Recent search',\n icon: 'fa-solid fa-clock-rotate-left',\n data: { nav: { kind: 'search', query: recent.Query } },\n },\n GroupLabel: null,\n ScorePercent: null,\n });\n }\n } catch {\n // recents are decorative — never block the palette\n }\n try {\n const commandProvider = this.byTrigger.get('/');\n if (commandProvider) {\n const apps = await commandProvider.EmptyStateSuggestions({\n Query: '', MaxResults: 3, ContextUser: this.currentUser, Provider: null,\n });\n rows.push(...apps.map((s) => ({ Suggestion: s, GroupLabel: null, ScorePercent: null })));\n }\n } catch {\n // ditto\n }\n this.RecentRows = rows;\n this.cdr.markForCheck();\n }\n\n private get currentUser(): UserInfo | null {\n return Metadata.Provider?.CurrentUser ?? null; // global-provider-ok: Explorer shell palette is app chrome bound to the session's default provider\n }\n}\n\n/** Tree-shaking guard for the palette component. */\nexport function LoadOmnibarPaletteComponent(): void {\n // intentional no-op\n}\n","@if (IsOpen) {\n <div class=\"omnibar-overlay\" (click)=\"Close()\"></div>\n <div class=\"omnibar-palette\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\"\n (keydown)=\"OnPaletteKeydown($event)\">\n\n <div class=\"ob-input-row\">\n <div class=\"ob-field\">\n <span class=\"ob-lead\" [class.ob-lead--trigger]=\"ActiveTriggerChar.length > 0\">\n @if (ActiveTriggerChar.length > 0) {\n <b>{{ ActiveTriggerChar }}</b>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n }\n </span>\n <input #paletteInput class=\"ob-input\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\"\n role=\"combobox\" aria-controls=\"ob-listbox\" aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"HasOptions\"\n [attr.aria-activedescendant]=\"ActiveDescendantId\"\n [placeholder]=\"ActivePlaceholder\"\n [ngModel]=\"Query\" (ngModelChange)=\"OnQueryChange($event)\"\n (keydown)=\"OnInputKeydown($event)\" />\n <span class=\"ob-mode-badge\">{{ ActiveModeLabel }}</span>\n <kbd class=\"ob-kbd\">esc</kbd>\n </div>\n <button type=\"button\" class=\"ob-close\" aria-label=\"Close\" title=\"Close\" (click)=\"Close()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (ShowScopes && Scopes.length > 0) {\n <div class=\"ob-scopes\">\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"SelectedScopeIDs.length === 0\"\n (click)=\"ClearScopes()\">All sources</button>\n @for (scope of Scopes; track scope.ID) {\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"IsScopeSelected(scope.ID)\"\n (click)=\"ToggleScope(scope.ID)\">{{ scope.Name }}</button>\n }\n </div>\n }\n\n <div class=\"ob-body\">\n @if (IsLoading) {\n <div class=\"ob-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Searching…</div>\n } @else if (Rows.length === 0 && Query.length === 0) {\n <div class=\"ob-hintbar\">\n @for (hint of TriggerHints; track hint.Char) {\n <button type=\"button\" class=\"ob-hint-chip\" (click)=\"SeedTrigger(hint.Char)\">\n <b>{{ hint.Char }}</b><span>{{ hint.Label }}</span>\n </button>\n }\n </div>\n @if (RecentRows.length > 0) {\n <div class=\"ob-group-label\" role=\"presentation\">Recent</div>\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of RecentRows; track row.Suggestion.id; let i = $index) {\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + (RecentBaseIndex + i)\"\n [attr.tabindex]=\"RecentBaseIndex + i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"RecentBaseIndex + i === SelectedIndex\"\n [class.ob-row--sel]=\"RecentBaseIndex + i === SelectedIndex\"\n (focus)=\"SelectedIndex = RecentBaseIndex + i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = RecentBaseIndex + i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-clock-rotate-left'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n </span>\n <span class=\"ob-raux\"><span class=\"ob-rtype\">{{ row.Suggestion.type }}</span></span>\n </div>\n }\n </div>\n }\n } @else if (Rows.length === 0) {\n <div class=\"ob-empty\">No matches — press <kbd class=\"ob-kbd\">↵</kbd> to search everything for “{{ EffectiveQuery }}”.</div>\n } @else {\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of Rows; track row.Suggestion.id; let i = $index) {\n @if (row.GroupLabel) {\n <div class=\"ob-group-label\" role=\"presentation\">{{ row.GroupLabel }}</div>\n }\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + i\"\n [attr.tabindex]=\"i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"i === SelectedIndex\"\n [class.ob-row--sel]=\"i === SelectedIndex\"\n (focus)=\"SelectedIndex = i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-circle'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n @if (row.Suggestion.description) {\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n }\n </span>\n <span class=\"ob-raux\">\n @if (row.ScorePercent != null) {\n <span class=\"ob-score\"><i [style.width.%]=\"row.ScorePercent\"></i></span>\n }\n <span class=\"ob-rtype\">{{ row.Suggestion.type }}</span>\n <span class=\"ob-go\">open <kbd class=\"ob-kbd\">↵</kbd></span>\n </span>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"ob-foot\">\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↑</kbd><kbd class=\"ob-kbd\">↓</kbd> navigate</span>\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↵</kbd> open</span>\n <button type=\"button\" class=\"ob-settings\" aria-label=\"Command Palette settings\"\n title=\"Command Palette settings\" (click)=\"RequestSettings()\">\n <i class=\"fa-solid fa-gear\" aria-hidden=\"true\"></i>\n <span>Settings</span>\n </button>\n </div>\n </div>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnibar-record.provider.d.ts","sourceRoot":"","sources":["../../../../src/lib/omnibar/providers/omnibar-record.provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAC;AAK1F;;;;;;GAMG;AACH,qBACa,qBAAsB,SAAQ,eAAe;IACtD,SAAgB,WAAW,OAAO;IAClC,SAAgB,GAAG,qBAAqB;IACxC,SAAyB,QAAQ,MAAM;IACvC,SAAgB,SAAS,oBAAoB;IAG7C,SAAyB,WAAW,8DAAyD;IAE7F;;;;;;OAMG;IACmB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmC7G,oGAAoG;YACtF,kBAAkB;
|
|
1
|
+
{"version":3,"file":"omnibar-record.provider.d.ts","sourceRoot":"","sources":["../../../../src/lib/omnibar/providers/omnibar-record.provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAC;AAK1F;;;;;;GAMG;AACH,qBACa,qBAAsB,SAAQ,eAAe;IACtD,SAAgB,WAAW,OAAO;IAClC,SAAgB,GAAG,qBAAqB;IACxC,SAAyB,QAAQ,MAAM;IACvC,SAAgB,SAAS,oBAAoB;IAG7C,SAAyB,WAAW,8DAAyD;IAE7F;;;;;;OAMG;IACmB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmC7G,oGAAoG;YACtF,kBAAkB;IAyBnB,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiB7F,2GAA2G;IAC3G,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,gBAAgB;IAexB,+EAA+E;YACjE,iBAAiB;CAsClC;AAED,iEAAiE;AACjE,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
|
@@ -67,7 +67,12 @@ let OmnibarRecordProvider = class OmnibarRecordProvider extends OmnibarProvider
|
|
|
67
67
|
async resolveRecordNames(md, targets, user) {
|
|
68
68
|
const resolved = new Map();
|
|
69
69
|
try {
|
|
70
|
-
|
|
70
|
+
// Recents span arbitrary entities whose key column can have any name; `FromID` assumed
|
|
71
|
+
// `ID` and left those records showing a raw id instead of a name.
|
|
72
|
+
const inputs = targets.map((t) => ({
|
|
73
|
+
EntityName: t.entityName,
|
|
74
|
+
CompositeKey: CompositeKey.FromURLSegment(md.EntityByName(t.entityName), t.recordId),
|
|
75
|
+
}));
|
|
71
76
|
const results = await md.GetEntityRecordNames(inputs, user);
|
|
72
77
|
for (const r of results ?? []) {
|
|
73
78
|
if (r.Success && r.RecordName) {
|
|
@@ -137,7 +142,7 @@ let OmnibarRecordProvider = class OmnibarRecordProvider extends OmnibarProvider
|
|
|
137
142
|
const result = await rv.RunView({
|
|
138
143
|
EntityName: entity.Name,
|
|
139
144
|
ExtraFilter: escaped.length > 0 ? `${nameField.Name} LIKE '%${escaped}%'` : '',
|
|
140
|
-
Fields: [entity.
|
|
145
|
+
Fields: [...entity.PrimaryKeys.map((pk) => pk.Name), nameField.Name],
|
|
141
146
|
OrderBy: nameField.Name,
|
|
142
147
|
MaxRows: MAX_RECORD_ROWS,
|
|
143
148
|
ResultType: 'simple',
|
|
@@ -146,7 +151,8 @@ let OmnibarRecordProvider = class OmnibarRecordProvider extends OmnibarProvider
|
|
|
146
151
|
return [];
|
|
147
152
|
}
|
|
148
153
|
return result.Results.map((row) => {
|
|
149
|
-
|
|
154
|
+
// Compact key segment (raw value, or "F1|v1||F2|v2" for a composite key) — the palette resolves it with FromURLSegment
|
|
155
|
+
const recordId = CompositeKey.FromEntityRecord(entity, row).ToCompactURLSegment();
|
|
150
156
|
const name = String(row[nameField.Name] ?? recordId);
|
|
151
157
|
const nav = { kind: 'record', entityName: entity.Name, recordId };
|
|
152
158
|
return {
|