@memberjunction/ng-explorer-core 6.2.0-edge.6 → 6.2.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/dist/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +10 -0
- package/dist/app-routing.module.js.map +1 -1
- package/dist/generated/lazy-feature-config.d.ts +1 -1
- package/dist/generated/lazy-feature-config.d.ts.map +1 -1
- package/dist/generated/lazy-feature-config.js +14 -2
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +2 -2
- package/dist/lib/office/office-connect.component.d.ts +19 -0
- package/dist/lib/office/office-connect.component.d.ts.map +1 -0
- package/dist/lib/office/office-connect.component.js +80 -0
- package/dist/lib/office/office-connect.component.js.map +1 -0
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +7 -0
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +20 -8
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-class-resolution.d.ts +14 -0
- package/dist/lib/resource-wrappers/dashboard-class-resolution.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/dashboard-class-resolution.js +21 -0
- package/dist/lib/resource-wrappers/dashboard-class-resolution.js.map +1 -0
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +3 -2
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +3 -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/single-list-detail/single-list-detail.component.js +2 -2
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +14 -0
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +62 -2
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +2 -2
- package/dist/module.d.ts +64 -63
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +3 -0
- package/dist/module.js.map +1 -1
- package/package.json +58 -57
|
@@ -647,11 +647,11 @@ export class DashboardPreferencesDialogComponent extends BaseAngularComponent {
|
|
|
647
647
|
i0.ɵɵproperty("disabled", !ctx.hasChanges || ctx.saving);
|
|
648
648
|
i0.ɵɵadvance();
|
|
649
649
|
i0.ɵɵconditional(ctx.saving ? 19 : 20);
|
|
650
|
-
} }, 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:
|
|
650
|
+
} }, 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: var(--mj-brand-on-primary);\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: var(--mj-text-inverse);\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\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}"] });
|
|
651
651
|
}
|
|
652
652
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardPreferencesDialogComponent, [{
|
|
653
653
|
type: Component,
|
|
654
|
-
args: [{ standalone: false, selector: 'mj-dashboard-preferences-dialog', template: "<mj-dialog [Visible]=\"true\" Title=\"Dashboard Preferences\"\n [Width]=\"800\"\n [Height]=\"600\"\n [MinWidth]=\"600\"\n (Close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"personal\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"system\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <mj-empty-state\n Variant=\"error\"\n Size=\"compact\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n [Title]=\"error\" />\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (availableDashboards.length === 0) {\n <mj-empty-state\n Variant=\"success\"\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-check\"\n Title=\"All dashboards are configured\" />\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (configuredDashboards.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No dashboards configured\" />\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </mj-dialog-actions>\n</div>\n</mj-dialog>\n", styles: [".dashboard-preferences-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header h3 {\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 h3 i {\n margin-right: 8px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator i {\n margin-right: 6px;\n}\n\n.preference-mode-selector {\n margin-top: 12px;\n display: flex;\n gap: 20px;\n}\n\n.preference-mode-selector label {\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 input[type=\"radio\"] {\n margin: 0;\n}\n\n.dialog-content {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n}\n\n.loading-container {\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 {\n display: flex;\n gap: 20px;\n height: 100%;\n}\n\n.panel {\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 h4 {\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 h4 i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.dashboard-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n\n.dashboard-item {\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: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 {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: rotate(2deg);\n}\n\n.dashboard-item.cdk-drag-placeholder {\n opacity: 0.3;\n border-style: dashed;\n}\n\n.dashboard-item-content {\n display: flex;\n align-items: center;\n padding: 12px;\n gap: 12px;\n}\n\n.drag-handle {\n color: var(--mj-text-disabled);\n cursor: move;\n font-size: 14px;\n}\n\n.order-number {\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 {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dashboard-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n}\n\n.dashboard-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n}\n\n.add-button {\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:hover {\n background-color: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n opacity: 1;\n}\n\n.remove-button {\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:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n}\n\n.cdk-drop-list-dragging .dashboard-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.dialog-footer {\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 {\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:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-text-muted);\n color: white;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: white;\n border-color: var(--mj-brand-primary);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .dashboard-preferences-dialog {\n width: 95vw;\n max-height: 90vh;\n }\n\n .preferences-panels {\n flex-direction: column;\n gap: 16px;\n }\n\n .panel {\n min-height: 200px;\n }\n\n .dashboard-list {\n min-height: 150px;\n }\n}\n"] }]
|
|
654
|
+
args: [{ standalone: false, selector: 'mj-dashboard-preferences-dialog', template: "<mj-dialog [Visible]=\"true\" Title=\"Dashboard Preferences\"\n [Width]=\"800\"\n [Height]=\"600\"\n [MinWidth]=\"600\"\n (Close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"personal\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"system\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <mj-empty-state\n Variant=\"error\"\n Size=\"compact\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n [Title]=\"error\" />\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (availableDashboards.length === 0) {\n <mj-empty-state\n Variant=\"success\"\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-check\"\n Title=\"All dashboards are configured\" />\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (configuredDashboards.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No dashboards configured\" />\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </mj-dialog-actions>\n</div>\n</mj-dialog>\n", styles: [".dashboard-preferences-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.dialog-header h3 {\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 h3 i {\n margin-right: 8px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.scope-indicator i {\n margin-right: 6px;\n}\n\n.preference-mode-selector {\n margin-top: 12px;\n display: flex;\n gap: 20px;\n}\n\n.preference-mode-selector label {\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 input[type=\"radio\"] {\n margin: 0;\n}\n\n.dialog-content {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n}\n\n.loading-container {\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 {\n display: flex;\n gap: 20px;\n height: 100%;\n}\n\n.panel {\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 h4 {\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 h4 i {\n margin-right: 8px;\n color: var(--mj-text-muted);\n}\n\n.dashboard-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n\n.dashboard-item {\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: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 {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: rotate(2deg);\n}\n\n.dashboard-item.cdk-drag-placeholder {\n opacity: 0.3;\n border-style: dashed;\n}\n\n.dashboard-item-content {\n display: flex;\n align-items: center;\n padding: 12px;\n gap: 12px;\n}\n\n.drag-handle {\n color: var(--mj-text-disabled);\n cursor: move;\n font-size: 14px;\n}\n\n.order-number {\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: var(--mj-brand-on-primary);\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.dashboard-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dashboard-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n}\n\n.dashboard-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n}\n\n.add-button {\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:hover {\n background-color: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n opacity: 1;\n}\n\n.remove-button {\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:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n}\n\n.cdk-drop-list-dragging .dashboard-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.dialog-footer {\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 {\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:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .dashboard-preferences-dialog {\n width: 95vw;\n max-height: 90vh;\n }\n\n .preferences-panels {\n flex-direction: column;\n gap: 16px;\n }\n\n .panel {\n min-height: 200px;\n }\n\n .dashboard-list {\n min-height: 150px;\n }\n}\n"] }]
|
|
655
655
|
}], null, { ApplicationId: [{
|
|
656
656
|
type: Input
|
|
657
657
|
}], applicationId: [{
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
|
+
import { OfficeConnectPanelComponent } from '@memberjunction/ng-export-service';
|
|
3
|
+
import { OfficeConnectQueryParams } from '@memberjunction/excel-addin';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class OfficeConnectComponent extends BaseAngularComponent {
|
|
6
|
+
private route;
|
|
7
|
+
private router;
|
|
8
|
+
private authBase;
|
|
9
|
+
Panel?: OfficeConnectPanelComponent;
|
|
10
|
+
get QueryParams(): OfficeConnectQueryParams;
|
|
11
|
+
/** Starts Explorer's configured auth provider sign-in, asking it to return to this route. */
|
|
12
|
+
OnSignIn(): void;
|
|
13
|
+
OnNavigateToUrl(url: string): void;
|
|
14
|
+
/** Leaves the page. Protected so tests can observe navigation without performing it. */
|
|
15
|
+
protected LeaveFor(url: string): void;
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<OfficeConnectComponent, never>;
|
|
17
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<OfficeConnectComponent, "mj-office-connect", never, {}, {}, never, never, false, never>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=office-connect.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office-connect.component.d.ts","sourceRoot":"","sources":["../../../src/lib/office/office-connect.component.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAA4B,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;;AAEjG,qBAYa,sBAAuB,SAAQ,oBAAoB;IAC5D,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAsB;IAG/B,KAAK,CAAC,EAAE,2BAA2B,CAAC;IAE3C,IAAW,WAAW,IAAI,wBAAwB,CAEjD;IAED,6FAA6F;IACtF,QAAQ,IAAI,IAAI;IAShB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzC,wFAAwF;IACxF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;yCA3B5B,sBAAsB;2CAAtB,sBAAsB;CA8BlC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Explorer's `office/connect` route wrapper around `<mj-office-connect-panel>`.
|
|
3
|
+
*
|
|
4
|
+
* The full consent UI, session readiness polling, `ExcelAddin.*` operations, and RSA-OAEP handoff live
|
|
5
|
+
* in `@memberjunction/ng-export-service`'s generic `<mj-office-connect-panel>` component (and
|
|
6
|
+
* `@memberjunction/excel-addin`'s pure `office-connect` helpers) so non-Explorer Angular apps can serve
|
|
7
|
+
* `/office/connect` identically. This thin Explorer route wrapper connects `ActivatedRoute`, `Router`,
|
|
8
|
+
* and `MJAuthBase`.
|
|
9
|
+
*
|
|
10
|
+
* Like the OAuth callback and claim redemption pages, this route is a deliberate exception to the
|
|
11
|
+
* NavigationService-only rule: it is registered directly in the routing module without `AuthGuard`.
|
|
12
|
+
*
|
|
13
|
+
* @module Office
|
|
14
|
+
*/
|
|
15
|
+
import { Component, ViewChild, inject } from '@angular/core';
|
|
16
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
17
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
18
|
+
import { MJAuthBase } from '@memberjunction/ng-auth-services';
|
|
19
|
+
import { OfficeConnectPanelComponent } from '@memberjunction/ng-export-service';
|
|
20
|
+
import { BuildOfficeSignInOptions } from '@memberjunction/excel-addin';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@memberjunction/ng-export-service";
|
|
23
|
+
export class OfficeConnectComponent extends BaseAngularComponent {
|
|
24
|
+
route = inject(ActivatedRoute);
|
|
25
|
+
router = inject(Router);
|
|
26
|
+
authBase = inject(MJAuthBase);
|
|
27
|
+
Panel;
|
|
28
|
+
get QueryParams() {
|
|
29
|
+
return this.route.snapshot.queryParams;
|
|
30
|
+
}
|
|
31
|
+
/** Starts Explorer's configured auth provider sign-in, asking it to return to this route. */
|
|
32
|
+
OnSignIn() {
|
|
33
|
+
this.authBase.login(BuildOfficeSignInOptions(this.router.url)).subscribe({
|
|
34
|
+
error: (e) => {
|
|
35
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
36
|
+
this.Panel?.ShowSignInError(`Sign-in didn't start: ${detail}`);
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
OnNavigateToUrl(url) {
|
|
41
|
+
this.LeaveFor(url);
|
|
42
|
+
}
|
|
43
|
+
/** Leaves the page. Protected so tests can observe navigation without performing it. */
|
|
44
|
+
LeaveFor(url) {
|
|
45
|
+
window.location.replace(url);
|
|
46
|
+
}
|
|
47
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵOfficeConnectComponent_BaseFactory; return function OfficeConnectComponent_Factory(__ngFactoryType__) { return (ɵOfficeConnectComponent_BaseFactory || (ɵOfficeConnectComponent_BaseFactory = i0.ɵɵgetInheritedFactory(OfficeConnectComponent)))(__ngFactoryType__ || OfficeConnectComponent); }; })();
|
|
48
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: OfficeConnectComponent, selectors: [["mj-office-connect"]], viewQuery: function OfficeConnectComponent_Query(rf, ctx) { if (rf & 1) {
|
|
49
|
+
i0.ɵɵviewQuery(OfficeConnectPanelComponent, 5);
|
|
50
|
+
} if (rf & 2) {
|
|
51
|
+
let _t;
|
|
52
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.Panel = _t.first);
|
|
53
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 2, consts: [[3, "SignInRequested", "NavigateToUrl", "Provider", "QueryParams"]], template: function OfficeConnectComponent_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
i0.ɵɵelementStart(0, "mj-office-connect-panel", 0);
|
|
55
|
+
i0.ɵɵlistener("SignInRequested", function OfficeConnectComponent_Template_mj_office_connect_panel_SignInRequested_0_listener() { return ctx.OnSignIn(); })("NavigateToUrl", function OfficeConnectComponent_Template_mj_office_connect_panel_NavigateToUrl_0_listener($event) { return ctx.OnNavigateToUrl($event); });
|
|
56
|
+
i0.ɵɵelementEnd();
|
|
57
|
+
} if (rf & 2) {
|
|
58
|
+
i0.ɵɵproperty("Provider", ctx.Provider)("QueryParams", ctx.QueryParams);
|
|
59
|
+
} }, dependencies: [i1.OfficeConnectPanelComponent], encapsulation: 2 });
|
|
60
|
+
}
|
|
61
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OfficeConnectComponent, [{
|
|
62
|
+
type: Component,
|
|
63
|
+
args: [{
|
|
64
|
+
standalone: false,
|
|
65
|
+
selector: 'mj-office-connect',
|
|
66
|
+
template: `
|
|
67
|
+
<mj-office-connect-panel
|
|
68
|
+
[Provider]="Provider"
|
|
69
|
+
[QueryParams]="QueryParams"
|
|
70
|
+
(SignInRequested)="OnSignIn()"
|
|
71
|
+
(NavigateToUrl)="OnNavigateToUrl($event)">
|
|
72
|
+
</mj-office-connect-panel>
|
|
73
|
+
`,
|
|
74
|
+
}]
|
|
75
|
+
}], null, { Panel: [{
|
|
76
|
+
type: ViewChild,
|
|
77
|
+
args: [OfficeConnectPanelComponent]
|
|
78
|
+
}] }); })();
|
|
79
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(OfficeConnectComponent, { className: "OfficeConnectComponent", filePath: "src/lib/office/office-connect.component.ts", lineNumber: 34 }); })();
|
|
80
|
+
//# sourceMappingURL=office-connect.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office-connect.component.js","sourceRoot":"","sources":["../../../src/lib/office/office-connect.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAA4B,MAAM,6BAA6B,CAAC;;;AAcjG,MAAM,OAAO,sBAAuB,SAAQ,oBAAoB;IACpD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAG/B,KAAK,CAA+B;IAE3C,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC3C,CAAC;IAED,6FAA6F;IACtF,QAAQ;QACX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,KAAK,EAAE,CAAC,CAAQ,EAAE,EAAE;gBAChB,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;YACnE,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAEM,eAAe,CAAC,GAAW;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,wFAAwF;IAC9E,QAAQ,CAAC,GAAW;QAC1B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;qQA7BQ,sBAAsB,yBAAtB,sBAAsB;6DAAtB,sBAAsB;2BAKpB,2BAA2B;;;;;YAblC,kDAI8C;YAA1C,AADA,wIAAmB,cAAU,IAAC,6HACb,2BAAuB,IAAC;YAC7C,iBAA0B;;YAHtB,AADA,uCAAqB,gCACM;;;iFAM1B,sBAAsB;cAZlC,SAAS;eAAC;gBACP,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,mBAAmB;gBAC7B,QAAQ,EAAE;;;;;;;KAOT;aACJ;;kBAMI,SAAS;mBAAC,2BAA2B;;kFAL7B,sBAAsB","sourcesContent":["/**\n * @fileoverview Explorer's `office/connect` route wrapper around `<mj-office-connect-panel>`.\n *\n * The full consent UI, session readiness polling, `ExcelAddin.*` operations, and RSA-OAEP handoff live\n * in `@memberjunction/ng-export-service`'s generic `<mj-office-connect-panel>` component (and\n * `@memberjunction/excel-addin`'s pure `office-connect` helpers) so non-Explorer Angular apps can serve\n * `/office/connect` identically. This thin Explorer route wrapper connects `ActivatedRoute`, `Router`,\n * and `MJAuthBase`.\n *\n * Like the OAuth callback and claim redemption pages, this route is a deliberate exception to the\n * NavigationService-only rule: it is registered directly in the routing module without `AuthGuard`.\n *\n * @module Office\n */\nimport { Component, ViewChild, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { OfficeConnectPanelComponent } from '@memberjunction/ng-export-service';\nimport { BuildOfficeSignInOptions, OfficeConnectQueryParams } from '@memberjunction/excel-addin';\n\n@Component({\n standalone: false,\n selector: 'mj-office-connect',\n template: `\n <mj-office-connect-panel\n [Provider]=\"Provider\"\n [QueryParams]=\"QueryParams\"\n (SignInRequested)=\"OnSignIn()\"\n (NavigateToUrl)=\"OnNavigateToUrl($event)\">\n </mj-office-connect-panel>\n `,\n})\nexport class OfficeConnectComponent extends BaseAngularComponent {\n private route = inject(ActivatedRoute);\n private router = inject(Router);\n private authBase = inject(MJAuthBase);\n\n @ViewChild(OfficeConnectPanelComponent)\n public Panel?: OfficeConnectPanelComponent;\n\n public get QueryParams(): OfficeConnectQueryParams {\n return this.route.snapshot.queryParams;\n }\n\n /** Starts Explorer's configured auth provider sign-in, asking it to return to this route. */\n public OnSignIn(): void {\n this.authBase.login(BuildOfficeSignInOptions(this.router.url)).subscribe({\n error: (e: Error) => {\n const detail = e instanceof Error ? e.message : String(e);\n this.Panel?.ShowSignInError(`Sign-in didn't start: ${detail}`);\n },\n });\n }\n\n public OnNavigateToUrl(url: string): void {\n this.LeaveFor(url);\n }\n\n /** Leaves the page. Protected so tests can observe navigation without performing it. */\n protected LeaveFor(url: string): void {\n window.location.replace(url);\n }\n}\n"]}
|
|
@@ -202,6 +202,13 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
|
|
|
202
202
|
* Select a conversation by ID - loads the entity and updates local state
|
|
203
203
|
*/
|
|
204
204
|
private selectConversation;
|
|
205
|
+
/**
|
|
206
|
+
* Loads a selected conversation the engine's list does not hold. The list carries only Global
|
|
207
|
+
* and Both scope; an application-scoped conversation (a routine's wake thread, a cockpit chat)
|
|
208
|
+
* is reachable only by deep link, and without its entity the chat shows no title and no pinned
|
|
209
|
+
* agent. Applied only while the same conversation is still selected.
|
|
210
|
+
*/
|
|
211
|
+
private loadUnlistedConversation;
|
|
205
212
|
/**
|
|
206
213
|
* Update URL query string to reflect current state.
|
|
207
214
|
* Uses NavigationService for proper URL management that respects app-scoped routes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -611,19 +611,31 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
611
611
|
// Keep bridge in sync so other consumers (toast suppression, overlay) know
|
|
612
612
|
// which conversation the workspace is viewing
|
|
613
613
|
this.bridge.SetActiveFromWorkspace(conversationId);
|
|
614
|
-
// Load the conversation entity from
|
|
614
|
+
// Load the conversation entity from the engine's list; an unlisted one is loaded below.
|
|
615
615
|
const conversation = this.engine.GetConversation(conversationId);
|
|
616
|
-
|
|
617
|
-
this.SelectedConversation = conversation;
|
|
618
|
-
}
|
|
619
|
-
else {
|
|
620
|
-
// Conversation might not be loaded yet - the chat area will handle loading
|
|
621
|
-
this.SelectedConversation = null;
|
|
622
|
-
}
|
|
616
|
+
this.SelectedConversation = conversation ?? null;
|
|
623
617
|
// Update URL if not skipping
|
|
624
618
|
if (!this.skipUrlUpdate) {
|
|
625
619
|
this.updateUrl();
|
|
626
620
|
}
|
|
621
|
+
if (!conversation) {
|
|
622
|
+
await this.loadUnlistedConversation(conversationId);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Loads a selected conversation the engine's list does not hold. The list carries only Global
|
|
627
|
+
* and Both scope; an application-scoped conversation (a routine's wake thread, a cockpit chat)
|
|
628
|
+
* is reachable only by deep link, and without its entity the chat shows no title and no pinned
|
|
629
|
+
* agent. Applied only while the same conversation is still selected.
|
|
630
|
+
*/
|
|
631
|
+
async loadUnlistedConversation(conversationId) {
|
|
632
|
+
const loaded = await this.engine.EnsureConversationLoaded(conversationId, this.CurrentUser);
|
|
633
|
+
if (!loaded || !UUIDsEqual(this.SelectedConversationId, conversationId)) {
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
this.SelectedConversation = loaded;
|
|
637
|
+
this.updateTabTitle();
|
|
638
|
+
this.cdr.detectChanges();
|
|
627
639
|
}
|
|
628
640
|
/**
|
|
629
641
|
* Update URL query string to reflect current state.
|