@memberjunction/ng-dashboards 5.8.0 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/models/model-management.component.d.ts +2 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +44 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +15 -12
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +10 -7
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +96 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
- package/dist/Integration/components/activity/activity.component.js +961 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -0
- package/dist/Integration/components/connections/connections.component.d.ts +194 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
- package/dist/Integration/components/connections/connections.component.js +2368 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +213 -15
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2093 -187
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +60 -0
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
- package/dist/Integration/components/overview/overview.component.js +628 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
- package/dist/Integration/components/schedules/schedules.component.js +842 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js +3 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/index.d.ts +5 -3
- package/dist/Integration/index.d.ts.map +1 -1
- package/dist/Integration/index.js +11 -7
- package/dist/Integration/index.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +20 -16
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +40 -21
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +123 -9
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +385 -68
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/__tests__/mapping-validation.test.d.ts +2 -0
- package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
- package/dist/__tests__/mapping-validation.test.js +170 -0
- package/dist/__tests__/mapping-validation.test.js.map +1 -0
- package/package.json +40 -38
- package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +0 -81
- package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +0 -1
- package/dist/Integration/components/connection-studio/connection-studio.component.js +0 -960
- package/dist/Integration/components/connection-studio/connection-studio.component.js.map +0 -1
- package/dist/Integration/components/control-tower/control-tower.component.d.ts +0 -43
- package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +0 -1
- package/dist/Integration/components/control-tower/control-tower.component.js +0 -446
- package/dist/Integration/components/control-tower/control-tower.component.js.map +0 -1
- package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +0 -65
- package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +0 -1
- package/dist/Integration/components/sync-activity/sync-activity.component.js +0 -671
- package/dist/Integration/components/sync-activity/sync-activity.component.js.map +0 -1
- package/dist/__tests__/connection-studio.test.d.ts +0 -2
- package/dist/__tests__/connection-studio.test.d.ts.map +0 -1
- package/dist/__tests__/connection-studio.test.js +0 -186
- package/dist/__tests__/connection-studio.test.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-activity.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/sync-activity/sync-activity.component.ts","../../../../src/Integration/components/sync-activity/sync-activity.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { IRunViewProvider, RunView } from '@memberjunction/core';\nimport {\n IntegrationDataService,\n IntegrationRow,\n IntegrationRunRow,\n RunDetailRow,\n EntityMapRow,\n} from '../../services/integration-data.service';\n\ntype StatusFilter = 'All' | 'Success' | 'Failed' | 'In Progress' | 'Pending';\n\ninterface WatermarkRow {\n ID: string;\n EntityMapID: string;\n WatermarkType: string;\n WatermarkValue: string | null;\n LastAppliedAt: string | null;\n EntityMap: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'IntegrationSyncActivity')\n@Component({\n standalone: false,\n selector: 'app-sync-activity',\n templateUrl: './sync-activity.component.html',\n styleUrls: ['./sync-activity.component.css']\n})\nexport class SyncActivityComponent extends BaseResourceComponent implements OnInit {\n\n Integrations: IntegrationRow[] = [];\n Runs: IntegrationRunRow[] = [];\n FilteredRuns: IntegrationRunRow[] = [];\n RunDetails: RunDetailRow[] = [];\n Watermarks: WatermarkRow[] = [];\n\n SelectedIntegrationID = '';\n SelectedStatusFilter: StatusFilter = 'All';\n SelectedRunID: string | null = null;\n ActiveDetailsTab: 'entities' | 'watermarks' = 'entities';\n\n IsLoadingIntegrations = false;\n IsLoadingRuns = false;\n IsLoadingDetails = false;\n IsLoadingWatermarks = false;\n ShowErrorLog = false;\n\n StatusOptions: StatusFilter[] = ['All', 'Success', 'Failed', 'In Progress', 'Pending'];\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n\n async ngOnInit(): Promise<void> {\n await this.loadIntegrations();\n }\n\n private async loadIntegrations(): Promise<void> {\n this.IsLoadingIntegrations = true;\n this.cdr.detectChanges();\n try {\n const summaries = await this.dataService.LoadIntegrationSummaries(this.RunViewToUse);\n this.Integrations = summaries.map(s => s.Integration);\n } catch (err) {\n console.error('[SyncActivity] Failed to load integrations:', err);\n } finally {\n this.IsLoadingIntegrations = false;\n this.cdr.detectChanges();\n }\n }\n\n async OnIntegrationChange(): Promise<void> {\n this.SelectedRunID = null;\n this.RunDetails = [];\n this.Watermarks = [];\n this.ShowErrorLog = false;\n await this.LoadRuns();\n }\n\n async LoadRuns(): Promise<void> {\n this.IsLoadingRuns = true;\n this.SelectedRunID = null;\n this.RunDetails = [];\n this.ShowErrorLog = false;\n this.cdr.detectChanges();\n try {\n if (this.SelectedIntegrationID) {\n this.Runs = await this.dataService.LoadRunHistory(\n this.SelectedIntegrationID, 100, this.RunViewToUse\n );\n } else {\n this.Runs = await this.loadAllRuns();\n }\n this.applyStatusFilter();\n } catch (err) {\n console.error('[SyncActivity] Failed to load runs:', err);\n } finally {\n this.IsLoadingRuns = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadAllRuns(): Promise<IntegrationRunRow[]> {\n const rv = new RunView(this.RunViewToUse ?? null);\n const result = await rv.RunView<IntegrationRunRow>({\n EntityName: 'MJ: Company Integration Runs',\n ExtraFilter: '',\n OrderBy: 'StartedAt DESC',\n MaxRows: 200,\n Fields: ['ID', 'CompanyIntegrationID', 'StartedAt', 'EndedAt', 'TotalRecords',\n 'Status', 'ErrorLog', 'Integration', 'Company', 'RunByUser'],\n ResultType: 'simple'\n });\n return result.Results;\n }\n\n OnStatusFilterChange(): void {\n this.applyStatusFilter();\n }\n\n private applyStatusFilter(): void {\n if (this.SelectedStatusFilter === 'All') {\n this.FilteredRuns = this.Runs;\n } else {\n this.FilteredRuns = this.Runs.filter(r => r.Status === this.SelectedStatusFilter);\n }\n }\n\n async OnRunClick(run: IntegrationRunRow): Promise<void> {\n if (UUIDsEqual(this.SelectedRunID, run.ID)) {\n this.SelectedRunID = null;\n this.RunDetails = [];\n this.Watermarks = [];\n this.ShowErrorLog = false;\n return;\n }\n this.SelectedRunID = run.ID;\n this.RunDetails = [];\n this.Watermarks = [];\n this.ShowErrorLog = false;\n this.ActiveDetailsTab = 'entities';\n await Promise.all([\n this.loadRunDetails(run.ID),\n this.loadWatermarks(run.CompanyIntegrationID),\n ]);\n }\n\n private async loadRunDetails(runID: string): Promise<void> {\n this.IsLoadingDetails = true;\n this.cdr.detectChanges();\n try {\n this.RunDetails = await this.dataService.LoadRunDetails(runID, this.RunViewToUse);\n } catch (err) {\n console.error('[SyncActivity] Failed to load run details:', err);\n } finally {\n this.IsLoadingDetails = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadWatermarks(companyIntegrationID: string): Promise<void> {\n this.IsLoadingWatermarks = true;\n this.cdr.detectChanges();\n try {\n this.Watermarks = await this.loadWatermarkData(companyIntegrationID);\n } catch (err) {\n console.error('[SyncActivity] Failed to load watermarks:', err);\n } finally {\n this.IsLoadingWatermarks = false;\n this.cdr.detectChanges();\n }\n }\n\n private async loadWatermarkData(companyIntegrationID: string): Promise<WatermarkRow[]> {\n const entityMaps = await this.dataService.LoadEntityMaps(companyIntegrationID, this.RunViewToUse);\n if (entityMaps.length === 0) return [];\n\n const entityMapIDs = entityMaps.map(m => `'${m.ID}'`).join(',');\n const rv = new RunView(this.RunViewToUse ?? null);\n const result = await rv.RunView<WatermarkRow>({\n EntityName: 'MJ: Company Integration Sync Watermarks',\n ExtraFilter: `EntityMapID IN (${entityMapIDs})`,\n OrderBy: 'LastAppliedAt DESC',\n Fields: ['ID', 'EntityMapID', 'WatermarkType', 'WatermarkValue', 'LastAppliedAt'],\n ResultType: 'simple'\n });\n\n return this.mergeWatermarksWithEntityMaps(result.Results, entityMaps);\n }\n\n private mergeWatermarksWithEntityMaps(\n watermarks: WatermarkRow[],\n entityMaps: EntityMapRow[]\n ): WatermarkRow[] {\n const mapLookup = new Map(entityMaps.map(m => [m.ID.toLowerCase(), m]));\n return watermarks.map(w => ({\n ...w,\n EntityMap: mapLookup.get(w.EntityMapID?.toLowerCase())?.ExternalObjectName ?? w.EntityMapID\n }));\n }\n\n SetDetailsTab(tab: 'entities' | 'watermarks'): void {\n this.ActiveDetailsTab = tab;\n }\n\n ToggleErrorLog(event: Event): void {\n event.stopPropagation();\n this.ShowErrorLog = !this.ShowErrorLog;\n }\n\n IsSelectedRun(id: string): boolean {\n return UUIDsEqual(this.SelectedRunID, id);\n }\n\n GetSelectedRun(): IntegrationRunRow | null {\n return this.FilteredRuns.find(r => UUIDsEqual(r.ID, this.SelectedRunID)) ?? null;\n }\n\n StatusChipClass(status: string): string {\n if (status === 'Success') return 'chip chip-green';\n if (status === 'Failed') return 'chip chip-red';\n if (status === 'In Progress') return 'chip chip-amber';\n return 'chip chip-gray';\n }\n\n StatusIcon(status: string): string {\n if (status === 'Success') return 'fa-solid fa-circle-check';\n if (status === 'Failed') return 'fa-solid fa-circle-xmark';\n if (status === 'In Progress') return 'fa-solid fa-spinner fa-spin';\n return 'fa-solid fa-clock';\n }\n\n FormatDate(dateStr: string | null): string {\n if (!dateStr) return '--';\n return new Date(dateStr).toLocaleString(undefined, {\n month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit'\n });\n }\n\n FormatDuration(run: IntegrationRunRow): string {\n if (!run.StartedAt || !run.EndedAt) return '--';\n const ms = new Date(run.EndedAt).getTime() - new Date(run.StartedAt).getTime();\n return this.dataService.FormatDuration(ms);\n }\n\n FormatWatermark(value: string | null): string {\n if (!value) return 'Not set';\n if (value.length > 40) return value.substring(0, 37) + '...';\n return value;\n }\n\n get TotalRuns(): number { return this.Runs.length; }\n get SuccessfulRuns(): number { return this.Runs.filter(r => r.Status === 'Success').length; }\n get FailedRuns(): number { return this.Runs.filter(r => r.Status === 'Failed').length; }\n get TotalRecordsInView(): number {\n return this.FilteredRuns.reduce((acc, r) => acc + r.TotalRecords, 0);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Sync Activity';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-clock-rotate-left';\n }\n}\n\nexport function LoadSyncActivityComponent(): void {\n // Tree-shaking prevention: importing this module causes\n // @RegisterClass decorators to fire, registering components.\n}\n","<div class=\"sync-activity\">\n\n <!-- Header bar -->\n <div class=\"activity-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Sync Activity\n </h2>\n </div>\n <div class=\"header-filters\">\n <select class=\"filter-select\" [(ngModel)]=\"SelectedIntegrationID\" (change)=\"OnIntegrationChange()\">\n <option value=\"\">All Integrations</option>\n @for (integration of Integrations; track integration.ID) {\n <option [value]=\"integration.ID\">{{ integration.Name }}</option>\n }\n </select>\n\n <select class=\"filter-select\" [(ngModel)]=\"SelectedStatusFilter\" (change)=\"OnStatusFilterChange()\">\n @for (status of StatusOptions; track status) {\n <option [value]=\"status\">{{ status }}</option>\n }\n </select>\n\n <button class=\"refresh-btn\" (click)=\"LoadRuns()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n </button>\n </div>\n </div>\n\n <!-- Summary KPIs -->\n @if (!IsLoadingRuns && Runs.length > 0) {\n <div class=\"activity-kpis\">\n <div class=\"kpi-item\">\n <span class=\"kpi-value\">{{ TotalRuns }}</span>\n <span class=\"kpi-label\">Total Runs</span>\n </div>\n <div class=\"kpi-item kpi-success\">\n <span class=\"kpi-value\">{{ SuccessfulRuns }}</span>\n <span class=\"kpi-label\">Successful</span>\n </div>\n <div class=\"kpi-item kpi-failed\">\n <span class=\"kpi-value\">{{ FailedRuns }}</span>\n <span class=\"kpi-label\">Failed</span>\n </div>\n <div class=\"kpi-item\">\n <span class=\"kpi-value\">{{ TotalRecordsInView | number }}</span>\n <span class=\"kpi-label\">Records (filtered)</span>\n </div>\n </div>\n }\n\n <!-- Loading state -->\n @if (IsLoadingRuns) {\n <div class=\"loading-area\">\n <mj-loading text=\"Loading run history...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoadingRuns && FilteredRuns.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No runs found for the selected filters.</p>\n </div>\n }\n\n <!-- Run list + detail split -->\n @if (!IsLoadingRuns && FilteredRuns.length > 0) {\n <div class=\"activity-body\">\n\n <!-- Run list -->\n <div class=\"run-list-panel\">\n <table class=\"run-table\">\n <thead>\n <tr>\n <th>Integration</th>\n <th>Started</th>\n <th>Status</th>\n <th>Duration</th>\n <th>Records</th>\n <th>Run By</th>\n </tr>\n </thead>\n <tbody>\n @for (run of FilteredRuns; track run.ID) {\n <tr class=\"run-row\"\n [class.selected]=\"IsSelectedRun(run.ID)\"\n (click)=\"OnRunClick(run)\">\n <td class=\"integration-cell\">\n <span class=\"integration-name\">{{ run.Integration }}</span>\n <span class=\"company-name\">{{ run.Company }}</span>\n </td>\n <td class=\"date-cell\">{{ FormatDate(run.StartedAt) }}</td>\n <td>\n <span [class]=\"StatusChipClass(run.Status)\">\n <i [class]=\"StatusIcon(run.Status)\"></i>\n {{ run.Status }}\n </span>\n </td>\n <td class=\"mono-cell\">{{ FormatDuration(run) }}</td>\n <td class=\"mono-cell\">{{ run.TotalRecords | number }}</td>\n <td>{{ run.RunByUser }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Detail panel -->\n @if (SelectedRunID) {\n <div class=\"detail-panel\">\n <div class=\"detail-header\">\n <h3>Run Details</h3>\n <button class=\"close-detail-btn\" (click)=\"OnRunClick(GetSelectedRun()!)\"\n title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Tab switcher -->\n <div class=\"detail-tabs\">\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailsTab === 'entities'\"\n (click)=\"SetDetailsTab('entities')\">\n <i class=\"fa-solid fa-table\"></i> Entity Breakdown\n </button>\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailsTab === 'watermarks'\"\n (click)=\"SetDetailsTab('watermarks')\">\n <i class=\"fa-solid fa-droplet\"></i> Watermarks\n </button>\n </div>\n\n <!-- Entity breakdown tab -->\n @if (ActiveDetailsTab === 'entities') {\n @if (IsLoadingDetails) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading entity breakdown...\" size=\"small\"></mj-loading>\n </div>\n } @else if (RunDetails.length === 0) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <p>No entity detail records for this run.</p>\n </div>\n } @else {\n <table class=\"detail-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th class=\"num-col\">Processed</th>\n <th class=\"num-col\">Created</th>\n <th class=\"num-col\">Updated</th>\n <th class=\"num-col\">Deleted</th>\n <th class=\"num-col\">Errors</th>\n <th class=\"num-col\">Skipped</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of RunDetails; track detail.ID) {\n <tr [class.error-row]=\"detail.RecordsErrored > 0\">\n <td>{{ detail.Entity }}</td>\n <td class=\"num-col\">{{ detail.RecordsProcessed | number }}</td>\n <td class=\"num-col created-col\">{{ detail.RecordsCreated | number }}</td>\n <td class=\"num-col updated-col\">{{ detail.RecordsUpdated | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsDeleted | number }}</td>\n <td class=\"num-col error-col\">{{ detail.RecordsErrored | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsSkipped | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Error log section -->\n @if (GetSelectedRun()?.ErrorLog) {\n <div class=\"error-log-section\">\n <button class=\"error-toggle-btn\" (click)=\"ToggleErrorLog($event)\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Error Log\n <i class=\"fa-solid fa-chevron-down toggle-chevron\"\n [class.flipped]=\"ShowErrorLog\"></i>\n </button>\n @if (ShowErrorLog) {\n <pre class=\"error-log-content\">{{ GetSelectedRun()?.ErrorLog }}</pre>\n }\n </div>\n }\n }\n\n <!-- Watermarks tab -->\n @if (ActiveDetailsTab === 'watermarks') {\n @if (IsLoadingWatermarks) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading watermarks...\" size=\"small\"></mj-loading>\n </div>\n } @else if (Watermarks.length === 0) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-droplet-slash\"></i>\n <p>No watermarks recorded for this integration.</p>\n </div>\n } @else {\n <table class=\"detail-table\">\n <thead>\n <tr>\n <th>Entity Map</th>\n <th>Type</th>\n <th>Current Value</th>\n <th>Last Applied</th>\n </tr>\n </thead>\n <tbody>\n @for (wm of Watermarks; track wm.ID) {\n <tr>\n <td>{{ wm.EntityMap }}</td>\n <td>\n <span class=\"type-badge\">{{ wm.WatermarkType }}</span>\n </td>\n <td class=\"watermark-value mono-cell\">{{ FormatWatermark(wm.WatermarkValue) }}</td>\n <td>{{ FormatDate(wm.LastAppliedAt) }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n\n </div>\n }\n\n </div>\n }\n\n</div>\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-studio.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connection-studio.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for ConnectionStudioComponent logic
|
|
3
|
-
* Tests the resolveIntegrationIcon function and component state management
|
|
4
|
-
*/
|
|
5
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
6
|
-
// Mock Angular before any component imports
|
|
7
|
-
vi.mock('@angular/core', () => ({
|
|
8
|
-
Injectable: () => (target) => target,
|
|
9
|
-
Component: () => (target) => target,
|
|
10
|
-
NgModule: () => (target) => target,
|
|
11
|
-
Input: () => () => { },
|
|
12
|
-
Output: () => () => { },
|
|
13
|
-
EventEmitter: class {
|
|
14
|
-
emit() { }
|
|
15
|
-
subscribe() { }
|
|
16
|
-
},
|
|
17
|
-
ChangeDetectorRef: class {
|
|
18
|
-
detectChanges() { }
|
|
19
|
-
markForCheck() { }
|
|
20
|
-
},
|
|
21
|
-
ViewContainerRef: class {
|
|
22
|
-
},
|
|
23
|
-
inject: () => ({}),
|
|
24
|
-
OnInit: class {
|
|
25
|
-
},
|
|
26
|
-
}));
|
|
27
|
-
vi.mock('@memberjunction/global', () => ({
|
|
28
|
-
RegisterClass: () => (target) => target,
|
|
29
|
-
UUIDsEqual: (a, b) => {
|
|
30
|
-
if (a == null || b == null)
|
|
31
|
-
return a === b;
|
|
32
|
-
return a.toLowerCase() === b.toLowerCase();
|
|
33
|
-
},
|
|
34
|
-
}));
|
|
35
|
-
vi.mock('@memberjunction/ng-shared', () => ({
|
|
36
|
-
BaseResourceComponent: class {
|
|
37
|
-
get RunViewToUse() { return null; }
|
|
38
|
-
},
|
|
39
|
-
}));
|
|
40
|
-
vi.mock('@memberjunction/core-entities', () => ({
|
|
41
|
-
ResourceData: class {
|
|
42
|
-
},
|
|
43
|
-
MJCredentialEntity: class {
|
|
44
|
-
},
|
|
45
|
-
MJCredentialTypeEntity: class {
|
|
46
|
-
},
|
|
47
|
-
}));
|
|
48
|
-
vi.mock('@memberjunction/core', () => ({
|
|
49
|
-
Metadata: class {
|
|
50
|
-
},
|
|
51
|
-
}));
|
|
52
|
-
vi.mock('@memberjunction/ng-credentials', () => ({
|
|
53
|
-
CredentialDialogService: class {
|
|
54
|
-
getCredentialTypes() { return Promise.resolve([]); }
|
|
55
|
-
createCredential() { return Promise.resolve({ success: false, action: 'cancelled' }); }
|
|
56
|
-
editCredential() { return Promise.resolve({ success: false, action: 'cancelled' }); }
|
|
57
|
-
},
|
|
58
|
-
}));
|
|
59
|
-
vi.mock('../../services/integration-data.service', () => ({
|
|
60
|
-
IntegrationDataService: class {
|
|
61
|
-
LoadIntegrationDefinitions() { return Promise.resolve([]); }
|
|
62
|
-
LoadSourceTypes() { return Promise.resolve([]); }
|
|
63
|
-
},
|
|
64
|
-
}));
|
|
65
|
-
// Test the icon resolution logic directly
|
|
66
|
-
const INTEGRATION_ICONS = {
|
|
67
|
-
hubspot: 'fa-brands fa-hubspot',
|
|
68
|
-
salesforce: 'fa-brands fa-salesforce',
|
|
69
|
-
yourmembership: 'fa-solid fa-id-card-clip',
|
|
70
|
-
csv: 'fa-solid fa-file-csv',
|
|
71
|
-
excel: 'fa-solid fa-file-excel',
|
|
72
|
-
file: 'fa-solid fa-file-import',
|
|
73
|
-
};
|
|
74
|
-
function resolveIntegrationIcon(name) {
|
|
75
|
-
const lower = name.toLowerCase();
|
|
76
|
-
for (const [pattern, icon] of Object.entries(INTEGRATION_ICONS)) {
|
|
77
|
-
if (lower.includes(pattern))
|
|
78
|
-
return icon;
|
|
79
|
-
}
|
|
80
|
-
return 'fa-solid fa-plug';
|
|
81
|
-
}
|
|
82
|
-
describe('resolveIntegrationIcon', () => {
|
|
83
|
-
it('should resolve HubSpot icon', () => {
|
|
84
|
-
expect(resolveIntegrationIcon('HubSpot')).toBe('fa-brands fa-hubspot');
|
|
85
|
-
});
|
|
86
|
-
it('should resolve Salesforce icon', () => {
|
|
87
|
-
expect(resolveIntegrationIcon('Salesforce')).toBe('fa-brands fa-salesforce');
|
|
88
|
-
});
|
|
89
|
-
it('should resolve YourMembership icon', () => {
|
|
90
|
-
expect(resolveIntegrationIcon('YourMembership')).toBe('fa-solid fa-id-card-clip');
|
|
91
|
-
});
|
|
92
|
-
it('should resolve CSV file icon', () => {
|
|
93
|
-
expect(resolveIntegrationIcon('CSV Import')).toBe('fa-solid fa-file-csv');
|
|
94
|
-
});
|
|
95
|
-
it('should return default plug icon for unknown integrations', () => {
|
|
96
|
-
expect(resolveIntegrationIcon('SomeRandomSystem')).toBe('fa-solid fa-plug');
|
|
97
|
-
});
|
|
98
|
-
it('should be case-insensitive', () => {
|
|
99
|
-
expect(resolveIntegrationIcon('HUBSPOT')).toBe('fa-brands fa-hubspot');
|
|
100
|
-
expect(resolveIntegrationIcon('salesforce')).toBe('fa-brands fa-salesforce');
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
describe('ConnectionStudio step validation logic', () => {
|
|
104
|
-
function createIntegration(overrides = {}) {
|
|
105
|
-
return {
|
|
106
|
-
ID: 'int-1', Name: 'HubSpot', Description: 'CRM',
|
|
107
|
-
ClassName: 'HubSpotConnector', ImportPath: null,
|
|
108
|
-
NavigationBaseURL: null, BatchMaxRequestCount: -1, BatchRequestWaitTime: -1,
|
|
109
|
-
CredentialTypeID: null,
|
|
110
|
-
...overrides
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
function createSourceType(overrides = {}) {
|
|
114
|
-
return {
|
|
115
|
-
ID: 'st-1', Name: 'SaaS API', Description: null,
|
|
116
|
-
DriverClass: 'SaaSAPIConnector', IconClass: 'fa-solid fa-cloud',
|
|
117
|
-
Status: 'Active',
|
|
118
|
-
...overrides
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
describe('Step 1 validation', () => {
|
|
122
|
-
it('should require integration selection in normal mode', () => {
|
|
123
|
-
const selectedIntegrationID = null;
|
|
124
|
-
const useCustomMode = false;
|
|
125
|
-
const customSourceTypeID = null;
|
|
126
|
-
const isValid = useCustomMode ? !!customSourceTypeID : !!selectedIntegrationID;
|
|
127
|
-
expect(isValid).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
it('should pass with integration selected', () => {
|
|
130
|
-
const selectedIntegrationID = 'int-1';
|
|
131
|
-
const useCustomMode = false;
|
|
132
|
-
const isValid = !useCustomMode && !!selectedIntegrationID;
|
|
133
|
-
expect(isValid).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
it('should require source type in custom mode', () => {
|
|
136
|
-
const useCustomMode = true;
|
|
137
|
-
const customSourceTypeID = null;
|
|
138
|
-
const isValid = useCustomMode ? !!customSourceTypeID : false;
|
|
139
|
-
expect(isValid).toBe(false);
|
|
140
|
-
});
|
|
141
|
-
it('should pass in custom mode with source type', () => {
|
|
142
|
-
const useCustomMode = true;
|
|
143
|
-
const customSourceTypeID = 'st-1';
|
|
144
|
-
const isValid = useCustomMode ? !!customSourceTypeID : false;
|
|
145
|
-
expect(isValid).toBe(true);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('Step 2 validation', () => {
|
|
149
|
-
it('should require connection name', () => {
|
|
150
|
-
expect(!!(''.trim())).toBe(false);
|
|
151
|
-
expect(!!(' '.trim())).toBe(false);
|
|
152
|
-
});
|
|
153
|
-
it('should pass with a name', () => {
|
|
154
|
-
expect(!!('Production HubSpot'.trim())).toBe(true);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
describe('Integration selection behavior', () => {
|
|
158
|
-
it('should pre-fill connection name from integration', () => {
|
|
159
|
-
const integration = createIntegration({ Name: 'Salesforce' });
|
|
160
|
-
const connectionName = integration.Name;
|
|
161
|
-
expect(connectionName).toBe('Salesforce');
|
|
162
|
-
});
|
|
163
|
-
it('should clear custom mode when selecting integration', () => {
|
|
164
|
-
let useCustomMode = true;
|
|
165
|
-
let selectedIntegrationID = null;
|
|
166
|
-
let customSourceTypeID = 'st-1';
|
|
167
|
-
// Simulate SelectIntegration
|
|
168
|
-
useCustomMode = false;
|
|
169
|
-
selectedIntegrationID = 'int-1';
|
|
170
|
-
customSourceTypeID = null;
|
|
171
|
-
expect(useCustomMode).toBe(false);
|
|
172
|
-
expect(selectedIntegrationID).toBe('int-1');
|
|
173
|
-
expect(customSourceTypeID).toBeNull();
|
|
174
|
-
});
|
|
175
|
-
it('should clear integration when selecting custom mode', () => {
|
|
176
|
-
let useCustomMode = false;
|
|
177
|
-
let selectedIntegrationID = 'int-1';
|
|
178
|
-
// Simulate SelectCustomMode
|
|
179
|
-
useCustomMode = true;
|
|
180
|
-
selectedIntegrationID = null;
|
|
181
|
-
expect(useCustomMode).toBe(true);
|
|
182
|
-
expect(selectedIntegrationID).toBeNull();
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
//# sourceMappingURL=connection-studio.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-studio.test.js","sourceRoot":"","sources":["../../src/__tests__/connection-studio.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for ConnectionStudioComponent logic\n * Tests the resolveIntegrationIcon function and component state management\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// Mock Angular before any component imports\nvi.mock('@angular/core', () => ({\n Injectable: () => (target: Function) => target,\n Component: () => (target: Function) => target,\n NgModule: () => (target: Function) => target,\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} subscribe() {} },\n ChangeDetectorRef: class { detectChanges() {} markForCheck() {} },\n ViewContainerRef: class {},\n inject: () => ({}),\n OnInit: class {},\n}));\n\nvi.mock('@memberjunction/global', () => ({\n RegisterClass: () => (target: Function) => target,\n UUIDsEqual: (a: string | null, b: string | null) => {\n if (a == null || b == null) return a === b;\n return a.toLowerCase() === b.toLowerCase();\n },\n}));\n\nvi.mock('@memberjunction/ng-shared', () => ({\n BaseResourceComponent: class {\n get RunViewToUse() { return null; }\n },\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n ResourceData: class {},\n MJCredentialEntity: class {},\n MJCredentialTypeEntity: class {},\n}));\n\nvi.mock('@memberjunction/core', () => ({\n Metadata: class {},\n}));\n\nvi.mock('@memberjunction/ng-credentials', () => ({\n CredentialDialogService: class {\n getCredentialTypes() { return Promise.resolve([]); }\n createCredential() { return Promise.resolve({ success: false, action: 'cancelled' }); }\n editCredential() { return Promise.resolve({ success: false, action: 'cancelled' }); }\n },\n}));\n\nvi.mock('../../services/integration-data.service', () => ({\n IntegrationDataService: class {\n LoadIntegrationDefinitions() { return Promise.resolve([]); }\n LoadSourceTypes() { return Promise.resolve([]); }\n },\n}));\n\nimport { IntegrationDefinitionRow, SourceTypeRow } from '../Integration/services/integration-data.service';\n\n// Test the icon resolution logic directly\nconst INTEGRATION_ICONS: Record<string, string> = {\n hubspot: 'fa-brands fa-hubspot',\n salesforce: 'fa-brands fa-salesforce',\n yourmembership: 'fa-solid fa-id-card-clip',\n csv: 'fa-solid fa-file-csv',\n excel: 'fa-solid fa-file-excel',\n file: 'fa-solid fa-file-import',\n};\n\nfunction resolveIntegrationIcon(name: string): string {\n const lower = name.toLowerCase();\n for (const [pattern, icon] of Object.entries(INTEGRATION_ICONS)) {\n if (lower.includes(pattern)) return icon;\n }\n return 'fa-solid fa-plug';\n}\n\ndescribe('resolveIntegrationIcon', () => {\n it('should resolve HubSpot icon', () => {\n expect(resolveIntegrationIcon('HubSpot')).toBe('fa-brands fa-hubspot');\n });\n\n it('should resolve Salesforce icon', () => {\n expect(resolveIntegrationIcon('Salesforce')).toBe('fa-brands fa-salesforce');\n });\n\n it('should resolve YourMembership icon', () => {\n expect(resolveIntegrationIcon('YourMembership')).toBe('fa-solid fa-id-card-clip');\n });\n\n it('should resolve CSV file icon', () => {\n expect(resolveIntegrationIcon('CSV Import')).toBe('fa-solid fa-file-csv');\n });\n\n it('should return default plug icon for unknown integrations', () => {\n expect(resolveIntegrationIcon('SomeRandomSystem')).toBe('fa-solid fa-plug');\n });\n\n it('should be case-insensitive', () => {\n expect(resolveIntegrationIcon('HUBSPOT')).toBe('fa-brands fa-hubspot');\n expect(resolveIntegrationIcon('salesforce')).toBe('fa-brands fa-salesforce');\n });\n});\n\ndescribe('ConnectionStudio step validation logic', () => {\n function createIntegration(overrides: Partial<IntegrationDefinitionRow> = {}): IntegrationDefinitionRow {\n return {\n ID: 'int-1', Name: 'HubSpot', Description: 'CRM',\n ClassName: 'HubSpotConnector', ImportPath: null,\n NavigationBaseURL: null, BatchMaxRequestCount: -1, BatchRequestWaitTime: -1,\n CredentialTypeID: null,\n ...overrides\n };\n }\n\n function createSourceType(overrides: Partial<SourceTypeRow> = {}): SourceTypeRow {\n return {\n ID: 'st-1', Name: 'SaaS API', Description: null,\n DriverClass: 'SaaSAPIConnector', IconClass: 'fa-solid fa-cloud',\n Status: 'Active',\n ...overrides\n };\n }\n\n describe('Step 1 validation', () => {\n it('should require integration selection in normal mode', () => {\n const selectedIntegrationID: string | null = null;\n const useCustomMode = false;\n const customSourceTypeID: string | null = null;\n\n const isValid = useCustomMode ? !!customSourceTypeID : !!selectedIntegrationID;\n expect(isValid).toBe(false);\n });\n\n it('should pass with integration selected', () => {\n const selectedIntegrationID = 'int-1';\n const useCustomMode = false;\n\n const isValid = !useCustomMode && !!selectedIntegrationID;\n expect(isValid).toBe(true);\n });\n\n it('should require source type in custom mode', () => {\n const useCustomMode = true;\n const customSourceTypeID: string | null = null;\n\n const isValid = useCustomMode ? !!customSourceTypeID : false;\n expect(isValid).toBe(false);\n });\n\n it('should pass in custom mode with source type', () => {\n const useCustomMode = true;\n const customSourceTypeID = 'st-1';\n\n const isValid = useCustomMode ? !!customSourceTypeID : false;\n expect(isValid).toBe(true);\n });\n });\n\n describe('Step 2 validation', () => {\n it('should require connection name', () => {\n expect(!!(''.trim())).toBe(false);\n expect(!!(' '.trim())).toBe(false);\n });\n\n it('should pass with a name', () => {\n expect(!!('Production HubSpot'.trim())).toBe(true);\n });\n });\n\n describe('Integration selection behavior', () => {\n it('should pre-fill connection name from integration', () => {\n const integration = createIntegration({ Name: 'Salesforce' });\n const connectionName = integration.Name;\n expect(connectionName).toBe('Salesforce');\n });\n\n it('should clear custom mode when selecting integration', () => {\n let useCustomMode = true;\n let selectedIntegrationID: string | null = null;\n let customSourceTypeID: string | null = 'st-1';\n\n // Simulate SelectIntegration\n useCustomMode = false;\n selectedIntegrationID = 'int-1';\n customSourceTypeID = null;\n\n expect(useCustomMode).toBe(false);\n expect(selectedIntegrationID).toBe('int-1');\n expect(customSourceTypeID).toBeNull();\n });\n\n it('should clear integration when selecting custom mode', () => {\n let useCustomMode = false;\n let selectedIntegrationID: string | null = 'int-1';\n\n // Simulate SelectCustomMode\n useCustomMode = true;\n selectedIntegrationID = null;\n\n expect(useCustomMode).toBe(true);\n expect(selectedIntegrationID).toBeNull();\n });\n });\n});\n"]}
|