@memberjunction/ng-dashboards 5.41.0 → 5.43.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/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +16 -5
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +59 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +150 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts.component.d.ts +28 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts.component.js +235 -0
- package/dist/AI/components/analytics/realtime/realtime-transcripts.component.js.map +1 -0
- package/dist/AI/index.d.ts +2 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +3 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/BulkOperations/bulk-operations-container.component.d.ts +17 -0
- package/dist/BulkOperations/bulk-operations-container.component.d.ts.map +1 -0
- package/dist/BulkOperations/bulk-operations-container.component.js +70 -0
- package/dist/BulkOperations/bulk-operations-container.component.js.map +1 -0
- package/dist/BulkOperations/bulk-operations-operations.component.d.ts +16 -0
- package/dist/BulkOperations/bulk-operations-operations.component.d.ts.map +1 -0
- package/dist/BulkOperations/bulk-operations-operations.component.js +42 -0
- package/dist/BulkOperations/bulk-operations-operations.component.js.map +1 -0
- package/dist/BulkOperations/bulk-operations-run-history.component.d.ts +16 -0
- package/dist/BulkOperations/bulk-operations-run-history.component.d.ts.map +1 -0
- package/dist/BulkOperations/bulk-operations-run-history.component.js +42 -0
- package/dist/BulkOperations/bulk-operations-run-history.component.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +12 -8
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +12 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +419 -333
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +4 -1
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +20 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +54 -50
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +27 -3
- package/dist/core-dashboards.module.js.map +1 -1
- package/package.json +56 -55
|
@@ -305,7 +305,7 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditi
|
|
|
305
305
|
} }
|
|
306
306
|
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
307
307
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
308
|
-
i0.ɵɵelementStart(0, "div",
|
|
308
|
+
i0.ɵɵelementStart(0, "div", 99)(1, "div", 59)(2, "span", 60);
|
|
309
309
|
i0.ɵɵtext(3, "Pull (External \u2192 MJ)");
|
|
310
310
|
i0.ɵɵelementEnd();
|
|
311
311
|
i0.ɵɵelementStart(4, "button", 61);
|
|
@@ -351,7 +351,7 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Templat
|
|
|
351
351
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleSyncMenu(ctx_r1.SelectedSummary.Integration.ID, $event)); });
|
|
352
352
|
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditional_2_Template, 2, 0)(3, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditional_3_Template, 3, 0);
|
|
353
353
|
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditional_4_Template, 28, 0, "div",
|
|
354
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Conditional_4_Template, 28, 0, "div", 99);
|
|
355
355
|
i0.ɵɵelementEnd();
|
|
356
356
|
} if (rf & 2) {
|
|
357
357
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -364,7 +364,7 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_21_Templat
|
|
|
364
364
|
} }
|
|
365
365
|
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
366
366
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
367
|
-
i0.ɵɵelementStart(0, "mj-scheduled-job-summary",
|
|
367
|
+
i0.ɵɵelementStart(0, "mj-scheduled-job-summary", 100);
|
|
368
368
|
i0.ɵɵlistener("EditRequested", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_28_Template_mj_scheduled_job_summary_EditRequested_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSchedulePanel()); });
|
|
369
369
|
i0.ɵɵelementEnd();
|
|
370
370
|
} if (rf & 2) {
|
|
@@ -373,24 +373,32 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_28_Templat
|
|
|
373
373
|
} }
|
|
374
374
|
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
375
375
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
376
|
-
i0.ɵɵelementStart(0, "div", 82)(1, "span",
|
|
376
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "span", 101);
|
|
377
377
|
i0.ɵɵtext(2, "No sync schedule configured");
|
|
378
378
|
i0.ɵɵelementEnd();
|
|
379
|
-
i0.ɵɵelementStart(3, "button",
|
|
379
|
+
i0.ɵɵelementStart(3, "button", 102);
|
|
380
380
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_29_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSchedulePanel()); });
|
|
381
381
|
i0.ɵɵelement(4, "i", 13);
|
|
382
382
|
i0.ɵɵtext(5, " Schedule Sync ");
|
|
383
383
|
i0.ɵɵelementEnd()();
|
|
384
384
|
} }
|
|
385
|
-
function
|
|
385
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
386
|
+
i0.ɵɵelement(0, "i", 43);
|
|
387
|
+
i0.ɵɵtext(1, " Finding\u2026 ");
|
|
388
|
+
} }
|
|
389
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
390
|
+
i0.ɵɵelement(0, "i", 103);
|
|
391
|
+
i0.ɵɵtext(1, " Find New Tables ");
|
|
392
|
+
} }
|
|
393
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
386
394
|
i0.ɵɵelement(0, "i", 49);
|
|
387
395
|
} }
|
|
388
|
-
function
|
|
396
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
389
397
|
i0.ɵɵelement(0, "i", 50);
|
|
390
398
|
} }
|
|
391
|
-
function
|
|
392
|
-
i0.ɵɵelementStart(0, "div",
|
|
393
|
-
i0.ɵɵconditionalCreate(1,
|
|
399
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
400
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
401
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditional_1_Template, 1, 0, "i", 49)(2, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditional_2_Template, 1, 0, "i", 50);
|
|
394
402
|
i0.ɵɵelementStart(3, "span");
|
|
395
403
|
i0.ɵɵtext(4);
|
|
396
404
|
i0.ɵɵelementEnd()();
|
|
@@ -402,8 +410,8 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_51_Templat
|
|
|
402
410
|
i0.ɵɵadvance(3);
|
|
403
411
|
i0.ɵɵtextInterpolate(ctx_r1.SyncResult.Message || (ctx_r1.SyncResult.Success ? "Sync completed successfully" : "Sync failed"));
|
|
404
412
|
} }
|
|
405
|
-
function
|
|
406
|
-
i0.ɵɵelementStart(0, "option",
|
|
413
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
414
|
+
i0.ɵɵelementStart(0, "option", 111);
|
|
407
415
|
i0.ɵɵtext(1);
|
|
408
416
|
i0.ɵɵelementEnd();
|
|
409
417
|
} if (rf & 2) {
|
|
@@ -412,16 +420,16 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_52_For_13_
|
|
|
412
420
|
i0.ɵɵadvance();
|
|
413
421
|
i0.ɵɵtextInterpolate(schema_r18);
|
|
414
422
|
} }
|
|
415
|
-
function
|
|
423
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
416
424
|
i0.ɵɵelement(0, "i", 43);
|
|
417
425
|
i0.ɵɵtext(1, " Mapping... ");
|
|
418
426
|
} }
|
|
419
|
-
function
|
|
420
|
-
i0.ɵɵelement(0, "i",
|
|
427
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
428
|
+
i0.ɵɵelement(0, "i", 95);
|
|
421
429
|
i0.ɵɵtext(1, " Auto-Map ");
|
|
422
430
|
} }
|
|
423
|
-
function
|
|
424
|
-
i0.ɵɵelementStart(0, "div",
|
|
431
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
432
|
+
i0.ɵɵelementStart(0, "div", 125);
|
|
425
433
|
i0.ɵɵelement(1, "i", 49);
|
|
426
434
|
i0.ɵɵtext(2);
|
|
427
435
|
i0.ɵɵelementEnd();
|
|
@@ -430,15 +438,15 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_52_Conditi
|
|
|
430
438
|
i0.ɵɵadvance(2);
|
|
431
439
|
i0.ɵɵtextInterpolate4(" Created ", ctx_r1.AutoMapResult.EntityMapsCreated, " entity map", ctx_r1.AutoMapResult.EntityMapsCreated !== 1 ? "s" : "", " with ", ctx_r1.AutoMapResult.FieldMapsCreated, " field map", ctx_r1.AutoMapResult.FieldMapsCreated !== 1 ? "s" : "", " ");
|
|
432
440
|
} }
|
|
433
|
-
function
|
|
434
|
-
i0.ɵɵelementStart(0, "div",
|
|
435
|
-
i0.ɵɵelement(1, "i",
|
|
441
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
442
|
+
i0.ɵɵelementStart(0, "div", 125);
|
|
443
|
+
i0.ɵɵelement(1, "i", 127);
|
|
436
444
|
i0.ɵɵtext(2, " All entities in this schema are already mapped. ");
|
|
437
445
|
i0.ɵɵelementEnd();
|
|
438
446
|
} }
|
|
439
|
-
function
|
|
440
|
-
i0.ɵɵelementStart(0, "div",
|
|
441
|
-
i0.ɵɵelement(1, "i",
|
|
447
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
448
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
449
|
+
i0.ɵɵelement(1, "i", 129);
|
|
442
450
|
i0.ɵɵtext(2);
|
|
443
451
|
i0.ɵɵelementEnd();
|
|
444
452
|
} if (rf & 2) {
|
|
@@ -446,19 +454,19 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_52_Conditi
|
|
|
446
454
|
i0.ɵɵadvance(2);
|
|
447
455
|
i0.ɵɵtextInterpolate1(" ", err_r19);
|
|
448
456
|
} }
|
|
449
|
-
function
|
|
450
|
-
i0.ɵɵelementStart(0, "div",
|
|
451
|
-
i0.ɵɵrepeaterCreate(1,
|
|
457
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
458
|
+
i0.ɵɵelementStart(0, "div", 126);
|
|
459
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_3_For_2_Template, 3, 1, "div", 128, i0.ɵɵrepeaterTrackByIdentity);
|
|
452
460
|
i0.ɵɵelementEnd();
|
|
453
461
|
} if (rf & 2) {
|
|
454
462
|
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
455
463
|
i0.ɵɵadvance();
|
|
456
464
|
i0.ɵɵrepeater(ctx_r1.AutoMapResult.Errors);
|
|
457
465
|
} }
|
|
458
|
-
function
|
|
459
|
-
i0.ɵɵelementStart(0, "div",
|
|
460
|
-
i0.ɵɵconditionalCreate(1,
|
|
461
|
-
i0.ɵɵconditionalCreate(3,
|
|
466
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
467
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
468
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_1_Template, 3, 4, "div", 125)(2, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_2_Template, 3, 0, "div", 125);
|
|
469
|
+
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Conditional_3_Template, 3, 0, "div", 126);
|
|
462
470
|
i0.ɵɵelementEnd();
|
|
463
471
|
} if (rf & 2) {
|
|
464
472
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -468,47 +476,47 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_52_Conditi
|
|
|
468
476
|
i0.ɵɵadvance(2);
|
|
469
477
|
i0.ɵɵconditional(ctx_r1.AutoMapResult.Errors.length > 0 ? 3 : -1);
|
|
470
478
|
} }
|
|
471
|
-
function
|
|
479
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
472
480
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
473
|
-
i0.ɵɵelementStart(0, "div",
|
|
474
|
-
i0.ɵɵelement(2, "i",
|
|
481
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "div", 105);
|
|
482
|
+
i0.ɵɵelement(2, "i", 95);
|
|
475
483
|
i0.ɵɵelementStart(3, "span");
|
|
476
484
|
i0.ɵɵtext(4, "Auto-map all entities in a schema to this integration with 1:1 field mappings");
|
|
477
485
|
i0.ɵɵelementEnd()();
|
|
478
|
-
i0.ɵɵelementStart(5, "div",
|
|
486
|
+
i0.ɵɵelementStart(5, "div", 106)(6, "div", 107)(7, "label", 108);
|
|
479
487
|
i0.ɵɵtext(8, "Target Schema");
|
|
480
488
|
i0.ɵɵelementEnd();
|
|
481
|
-
i0.ɵɵelementStart(9, "select",
|
|
482
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
483
|
-
i0.ɵɵelementStart(10, "option",
|
|
489
|
+
i0.ɵɵelementStart(9, "select", 109);
|
|
490
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_select_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.AutoMapSelectedSchema, $event) || (ctx_r1.AutoMapSelectedSchema = $event); return i0.ɵɵresetView($event); });
|
|
491
|
+
i0.ɵɵelementStart(10, "option", 110);
|
|
484
492
|
i0.ɵɵtext(11, "Select schema...");
|
|
485
493
|
i0.ɵɵelementEnd();
|
|
486
|
-
i0.ɵɵrepeaterCreate(12,
|
|
494
|
+
i0.ɵɵrepeaterCreate(12, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_For_13_Template, 2, 2, "option", 111, i0.ɵɵrepeaterTrackByIdentity);
|
|
487
495
|
i0.ɵɵelementEnd()();
|
|
488
|
-
i0.ɵɵelementStart(14, "div",
|
|
496
|
+
i0.ɵɵelementStart(14, "div", 112)(15, "label", 108);
|
|
489
497
|
i0.ɵɵtext(16, "Direction");
|
|
490
498
|
i0.ɵɵelementEnd();
|
|
491
|
-
i0.ɵɵelementStart(17, "div",
|
|
492
|
-
i0.ɵɵlistener("click", function
|
|
493
|
-
i0.ɵɵelement(19, "i",
|
|
499
|
+
i0.ɵɵelementStart(17, "div", 113)(18, "button", 114);
|
|
500
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Pull"); });
|
|
501
|
+
i0.ɵɵelement(19, "i", 115);
|
|
494
502
|
i0.ɵɵelementEnd();
|
|
495
|
-
i0.ɵɵelementStart(20, "button",
|
|
496
|
-
i0.ɵɵlistener("click", function
|
|
497
|
-
i0.ɵɵelement(21, "i",
|
|
503
|
+
i0.ɵɵelementStart(20, "button", 116);
|
|
504
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Bidirectional"); });
|
|
505
|
+
i0.ɵɵelement(21, "i", 117);
|
|
498
506
|
i0.ɵɵelementEnd();
|
|
499
|
-
i0.ɵɵelementStart(22, "button",
|
|
500
|
-
i0.ɵɵlistener("click", function
|
|
507
|
+
i0.ɵɵelementStart(22, "button", 118);
|
|
508
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Push"); });
|
|
501
509
|
i0.ɵɵelement(23, "i", 69);
|
|
502
510
|
i0.ɵɵelementEnd()()();
|
|
503
|
-
i0.ɵɵelementStart(24, "div",
|
|
504
|
-
i0.ɵɵlistener("click", function
|
|
505
|
-
i0.ɵɵconditionalCreate(26,
|
|
511
|
+
i0.ɵɵelementStart(24, "div", 119)(25, "button", 120);
|
|
512
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunAutoMap()); });
|
|
513
|
+
i0.ɵɵconditionalCreate(26, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_26_Template, 2, 0)(27, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_27_Template, 2, 0);
|
|
506
514
|
i0.ɵɵelementEnd();
|
|
507
|
-
i0.ɵɵelementStart(28, "button",
|
|
508
|
-
i0.ɵɵlistener("click", function
|
|
509
|
-
i0.ɵɵelement(29, "i",
|
|
515
|
+
i0.ɵɵelementStart(28, "button", 121);
|
|
516
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAutoMapPanel()); });
|
|
517
|
+
i0.ɵɵelement(29, "i", 122);
|
|
510
518
|
i0.ɵɵelementEnd()()();
|
|
511
|
-
i0.ɵɵconditionalCreate(30,
|
|
519
|
+
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Conditional_30_Template, 4, 8, "div", 123);
|
|
512
520
|
i0.ɵɵelementEnd();
|
|
513
521
|
} if (rf & 2) {
|
|
514
522
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -531,11 +539,11 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_52_Templat
|
|
|
531
539
|
i0.ɵɵadvance(4);
|
|
532
540
|
i0.ɵɵconditional(ctx_r1.AutoMapResult ? 30 : -1);
|
|
533
541
|
} }
|
|
534
|
-
function
|
|
542
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
535
543
|
i0.ɵɵelement(0, "i", 43);
|
|
536
544
|
i0.ɵɵtext(1, " Creating... ");
|
|
537
545
|
} }
|
|
538
|
-
function
|
|
546
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
539
547
|
i0.ɵɵelement(0, "i", 92);
|
|
540
548
|
i0.ɵɵtext(1);
|
|
541
549
|
} if (rf & 2) {
|
|
@@ -543,17 +551,17 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Conditi
|
|
|
543
551
|
i0.ɵɵadvance();
|
|
544
552
|
i0.ɵɵtextInterpolate2(" Create ", ctx_r1.CreateTablesSelectedCount, " Table", ctx_r1.CreateTablesSelectedCount !== 1 ? "s" : "", " ");
|
|
545
553
|
} }
|
|
546
|
-
function
|
|
547
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
554
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
555
|
+
i0.ɵɵelement(0, "mj-loading", 130);
|
|
548
556
|
} }
|
|
549
|
-
function
|
|
550
|
-
i0.ɵɵelementStart(0, "div",
|
|
551
|
-
i0.ɵɵelement(1, "i",
|
|
557
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
558
|
+
i0.ɵɵelementStart(0, "div", 131);
|
|
559
|
+
i0.ɵɵelement(1, "i", 127);
|
|
552
560
|
i0.ɵɵtext(2, " No source objects available from this connector. ");
|
|
553
561
|
i0.ɵɵelementEnd();
|
|
554
562
|
} }
|
|
555
|
-
function
|
|
556
|
-
i0.ɵɵelementStart(0, "span",
|
|
563
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
564
|
+
i0.ɵɵelementStart(0, "span", 140);
|
|
557
565
|
i0.ɵɵtext(1);
|
|
558
566
|
i0.ɵɵelementEnd();
|
|
559
567
|
} if (rf & 2) {
|
|
@@ -561,27 +569,27 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Conditi
|
|
|
561
569
|
i0.ɵɵadvance();
|
|
562
570
|
i0.ɵɵtextInterpolate(obj_r23.Name);
|
|
563
571
|
} }
|
|
564
|
-
function
|
|
565
|
-
i0.ɵɵelementStart(0, "span",
|
|
572
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
i0.ɵɵelementStart(0, "span", 141);
|
|
566
574
|
i0.ɵɵtext(1, "Custom");
|
|
567
575
|
i0.ɵɵelementEnd();
|
|
568
576
|
} }
|
|
569
|
-
function
|
|
570
|
-
i0.ɵɵelementStart(0, "span",
|
|
577
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
578
|
+
i0.ɵɵelementStart(0, "span", 142);
|
|
571
579
|
i0.ɵɵtext(1, "Registered");
|
|
572
580
|
i0.ɵɵelementEnd();
|
|
573
581
|
} }
|
|
574
|
-
function
|
|
582
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
575
583
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
576
|
-
i0.ɵɵelementStart(0, "label",
|
|
577
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
584
|
+
i0.ɵɵelementStart(0, "label", 137)(1, "input", 139);
|
|
585
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Template_input_ngModelChange_1_listener($event) { const obj_r23 = i0.ɵɵrestoreView(_r22).$implicit; i0.ɵɵtwoWayBindingSet(obj_r23.Selected, $event) || (obj_r23.Selected = $event); return i0.ɵɵresetView($event); });
|
|
578
586
|
i0.ɵɵelementEnd();
|
|
579
587
|
i0.ɵɵelementStart(2, "span");
|
|
580
588
|
i0.ɵɵtext(3);
|
|
581
589
|
i0.ɵɵelementEnd();
|
|
582
|
-
i0.ɵɵconditionalCreate(4,
|
|
583
|
-
i0.ɵɵconditionalCreate(5,
|
|
584
|
-
i0.ɵɵconditionalCreate(6,
|
|
590
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_4_Template, 2, 1, "span", 140);
|
|
591
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_5_Template, 2, 0, "span", 141);
|
|
592
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Conditional_6_Template, 2, 0, "span", 142);
|
|
585
593
|
i0.ɵɵelementEnd();
|
|
586
594
|
} if (rf & 2) {
|
|
587
595
|
const obj_r23 = ctx.$implicit;
|
|
@@ -596,18 +604,18 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Conditi
|
|
|
596
604
|
i0.ɵɵadvance();
|
|
597
605
|
i0.ɵɵconditional(obj_r23.AlreadyPersisted ? 6 : -1);
|
|
598
606
|
} }
|
|
599
|
-
function
|
|
607
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
600
608
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
601
|
-
i0.ɵɵelementStart(0, "div",
|
|
602
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
609
|
+
i0.ɵɵelementStart(0, "div", 133)(1, "input", 134);
|
|
610
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.CreateTablesSearch, $event) || (ctx_r1.CreateTablesSearch = $event); return i0.ɵɵresetView($event); });
|
|
603
611
|
i0.ɵɵelementEnd()();
|
|
604
|
-
i0.ɵɵelementStart(2, "div",
|
|
605
|
-
i0.ɵɵlistener("change", function
|
|
612
|
+
i0.ɵɵelementStart(2, "div", 135)(3, "div", 136)(4, "label", 137)(5, "input", 138);
|
|
613
|
+
i0.ɵɵlistener("change", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_Template_input_change_5_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleAllCreateTablesObjects($event.target.checked)); });
|
|
606
614
|
i0.ɵɵelementEnd();
|
|
607
615
|
i0.ɵɵelementStart(6, "span");
|
|
608
616
|
i0.ɵɵtext(7);
|
|
609
617
|
i0.ɵɵelementEnd()()();
|
|
610
|
-
i0.ɵɵrepeaterCreate(8,
|
|
618
|
+
i0.ɵɵrepeaterCreate(8, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_For_9_Template, 7, 5, "label", 137, _forTrack1);
|
|
611
619
|
i0.ɵɵelementEnd();
|
|
612
620
|
} if (rf & 2) {
|
|
613
621
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -620,15 +628,15 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Conditi
|
|
|
620
628
|
i0.ɵɵadvance();
|
|
621
629
|
i0.ɵɵrepeater(ctx_r1.FilteredCreateTablesObjects);
|
|
622
630
|
} }
|
|
623
|
-
function
|
|
631
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
624
632
|
i0.ɵɵelement(0, "i", 49);
|
|
625
633
|
} }
|
|
626
|
-
function
|
|
634
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
627
635
|
i0.ɵɵelement(0, "i", 50);
|
|
628
636
|
} }
|
|
629
|
-
function
|
|
630
|
-
i0.ɵɵelementStart(0, "div",
|
|
631
|
-
i0.ɵɵconditionalCreate(1,
|
|
637
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
638
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
639
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Conditional_1_Template, 1, 0, "i", 49)(2, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Conditional_2_Template, 1, 0, "i", 50);
|
|
632
640
|
i0.ɵɵelementStart(3, "span");
|
|
633
641
|
i0.ɵɵtext(4);
|
|
634
642
|
i0.ɵɵelementEnd()();
|
|
@@ -640,23 +648,23 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Conditi
|
|
|
640
648
|
i0.ɵɵadvance(3);
|
|
641
649
|
i0.ɵɵtextInterpolate(ctx_r1.CreateTablesResult.Message);
|
|
642
650
|
} }
|
|
643
|
-
function
|
|
651
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
644
652
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
645
|
-
i0.ɵɵelementStart(0, "div",
|
|
653
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "div", 105);
|
|
646
654
|
i0.ɵɵelement(2, "i", 92);
|
|
647
655
|
i0.ɵɵelementStart(3, "span");
|
|
648
656
|
i0.ɵɵtext(4, "Select source objects to create as entity tables in your database");
|
|
649
657
|
i0.ɵɵelementEnd()();
|
|
650
|
-
i0.ɵɵelementStart(5, "div",
|
|
651
|
-
i0.ɵɵlistener("click", function
|
|
652
|
-
i0.ɵɵconditionalCreate(8,
|
|
658
|
+
i0.ɵɵelementStart(5, "div", 106)(6, "div", 119)(7, "button", 120);
|
|
659
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunCreateTables()); });
|
|
660
|
+
i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_8_Template, 2, 0)(9, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_9_Template, 2, 2);
|
|
653
661
|
i0.ɵɵelementEnd();
|
|
654
|
-
i0.ɵɵelementStart(10, "button",
|
|
655
|
-
i0.ɵɵlistener("click", function
|
|
656
|
-
i0.ɵɵelement(11, "i",
|
|
662
|
+
i0.ɵɵelementStart(10, "button", 121);
|
|
663
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseCreateTablesPanel()); });
|
|
664
|
+
i0.ɵɵelement(11, "i", 122);
|
|
657
665
|
i0.ɵɵelementEnd()()();
|
|
658
|
-
i0.ɵɵconditionalCreate(12,
|
|
659
|
-
i0.ɵɵconditionalCreate(15,
|
|
666
|
+
i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_12_Template, 1, 0, "mj-loading", 130)(13, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_13_Template, 3, 0, "div", 131)(14, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_14_Template, 10, 4);
|
|
667
|
+
i0.ɵɵconditionalCreate(15, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Conditional_15_Template, 5, 6, "div", 132);
|
|
660
668
|
i0.ɵɵelementEnd();
|
|
661
669
|
} if (rf & 2) {
|
|
662
670
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -669,19 +677,19 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_53_Templat
|
|
|
669
677
|
i0.ɵɵadvance(3);
|
|
670
678
|
i0.ɵɵconditional(ctx_r1.CreateTablesResult ? 15 : -1);
|
|
671
679
|
} }
|
|
672
|
-
function
|
|
673
|
-
i0.ɵɵelementStart(0, "div",
|
|
680
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
681
|
+
i0.ɵɵelementStart(0, "div", 143);
|
|
674
682
|
i0.ɵɵelement(1, "i", 43);
|
|
675
683
|
i0.ɵɵtext(2, " Loading...");
|
|
676
684
|
i0.ɵɵelementEnd();
|
|
677
685
|
} }
|
|
678
|
-
function
|
|
679
|
-
i0.ɵɵelementStart(0, "div",
|
|
686
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
687
|
+
i0.ɵɵelementStart(0, "div", 144);
|
|
680
688
|
i0.ɵɵtext(1, "No source objects found in metadata");
|
|
681
689
|
i0.ɵɵelementEnd();
|
|
682
690
|
} }
|
|
683
|
-
function
|
|
684
|
-
i0.ɵɵelementStart(0, "option",
|
|
691
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_7_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
692
|
+
i0.ɵɵelementStart(0, "option", 111);
|
|
685
693
|
i0.ɵɵtext(1);
|
|
686
694
|
i0.ɵɵelementEnd();
|
|
687
695
|
} if (rf & 2) {
|
|
@@ -690,14 +698,14 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditi
|
|
|
690
698
|
i0.ɵɵadvance();
|
|
691
699
|
i0.ɵɵtextInterpolate(obj_r26.Label || obj_r26.Name);
|
|
692
700
|
} }
|
|
693
|
-
function
|
|
701
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
694
702
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
695
|
-
i0.ɵɵelementStart(0, "select",
|
|
696
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
697
|
-
i0.ɵɵelementStart(1, "option",
|
|
703
|
+
i0.ɵɵelementStart(0, "select", 109);
|
|
704
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_7_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.AddMapSourceObjectName, $event) || (ctx_r1.AddMapSourceObjectName = $event); return i0.ɵɵresetView($event); });
|
|
705
|
+
i0.ɵɵelementStart(1, "option", 110);
|
|
698
706
|
i0.ɵɵtext(2, "Select source object...");
|
|
699
707
|
i0.ɵɵelementEnd();
|
|
700
|
-
i0.ɵɵrepeaterCreate(3,
|
|
708
|
+
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_7_For_4_Template, 2, 2, "option", 111, _forTrack1);
|
|
701
709
|
i0.ɵɵelementEnd();
|
|
702
710
|
} if (rf & 2) {
|
|
703
711
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -707,53 +715,53 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Conditi
|
|
|
707
715
|
i0.ɵɵadvance(2);
|
|
708
716
|
i0.ɵɵrepeater(ctx_r1.AvailableSourceObjects);
|
|
709
717
|
} }
|
|
710
|
-
function
|
|
718
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
711
719
|
i0.ɵɵelement(0, "i", 43);
|
|
712
720
|
} }
|
|
713
|
-
function
|
|
714
|
-
i0.ɵɵelement(0, "i",
|
|
721
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
722
|
+
i0.ɵɵelement(0, "i", 150);
|
|
715
723
|
i0.ɵɵtext(1, " Add ");
|
|
716
724
|
} }
|
|
717
|
-
function
|
|
725
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
718
726
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
719
|
-
i0.ɵɵelementStart(0, "div",
|
|
727
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "div", 106)(2, "div", 107)(3, "label", 108);
|
|
720
728
|
i0.ɵɵtext(4, "Source Object");
|
|
721
729
|
i0.ɵɵelementEnd();
|
|
722
|
-
i0.ɵɵconditionalCreate(5,
|
|
730
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_5_Template, 3, 0, "div", 143)(6, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_6_Template, 2, 0, "div", 144)(7, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_7_Template, 5, 2, "select", 145);
|
|
723
731
|
i0.ɵɵelementEnd();
|
|
724
|
-
i0.ɵɵelementStart(8, "div",
|
|
732
|
+
i0.ɵɵelementStart(8, "div", 112)(9, "label", 108);
|
|
725
733
|
i0.ɵɵtext(10, "Direction");
|
|
726
734
|
i0.ɵɵelementEnd();
|
|
727
|
-
i0.ɵɵelementStart(11, "div",
|
|
728
|
-
i0.ɵɵlistener("click", function
|
|
729
|
-
i0.ɵɵelement(13, "i",
|
|
735
|
+
i0.ɵɵelementStart(11, "div", 113)(12, "button", 114);
|
|
736
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Pull"); });
|
|
737
|
+
i0.ɵɵelement(13, "i", 115);
|
|
730
738
|
i0.ɵɵelementEnd();
|
|
731
|
-
i0.ɵɵelementStart(14, "button",
|
|
732
|
-
i0.ɵɵlistener("click", function
|
|
733
|
-
i0.ɵɵelement(15, "i",
|
|
739
|
+
i0.ɵɵelementStart(14, "button", 116);
|
|
740
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Bidirectional"); });
|
|
741
|
+
i0.ɵɵelement(15, "i", 117);
|
|
734
742
|
i0.ɵɵelementEnd();
|
|
735
|
-
i0.ɵɵelementStart(16, "button",
|
|
736
|
-
i0.ɵɵlistener("click", function
|
|
743
|
+
i0.ɵɵelementStart(16, "button", 118);
|
|
744
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Push"); });
|
|
737
745
|
i0.ɵɵelement(17, "i", 69);
|
|
738
746
|
i0.ɵɵelementEnd()()();
|
|
739
|
-
i0.ɵɵelementStart(18, "div",
|
|
747
|
+
i0.ɵɵelementStart(18, "div", 146)(19, "label", 108);
|
|
740
748
|
i0.ɵɵtext(20, "MJ Entity");
|
|
741
749
|
i0.ɵɵelementEnd();
|
|
742
|
-
i0.ɵɵelementStart(21, "div",
|
|
743
|
-
i0.ɵɵlistener("SelectionChange", function
|
|
750
|
+
i0.ɵɵelementStart(21, "div", 147)(22, "mj-tree-dropdown", 148, 0);
|
|
751
|
+
i0.ɵɵlistener("SelectionChange", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_mj_tree_dropdown_SelectionChange_22_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnEntityTreeSelection($event)); });
|
|
744
752
|
i0.ɵɵelementEnd();
|
|
745
|
-
i0.ɵɵelementStart(24, "button",
|
|
746
|
-
i0.ɵɵlistener("click", function
|
|
753
|
+
i0.ɵɵelementStart(24, "button", 149);
|
|
754
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenNewEntityDialog()); });
|
|
747
755
|
i0.ɵɵelement(25, "i", 13);
|
|
748
756
|
i0.ɵɵtext(26, " New ");
|
|
749
757
|
i0.ɵɵelementEnd()()();
|
|
750
|
-
i0.ɵɵelementStart(27, "div",
|
|
751
|
-
i0.ɵɵlistener("click", function
|
|
752
|
-
i0.ɵɵconditionalCreate(29,
|
|
758
|
+
i0.ɵɵelementStart(27, "div", 119)(28, "button", 120);
|
|
759
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveAddMap()); });
|
|
760
|
+
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_29_Template, 1, 0, "i", 43)(30, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Conditional_30_Template, 2, 0);
|
|
753
761
|
i0.ɵɵelementEnd();
|
|
754
|
-
i0.ɵɵelementStart(31, "button",
|
|
755
|
-
i0.ɵɵlistener("click", function
|
|
756
|
-
i0.ɵɵelement(32, "i",
|
|
762
|
+
i0.ɵɵelementStart(31, "button", 121);
|
|
763
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAddMapPanel()); });
|
|
764
|
+
i0.ɵɵelement(32, "i", 122);
|
|
757
765
|
i0.ɵɵelementEnd()()()();
|
|
758
766
|
} if (rf & 2) {
|
|
759
767
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -772,62 +780,62 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Templat
|
|
|
772
780
|
i0.ɵɵadvance();
|
|
773
781
|
i0.ɵɵconditional(ctx_r1.IsSavingAddMap ? 29 : 30);
|
|
774
782
|
} }
|
|
775
|
-
function
|
|
783
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_58_Template(rf, ctx) { if (rf & 1) {
|
|
776
784
|
i0.ɵɵelementStart(0, "div", 15);
|
|
777
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
785
|
+
i0.ɵɵelement(1, "mj-loading", 151);
|
|
778
786
|
i0.ɵɵelementEnd();
|
|
779
787
|
} }
|
|
780
|
-
function
|
|
788
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
781
789
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
782
|
-
i0.ɵɵelementStart(0, "div",
|
|
783
|
-
i0.ɵɵelement(1, "i",
|
|
790
|
+
i0.ɵɵelementStart(0, "div", 98);
|
|
791
|
+
i0.ɵɵelement(1, "i", 152);
|
|
784
792
|
i0.ɵɵelementStart(2, "h3");
|
|
785
793
|
i0.ɵɵtext(3, "No entity maps configured");
|
|
786
794
|
i0.ɵɵelementEnd();
|
|
787
795
|
i0.ɵɵelementStart(4, "p");
|
|
788
796
|
i0.ɵɵtext(5, "Entity maps define how external objects sync to MJ entities.");
|
|
789
797
|
i0.ɵɵelementEnd();
|
|
790
|
-
i0.ɵɵelementStart(6, "button",
|
|
791
|
-
i0.ɵɵlistener("click", function
|
|
798
|
+
i0.ɵɵelementStart(6, "button", 153);
|
|
799
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_59_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
|
|
792
800
|
i0.ɵɵelement(7, "i", 13);
|
|
793
801
|
i0.ɵɵtext(8, " Add Your First Entity Map ");
|
|
794
802
|
i0.ɵɵelementEnd()();
|
|
795
803
|
} }
|
|
796
|
-
function
|
|
797
|
-
i0.ɵɵelementStart(0, "span",
|
|
798
|
-
i0.ɵɵelement(1, "i",
|
|
804
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
805
|
+
i0.ɵɵelementStart(0, "span", 171);
|
|
806
|
+
i0.ɵɵelement(1, "i", 175);
|
|
799
807
|
i0.ɵɵelementEnd();
|
|
800
808
|
} }
|
|
801
|
-
function
|
|
809
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
802
810
|
const _r28 = i0.ɵɵgetCurrentView();
|
|
803
|
-
i0.ɵɵelementStart(0, "div",
|
|
804
|
-
i0.ɵɵlistener("click", function
|
|
805
|
-
i0.ɵɵelementStart(1, "span",
|
|
806
|
-
i0.ɵɵlistener("click", function
|
|
807
|
-
i0.ɵɵelementStart(2, "label",
|
|
808
|
-
i0.ɵɵlistener("change", function
|
|
809
|
-
i0.ɵɵelementEnd();
|
|
810
|
-
i0.ɵɵelement(4, "span",
|
|
811
|
+
i0.ɵɵelementStart(0, "div", 163);
|
|
812
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template_div_click_0_listener() { const em_r29 = i0.ɵɵrestoreView(_r28).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnEntityMapClick(em_r29)); });
|
|
813
|
+
i0.ɵɵelementStart(1, "span", 164);
|
|
814
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template_span_click_1_listener($event) { i0.ɵɵrestoreView(_r28); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
815
|
+
i0.ɵɵelementStart(2, "label", 165)(3, "input", 138);
|
|
816
|
+
i0.ɵɵlistener("change", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template_input_change_3_listener($event) { const em_r29 = i0.ɵɵrestoreView(_r28).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnToggleMapEnabled(em_r29, $event)); });
|
|
817
|
+
i0.ɵɵelementEnd();
|
|
818
|
+
i0.ɵɵelement(4, "span", 166);
|
|
811
819
|
i0.ɵɵelementEnd()();
|
|
812
|
-
i0.ɵɵelementStart(5, "span",
|
|
820
|
+
i0.ɵɵelementStart(5, "span", 167);
|
|
813
821
|
i0.ɵɵtext(6);
|
|
814
822
|
i0.ɵɵelementEnd();
|
|
815
|
-
i0.ɵɵelementStart(7, "span",
|
|
816
|
-
i0.ɵɵlistener("click", function
|
|
817
|
-
i0.ɵɵelementStart(8, "button",
|
|
818
|
-
i0.ɵɵlistener("click", function
|
|
823
|
+
i0.ɵɵelementStart(7, "span", 168);
|
|
824
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template_span_click_7_listener($event) { i0.ɵɵrestoreView(_r28); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
825
|
+
i0.ɵɵelementStart(8, "button", 169);
|
|
826
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template_button_click_8_listener() { const em_r29 = i0.ɵɵrestoreView(_r28).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CycleSyncDirection(em_r29)); });
|
|
819
827
|
i0.ɵɵtext(9);
|
|
820
828
|
i0.ɵɵelementEnd()();
|
|
821
|
-
i0.ɵɵelementStart(10, "span",
|
|
829
|
+
i0.ɵɵelementStart(10, "span", 170);
|
|
822
830
|
i0.ɵɵtext(11);
|
|
823
831
|
i0.ɵɵelementEnd();
|
|
824
|
-
i0.ɵɵelementStart(12, "span",
|
|
825
|
-
i0.ɵɵconditionalCreate(13,
|
|
826
|
-
i0.ɵɵelementStart(14, "span",
|
|
832
|
+
i0.ɵɵelementStart(12, "span", 159);
|
|
833
|
+
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Conditional_13_Template, 2, 0, "span", 171);
|
|
834
|
+
i0.ɵɵelementStart(14, "span", 172);
|
|
827
835
|
i0.ɵɵelement(15, "i", 38);
|
|
828
836
|
i0.ɵɵelementEnd();
|
|
829
|
-
i0.ɵɵelementStart(16, "span",
|
|
830
|
-
i0.ɵɵelement(17, "i",
|
|
837
|
+
i0.ɵɵelementStart(16, "span", 173);
|
|
838
|
+
i0.ɵɵelement(17, "i", 174);
|
|
831
839
|
i0.ɵɵelementEnd()()();
|
|
832
840
|
} if (rf & 2) {
|
|
833
841
|
const em_r29 = ctx.$implicit;
|
|
@@ -855,27 +863,27 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_For_12_
|
|
|
855
863
|
i0.ɵɵadvance();
|
|
856
864
|
i0.ɵɵproperty("title", "Conflict: " + em_r29.ConflictResolution);
|
|
857
865
|
} }
|
|
858
|
-
function
|
|
859
|
-
i0.ɵɵelementStart(0, "div",
|
|
866
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_ForEmpty_13_Template(rf, ctx) { if (rf & 1) {
|
|
867
|
+
i0.ɵɵelementStart(0, "div", 162);
|
|
860
868
|
i0.ɵɵtext(1, " No entity maps match your filter. ");
|
|
861
869
|
i0.ɵɵelementEnd();
|
|
862
870
|
} }
|
|
863
|
-
function
|
|
864
|
-
i0.ɵɵelementStart(0, "div",
|
|
871
|
+
function ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_Template(rf, ctx) { if (rf & 1) {
|
|
872
|
+
i0.ɵɵelementStart(0, "div", 154)(1, "span", 155);
|
|
865
873
|
i0.ɵɵtext(2, "Sync");
|
|
866
874
|
i0.ɵɵelementEnd();
|
|
867
|
-
i0.ɵɵelementStart(3, "span",
|
|
875
|
+
i0.ɵɵelementStart(3, "span", 156);
|
|
868
876
|
i0.ɵɵtext(4, "External Object");
|
|
869
877
|
i0.ɵɵelementEnd();
|
|
870
|
-
i0.ɵɵelement(5, "span",
|
|
871
|
-
i0.ɵɵelementStart(6, "span",
|
|
878
|
+
i0.ɵɵelement(5, "span", 157);
|
|
879
|
+
i0.ɵɵelementStart(6, "span", 158);
|
|
872
880
|
i0.ɵɵtext(7, "MJ Entity");
|
|
873
881
|
i0.ɵɵelementEnd();
|
|
874
|
-
i0.ɵɵelementStart(8, "span",
|
|
882
|
+
i0.ɵɵelementStart(8, "span", 159);
|
|
875
883
|
i0.ɵɵtext(9, "Config");
|
|
876
884
|
i0.ɵɵelementEnd()();
|
|
877
|
-
i0.ɵɵelementStart(10, "div",
|
|
878
|
-
i0.ɵɵrepeaterCreate(11,
|
|
885
|
+
i0.ɵɵelementStart(10, "div", 160);
|
|
886
|
+
i0.ɵɵrepeaterCreate(11, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_For_12_Template, 18, 14, "div", 161, _forTrack2, false, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_ForEmpty_13_Template, 2, 0, "div", 162);
|
|
879
887
|
i0.ɵɵelementEnd();
|
|
880
888
|
} if (rf & 2) {
|
|
881
889
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -940,20 +948,24 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Template(rf, ctx) { if
|
|
|
940
948
|
i0.ɵɵtext(44, " Create Tables ");
|
|
941
949
|
i0.ɵɵelementEnd();
|
|
942
950
|
i0.ɵɵelementStart(45, "button", 93);
|
|
943
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.
|
|
944
|
-
i0.ɵɵ
|
|
945
|
-
i0.ɵɵ
|
|
946
|
-
i0.ɵɵ
|
|
947
|
-
i0.ɵɵ
|
|
948
|
-
i0.ɵɵ
|
|
949
|
-
i0.ɵɵ
|
|
950
|
-
i0.ɵɵ
|
|
951
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FindAndAddNewTables()); });
|
|
952
|
+
i0.ɵɵconditionalCreate(46, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_46_Template, 2, 0)(47, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_47_Template, 2, 0);
|
|
953
|
+
i0.ɵɵelementEnd();
|
|
954
|
+
i0.ɵɵelementStart(48, "button", 94);
|
|
955
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Template_button_click_48_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleAutoMapPanel()); });
|
|
956
|
+
i0.ɵɵelement(49, "i", 95);
|
|
957
|
+
i0.ɵɵtext(50, " Auto-Map Schema ");
|
|
958
|
+
i0.ɵɵelementEnd();
|
|
959
|
+
i0.ɵɵelementStart(51, "button", 94);
|
|
960
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_2_Template_button_click_51_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
|
|
961
|
+
i0.ɵɵelement(52, "i", 13);
|
|
962
|
+
i0.ɵɵtext(53, " Add Map ");
|
|
951
963
|
i0.ɵɵelementEnd()()();
|
|
952
|
-
i0.ɵɵconditionalCreate(
|
|
953
|
-
i0.ɵɵconditionalCreate(
|
|
954
|
-
i0.ɵɵconditionalCreate(
|
|
955
|
-
i0.ɵɵconditionalCreate(
|
|
956
|
-
i0.ɵɵconditionalCreate(
|
|
964
|
+
i0.ɵɵconditionalCreate(54, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_54_Template, 5, 6, "div", 96);
|
|
965
|
+
i0.ɵɵconditionalCreate(55, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_55_Template, 31, 11, "div", 97);
|
|
966
|
+
i0.ɵɵconditionalCreate(56, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_56_Template, 16, 4, "div", 97);
|
|
967
|
+
i0.ɵɵconditionalCreate(57, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_57_Template, 33, 16, "div", 97);
|
|
968
|
+
i0.ɵɵconditionalCreate(58, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_58_Template, 2, 0, "div", 15)(59, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_59_Template, 9, 0, "div", 98)(60, ConnectionsComponent_Conditional_8_Conditional_2_Conditional_60_Template, 14, 1);
|
|
957
969
|
} if (rf & 2) {
|
|
958
970
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
959
971
|
i0.ɵɵadvance(4);
|
|
@@ -985,23 +997,27 @@ function ConnectionsComponent_Conditional_8_Conditional_2_Template(rf, ctx) { if
|
|
|
985
997
|
i0.ɵɵadvance();
|
|
986
998
|
i0.ɵɵclassProp("active", ctx_r1.ShowCreateTablesPanel);
|
|
987
999
|
i0.ɵɵadvance(3);
|
|
1000
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsCreatingTables);
|
|
1001
|
+
i0.ɵɵadvance();
|
|
1002
|
+
i0.ɵɵconditional(ctx_r1.IsCreatingTables ? 46 : 47);
|
|
1003
|
+
i0.ɵɵadvance(2);
|
|
988
1004
|
i0.ɵɵclassProp("active", ctx_r1.ShowAutoMapPanel);
|
|
989
1005
|
i0.ɵɵadvance(3);
|
|
990
1006
|
i0.ɵɵclassProp("active", ctx_r1.ShowAddMapPanel);
|
|
991
1007
|
i0.ɵɵadvance(3);
|
|
992
|
-
i0.ɵɵconditional(ctx_r1.SyncResult ?
|
|
1008
|
+
i0.ɵɵconditional(ctx_r1.SyncResult ? 54 : -1);
|
|
993
1009
|
i0.ɵɵadvance();
|
|
994
|
-
i0.ɵɵconditional(ctx_r1.ShowAutoMapPanel ?
|
|
1010
|
+
i0.ɵɵconditional(ctx_r1.ShowAutoMapPanel ? 55 : -1);
|
|
995
1011
|
i0.ɵɵadvance();
|
|
996
|
-
i0.ɵɵconditional(ctx_r1.ShowCreateTablesPanel ?
|
|
1012
|
+
i0.ɵɵconditional(ctx_r1.ShowCreateTablesPanel ? 56 : -1);
|
|
997
1013
|
i0.ɵɵadvance();
|
|
998
|
-
i0.ɵɵconditional(ctx_r1.ShowAddMapPanel ?
|
|
1014
|
+
i0.ɵɵconditional(ctx_r1.ShowAddMapPanel ? 57 : -1);
|
|
999
1015
|
i0.ɵɵadvance();
|
|
1000
|
-
i0.ɵɵconditional(ctx_r1.IsDetailLoading ?
|
|
1016
|
+
i0.ɵɵconditional(ctx_r1.IsDetailLoading ? 58 : ctx_r1.DetailEntityMaps.length === 0 && !ctx_r1.ShowAddMapPanel ? 59 : ctx_r1.DetailEntityMaps.length > 0 ? 60 : -1);
|
|
1001
1017
|
} }
|
|
1002
1018
|
function ConnectionsComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1003
1019
|
i0.ɵɵelementStart(0, "div", 7);
|
|
1004
|
-
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_8_Conditional_1_Template, 1, 3, "app-visual-field-editor", 65)(2, ConnectionsComponent_Conditional_8_Conditional_2_Template,
|
|
1020
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_8_Conditional_1_Template, 1, 3, "app-visual-field-editor", 65)(2, ConnectionsComponent_Conditional_8_Conditional_2_Template, 61, 34);
|
|
1005
1021
|
i0.ɵɵelementEnd();
|
|
1006
1022
|
} if (rf & 2) {
|
|
1007
1023
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1009,7 +1025,7 @@ function ConnectionsComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
|
1009
1025
|
i0.ɵɵconditional(ctx_r1.EditorEntityMap ? 1 : 2);
|
|
1010
1026
|
} }
|
|
1011
1027
|
function ConnectionsComponent_Conditional_9_For_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1012
|
-
i0.ɵɵelement(0, "i",
|
|
1028
|
+
i0.ɵɵelement(0, "i", 150);
|
|
1013
1029
|
} }
|
|
1014
1030
|
function ConnectionsComponent_Conditional_9_For_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1015
1031
|
i0.ɵɵtext(0);
|
|
@@ -1018,20 +1034,20 @@ function ConnectionsComponent_Conditional_9_For_9_Conditional_3_Template(rf, ctx
|
|
|
1018
1034
|
i0.ɵɵtextInterpolate1(" ", step_r31.Number, " ");
|
|
1019
1035
|
} }
|
|
1020
1036
|
function ConnectionsComponent_Conditional_9_For_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1021
|
-
i0.ɵɵelement(0, "div",
|
|
1037
|
+
i0.ɵɵelement(0, "div", 191);
|
|
1022
1038
|
} if (rf & 2) {
|
|
1023
1039
|
const step_r31 = i0.ɵɵnextContext().$implicit;
|
|
1024
1040
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1025
1041
|
i0.ɵɵclassProp("step-line-active", ctx_r1.IsStepCompleted(step_r31.Number));
|
|
1026
1042
|
} }
|
|
1027
1043
|
function ConnectionsComponent_Conditional_9_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
1028
|
-
i0.ɵɵelementStart(0, "div",
|
|
1029
|
-
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_9_For_9_Conditional_2_Template, 1, 0, "i",
|
|
1044
|
+
i0.ɵɵelementStart(0, "div", 187)(1, "div", 188);
|
|
1045
|
+
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_9_For_9_Conditional_2_Template, 1, 0, "i", 150)(3, ConnectionsComponent_Conditional_9_For_9_Conditional_3_Template, 1, 1);
|
|
1030
1046
|
i0.ɵɵelementEnd();
|
|
1031
|
-
i0.ɵɵelementStart(4, "span",
|
|
1047
|
+
i0.ɵɵelementStart(4, "span", 189);
|
|
1032
1048
|
i0.ɵɵtext(5);
|
|
1033
1049
|
i0.ɵɵelementEnd()();
|
|
1034
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_For_9_Conditional_6_Template, 1, 2, "div",
|
|
1050
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_For_9_Conditional_6_Template, 1, 2, "div", 190);
|
|
1035
1051
|
} if (rf & 2) {
|
|
1036
1052
|
const step_r31 = ctx.$implicit;
|
|
1037
1053
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1044,24 +1060,24 @@ function ConnectionsComponent_Conditional_9_For_9_Template(rf, ctx) { if (rf & 1
|
|
|
1044
1060
|
i0.ɵɵconditional(step_r31.Number < ctx_r1.WizardSteps.length ? 6 : -1);
|
|
1045
1061
|
} }
|
|
1046
1062
|
function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1047
|
-
i0.ɵɵelementStart(0, "div",
|
|
1048
|
-
i0.ɵɵelement(1, "i",
|
|
1063
|
+
i0.ɵɵelementStart(0, "div", 196);
|
|
1064
|
+
i0.ɵɵelement(1, "i", 198);
|
|
1049
1065
|
i0.ɵɵelementStart(2, "p");
|
|
1050
1066
|
i0.ɵɵtext(3, "No integrations configured");
|
|
1051
1067
|
i0.ɵɵelementEnd();
|
|
1052
|
-
i0.ɵɵelementStart(4, "span",
|
|
1068
|
+
i0.ɵɵelementStart(4, "span", 199);
|
|
1053
1069
|
i0.ɵɵtext(5, "Configure integration definitions in the admin area first.");
|
|
1054
1070
|
i0.ɵɵelementEnd()();
|
|
1055
1071
|
} }
|
|
1056
1072
|
function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1057
|
-
i0.ɵɵelementStart(0, "div",
|
|
1058
|
-
i0.ɵɵelement(1, "i",
|
|
1073
|
+
i0.ɵɵelementStart(0, "div", 196);
|
|
1074
|
+
i0.ɵɵelement(1, "i", 200);
|
|
1059
1075
|
i0.ɵɵelementStart(2, "p");
|
|
1060
1076
|
i0.ɵɵtext(3, "No matching integrations");
|
|
1061
1077
|
i0.ɵɵelementEnd()();
|
|
1062
1078
|
} }
|
|
1063
1079
|
function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1064
|
-
i0.ɵɵelementStart(0, "div",
|
|
1080
|
+
i0.ɵɵelementStart(0, "div", 205);
|
|
1065
1081
|
i0.ɵɵtext(1);
|
|
1066
1082
|
i0.ɵɵelementEnd();
|
|
1067
1083
|
} if (rf & 2) {
|
|
@@ -1071,15 +1087,15 @@ function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_C
|
|
|
1071
1087
|
} }
|
|
1072
1088
|
function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1073
1089
|
const _r33 = i0.ɵɵgetCurrentView();
|
|
1074
|
-
i0.ɵɵelementStart(0, "div",
|
|
1090
|
+
i0.ɵɵelementStart(0, "div", 202);
|
|
1075
1091
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Template_div_click_0_listener() { const def_r34 = i0.ɵɵrestoreView(_r33).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectIntegration(def_r34)); });
|
|
1076
|
-
i0.ɵɵelementStart(1, "div",
|
|
1092
|
+
i0.ɵɵelementStart(1, "div", 203);
|
|
1077
1093
|
i0.ɵɵelement(2, "i");
|
|
1078
1094
|
i0.ɵɵelementEnd();
|
|
1079
|
-
i0.ɵɵelementStart(3, "div",
|
|
1095
|
+
i0.ɵɵelementStart(3, "div", 204);
|
|
1080
1096
|
i0.ɵɵtext(4);
|
|
1081
1097
|
i0.ɵɵelementEnd();
|
|
1082
|
-
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Conditional_5_Template, 2, 1, "div",
|
|
1098
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Conditional_5_Template, 2, 1, "div", 205);
|
|
1083
1099
|
i0.ɵɵelementEnd();
|
|
1084
1100
|
} if (rf & 2) {
|
|
1085
1101
|
const def_r34 = ctx.$implicit;
|
|
@@ -1095,8 +1111,8 @@ function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_T
|
|
|
1095
1111
|
i0.ɵɵconditional(def_r34.Description ? 5 : -1);
|
|
1096
1112
|
} }
|
|
1097
1113
|
function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1098
|
-
i0.ɵɵelementStart(0, "div",
|
|
1099
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Template, 6, 8, "div",
|
|
1114
|
+
i0.ɵɵelementStart(0, "div", 197);
|
|
1115
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_For_2_Template, 6, 8, "div", 201, _forTrack2);
|
|
1100
1116
|
i0.ɵɵelementEnd();
|
|
1101
1117
|
} if (rf & 2) {
|
|
1102
1118
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1105,15 +1121,15 @@ function ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_Templat
|
|
|
1105
1121
|
} }
|
|
1106
1122
|
function ConnectionsComponent_Conditional_9_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1107
1123
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
1108
|
-
i0.ɵɵelementStart(0, "div",
|
|
1124
|
+
i0.ɵɵelementStart(0, "div", 181)(1, "h3", 192);
|
|
1109
1125
|
i0.ɵɵtext(2, "What system do you want to connect?");
|
|
1110
1126
|
i0.ɵɵelementEnd();
|
|
1111
|
-
i0.ɵɵelementStart(3, "div",
|
|
1112
|
-
i0.ɵɵelement(4, "i",
|
|
1113
|
-
i0.ɵɵelementStart(5, "input",
|
|
1127
|
+
i0.ɵɵelementStart(3, "div", 193);
|
|
1128
|
+
i0.ɵɵelement(4, "i", 194);
|
|
1129
|
+
i0.ɵɵelementStart(5, "input", 195);
|
|
1114
1130
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_9_Conditional_11_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SearchQuery, $event) || (ctx_r1.SearchQuery = $event); return i0.ɵɵresetView($event); });
|
|
1115
1131
|
i0.ɵɵelementEnd()();
|
|
1116
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_6_Template, 6, 0, "div",
|
|
1132
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_6_Template, 6, 0, "div", 196)(7, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_7_Template, 4, 0, "div", 196)(8, ConnectionsComponent_Conditional_9_Conditional_11_Conditional_8_Template, 3, 0, "div", 197);
|
|
1117
1133
|
i0.ɵɵelementEnd();
|
|
1118
1134
|
} if (rf & 2) {
|
|
1119
1135
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1123,7 +1139,7 @@ function ConnectionsComponent_Conditional_9_Conditional_11_Template(rf, ctx) { i
|
|
|
1123
1139
|
i0.ɵɵconditional(ctx_r1.FilteredIntegrations.length === 0 && ctx_r1.AvailableIntegrations.length === 0 ? 6 : ctx_r1.FilteredIntegrations.length === 0 ? 7 : 8);
|
|
1124
1140
|
} }
|
|
1125
1141
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
1126
|
-
i0.ɵɵelementStart(0, "option",
|
|
1142
|
+
i0.ɵɵelementStart(0, "option", 111);
|
|
1127
1143
|
i0.ɵɵtext(1);
|
|
1128
1144
|
i0.ɵɵelementEnd();
|
|
1129
1145
|
} if (rf & 2) {
|
|
@@ -1134,12 +1150,12 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_For_4_
|
|
|
1134
1150
|
} }
|
|
1135
1151
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
1136
1152
|
const _r36 = i0.ɵɵgetCurrentView();
|
|
1137
|
-
i0.ɵɵelementStart(0, "select",
|
|
1153
|
+
i0.ɵɵelementStart(0, "select", 221);
|
|
1138
1154
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedCompanyID, $event) || (ctx_r1.SelectedCompanyID = $event); return i0.ɵɵresetView($event); });
|
|
1139
|
-
i0.ɵɵelementStart(1, "option",
|
|
1155
|
+
i0.ɵɵelementStart(1, "option", 110);
|
|
1140
1156
|
i0.ɵɵtext(2, "Select a company...");
|
|
1141
1157
|
i0.ɵɵelementEnd();
|
|
1142
|
-
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_For_4_Template, 2, 2, "option",
|
|
1158
|
+
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_For_4_Template, 2, 2, "option", 111, _forTrack2);
|
|
1143
1159
|
i0.ɵɵelementEnd();
|
|
1144
1160
|
} if (rf & 2) {
|
|
1145
1161
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1150,26 +1166,26 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_Templa
|
|
|
1150
1166
|
i0.ɵɵrepeater(ctx_r1.Companies);
|
|
1151
1167
|
} }
|
|
1152
1168
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1153
|
-
i0.ɵɵelement(0, "input",
|
|
1169
|
+
i0.ɵɵelement(0, "input", 211);
|
|
1154
1170
|
} if (rf & 2) {
|
|
1155
1171
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1156
1172
|
i0.ɵɵproperty("value", ctx_r1.Companies[0].Name);
|
|
1157
1173
|
} }
|
|
1158
1174
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
1159
|
-
i0.ɵɵelementStart(0, "div",
|
|
1175
|
+
i0.ɵɵelementStart(0, "div", 212);
|
|
1160
1176
|
i0.ɵɵtext(1, "No companies available. Create one in the admin area.");
|
|
1161
1177
|
i0.ɵɵelementEnd();
|
|
1162
1178
|
} }
|
|
1163
1179
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
1164
1180
|
const _r38 = i0.ɵɵgetCurrentView();
|
|
1165
|
-
i0.ɵɵelementStart(0, "div",
|
|
1166
|
-
i0.ɵɵelement(2, "i",
|
|
1181
|
+
i0.ɵɵelementStart(0, "div", 217)(1, "div", 222);
|
|
1182
|
+
i0.ɵɵelement(2, "i", 223);
|
|
1167
1183
|
i0.ɵɵelementStart(3, "span");
|
|
1168
1184
|
i0.ɵɵtext(4);
|
|
1169
1185
|
i0.ɵɵelementEnd()();
|
|
1170
|
-
i0.ɵɵelementStart(5, "button",
|
|
1186
|
+
i0.ɵɵelementStart(5, "button", 224);
|
|
1171
1187
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_22_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearCredential()); });
|
|
1172
|
-
i0.ɵɵelement(6, "i",
|
|
1188
|
+
i0.ɵɵelement(6, "i", 122);
|
|
1173
1189
|
i0.ɵɵelementEnd()();
|
|
1174
1190
|
} if (rf & 2) {
|
|
1175
1191
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1178,9 +1194,9 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_22_Templa
|
|
|
1178
1194
|
} }
|
|
1179
1195
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
1180
1196
|
const _r39 = i0.ɵɵgetCurrentView();
|
|
1181
|
-
i0.ɵɵelementStart(0, "div",
|
|
1197
|
+
i0.ɵɵelementStart(0, "div", 218)(1, "button", 44);
|
|
1182
1198
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r39); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ShowExistingCredentials()); });
|
|
1183
|
-
i0.ɵɵelement(2, "i",
|
|
1199
|
+
i0.ɵɵelement(2, "i", 223);
|
|
1184
1200
|
i0.ɵɵtext(3, " Choose Existing Credential ");
|
|
1185
1201
|
i0.ɵɵelementEnd();
|
|
1186
1202
|
i0.ɵɵelementStart(4, "button", 44);
|
|
@@ -1190,15 +1206,15 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_23_Templa
|
|
|
1190
1206
|
i0.ɵɵelementEnd()();
|
|
1191
1207
|
} }
|
|
1192
1208
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
1193
|
-
i0.ɵɵelementStart(0, "div",
|
|
1194
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
1209
|
+
i0.ɵɵelementStart(0, "div", 219);
|
|
1210
|
+
i0.ɵɵelement(1, "mj-loading", 225);
|
|
1195
1211
|
i0.ɵɵelementEnd();
|
|
1196
1212
|
} }
|
|
1197
1213
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1198
1214
|
const _r40 = i0.ɵɵgetCurrentView();
|
|
1199
|
-
i0.ɵɵelementStart(0, "div",
|
|
1215
|
+
i0.ɵɵelementStart(0, "div", 227);
|
|
1200
1216
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_For_2_Template_div_click_0_listener() { const cred_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectExistingCredential(cred_r41)); });
|
|
1201
|
-
i0.ɵɵelement(1, "i",
|
|
1217
|
+
i0.ɵɵelement(1, "i", 223);
|
|
1202
1218
|
i0.ɵɵelementStart(2, "span");
|
|
1203
1219
|
i0.ɵɵtext(3);
|
|
1204
1220
|
i0.ɵɵelementEnd()();
|
|
@@ -1208,8 +1224,8 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_For_2_
|
|
|
1208
1224
|
i0.ɵɵtextInterpolate(cred_r41.Name);
|
|
1209
1225
|
} }
|
|
1210
1226
|
function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
1211
|
-
i0.ɵɵelementStart(0, "div",
|
|
1212
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_For_2_Template, 4, 1, "div",
|
|
1227
|
+
i0.ɵɵelementStart(0, "div", 220);
|
|
1228
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_For_2_Template, 4, 1, "div", 226, _forTrack2);
|
|
1213
1229
|
i0.ɵɵelementEnd();
|
|
1214
1230
|
} if (rf & 2) {
|
|
1215
1231
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1218,34 +1234,34 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_Templa
|
|
|
1218
1234
|
} }
|
|
1219
1235
|
function ConnectionsComponent_Conditional_9_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
1220
1236
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
1221
|
-
i0.ɵɵelementStart(0, "div",
|
|
1237
|
+
i0.ɵɵelementStart(0, "div", 181)(1, "h3", 192);
|
|
1222
1238
|
i0.ɵɵtext(2, "Set up your connection");
|
|
1223
1239
|
i0.ɵɵelementEnd();
|
|
1224
|
-
i0.ɵɵelementStart(3, "div",
|
|
1240
|
+
i0.ɵɵelementStart(3, "div", 206)(4, "label", 207);
|
|
1225
1241
|
i0.ɵɵtext(5, "Connection Name");
|
|
1226
1242
|
i0.ɵɵelementEnd();
|
|
1227
|
-
i0.ɵɵelementStart(6, "input",
|
|
1243
|
+
i0.ɵɵelementStart(6, "input", 208);
|
|
1228
1244
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_9_Conditional_12_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionName, $event) || (ctx_r1.ConnectionName = $event); return i0.ɵɵresetView($event); });
|
|
1229
1245
|
i0.ɵɵelementEnd()();
|
|
1230
|
-
i0.ɵɵelementStart(7, "div",
|
|
1246
|
+
i0.ɵɵelementStart(7, "div", 206)(8, "label", 209);
|
|
1231
1247
|
i0.ɵɵtext(9, "Company");
|
|
1232
1248
|
i0.ɵɵelementEnd();
|
|
1233
|
-
i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_Template, 5, 2, "select",
|
|
1249
|
+
i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_10_Template, 5, 2, "select", 210)(11, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_11_Template, 1, 1, "input", 211)(12, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_12_Template, 2, 0, "div", 212);
|
|
1234
1250
|
i0.ɵɵelementEnd();
|
|
1235
|
-
i0.ɵɵelementStart(13, "div",
|
|
1251
|
+
i0.ɵɵelementStart(13, "div", 206)(14, "label", 213);
|
|
1236
1252
|
i0.ɵɵtext(15, "Description ");
|
|
1237
|
-
i0.ɵɵelementStart(16, "span",
|
|
1253
|
+
i0.ɵɵelementStart(16, "span", 214);
|
|
1238
1254
|
i0.ɵɵtext(17, "(optional)");
|
|
1239
1255
|
i0.ɵɵelementEnd()();
|
|
1240
|
-
i0.ɵɵelementStart(18, "textarea",
|
|
1256
|
+
i0.ɵɵelementStart(18, "textarea", 215);
|
|
1241
1257
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_9_Conditional_12_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionDescription, $event) || (ctx_r1.ConnectionDescription = $event); return i0.ɵɵresetView($event); });
|
|
1242
1258
|
i0.ɵɵelementEnd()();
|
|
1243
|
-
i0.ɵɵelementStart(19, "div",
|
|
1259
|
+
i0.ɵɵelementStart(19, "div", 206)(20, "label", 216);
|
|
1244
1260
|
i0.ɵɵtext(21, "Credential");
|
|
1245
1261
|
i0.ɵɵelementEnd();
|
|
1246
|
-
i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_22_Template, 7, 1, "div",
|
|
1247
|
-
i0.ɵɵconditionalCreate(24, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_24_Template, 2, 0, "div",
|
|
1248
|
-
i0.ɵɵconditionalCreate(25, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_Template, 3, 0, "div",
|
|
1262
|
+
i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_22_Template, 7, 1, "div", 217)(23, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_23_Template, 7, 0, "div", 218);
|
|
1263
|
+
i0.ɵɵconditionalCreate(24, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_24_Template, 2, 0, "div", 219);
|
|
1264
|
+
i0.ɵɵconditionalCreate(25, ConnectionsComponent_Conditional_9_Conditional_12_Conditional_25_Template, 3, 0, "div", 220);
|
|
1249
1265
|
i0.ɵɵelementEnd()();
|
|
1250
1266
|
} if (rf & 2) {
|
|
1251
1267
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1264,18 +1280,18 @@ function ConnectionsComponent_Conditional_9_Conditional_12_Template(rf, ctx) { i
|
|
|
1264
1280
|
} }
|
|
1265
1281
|
function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1266
1282
|
const _r42 = i0.ɵɵgetCurrentView();
|
|
1267
|
-
i0.ɵɵelementStart(0, "div",
|
|
1283
|
+
i0.ɵɵelementStart(0, "div", 228)(1, "button", 231);
|
|
1268
1284
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
|
|
1269
|
-
i0.ɵɵelement(2, "i",
|
|
1285
|
+
i0.ɵɵelement(2, "i", 232);
|
|
1270
1286
|
i0.ɵɵtext(3, " Test Connection ");
|
|
1271
1287
|
i0.ɵɵelementEnd();
|
|
1272
|
-
i0.ɵɵelementStart(4, "p",
|
|
1288
|
+
i0.ɵɵelementStart(4, "p", 233);
|
|
1273
1289
|
i0.ɵɵtext(5, "We'll verify we can reach your system and authenticate.");
|
|
1274
1290
|
i0.ɵɵelementEnd()();
|
|
1275
1291
|
} }
|
|
1276
1292
|
function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1277
|
-
i0.ɵɵelementStart(0, "div",
|
|
1278
|
-
i0.ɵɵelement(2, "i",
|
|
1293
|
+
i0.ɵɵelementStart(0, "div", 229)(1, "div", 234);
|
|
1294
|
+
i0.ɵɵelement(2, "i", 235);
|
|
1279
1295
|
i0.ɵɵelementEnd();
|
|
1280
1296
|
i0.ɵɵelementStart(3, "p");
|
|
1281
1297
|
i0.ɵɵtext(4, "Testing connection...");
|
|
@@ -1288,7 +1304,7 @@ function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditi
|
|
|
1288
1304
|
i0.ɵɵelement(0, "i", 50);
|
|
1289
1305
|
} }
|
|
1290
1306
|
function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1291
|
-
i0.ɵɵelementStart(0, "div",
|
|
1307
|
+
i0.ɵɵelementStart(0, "div", 239);
|
|
1292
1308
|
i0.ɵɵtext(1);
|
|
1293
1309
|
i0.ɵɵelementEnd();
|
|
1294
1310
|
} if (rf & 2) {
|
|
@@ -1298,21 +1314,21 @@ function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditi
|
|
|
1298
1314
|
} }
|
|
1299
1315
|
function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1300
1316
|
const _r43 = i0.ɵɵgetCurrentView();
|
|
1301
|
-
i0.ɵɵelementStart(0, "button",
|
|
1317
|
+
i0.ɵɵelementStart(0, "button", 241);
|
|
1302
1318
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r43); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
|
|
1303
|
-
i0.ɵɵelement(1, "i",
|
|
1319
|
+
i0.ɵɵelement(1, "i", 242);
|
|
1304
1320
|
i0.ɵɵtext(2, " Retry ");
|
|
1305
1321
|
i0.ɵɵelementEnd();
|
|
1306
1322
|
} }
|
|
1307
1323
|
function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1308
|
-
i0.ɵɵelementStart(0, "div",
|
|
1324
|
+
i0.ɵɵelementStart(0, "div", 236)(1, "div", 237);
|
|
1309
1325
|
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_2_Template, 1, 0, "i", 49)(3, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_3_Template, 1, 0, "i", 50);
|
|
1310
1326
|
i0.ɵɵelementEnd();
|
|
1311
|
-
i0.ɵɵelementStart(4, "div",
|
|
1327
|
+
i0.ɵɵelementStart(4, "div", 238);
|
|
1312
1328
|
i0.ɵɵtext(5);
|
|
1313
1329
|
i0.ɵɵelementEnd();
|
|
1314
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_6_Template, 2, 1, "div",
|
|
1315
|
-
i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_7_Template, 3, 0, "button",
|
|
1330
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_6_Template, 2, 1, "div", 239);
|
|
1331
|
+
i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Conditional_7_Template, 3, 0, "button", 240);
|
|
1316
1332
|
i0.ɵɵelementEnd();
|
|
1317
1333
|
} if (rf & 2) {
|
|
1318
1334
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1327,12 +1343,12 @@ function ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Templat
|
|
|
1327
1343
|
i0.ɵɵconditional(!ctx_r1.TestResult.Success ? 7 : -1);
|
|
1328
1344
|
} }
|
|
1329
1345
|
function ConnectionsComponent_Conditional_9_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
1330
|
-
i0.ɵɵelementStart(0, "div",
|
|
1346
|
+
i0.ɵɵelementStart(0, "div", 182)(1, "h3", 192);
|
|
1331
1347
|
i0.ɵɵtext(2, "Let's verify everything works");
|
|
1332
1348
|
i0.ɵɵelementEnd();
|
|
1333
|
-
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_3_Template, 6, 0, "div",
|
|
1334
|
-
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_4_Template, 5, 0, "div",
|
|
1335
|
-
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Template, 8, 8, "div",
|
|
1349
|
+
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_3_Template, 6, 0, "div", 228);
|
|
1350
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_4_Template, 5, 0, "div", 229);
|
|
1351
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_9_Conditional_13_Conditional_5_Template, 8, 8, "div", 230);
|
|
1336
1352
|
i0.ɵɵelementEnd();
|
|
1337
1353
|
} if (rf & 2) {
|
|
1338
1354
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1362,26 +1378,26 @@ function ConnectionsComponent_Conditional_9_Conditional_20_Template(rf, ctx) { i
|
|
|
1362
1378
|
} }
|
|
1363
1379
|
function ConnectionsComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1364
1380
|
const _r30 = i0.ɵɵgetCurrentView();
|
|
1365
|
-
i0.ɵɵelementStart(0, "div", 8)(1, "div",
|
|
1381
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "div", 176)(2, "button", 177);
|
|
1366
1382
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseWizard()); });
|
|
1367
1383
|
i0.ɵɵelement(3, "i", 69);
|
|
1368
1384
|
i0.ɵɵtext(4, " Back to Integrations ");
|
|
1369
1385
|
i0.ɵɵelementEnd();
|
|
1370
|
-
i0.ɵɵelementStart(5, "h2",
|
|
1386
|
+
i0.ɵɵelementStart(5, "h2", 178);
|
|
1371
1387
|
i0.ɵɵtext(6, "New Integration");
|
|
1372
1388
|
i0.ɵɵelementEnd()();
|
|
1373
|
-
i0.ɵɵelementStart(7, "div",
|
|
1389
|
+
i0.ɵɵelementStart(7, "div", 179);
|
|
1374
1390
|
i0.ɵɵrepeaterCreate(8, ConnectionsComponent_Conditional_9_For_9_Template, 7, 7, null, null, _forTrack3);
|
|
1375
1391
|
i0.ɵɵelementEnd();
|
|
1376
|
-
i0.ɵɵelementStart(10, "div",
|
|
1377
|
-
i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_9_Conditional_11_Template, 9, 2, "div",
|
|
1378
|
-
i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_9_Conditional_12_Template, 26, 6, "div",
|
|
1379
|
-
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_9_Conditional_13_Template, 6, 3, "div",
|
|
1392
|
+
i0.ɵɵelementStart(10, "div", 180);
|
|
1393
|
+
i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_9_Conditional_11_Template, 9, 2, "div", 181);
|
|
1394
|
+
i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_9_Conditional_12_Template, 26, 6, "div", 181);
|
|
1395
|
+
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_9_Conditional_13_Template, 6, 3, "div", 182);
|
|
1380
1396
|
i0.ɵɵelementEnd();
|
|
1381
|
-
i0.ɵɵelementStart(14, "div",
|
|
1382
|
-
i0.ɵɵelement(15, "div",
|
|
1383
|
-
i0.ɵɵelementStart(16, "div",
|
|
1384
|
-
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_9_Conditional_17_Template, 2, 0, "button",
|
|
1397
|
+
i0.ɵɵelementStart(14, "div", 183);
|
|
1398
|
+
i0.ɵɵelement(15, "div", 184);
|
|
1399
|
+
i0.ɵɵelementStart(16, "div", 185);
|
|
1400
|
+
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_9_Conditional_17_Template, 2, 0, "button", 186);
|
|
1385
1401
|
i0.ɵɵelementStart(18, "button", 56);
|
|
1386
1402
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_9_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.FinishWizard()); });
|
|
1387
1403
|
i0.ɵɵconditionalCreate(19, ConnectionsComponent_Conditional_9_Conditional_19_Template, 2, 0)(20, ConnectionsComponent_Conditional_9_Conditional_20_Template, 1, 1);
|
|
@@ -1404,20 +1420,20 @@ function ConnectionsComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
|
1404
1420
|
i0.ɵɵconditional(ctx_r1.IsSaving ? 19 : 20);
|
|
1405
1421
|
} }
|
|
1406
1422
|
function ConnectionsComponent_Conditional_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1407
|
-
i0.ɵɵelementStart(0, "div",
|
|
1408
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
1423
|
+
i0.ɵɵelementStart(0, "div", 247);
|
|
1424
|
+
i0.ɵɵelement(1, "mj-loading", 248);
|
|
1409
1425
|
i0.ɵɵelementEnd();
|
|
1410
1426
|
} }
|
|
1411
1427
|
function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
1412
1428
|
const _r47 = i0.ɵɵgetCurrentView();
|
|
1413
|
-
i0.ɵɵelementStart(0, "div",
|
|
1414
|
-
i0.ɵɵelement(2, "i",
|
|
1429
|
+
i0.ɵɵelementStart(0, "div", 256)(1, "div", 259);
|
|
1430
|
+
i0.ɵɵelement(2, "i", 223);
|
|
1415
1431
|
i0.ɵɵelementStart(3, "span");
|
|
1416
1432
|
i0.ɵɵtext(4);
|
|
1417
1433
|
i0.ɵɵelementEnd()();
|
|
1418
|
-
i0.ɵɵelementStart(5, "button",
|
|
1434
|
+
i0.ɵɵelementStart(5, "button", 260);
|
|
1419
1435
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_17_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r47); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearEditCredential()); });
|
|
1420
|
-
i0.ɵɵelement(6, "i",
|
|
1436
|
+
i0.ɵɵelement(6, "i", 122);
|
|
1421
1437
|
i0.ɵɵelementEnd()();
|
|
1422
1438
|
} if (rf & 2) {
|
|
1423
1439
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -1426,9 +1442,9 @@ function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_17_Templa
|
|
|
1426
1442
|
} }
|
|
1427
1443
|
function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1428
1444
|
const _r49 = i0.ɵɵgetCurrentView();
|
|
1429
|
-
i0.ɵɵelementStart(0, "div",
|
|
1445
|
+
i0.ɵɵelementStart(0, "div", 265);
|
|
1430
1446
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_For_2_Template_div_click_0_listener() { const cred_r50 = i0.ɵɵrestoreView(_r49).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SelectEditCredential(cred_r50)); });
|
|
1431
|
-
i0.ɵɵelement(1, "i",
|
|
1447
|
+
i0.ɵɵelement(1, "i", 223);
|
|
1432
1448
|
i0.ɵɵelementStart(2, "span");
|
|
1433
1449
|
i0.ɵɵtext(3);
|
|
1434
1450
|
i0.ɵɵelementEnd()();
|
|
@@ -1438,8 +1454,8 @@ function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Condit
|
|
|
1438
1454
|
i0.ɵɵtextInterpolate(cred_r50.Name);
|
|
1439
1455
|
} }
|
|
1440
1456
|
function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1441
|
-
i0.ɵɵelementStart(0, "div",
|
|
1442
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_For_2_Template, 4, 1, "div",
|
|
1457
|
+
i0.ɵɵelementStart(0, "div", 263);
|
|
1458
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_For_2_Template, 4, 1, "div", 264, _forTrack2);
|
|
1443
1459
|
i0.ɵɵelementEnd();
|
|
1444
1460
|
} if (rf & 2) {
|
|
1445
1461
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -1448,12 +1464,12 @@ function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Condit
|
|
|
1448
1464
|
} }
|
|
1449
1465
|
function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
1450
1466
|
const _r48 = i0.ɵɵgetCurrentView();
|
|
1451
|
-
i0.ɵɵelementStart(0, "div",
|
|
1467
|
+
i0.ɵɵelementStart(0, "div", 261)(1, "button", 262);
|
|
1452
1468
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r48); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenEditCredentialDialog()); });
|
|
1453
1469
|
i0.ɵɵelement(2, "i", 13);
|
|
1454
1470
|
i0.ɵɵtext(3, " New Credential ");
|
|
1455
1471
|
i0.ɵɵelementEnd()();
|
|
1456
|
-
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_Template, 3, 0, "div",
|
|
1472
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Conditional_4_Template, 3, 0, "div", 263);
|
|
1457
1473
|
} if (rf & 2) {
|
|
1458
1474
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1459
1475
|
i0.ɵɵadvance(4);
|
|
@@ -1468,41 +1484,41 @@ function ConnectionsComponent_Conditional_12_Conditional_9_Conditional_32_Templa
|
|
|
1468
1484
|
} }
|
|
1469
1485
|
function ConnectionsComponent_Conditional_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1470
1486
|
const _r46 = i0.ɵɵgetCurrentView();
|
|
1471
|
-
i0.ɵɵelementStart(0, "div",
|
|
1487
|
+
i0.ɵɵelementStart(0, "div", 249)(1, "div", 250)(2, "label", 251);
|
|
1472
1488
|
i0.ɵɵtext(3, "Connection Name");
|
|
1473
1489
|
i0.ɵɵelementEnd();
|
|
1474
|
-
i0.ɵɵelementStart(4, "input",
|
|
1490
|
+
i0.ɵɵelementStart(4, "input", 252);
|
|
1475
1491
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_12_Conditional_9_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditName, $event) || (ctx_r1.EditName = $event); return i0.ɵɵresetView($event); });
|
|
1476
1492
|
i0.ɵɵelementEnd()();
|
|
1477
|
-
i0.ɵɵelementStart(5, "div",
|
|
1493
|
+
i0.ɵɵelementStart(5, "div", 250)(6, "label", 251);
|
|
1478
1494
|
i0.ɵɵtext(7, "Status");
|
|
1479
1495
|
i0.ɵɵelementEnd();
|
|
1480
|
-
i0.ɵɵelementStart(8, "div",
|
|
1496
|
+
i0.ɵɵelementStart(8, "div", 253)(9, "label", 254)(10, "input", 139);
|
|
1481
1497
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_12_Conditional_9_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditIsActive, $event) || (ctx_r1.EditIsActive = $event); return i0.ɵɵresetView($event); });
|
|
1482
1498
|
i0.ɵɵelementEnd();
|
|
1483
|
-
i0.ɵɵelement(11, "span",
|
|
1499
|
+
i0.ɵɵelement(11, "span", 166);
|
|
1484
1500
|
i0.ɵɵelementEnd();
|
|
1485
|
-
i0.ɵɵelementStart(12, "span",
|
|
1501
|
+
i0.ɵɵelementStart(12, "span", 255);
|
|
1486
1502
|
i0.ɵɵtext(13);
|
|
1487
1503
|
i0.ɵɵelementEnd()()();
|
|
1488
|
-
i0.ɵɵelementStart(14, "div",
|
|
1504
|
+
i0.ɵɵelementStart(14, "div", 250)(15, "label", 251);
|
|
1489
1505
|
i0.ɵɵtext(16, "Credential");
|
|
1490
1506
|
i0.ɵɵelementEnd();
|
|
1491
|
-
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_17_Template, 7, 1, "div",
|
|
1507
|
+
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_17_Template, 7, 1, "div", 256)(18, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_18_Template, 5, 1);
|
|
1492
1508
|
i0.ɵɵelementEnd();
|
|
1493
|
-
i0.ɵɵelementStart(19, "div",
|
|
1509
|
+
i0.ɵɵelementStart(19, "div", 250)(20, "label", 251);
|
|
1494
1510
|
i0.ɵɵtext(21, "Integration");
|
|
1495
1511
|
i0.ɵɵelementEnd();
|
|
1496
|
-
i0.ɵɵelementStart(22, "div",
|
|
1512
|
+
i0.ɵɵelementStart(22, "div", 257);
|
|
1497
1513
|
i0.ɵɵtext(23);
|
|
1498
1514
|
i0.ɵɵelementEnd()();
|
|
1499
|
-
i0.ɵɵelementStart(24, "div",
|
|
1515
|
+
i0.ɵɵelementStart(24, "div", 250)(25, "label", 251);
|
|
1500
1516
|
i0.ɵɵtext(26, "Company");
|
|
1501
1517
|
i0.ɵɵelementEnd();
|
|
1502
|
-
i0.ɵɵelementStart(27, "div",
|
|
1518
|
+
i0.ɵɵelementStart(27, "div", 257);
|
|
1503
1519
|
i0.ɵɵtext(28);
|
|
1504
1520
|
i0.ɵɵelementEnd()()();
|
|
1505
|
-
i0.ɵɵelementStart(29, "div",
|
|
1521
|
+
i0.ɵɵelementStart(29, "div", 258)(30, "button", 56);
|
|
1506
1522
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_12_Conditional_9_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveEditChanges()); });
|
|
1507
1523
|
i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_31_Template, 2, 0)(32, ConnectionsComponent_Conditional_12_Conditional_9_Conditional_32_Template, 1, 0);
|
|
1508
1524
|
i0.ɵɵelementEnd();
|
|
@@ -1533,17 +1549,17 @@ function ConnectionsComponent_Conditional_12_Conditional_9_Template(rf, ctx) { i
|
|
|
1533
1549
|
} }
|
|
1534
1550
|
function ConnectionsComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
1535
1551
|
const _r45 = i0.ɵɵgetCurrentView();
|
|
1536
|
-
i0.ɵɵelementStart(0, "div",
|
|
1552
|
+
i0.ɵɵelementStart(0, "div", 243)(1, "div", 244)(2, "div", 245);
|
|
1537
1553
|
i0.ɵɵelement(3, "i");
|
|
1538
1554
|
i0.ɵɵelementEnd();
|
|
1539
1555
|
i0.ɵɵelementStart(4, "span");
|
|
1540
1556
|
i0.ɵɵtext(5, "Configure Integration");
|
|
1541
1557
|
i0.ɵɵelementEnd()();
|
|
1542
|
-
i0.ɵɵelementStart(6, "button",
|
|
1558
|
+
i0.ɵɵelementStart(6, "button", 246);
|
|
1543
1559
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_12_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r45); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseEditPanel()); });
|
|
1544
|
-
i0.ɵɵelement(7, "i",
|
|
1560
|
+
i0.ɵɵelement(7, "i", 122);
|
|
1545
1561
|
i0.ɵɵelementEnd()();
|
|
1546
|
-
i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_12_Conditional_8_Template, 2, 0, "div",
|
|
1562
|
+
i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_12_Conditional_8_Template, 2, 0, "div", 247)(9, ConnectionsComponent_Conditional_12_Conditional_9_Template, 35, 10);
|
|
1547
1563
|
} if (rf & 2) {
|
|
1548
1564
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
1549
1565
|
i0.ɵɵadvance(2);
|
|
@@ -1555,7 +1571,7 @@ function ConnectionsComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
|
1555
1571
|
} }
|
|
1556
1572
|
function ConnectionsComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
1557
1573
|
const _r51 = i0.ɵɵgetCurrentView();
|
|
1558
|
-
i0.ɵɵelementStart(0, "mj-credential-dialog",
|
|
1574
|
+
i0.ɵɵelementStart(0, "mj-credential-dialog", 266);
|
|
1559
1575
|
i0.ɵɵlistener("close", function ConnectionsComponent_Conditional_13_Template_mj_credential_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r51); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.EditPanelOpen ? ctx_r1.OnEditCredentialDialogClose($event) : ctx_r1.OnCredentialDialogClose($event)); });
|
|
1560
1576
|
i0.ɵɵelementEnd();
|
|
1561
1577
|
} if (rf & 2) {
|
|
@@ -1569,13 +1585,13 @@ function ConnectionsComponent_Conditional_14_Conditional_16_Template(rf, ctx) {
|
|
|
1569
1585
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.AddMapSourceObjectName, " ");
|
|
1570
1586
|
} }
|
|
1571
1587
|
function ConnectionsComponent_Conditional_14_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
1572
|
-
i0.ɵɵelementStart(0, "span",
|
|
1588
|
+
i0.ɵɵelementStart(0, "span", 278);
|
|
1573
1589
|
i0.ɵɵtext(1, "Select a source object in the Add Map form first");
|
|
1574
1590
|
i0.ɵɵelementEnd();
|
|
1575
1591
|
} }
|
|
1576
1592
|
function ConnectionsComponent_Conditional_14_Conditional_29_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1577
|
-
i0.ɵɵelementStart(0, "div",
|
|
1578
|
-
i0.ɵɵelement(1, "i",
|
|
1593
|
+
i0.ɵɵelementStart(0, "div", 289);
|
|
1594
|
+
i0.ɵɵelement(1, "i", 129);
|
|
1579
1595
|
i0.ɵɵtext(2);
|
|
1580
1596
|
i0.ɵɵelementEnd();
|
|
1581
1597
|
} if (rf & 2) {
|
|
@@ -1584,8 +1600,8 @@ function ConnectionsComponent_Conditional_14_Conditional_29_For_2_Template(rf, c
|
|
|
1584
1600
|
i0.ɵɵtextInterpolate1(" ", warn_r53);
|
|
1585
1601
|
} }
|
|
1586
1602
|
function ConnectionsComponent_Conditional_14_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
1587
|
-
i0.ɵɵelementStart(0, "div",
|
|
1588
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_14_Conditional_29_For_2_Template, 3, 1, "div",
|
|
1603
|
+
i0.ɵɵelementStart(0, "div", 283);
|
|
1604
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_14_Conditional_29_For_2_Template, 3, 1, "div", 289, i0.ɵɵrepeaterTrackByIdentity);
|
|
1589
1605
|
i0.ɵɵelementEnd();
|
|
1590
1606
|
} if (rf & 2) {
|
|
1591
1607
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1593,23 +1609,23 @@ function ConnectionsComponent_Conditional_14_Conditional_29_Template(rf, ctx) {
|
|
|
1593
1609
|
i0.ɵɵrepeater(ctx_r1.DDLPreviewWarnings);
|
|
1594
1610
|
} }
|
|
1595
1611
|
function ConnectionsComponent_Conditional_14_Conditional_30_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1596
|
-
i0.ɵɵelement(0, "i",
|
|
1612
|
+
i0.ɵɵelement(0, "i", 150);
|
|
1597
1613
|
i0.ɵɵtext(1, " Copied ");
|
|
1598
1614
|
} }
|
|
1599
1615
|
function ConnectionsComponent_Conditional_14_Conditional_30_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1600
|
-
i0.ɵɵelement(0, "i",
|
|
1616
|
+
i0.ɵɵelement(0, "i", 293);
|
|
1601
1617
|
i0.ɵɵtext(1, " Copy ");
|
|
1602
1618
|
} }
|
|
1603
1619
|
function ConnectionsComponent_Conditional_14_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
1604
1620
|
const _r54 = i0.ɵɵgetCurrentView();
|
|
1605
|
-
i0.ɵɵelementStart(0, "div",
|
|
1621
|
+
i0.ɵɵelementStart(0, "div", 284)(1, "div", 290)(2, "span");
|
|
1606
1622
|
i0.ɵɵtext(3, "SQL Preview");
|
|
1607
1623
|
i0.ɵɵelementEnd();
|
|
1608
|
-
i0.ɵɵelementStart(4, "button",
|
|
1624
|
+
i0.ɵɵelementStart(4, "button", 291);
|
|
1609
1625
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_14_Conditional_30_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r54); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CopyDDLToClipboard()); });
|
|
1610
1626
|
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_14_Conditional_30_Conditional_5_Template, 2, 0)(6, ConnectionsComponent_Conditional_14_Conditional_30_Conditional_6_Template, 2, 0);
|
|
1611
1627
|
i0.ɵɵelementEnd()();
|
|
1612
|
-
i0.ɵɵelementStart(7, "pre",
|
|
1628
|
+
i0.ɵɵelementStart(7, "pre", 292);
|
|
1613
1629
|
i0.ɵɵtext(8);
|
|
1614
1630
|
i0.ɵɵelementEnd()();
|
|
1615
1631
|
} if (rf & 2) {
|
|
@@ -1620,8 +1636,8 @@ function ConnectionsComponent_Conditional_14_Conditional_30_Template(rf, ctx) {
|
|
|
1620
1636
|
i0.ɵɵtextInterpolate(ctx_r1.DDLPreview);
|
|
1621
1637
|
} }
|
|
1622
1638
|
function ConnectionsComponent_Conditional_14_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
1623
|
-
i0.ɵɵelementStart(0, "div",
|
|
1624
|
-
i0.ɵɵelement(2, "i",
|
|
1639
|
+
i0.ɵɵelementStart(0, "div", 285)(1, "h4");
|
|
1640
|
+
i0.ɵɵelement(2, "i", 294);
|
|
1625
1641
|
i0.ɵɵtext(3, " Next Steps");
|
|
1626
1642
|
i0.ɵɵelementEnd();
|
|
1627
1643
|
i0.ɵɵelementStart(4, "ol")(5, "li");
|
|
@@ -1642,54 +1658,54 @@ function ConnectionsComponent_Conditional_14_Conditional_34_Template(rf, ctx) {
|
|
|
1642
1658
|
i0.ɵɵtext(1, " Generating... ");
|
|
1643
1659
|
} }
|
|
1644
1660
|
function ConnectionsComponent_Conditional_14_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
1645
|
-
i0.ɵɵelement(0, "i",
|
|
1661
|
+
i0.ɵɵelement(0, "i", 295);
|
|
1646
1662
|
i0.ɵɵtext(1, " Generate SQL ");
|
|
1647
1663
|
} }
|
|
1648
1664
|
function ConnectionsComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
1649
1665
|
const _r52 = i0.ɵɵgetCurrentView();
|
|
1650
|
-
i0.ɵɵelementStart(0, "div",
|
|
1666
|
+
i0.ɵɵelementStart(0, "div", 267);
|
|
1651
1667
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_14_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1652
1668
|
i0.ɵɵelementEnd();
|
|
1653
|
-
i0.ɵɵelementStart(1, "div",
|
|
1669
|
+
i0.ɵɵelementStart(1, "div", 268)(2, "div", 269)(3, "h3");
|
|
1654
1670
|
i0.ɵɵtext(4, "Create New Entity Table");
|
|
1655
1671
|
i0.ɵɵelementEnd();
|
|
1656
|
-
i0.ɵɵelementStart(5, "button",
|
|
1672
|
+
i0.ɵɵelementStart(5, "button", 270);
|
|
1657
1673
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_14_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1658
|
-
i0.ɵɵelement(6, "i",
|
|
1674
|
+
i0.ɵɵelement(6, "i", 122);
|
|
1659
1675
|
i0.ɵɵelementEnd()();
|
|
1660
|
-
i0.ɵɵelementStart(7, "div",
|
|
1676
|
+
i0.ɵɵelementStart(7, "div", 271)(8, "p", 272);
|
|
1661
1677
|
i0.ɵɵtext(9, " Generate a SQL migration to create a new database table for this integration's data. After running the migration and CodeGen, the new entity will appear in the entity picker. ");
|
|
1662
1678
|
i0.ɵɵelementEnd();
|
|
1663
|
-
i0.ɵɵelementStart(10, "div",
|
|
1679
|
+
i0.ɵɵelementStart(10, "div", 273)(11, "div", 274)(12, "div", 275)(13, "label", 276);
|
|
1664
1680
|
i0.ɵɵtext(14, "Source Object");
|
|
1665
1681
|
i0.ɵɵelementEnd();
|
|
1666
|
-
i0.ɵɵelementStart(15, "div",
|
|
1667
|
-
i0.ɵɵconditionalCreate(16, ConnectionsComponent_Conditional_14_Conditional_16_Template, 1, 1)(17, ConnectionsComponent_Conditional_14_Conditional_17_Template, 2, 0, "span",
|
|
1682
|
+
i0.ɵɵelementStart(15, "div", 277);
|
|
1683
|
+
i0.ɵɵconditionalCreate(16, ConnectionsComponent_Conditional_14_Conditional_16_Template, 1, 1)(17, ConnectionsComponent_Conditional_14_Conditional_17_Template, 2, 0, "span", 278);
|
|
1668
1684
|
i0.ɵɵelementEnd()()();
|
|
1669
|
-
i0.ɵɵelementStart(18, "div",
|
|
1685
|
+
i0.ɵɵelementStart(18, "div", 274)(19, "div", 275)(20, "label", 276);
|
|
1670
1686
|
i0.ɵɵtext(21, "Schema");
|
|
1671
1687
|
i0.ɵɵelementEnd();
|
|
1672
|
-
i0.ɵɵelementStart(22, "input",
|
|
1688
|
+
i0.ɵɵelementStart(22, "input", 279);
|
|
1673
1689
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_14_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntitySchema, $event) || (ctx_r1.NewEntitySchema = $event); return i0.ɵɵresetView($event); });
|
|
1674
1690
|
i0.ɵɵelementEnd()();
|
|
1675
|
-
i0.ɵɵelementStart(23, "span",
|
|
1691
|
+
i0.ɵɵelementStart(23, "span", 280);
|
|
1676
1692
|
i0.ɵɵtext(24, ".");
|
|
1677
1693
|
i0.ɵɵelementEnd();
|
|
1678
|
-
i0.ɵɵelementStart(25, "div",
|
|
1694
|
+
i0.ɵɵelementStart(25, "div", 281)(26, "label", 276);
|
|
1679
1695
|
i0.ɵɵtext(27, "Table Name");
|
|
1680
1696
|
i0.ɵɵelementEnd();
|
|
1681
|
-
i0.ɵɵelementStart(28, "input",
|
|
1697
|
+
i0.ɵɵelementStart(28, "input", 282);
|
|
1682
1698
|
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_14_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityTable, $event) || (ctx_r1.NewEntityTable = $event); return i0.ɵɵresetView($event); });
|
|
1683
1699
|
i0.ɵɵelementEnd()()()();
|
|
1684
|
-
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_14_Conditional_29_Template, 3, 0, "div",
|
|
1685
|
-
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_14_Conditional_30_Template, 9, 2, "div",
|
|
1686
|
-
i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_14_Conditional_31_Template, 13, 0, "div",
|
|
1700
|
+
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_14_Conditional_29_Template, 3, 0, "div", 283);
|
|
1701
|
+
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_14_Conditional_30_Template, 9, 2, "div", 284);
|
|
1702
|
+
i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_14_Conditional_31_Template, 13, 0, "div", 285);
|
|
1687
1703
|
i0.ɵɵelementEnd();
|
|
1688
|
-
i0.ɵɵelementStart(32, "div",
|
|
1704
|
+
i0.ɵɵelementStart(32, "div", 286)(33, "button", 287);
|
|
1689
1705
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_14_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.PreviewDDL()); });
|
|
1690
1706
|
i0.ɵɵconditionalCreate(34, ConnectionsComponent_Conditional_14_Conditional_34_Template, 2, 0)(35, ConnectionsComponent_Conditional_14_Conditional_35_Template, 2, 0);
|
|
1691
1707
|
i0.ɵɵelementEnd();
|
|
1692
|
-
i0.ɵɵelementStart(36, "button",
|
|
1708
|
+
i0.ɵɵelementStart(36, "button", 288);
|
|
1693
1709
|
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_14_Template_button_click_36_listener() { i0.ɵɵrestoreView(_r52); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1694
1710
|
i0.ɵɵtext(37, " Done ");
|
|
1695
1711
|
i0.ɵɵelementEnd()()();
|
|
@@ -2893,6 +2909,76 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2893
2909
|
this.cdr.detectChanges();
|
|
2894
2910
|
}
|
|
2895
2911
|
}
|
|
2912
|
+
/**
|
|
2913
|
+
* One-click "find new tables": discovers every source object the connector now exposes that has
|
|
2914
|
+
* NO entity map yet, and provisions them all (table + entity map + field maps) in a single
|
|
2915
|
+
* ApplyAllBatch — no manual picker. This is the "find custom tables" affordance: a layer on top of
|
|
2916
|
+
* entity-map selection that surfaces whole new objects the source started exposing after setup
|
|
2917
|
+
* (distinct from custom COLUMNS, which the post-sync promoter handles automatically).
|
|
2918
|
+
*
|
|
2919
|
+
* Low-overhead by design: the only cost beyond a normal create is ONE DiscoverObjects call to
|
|
2920
|
+
* learn what's new; the apply itself is identical to provisioning known tables. A no-op when the
|
|
2921
|
+
* source exposes nothing new.
|
|
2922
|
+
*/
|
|
2923
|
+
async FindAndAddNewTables() {
|
|
2924
|
+
if (!this.SelectedSummary || this.IsCreatingTables)
|
|
2925
|
+
return;
|
|
2926
|
+
// CRITICAL: ApplyAllBatch runs RSU + CodeGen + an MJAPI restart. Doing that mid-sync would kill
|
|
2927
|
+
// the running sync, so block until no sync is active (see feedback: never restart mid-sync).
|
|
2928
|
+
if (this.SyncingIntegrationID) {
|
|
2929
|
+
this.CreateTablesResult = {
|
|
2930
|
+
Success: false,
|
|
2931
|
+
Message: 'A sync is in progress — wait for it to finish before adding new tables (adding tables restarts the API).',
|
|
2932
|
+
};
|
|
2933
|
+
this.cdr.detectChanges();
|
|
2934
|
+
return;
|
|
2935
|
+
}
|
|
2936
|
+
this.IsCreatingTables = true;
|
|
2937
|
+
this.CreateTablesResult = null;
|
|
2938
|
+
this.cdr.detectChanges();
|
|
2939
|
+
try {
|
|
2940
|
+
const integrationID = this.SelectedSummary.Integration.ID;
|
|
2941
|
+
// 1. One live DiscoverObjects call → keep only objects that aren't already mapped.
|
|
2942
|
+
const listed = await this.dataService.ListSourceObjects(integrationID);
|
|
2943
|
+
if (!listed.Success) {
|
|
2944
|
+
this.CreateTablesResult = { Success: false, Message: listed.Message ?? 'Discovery failed' };
|
|
2945
|
+
return;
|
|
2946
|
+
}
|
|
2947
|
+
const mappedNames = new Set(this.DetailEntityMaps.map(m => m.ExternalObjectName));
|
|
2948
|
+
const newObjects = (listed.Data ?? []).filter(o => !mappedNames.has(o.Name));
|
|
2949
|
+
if (newObjects.length === 0) {
|
|
2950
|
+
this.CreateTablesResult = {
|
|
2951
|
+
Success: true,
|
|
2952
|
+
Message: 'No new tables found — everything the source currently exposes is already mapped.',
|
|
2953
|
+
};
|
|
2954
|
+
return;
|
|
2955
|
+
}
|
|
2956
|
+
// 2. Provision all the new objects in a single batch (same path as the manual picker).
|
|
2957
|
+
const selections = newObjects.map(o => ({
|
|
2958
|
+
SourceObjectID: o.IntegrationObjectID ?? undefined,
|
|
2959
|
+
SourceObjectName: o.Name,
|
|
2960
|
+
}));
|
|
2961
|
+
const result = await this.dataService.ApplyAllBatch(integrationID, selections);
|
|
2962
|
+
this.CreateTablesResult = {
|
|
2963
|
+
Success: result.Success,
|
|
2964
|
+
Message: result.Success
|
|
2965
|
+
? `Added ${newObjects.length} new table${newObjects.length === 1 ? '' : 's'}: ${newObjects.map(o => o.Name).join(', ')}.`
|
|
2966
|
+
: (result.Message ?? 'Apply failed'),
|
|
2967
|
+
};
|
|
2968
|
+
if (result.Success) {
|
|
2969
|
+
this.DetailEntityMaps = await this.loadEntityMapsForIntegration(integrationID);
|
|
2970
|
+
this.DetailFilteredMaps = this.applyDetailFilter();
|
|
2971
|
+
this.EntityMapCounts = this.countMapsByIntegration(await this.loadAllEntityMaps());
|
|
2972
|
+
}
|
|
2973
|
+
}
|
|
2974
|
+
catch (err) {
|
|
2975
|
+
this.CreateTablesResult = { Success: false, Message: err instanceof Error ? err.message : String(err) };
|
|
2976
|
+
}
|
|
2977
|
+
finally {
|
|
2978
|
+
this.IsCreatingTables = false;
|
|
2979
|
+
this.cdr.detectChanges();
|
|
2980
|
+
}
|
|
2981
|
+
}
|
|
2896
2982
|
/**
|
|
2897
2983
|
* Search-only filter for the picker. Standard/Custom/Registered state
|
|
2898
2984
|
* shows up as badges — never hides anything — so Select All covers
|
|
@@ -3080,7 +3166,7 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
3080
3166
|
} if (rf & 2) {
|
|
3081
3167
|
let _t;
|
|
3082
3168
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityTreeDropdown = _t.first);
|
|
3083
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 15, vars: 18, consts: [["entityTreeDropdown", ""], ["Title", "Integrations", "Icon", "fa-solid fa-plug", "Subtitle", "Connected systems and data sources"], ["actions", ""], [3, "Clicked", "Loading"], ["mjButton", "", "variant", "primary", "size", "sm"], [3, "Flex", "Padding"], [1, "connections-container"], [1, "detail-view"], [1, "wizard-inline"], [1, "edit-panel-backdrop", 3, "click"], [1, "edit-panel"], [3, "Visible", "PreselectedTypeId"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "action-btn-label"], [1, "loading-container"], [1, "empty-state"], [1, "card-grid"], ["text", "Loading integrations..."], [1, "fa-solid", "fa-plug", "empty-icon"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "connection-card"], [1, "connection-card", "new-connection-card", 3, "click"], [1, "new-card-content"], [1, "new-card-icon"], [1, "new-card-label"], [1, "card-clickable", 3, "click"], [1, "card-header"], [1, "icon-circle"], [1, "icon-large"], [1, "card-body"], [1, "card-name"], [1, "card-company"], [1, "card-meta"], [1, "meta-label"], [1, "meta-separator"], [1, "meta-value"], [1, "card-sync-info"], [1, "fa-solid", "fa-arrows-rotate"], [1, "card-test-result", 3, "test-success", "test-failure"], [1, "delete-confirm-overlay"], [1, "card-footer"], ["mjButton", "", "variant", "outline", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "sync-menu-wrapper"], ["title", "Delete integration", 1, "card-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "card-test-result"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-xmark"], [1, "delete-confirm-content"], [1, "fa-solid", "fa-triangle-exclamation", "delete-warn-icon"], [1, "delete-confirm-text"], [1, "delete-confirm-actions"], ["mjButton", "", "variant", "danger", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "sync-dropdown"], [1, "fa-solid", "fa-chevron-down", "sync-caret"], [1, "sync-dropdown-group"], [1, "sync-dropdown-label"], [1, "sync-dropdown-item", 3, "click"], [1, "fa-solid", "fa-arrow-down-to-line"], [1, "fa-solid", "fa-rotate"], [1, "fa-solid", "fa-arrow-up-from-line"], [3, "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [3, "Close", "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [1, "detail-header"], ["title", "Back to Integrations", 1, "detail-back-btn", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "detail-header-info"], [1, "detail-header-text"], [1, "detail-title"], [1, "detail-subtitle"], [1, "detail-header-actions"], ["title", "Configure", 1, "detail-edit-btn", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], [1, "schedule-section"], [1, "schedule-section-header"], [1, "schedule-section-title"], [1, "fa-solid", "fa-calendar-check"], [3, "ScheduledJobID"], [1, "schedule-empty"], [3, "Close", "Saved", "Deleted", "IsOpen", "ScheduledJobID", "JobTypeID", "DefaultConfiguration", "HideJobType"], [1, "detail-toolbar"], [1, "detail-toolbar-left"], [1, "detail-map-count"], [1, "detail-toolbar-right"], [1, "detail-search"], [1, "fa-solid", "fa-filter"], ["type", "text", "placeholder", "Filter entity maps...", 3, "input", "value"], ["title", "Select source objects and create entity tables", 1, "add-map-btn", 3, "click"], [1, "fa-solid", "fa-table"], [1, "add-map-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "sync-result-banner", 3, "sync-success", "sync-failure"], [1, "add-map-panel"], [1, "detail-empty"], [1, "sync-dropdown", "sync-dropdown-left"], [3, "EditRequested", "ScheduledJobID"], [1, "schedule-empty-text"], [1, "schedule-create-btn", 3, "click"], [1, "sync-result-banner"], [1, "auto-map-header"], [1, "add-map-row"], [1, "add-map-field"], [1, "add-map-label"], [1, "add-map-select", 3, "ngModelChange", "ngModel"], ["disabled", "", 3, "ngValue"], [3, "value"], [1, "add-map-direction-col"], [1, "add-map-direction-btns"], ["title", "Pull from source", 3, "click"], [1, "fa-solid", "fa-arrow-right"], ["title", "Bidirectional sync", 3, "click"], [1, "fa-solid", "fa-right-left"], ["title", "Push to source", 3, "click"], [1, "add-map-actions"], [1, "add-map-save-btn", 3, "click", "disabled"], [1, "add-map-cancel-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "auto-map-result", 3, "auto-map-success", "auto-map-partial", "auto-map-failure"], [1, "auto-map-result"], [1, "auto-map-result-summary"], [1, "auto-map-errors"], [1, "fa-solid", "fa-circle-info"], [1, "auto-map-error"], [1, "fa-solid", "fa-triangle-exclamation"], ["text", "Loading source objects...", "size", "small"], [1, "auto-map-result", "auto-map-success"], [1, "auto-map-result", 3, "auto-map-success", "auto-map-failure"], [1, "create-tables-filters"], ["type", "text", "placeholder", "Search by name or label...", 1, "create-tables-search", "mj-input", 3, "ngModelChange", "ngModel"], [1, "create-tables-list"], [1, "create-tables-select-all"], [1, "create-tables-checkbox"], ["type", "checkbox", 3, "change", "checked"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "create-tables-name-hint"], [1, "create-tables-badge", "create-tables-badge-custom"], [1, "create-tables-badge", "create-tables-badge-registered"], [1, "add-map-loading"], [1, "add-map-hint"], [1, "add-map-select", 3, "ngModel"], [1, "add-map-field", "add-map-entity-field"], [1, "entity-picker-row"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], ["title", "Create new entity table", 1, "new-entity-btn", 3, "click"], [1, "fa-solid", "fa-check"], ["text", "Loading entity maps..."], [1, "fa-solid", "fa-cube"], [1, "add-map-btn", "add-map-btn-lg", 3, "click"], [1, "detail-table-head"], [1, "dt-col-toggle"], [1, "dt-col-source"], [1, "dt-col-direction"], [1, "dt-col-dest"], [1, "dt-col-meta"], [1, "detail-table-body"], [1, "detail-map-row", 3, "sync-disabled"], [1, "detail-table-empty"], [1, "detail-map-row", 3, "click"], [1, "dt-col-toggle", 3, "click"], [1, "toggle-switch", 3, "title"], [1, "toggle-slider"], [1, "dt-col-source", 3, "title"], [1, "dt-col-direction", 3, "click"], [1, "direction-toggle", 3, "click", "title"], [1, "dt-col-dest", 3, "title"], ["title", "Match strategy configured", 1, "detail-config-badge"], [1, "detail-config-badge", 3, "title"], [1, "map-edit-hint"], [1, "fa-solid", "fa-chevron-right"], [1, "fa-solid", "fa-link"], [1, "wizard-header"], [1, "wizard-back-btn", 3, "click"], [1, "wizard-title"], [1, "step-indicator"], [1, "wizard-body"], [1, "step-content"], [1, "step-content", "step-content-centered"], [1, "wizard-footer"], [1, "footer-left"], [1, "footer-right"], ["mjButton", "", "variant", "outline"], [1, "step-item"], [1, "step-circle"], [1, "step-label"], [1, "step-line", 3, "step-line-active"], [1, "step-line"], [1, "step-title"], [1, "search-bar"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search integrations...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "no-integrations"], [1, "integration-picker-grid"], [1, "fa-solid", "fa-puzzle-piece"], [1, "no-integrations-hint"], [1, "fa-solid", "fa-search"], [1, "integration-picker-card", 3, "picker-selected"], [1, "integration-picker-card", 3, "click"], [1, "picker-icon-circle"], [1, "picker-name"], [1, "picker-description"], [1, "form-group"], ["for", "connectionName", 1, "form-label"], ["id", "connectionName", "type", "text", "placeholder", "e.g. Production HubSpot", 1, "form-input", 3, "ngModelChange", "ngModel"], ["for", "companySelect", 1, "form-label"], ["id", "companySelect", 1, "form-input", 3, "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "form-hint"], ["for", "connectionDescription", 1, "form-label"], [1, "optional-label"], ["id", "connectionDescription", "placeholder", "Notes about this connection...", "rows", "3", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel"], [1, "form-label"], [1, "credential-selected"], [1, "credential-actions"], [1, "credential-loading"], [1, "credential-list"], ["id", "companySelect", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "credential-info"], [1, "fa-solid", "fa-key"], [1, "credential-clear", 3, "click"], ["text", "Loading credentials...", "size", "small"], [1, "credential-list-item"], [1, "credential-list-item", 3, "click"], [1, "test-prompt"], [1, "test-running"], [1, "test-result", 3, "test-result-success", "test-result-failure"], ["mjButton", "", "variant", "primary", "size", "lg", 3, "click"], [1, "fa-solid", "fa-vial"], [1, "test-hint"], [1, "test-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [1, "test-result"], [1, "test-result-icon"], [1, "test-result-message"], [1, "test-result-detail"], ["mjButton", "", "variant", "outline", 1, "test-retry-btn"], ["mjButton", "", "variant", "outline", 1, "test-retry-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], [1, "edit-panel-header"], [1, "edit-panel-title"], [1, "edit-icon-circle"], [1, "edit-close-btn", 3, "click"], [1, "edit-panel-loading"], ["text", "Loading...", "size", "small"], [1, "edit-panel-body"], [1, "edit-form-group"], [1, "edit-form-label"], ["type", "text", "placeholder", "Connection name...", 1, "edit-form-input", 3, "ngModelChange", "ngModel"], [1, "edit-toggle-row"], [1, "toggle-switch"], [1, "edit-toggle-label"], [1, "edit-credential-selected"], [1, "edit-readonly-field"], [1, "edit-panel-footer"], [1, "edit-credential-info"], [1, "edit-credential-clear", 3, "click"], [1, "edit-credential-actions"], ["mjButton", "", "variant", "outline", "size", "sm", 3, "click"], [1, "edit-credential-list"], [1, "edit-credential-item"], [1, "edit-credential-item", 3, "click"], [3, "close", "Visible", "PreselectedTypeId"], [1, "new-entity-backdrop", 3, "click"], [1, "new-entity-dialog"], [1, "new-entity-dialog-header"], [1, "new-entity-dialog-close", 3, "click"], [1, "new-entity-dialog-body"], [1, "new-entity-dialog-desc"], [1, "new-entity-dialog-form"], [1, "new-entity-dialog-row"], [1, "new-entity-dialog-field"], [1, "new-entity-dialog-label"], [1, "new-entity-dialog-value"], [1, "new-entity-dialog-hint"], ["type", "text", "placeholder", "e.g. hubspot", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "new-entity-dialog-dot"], [1, "new-entity-dialog-field", "new-entity-dialog-field-wide"], ["type", "text", "placeholder", "e.g. Contact", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "ddl-warnings"], [1, "ddl-preview-block"], [1, "new-entity-next-steps"], [1, "new-entity-dialog-footer"], [1, "new-entity-preview-btn", 3, "click", "disabled"], [1, "new-entity-dialog-done-btn", 3, "click"], [1, "ddl-warning"], [1, "ddl-preview-header"], ["title", "Copy to clipboard", 1, "ddl-copy-btn", 3, "click"], [1, "ddl-preview-code"], [1, "fa-regular", "fa-copy"], [1, "fa-solid", "fa-list-check"], [1, "fa-solid", "fa-code"]], template: function ConnectionsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
3169
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 15, vars: 18, consts: [["entityTreeDropdown", ""], ["Title", "Integrations", "Icon", "fa-solid fa-plug", "Subtitle", "Connected systems and data sources"], ["actions", ""], [3, "Clicked", "Loading"], ["mjButton", "", "variant", "primary", "size", "sm"], [3, "Flex", "Padding"], [1, "connections-container"], [1, "detail-view"], [1, "wizard-inline"], [1, "edit-panel-backdrop", 3, "click"], [1, "edit-panel"], [3, "Visible", "PreselectedTypeId"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "action-btn-label"], [1, "loading-container"], [1, "empty-state"], [1, "card-grid"], ["text", "Loading integrations..."], [1, "fa-solid", "fa-plug", "empty-icon"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "connection-card"], [1, "connection-card", "new-connection-card", 3, "click"], [1, "new-card-content"], [1, "new-card-icon"], [1, "new-card-label"], [1, "card-clickable", 3, "click"], [1, "card-header"], [1, "icon-circle"], [1, "icon-large"], [1, "card-body"], [1, "card-name"], [1, "card-company"], [1, "card-meta"], [1, "meta-label"], [1, "meta-separator"], [1, "meta-value"], [1, "card-sync-info"], [1, "fa-solid", "fa-arrows-rotate"], [1, "card-test-result", 3, "test-success", "test-failure"], [1, "delete-confirm-overlay"], [1, "card-footer"], ["mjButton", "", "variant", "outline", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "sync-menu-wrapper"], ["title", "Delete integration", 1, "card-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "card-test-result"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-xmark"], [1, "delete-confirm-content"], [1, "fa-solid", "fa-triangle-exclamation", "delete-warn-icon"], [1, "delete-confirm-text"], [1, "delete-confirm-actions"], ["mjButton", "", "variant", "danger", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "sync-dropdown"], [1, "fa-solid", "fa-chevron-down", "sync-caret"], [1, "sync-dropdown-group"], [1, "sync-dropdown-label"], [1, "sync-dropdown-item", 3, "click"], [1, "fa-solid", "fa-arrow-down-to-line"], [1, "fa-solid", "fa-rotate"], [1, "fa-solid", "fa-arrow-up-from-line"], [3, "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [3, "Close", "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [1, "detail-header"], ["title", "Back to Integrations", 1, "detail-back-btn", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "detail-header-info"], [1, "detail-header-text"], [1, "detail-title"], [1, "detail-subtitle"], [1, "detail-header-actions"], ["title", "Configure", 1, "detail-edit-btn", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], [1, "schedule-section"], [1, "schedule-section-header"], [1, "schedule-section-title"], [1, "fa-solid", "fa-calendar-check"], [3, "ScheduledJobID"], [1, "schedule-empty"], [3, "Close", "Saved", "Deleted", "IsOpen", "ScheduledJobID", "JobTypeID", "DefaultConfiguration", "HideJobType"], [1, "detail-toolbar"], [1, "detail-toolbar-left"], [1, "detail-map-count"], [1, "detail-toolbar-right"], [1, "detail-search"], [1, "fa-solid", "fa-filter"], ["type", "text", "placeholder", "Filter entity maps...", 3, "input", "value"], ["title", "Select source objects and create entity tables", 1, "add-map-btn", 3, "click"], [1, "fa-solid", "fa-table"], ["title", "Discover and add every source object that isn't mapped yet, in one step", 1, "add-map-btn", 3, "click", "disabled"], [1, "add-map-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "sync-result-banner", 3, "sync-success", "sync-failure"], [1, "add-map-panel"], [1, "detail-empty"], [1, "sync-dropdown", "sync-dropdown-left"], [3, "EditRequested", "ScheduledJobID"], [1, "schedule-empty-text"], [1, "schedule-create-btn", 3, "click"], [1, "fa-solid", "fa-magnifying-glass-plus"], [1, "sync-result-banner"], [1, "auto-map-header"], [1, "add-map-row"], [1, "add-map-field"], [1, "add-map-label"], [1, "add-map-select", 3, "ngModelChange", "ngModel"], ["disabled", "", 3, "ngValue"], [3, "value"], [1, "add-map-direction-col"], [1, "add-map-direction-btns"], ["title", "Pull from source", 3, "click"], [1, "fa-solid", "fa-arrow-right"], ["title", "Bidirectional sync", 3, "click"], [1, "fa-solid", "fa-right-left"], ["title", "Push to source", 3, "click"], [1, "add-map-actions"], [1, "add-map-save-btn", 3, "click", "disabled"], [1, "add-map-cancel-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "auto-map-result", 3, "auto-map-success", "auto-map-partial", "auto-map-failure"], [1, "auto-map-result"], [1, "auto-map-result-summary"], [1, "auto-map-errors"], [1, "fa-solid", "fa-circle-info"], [1, "auto-map-error"], [1, "fa-solid", "fa-triangle-exclamation"], ["text", "Loading source objects...", "size", "small"], [1, "auto-map-result", "auto-map-success"], [1, "auto-map-result", 3, "auto-map-success", "auto-map-failure"], [1, "create-tables-filters"], ["type", "text", "placeholder", "Search by name or label...", 1, "create-tables-search", "mj-input", 3, "ngModelChange", "ngModel"], [1, "create-tables-list"], [1, "create-tables-select-all"], [1, "create-tables-checkbox"], ["type", "checkbox", 3, "change", "checked"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "create-tables-name-hint"], [1, "create-tables-badge", "create-tables-badge-custom"], [1, "create-tables-badge", "create-tables-badge-registered"], [1, "add-map-loading"], [1, "add-map-hint"], [1, "add-map-select", 3, "ngModel"], [1, "add-map-field", "add-map-entity-field"], [1, "entity-picker-row"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], ["title", "Create new entity table", 1, "new-entity-btn", 3, "click"], [1, "fa-solid", "fa-check"], ["text", "Loading entity maps..."], [1, "fa-solid", "fa-cube"], [1, "add-map-btn", "add-map-btn-lg", 3, "click"], [1, "detail-table-head"], [1, "dt-col-toggle"], [1, "dt-col-source"], [1, "dt-col-direction"], [1, "dt-col-dest"], [1, "dt-col-meta"], [1, "detail-table-body"], [1, "detail-map-row", 3, "sync-disabled"], [1, "detail-table-empty"], [1, "detail-map-row", 3, "click"], [1, "dt-col-toggle", 3, "click"], [1, "toggle-switch", 3, "title"], [1, "toggle-slider"], [1, "dt-col-source", 3, "title"], [1, "dt-col-direction", 3, "click"], [1, "direction-toggle", 3, "click", "title"], [1, "dt-col-dest", 3, "title"], ["title", "Match strategy configured", 1, "detail-config-badge"], [1, "detail-config-badge", 3, "title"], [1, "map-edit-hint"], [1, "fa-solid", "fa-chevron-right"], [1, "fa-solid", "fa-link"], [1, "wizard-header"], [1, "wizard-back-btn", 3, "click"], [1, "wizard-title"], [1, "step-indicator"], [1, "wizard-body"], [1, "step-content"], [1, "step-content", "step-content-centered"], [1, "wizard-footer"], [1, "footer-left"], [1, "footer-right"], ["mjButton", "", "variant", "outline"], [1, "step-item"], [1, "step-circle"], [1, "step-label"], [1, "step-line", 3, "step-line-active"], [1, "step-line"], [1, "step-title"], [1, "search-bar"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search integrations...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "no-integrations"], [1, "integration-picker-grid"], [1, "fa-solid", "fa-puzzle-piece"], [1, "no-integrations-hint"], [1, "fa-solid", "fa-search"], [1, "integration-picker-card", 3, "picker-selected"], [1, "integration-picker-card", 3, "click"], [1, "picker-icon-circle"], [1, "picker-name"], [1, "picker-description"], [1, "form-group"], ["for", "connectionName", 1, "form-label"], ["id", "connectionName", "type", "text", "placeholder", "e.g. Production HubSpot", 1, "form-input", 3, "ngModelChange", "ngModel"], ["for", "companySelect", 1, "form-label"], ["id", "companySelect", 1, "form-input", 3, "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "form-hint"], ["for", "connectionDescription", 1, "form-label"], [1, "optional-label"], ["id", "connectionDescription", "placeholder", "Notes about this connection...", "rows", "3", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel"], [1, "form-label"], [1, "credential-selected"], [1, "credential-actions"], [1, "credential-loading"], [1, "credential-list"], ["id", "companySelect", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "credential-info"], [1, "fa-solid", "fa-key"], [1, "credential-clear", 3, "click"], ["text", "Loading credentials...", "size", "small"], [1, "credential-list-item"], [1, "credential-list-item", 3, "click"], [1, "test-prompt"], [1, "test-running"], [1, "test-result", 3, "test-result-success", "test-result-failure"], ["mjButton", "", "variant", "primary", "size", "lg", 3, "click"], [1, "fa-solid", "fa-vial"], [1, "test-hint"], [1, "test-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [1, "test-result"], [1, "test-result-icon"], [1, "test-result-message"], [1, "test-result-detail"], ["mjButton", "", "variant", "outline", 1, "test-retry-btn"], ["mjButton", "", "variant", "outline", 1, "test-retry-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], [1, "edit-panel-header"], [1, "edit-panel-title"], [1, "edit-icon-circle"], [1, "edit-close-btn", 3, "click"], [1, "edit-panel-loading"], ["text", "Loading...", "size", "small"], [1, "edit-panel-body"], [1, "edit-form-group"], [1, "edit-form-label"], ["type", "text", "placeholder", "Connection name...", 1, "edit-form-input", 3, "ngModelChange", "ngModel"], [1, "edit-toggle-row"], [1, "toggle-switch"], [1, "edit-toggle-label"], [1, "edit-credential-selected"], [1, "edit-readonly-field"], [1, "edit-panel-footer"], [1, "edit-credential-info"], [1, "edit-credential-clear", 3, "click"], [1, "edit-credential-actions"], ["mjButton", "", "variant", "outline", "size", "sm", 3, "click"], [1, "edit-credential-list"], [1, "edit-credential-item"], [1, "edit-credential-item", 3, "click"], [3, "close", "Visible", "PreselectedTypeId"], [1, "new-entity-backdrop", 3, "click"], [1, "new-entity-dialog"], [1, "new-entity-dialog-header"], [1, "new-entity-dialog-close", 3, "click"], [1, "new-entity-dialog-body"], [1, "new-entity-dialog-desc"], [1, "new-entity-dialog-form"], [1, "new-entity-dialog-row"], [1, "new-entity-dialog-field"], [1, "new-entity-dialog-label"], [1, "new-entity-dialog-value"], [1, "new-entity-dialog-hint"], ["type", "text", "placeholder", "e.g. hubspot", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "new-entity-dialog-dot"], [1, "new-entity-dialog-field", "new-entity-dialog-field-wide"], ["type", "text", "placeholder", "e.g. Contact", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "ddl-warnings"], [1, "ddl-preview-block"], [1, "new-entity-next-steps"], [1, "new-entity-dialog-footer"], [1, "new-entity-preview-btn", 3, "click", "disabled"], [1, "new-entity-dialog-done-btn", 3, "click"], [1, "ddl-warning"], [1, "ddl-preview-header"], ["title", "Copy to clipboard", 1, "ddl-copy-btn", 3, "click"], [1, "ddl-preview-code"], [1, "fa-regular", "fa-copy"], [1, "fa-solid", "fa-list-check"], [1, "fa-solid", "fa-code"]], template: function ConnectionsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
3084
3170
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 1)(2, "div", 2)(3, "mj-refresh-button", 3);
|
|
3085
3171
|
i0.ɵɵlistener("Clicked", function ConnectionsComponent_Template_mj_refresh_button_Clicked_3_listener() { return ctx.LoadData(); });
|
|
3086
3172
|
i0.ɵɵelementEnd();
|
|
@@ -3133,7 +3219,7 @@ ConnectionsComponent = ConnectionsComponent_1 = __decorate([
|
|
|
3133
3219
|
export { ConnectionsComponent };
|
|
3134
3220
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConnectionsComponent, [{
|
|
3135
3221
|
type: Component,
|
|
3136
|
-
args: [{ standalone: false, selector: 'app-integration-connections', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Integrations\"\n Icon=\"fa-solid fa-plug\"\n Subtitle=\"Connected systems and data sources\">\n <!-- [meta] intentionally omitted \u2014 chrome slot discipline audit Task B.\n \"Connections.length integrations\" badge mirrored the visible card\n grid row count. -->\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"LoadData()\"></mj-refresh-button>\n @if (!WizardOpen && !SelectedSummary) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OpenWizard()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">Add Integration</span>\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n<!-- Main container -->\n<div class=\"connections-container\" [class.detail-active]=\"!!SelectedSummary\"\n [class.editor-active]=\"!!EditorEntityMap\">\n\n <!-- ======================================================================\n CARD GRID VIEW (shown when no wizard and no detail selected)\n ====================================================================== -->\n @if (!WizardOpen && !SelectedSummary) {\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading integrations...\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && Connections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug empty-icon\"></i>\n <h3>No integrations yet</h3>\n <p>Connect your first external system to start syncing data.</p>\n <button mjButton variant=\"primary\" (click)=\"OpenWizard()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Your First Integration\n </button>\n </div>\n }\n\n <!-- Card grid -->\n @if (!IsLoading && Connections.length > 0) {\n <div class=\"card-grid\">\n @for (summary of Connections; track summary.Integration.ID) {\n <div class=\"connection-card\">\n <!-- Card header + body: clickable to open detail view -->\n <div class=\"card-clickable\" (click)=\"SelectIntegrationCard(summary)\">\n <div class=\"card-header\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(summary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(summary.Integration.Integration, summary.Icon)\" class=\"icon-large\"></i>\n </div>\n <span [class]=\"GetStatusBadgeClass(summary)\">{{ GetStatusBadge(summary) }}</span>\n </div>\n\n <!-- Card body -->\n <div class=\"card-body\">\n <div class=\"card-name\">{{ summary.Integration.Name }}</div>\n <div class=\"card-company\">{{ summary.Integration.Company }}</div>\n <div class=\"card-meta\">\n <span class=\"meta-label\">{{ GetSourceTypeLabel(summary) }}</span>\n <span class=\"meta-separator\">·</span>\n <span class=\"meta-value\">{{ GetCredentialHint(summary) }}</span>\n </div>\n <div class=\"card-sync-info\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Syncing {{ GetEntityMapCount(summary.Integration.ID) }} entities\n </div>\n\n <!-- Inline test result -->\n @if (GetCardTestResult(summary.Integration.ID); as testResult) {\n <div class=\"card-test-result\" [class.test-success]=\"testResult.Success\" [class.test-failure]=\"!testResult.Success\">\n @if (testResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ testResult.Message }}</span>\n </div>\n }\n </div>\n </div><!-- /card-clickable -->\n\n <!-- Delete confirmation overlay -->\n @if (IsDeleteConfirming(summary.Integration.ID)) {\n <div class=\"delete-confirm-overlay\">\n <div class=\"delete-confirm-content\">\n <i class=\"fa-solid fa-triangle-exclamation delete-warn-icon\"></i>\n <span class=\"delete-confirm-text\">Delete this integration and all its entity maps?</span>\n <div class=\"delete-confirm-actions\">\n <button mjButton\n variant=\"danger\"\n [disabled]=\"IsDeleting\"\n (click)=\"ConfirmDelete(summary.Integration.ID)\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Deleting...\n } @else {\n Delete\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"CancelDelete()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Card footer -->\n <div class=\"card-footer\">\n <button mjButton\n variant=\"outline\"\n [disabled]=\"!!TestingCardID\"\n (click)=\"TestExistingConnection(summary.Integration.ID)\">\n @if (IsTestingCard(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Test\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"OnMenuAction('edit', summary)\">\n Configure\n </button>\n @if (IsConnectionActive(summary)) {\n <div class=\"sync-menu-wrapper\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"ToggleSyncMenu(summary.Integration.ID, $event)\">\n @if (IsSyncing(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync\n <i class=\"fa-solid fa-chevron-down sync-caret\"></i>\n }\n </button>\n @if (SyncMenuIntegrationID === summary.Integration.ID) {\n <div class=\"sync-dropdown\">\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Pull (External \u2192 MJ)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Pull', $event)\">\n <i class=\"fa-solid fa-arrow-down-to-line\"></i> Incremental Pull\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Pull', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Pull\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Push (MJ \u2192 External)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Push', $event)\">\n <i class=\"fa-solid fa-arrow-up-from-line\"></i> Incremental Push\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Push', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Push\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Bidirectional</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Incremental Both\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Both\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button class=\"card-delete-btn\" (click)=\"OnMenuAction('delete', summary)\" title=\"Delete integration\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- New connection card -->\n <div class=\"connection-card new-connection-card\" (click)=\"OpenWizard()\">\n <div class=\"new-card-content\">\n <div class=\"new-card-icon\">\n <i class=\"fa-solid fa-plus\"></i>\n </div>\n <span class=\"new-card-label\">Add Integration</span>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ======================================================================\n DETAIL VIEW (entity maps for selected integration)\n ====================================================================== -->\n @if (!WizardOpen && SelectedSummary) {\n <div class=\"detail-view\">\n\n <!-- ================================================================\n ENTITY MAP EDITOR (field mapping detail for a selected map)\n ================================================================ -->\n @if (EditorEntityMap) {\n <app-visual-field-editor\n [EntityMap]=\"EditorEntityMap\"\n [CompanyIntegrationID]=\"SelectedSummary!.Integration.ID\"\n [RunViewProvider]=\"RunViewToUse\"\n (Close)=\"CloseEntityMapEditor()\">\n </app-visual-field-editor>\n\n <!-- ================================================================\n ENTITY MAPS LIST (shown when no editor map is selected)\n ================================================================ -->\n } @else {\n <!-- Detail header -->\n <div class=\"detail-header\">\n <button class=\"detail-back-btn\" (click)=\"CloseDetailView()\" title=\"Back to Integrations\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"detail-header-info\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(SelectedSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(SelectedSummary.Integration.Integration)\" class=\"icon-large\"></i>\n </div>\n <div class=\"detail-header-text\">\n <h2 class=\"detail-title\">{{ SelectedSummary.Integration.Name }}</h2>\n <span class=\"detail-subtitle\">\n {{ SelectedSummary.Integration.Company }}\n <span class=\"meta-separator\">·</span>\n {{ GetSourceTypeLabel(SelectedSummary) }}\n <span class=\"meta-separator\">·</span>\n <span [class]=\"GetStatusBadgeClass(SelectedSummary)\">{{ GetStatusBadge(SelectedSummary) }}</span>\n </span>\n </div>\n </div>\n <div class=\"detail-header-actions\">\n <button class=\"detail-edit-btn\" (click)=\"OpenEditPanel(SelectedSummary)\" title=\"Configure\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n @if (IsConnectionActive(SelectedSummary)) {\n <div class=\"sync-menu-wrapper\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"ToggleSyncMenu(SelectedSummary.Integration.ID, $event)\">\n @if (IsSyncing(SelectedSummary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync\n <i class=\"fa-solid fa-chevron-down sync-caret\"></i>\n }\n </button>\n @if (SyncMenuIntegrationID === SelectedSummary.Integration.ID) {\n <div class=\"sync-dropdown sync-dropdown-left\">\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Pull (External \u2192 MJ)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Pull', $event)\">\n <i class=\"fa-solid fa-arrow-down-to-line\"></i> Incremental Pull\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Pull', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Pull\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Push (MJ \u2192 External)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Push', $event)\">\n <i class=\"fa-solid fa-arrow-up-from-line\"></i> Incremental Push\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Push', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Push\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Bidirectional</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Incremental Both\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Both\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Schedule section -->\n <div class=\"schedule-section\">\n <div class=\"schedule-section-header\">\n <div class=\"schedule-section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Sync Schedule</span>\n </div>\n </div>\n @if (ScheduledJobID) {\n <mj-scheduled-job-summary\n [ScheduledJobID]=\"ScheduledJobID\"\n (EditRequested)=\"OpenSchedulePanel()\">\n </mj-scheduled-job-summary>\n } @else {\n <div class=\"schedule-empty\">\n <span class=\"schedule-empty-text\">No sync schedule configured</span>\n <button class=\"schedule-create-btn\" (click)=\"OpenSchedulePanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Schedule Sync\n </button>\n </div>\n }\n </div>\n\n <!-- Schedule slide panel -->\n <mj-scheduled-job-slide-panel\n [IsOpen]=\"ShowScheduleSlidePanel\"\n [ScheduledJobID]=\"ScheduledJobID\"\n [JobTypeID]=\"IntegrationSyncJobTypeID\"\n [DefaultConfiguration]=\"ScheduleDefaultConfiguration\"\n [HideJobType]=\"true\"\n (Close)=\"CloseSchedulePanel()\"\n (Saved)=\"OnScheduleSaved()\"\n (Deleted)=\"OnScheduleDeleted()\">\n </mj-scheduled-job-slide-panel>\n\n <!-- Entity maps toolbar -->\n <div class=\"detail-toolbar\">\n <div class=\"detail-toolbar-left\">\n <span class=\"detail-map-count\">\n {{ DetailEntityMaps.length }} entity map{{ DetailEntityMaps.length !== 1 ? 's' : '' }}\n <span class=\"meta-separator\">·</span>\n {{ DetailActiveMapCount }} active\n </span>\n </div>\n <div class=\"detail-toolbar-right\">\n <div class=\"detail-search\">\n <i class=\"fa-solid fa-filter\"></i>\n <input type=\"text\"\n placeholder=\"Filter entity maps...\"\n [value]=\"DetailSearchTerm\"\n (input)=\"OnDetailSearch($event)\" />\n </div>\n <button class=\"add-map-btn\" (click)=\"ToggleCreateTablesPanel()\" [class.active]=\"ShowCreateTablesPanel\"\n title=\"Select source objects and create entity tables\">\n <i class=\"fa-solid fa-table\"></i> Create Tables\n </button>\n <button class=\"add-map-btn\" (click)=\"ToggleAutoMapPanel()\" [class.active]=\"ShowAutoMapPanel\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map Schema\n </button>\n <button class=\"add-map-btn\" (click)=\"ToggleAddMapPanel()\" [class.active]=\"ShowAddMapPanel\">\n <i class=\"fa-solid fa-plus\"></i> Add Map\n </button>\n </div>\n </div>\n\n <!-- Sync result banner -->\n @if (SyncResult) {\n <div class=\"sync-result-banner\" [class.sync-success]=\"SyncResult.Success\" [class.sync-failure]=\"!SyncResult.Success\">\n @if (SyncResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ SyncResult.Message || (SyncResult.Success ? 'Sync completed successfully' : 'Sync failed') }}</span>\n </div>\n }\n\n <!-- Auto-Map Schema panel -->\n @if (ShowAutoMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"auto-map-header\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Auto-map all entities in a schema to this integration with 1:1 field mappings</span>\n </div>\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Target Schema</label>\n <select class=\"add-map-select\" [(ngModel)]=\"AutoMapSelectedSchema\">\n <option [ngValue]=\"''\" disabled>Select schema...</option>\n @for (schema of AutoMapSchemas; track schema) {\n <option [value]=\"schema\">{{ schema }}</option>\n }\n </select>\n </div>\n\n <div class=\"add-map-direction-col\">\n <label class=\"add-map-label\">Direction</label>\n <div class=\"add-map-direction-btns\">\n <button [class.active]=\"AutoMapDirection === 'Pull'\" (click)=\"AutoMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Bidirectional'\" (click)=\"AutoMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Push'\" (click)=\"AutoMapDirection = 'Push'\" title=\"Push to source\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanAutoMap\"\n (click)=\"RunAutoMap()\">\n @if (IsAutoMapping) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Mapping...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAutoMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n @if (AutoMapResult) {\n <div class=\"auto-map-result\" [class.auto-map-success]=\"AutoMapResult.Errors.length === 0\"\n [class.auto-map-partial]=\"AutoMapResult.Errors.length > 0 && AutoMapResult.EntityMapsCreated > 0\"\n [class.auto-map-failure]=\"AutoMapResult.EntityMapsCreated === 0 && AutoMapResult.Errors.length > 0\">\n @if (AutoMapResult.EntityMapsCreated > 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-check\"></i>\n Created {{ AutoMapResult.EntityMapsCreated }} entity map{{ AutoMapResult.EntityMapsCreated !== 1 ? 's' : '' }}\n with {{ AutoMapResult.FieldMapsCreated }} field map{{ AutoMapResult.FieldMapsCreated !== 1 ? 's' : '' }}\n </div>\n } @else if (AutoMapResult.Errors.length === 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-info\"></i>\n All entities in this schema are already mapped.\n </div>\n }\n @if (AutoMapResult.Errors.length > 0) {\n <div class=\"auto-map-errors\">\n @for (err of AutoMapResult.Errors; track err) {\n <div class=\"auto-map-error\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ err }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Create Tables panel (select source objects \u2192 create entity tables) -->\n @if (ShowCreateTablesPanel) {\n <div class=\"add-map-panel\">\n <div class=\"auto-map-header\">\n <i class=\"fa-solid fa-table\"></i>\n <span>Select source objects to create as entity tables in your database</span>\n </div>\n\n <div class=\"add-map-row\">\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanCreateTables\"\n (click)=\"RunCreateTables()\">\n @if (IsCreatingTables) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-table\"></i> Create {{ CreateTablesSelectedCount }} Table{{ CreateTablesSelectedCount !== 1 ? 's' : '' }}\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseCreateTablesPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n @if (IsLoadingCreateTablesObjects) {\n <mj-loading text=\"Loading source objects...\" size=\"small\"></mj-loading>\n } @else if (CreateTablesObjects.length === 0) {\n <div class=\"auto-map-result auto-map-success\">\n <i class=\"fa-solid fa-circle-info\"></i>\n No source objects available from this connector.\n </div>\n } @else {\n <div class=\"create-tables-filters\">\n <input type=\"text\"\n class=\"create-tables-search mj-input\"\n placeholder=\"Search by name or label...\"\n [(ngModel)]=\"CreateTablesSearch\" />\n </div>\n <div class=\"create-tables-list\">\n <div class=\"create-tables-select-all\">\n <label class=\"create-tables-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"FilteredCreateTablesObjects.length > 0 && CreateTablesSelectedCount === FilteredCreateTablesObjects.length\"\n (change)=\"ToggleAllCreateTablesObjects($any($event.target).checked)\" />\n <span>Select All ({{ FilteredCreateTablesObjects.length }} of {{ CreateTablesObjects.length }})</span>\n </label>\n </div>\n @for (obj of FilteredCreateTablesObjects; track obj.Name) {\n <label class=\"create-tables-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"obj.Selected\" />\n <span>{{ obj.Label }}</span>\n @if (obj.Label !== obj.Name) {\n <span class=\"create-tables-name-hint\">{{ obj.Name }}</span>\n }\n @if (obj.IsCustom) {\n <span class=\"create-tables-badge create-tables-badge-custom\">Custom</span>\n }\n @if (obj.AlreadyPersisted) {\n <span class=\"create-tables-badge create-tables-badge-registered\">Registered</span>\n }\n </label>\n }\n </div>\n }\n\n @if (CreateTablesResult) {\n <div class=\"auto-map-result\"\n [class.auto-map-success]=\"CreateTablesResult.Success\"\n [class.auto-map-failure]=\"!CreateTablesResult.Success\">\n @if (CreateTablesResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ CreateTablesResult.Message }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Add Entity Map inline form -->\n @if (ShowAddMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Source Object</label>\n @if (IsLoadingSourceObjects) {\n <div class=\"add-map-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n } @else if (AvailableSourceObjects.length === 0) {\n <div class=\"add-map-hint\">No source objects found in metadata</div>\n } @else {\n <select class=\"add-map-select\" [(ngModel)]=\"AddMapSourceObjectName\">\n <option [ngValue]=\"''\" disabled>Select source object...</option>\n @for (obj of AvailableSourceObjects; track obj.Name) {\n <option [value]=\"obj.Name\">{{ obj.Label || obj.Name }}</option>\n }\n </select>\n }\n </div>\n\n <div class=\"add-map-direction-col\">\n <label class=\"add-map-label\">Direction</label>\n <div class=\"add-map-direction-btns\">\n <button [class.active]=\"AddMapDirection === 'Pull'\" (click)=\"AddMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Bidirectional'\" (click)=\"AddMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Push'\" (click)=\"AddMapDirection = 'Push'\" title=\"Push to source\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"add-map-field add-map-entity-field\">\n <label class=\"add-map-label\">MJ Entity</label>\n <div class=\"entity-picker-row\">\n <mj-tree-dropdown\n #entityTreeDropdown\n [BranchConfig]=\"EntityBranchConfig\"\n [LeafConfig]=\"EntityLeafConfig\"\n [Value]=\"AddMapEntityIDAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search entities by schema...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"OnEntityTreeSelection($event)\">\n </mj-tree-dropdown>\n <button class=\"new-entity-btn\" (click)=\"OpenNewEntityDialog()\" title=\"Create new entity table\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n </div>\n\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanSaveAddMap || IsSavingAddMap\"\n (click)=\"SaveAddMap()\">\n @if (IsSavingAddMap) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-check\"></i> Add\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAddMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Entity maps table -->\n @if (IsDetailLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading entity maps...\"></mj-loading>\n </div>\n } @else if (DetailEntityMaps.length === 0 && !ShowAddMapPanel) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-cube\"></i>\n <h3>No entity maps configured</h3>\n <p>Entity maps define how external objects sync to MJ entities.</p>\n <button class=\"add-map-btn add-map-btn-lg\" (click)=\"ToggleAddMapPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Your First Entity Map\n </button>\n </div>\n } @else if (DetailEntityMaps.length > 0) {\n <!-- Table header -->\n <div class=\"detail-table-head\">\n <span class=\"dt-col-toggle\">Sync</span>\n <span class=\"dt-col-source\">External Object</span>\n <span class=\"dt-col-direction\"></span>\n <span class=\"dt-col-dest\">MJ Entity</span>\n <span class=\"dt-col-meta\">Config</span>\n </div>\n\n <!-- Table body -->\n <div class=\"detail-table-body\">\n @for (em of DetailFilteredMaps; track em.ID) {\n <div class=\"detail-map-row\" [class.sync-disabled]=\"!em.SyncEnabled\" (click)=\"OnEntityMapClick(em)\">\n <span class=\"dt-col-toggle\" (click)=\"$event.stopPropagation()\">\n <label class=\"toggle-switch\" [title]=\"em.SyncEnabled ? 'Sync enabled' : 'Sync disabled'\">\n <input type=\"checkbox\"\n [checked]=\"em.SyncEnabled\"\n (change)=\"OnToggleMapEnabled(em, $event)\" />\n <span class=\"toggle-slider\"></span>\n </label>\n </span>\n <span class=\"dt-col-source\" [title]=\"em.ExternalObjectName\">\n {{ em.ExternalObjectLabel ?? em.ExternalObjectName }}\n </span>\n <span class=\"dt-col-direction\" (click)=\"$event.stopPropagation()\">\n <button class=\"direction-toggle\" [class]=\"DirectionBadgeClass(em.SyncDirection)\"\n (click)=\"CycleSyncDirection(em)\"\n [title]=\"'Click to change sync direction (currently: ' + em.SyncDirection + ')'\">\n {{ DirectionText(em.SyncDirection) }}\n </button>\n </span>\n <span class=\"dt-col-dest\" [title]=\"em.Entity\">\n {{ em.Entity }}\n </span>\n <span class=\"dt-col-meta\">\n @if (em.MatchStrategy) {\n <span class=\"detail-config-badge\" title=\"Match strategy configured\">\n <i class=\"fa-solid fa-link\"></i>\n </span>\n }\n <span class=\"detail-config-badge\" [title]=\"'Conflict: ' + em.ConflictResolution\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </span>\n <span class=\"map-edit-hint\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </span>\n </span>\n </div>\n } @empty {\n <div class=\"detail-table-empty\">\n No entity maps match your filter.\n </div>\n }\n </div>\n }\n }\n\n </div>\n }\n\n <!-- ======================================================================\n WIZARD (inline, replaces card grid when open)\n ====================================================================== -->\n @if (WizardOpen) {\n <div class=\"wizard-inline\">\n <!-- Wizard header -->\n <div class=\"wizard-header\">\n <button class=\"wizard-back-btn\" (click)=\"CloseWizard()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Integrations\n </button>\n <h2 class=\"wizard-title\">New Integration</h2>\n </div>\n\n <!-- Step indicator -->\n <div class=\"step-indicator\">\n @for (step of WizardSteps; track step.Number) {\n <div class=\"step-item\" [class.step-active]=\"IsStepActive(step.Number)\" [class.step-completed]=\"IsStepCompleted(step.Number)\">\n <div class=\"step-circle\">\n @if (IsStepCompleted(step.Number)) {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n {{ step.Number }}\n }\n </div>\n <span class=\"step-label\">{{ step.Label }}</span>\n </div>\n @if (step.Number < WizardSteps.length) {\n <div class=\"step-line\" [class.step-line-active]=\"IsStepCompleted(step.Number)\"></div>\n }\n }\n </div>\n\n <!-- Step content -->\n <div class=\"wizard-body\">\n\n <!-- Step 1: Choose Integration -->\n @if (WizardStep === 1) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">What system do you want to connect?</h3>\n <div class=\"search-bar\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search integrations...\"\n [(ngModel)]=\"SearchQuery\" />\n </div>\n\n @if (FilteredIntegrations.length === 0 && AvailableIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n <p>No integrations configured</p>\n <span class=\"no-integrations-hint\">Configure integration definitions in the admin area first.</span>\n </div>\n } @else if (FilteredIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-search\"></i>\n <p>No matching integrations</p>\n </div>\n } @else {\n <div class=\"integration-picker-grid\">\n @for (def of FilteredIntegrations; track def.ID) {\n <div class=\"integration-picker-card\"\n [class.picker-selected]=\"IsSelectedIntegration(def)\"\n (click)=\"SelectIntegration(def)\">\n <div class=\"picker-icon-circle\" [style.background-color]=\"GetIconBrandColor(def.Name)\">\n <i [class]=\"GetIntegrationIcon(def.Name, def.Get('Icon'))\"></i>\n </div>\n <div class=\"picker-name\">{{ def.Name }}</div>\n @if (def.Description) {\n <div class=\"picker-description\">{{ def.Description }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Step 2: Configure Connection -->\n @if (WizardStep === 2) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">Set up your connection</h3>\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionName\">Connection Name</label>\n <input id=\"connectionName\"\n type=\"text\"\n class=\"form-input\"\n placeholder=\"e.g. Production HubSpot\"\n [(ngModel)]=\"ConnectionName\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"companySelect\">Company</label>\n @if (NeedsCompanyPicker) {\n <select id=\"companySelect\" class=\"form-input\" [(ngModel)]=\"SelectedCompanyID\">\n <option [ngValue]=\"null\" disabled>Select a company...</option>\n @for (company of Companies; track company.ID) {\n <option [value]=\"company.ID\">{{ company.Name }}</option>\n }\n </select>\n } @else if (Companies.length === 1) {\n <input type=\"text\" class=\"form-input\" [value]=\"Companies[0].Name\" disabled />\n } @else {\n <div class=\"form-hint\">No companies available. Create one in the admin area.</div>\n }\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionDescription\">Description <span class=\"optional-label\">(optional)</span></label>\n <textarea id=\"connectionDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"Notes about this connection...\"\n [(ngModel)]=\"ConnectionDescription\"\n rows=\"3\"></textarea>\n </div>\n\n <!-- Credential section -->\n <div class=\"form-group\">\n <label class=\"form-label\">Credential</label>\n @if (SelectedCredential) {\n <div class=\"credential-selected\">\n <div class=\"credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ SelectedCredential.Name }}</span>\n </div>\n <button class=\"credential-clear\" (click)=\"ClearCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"credential-actions\">\n <button mjButton variant=\"outline\" (click)=\"ShowExistingCredentials()\">\n <i class=\"fa-solid fa-key\"></i>\n Choose Existing Credential\n </button>\n <button mjButton variant=\"outline\" (click)=\"OpenCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Credential\n </button>\n </div>\n }\n\n @if (IsLoadingCredentials) {\n <div class=\"credential-loading\">\n <mj-loading text=\"Loading credentials...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsLoadingCredentials && ExistingCredentials.length > 0 && !SelectedCredential) {\n <div class=\"credential-list\">\n @for (cred of ExistingCredentials; track cred.ID) {\n <div class=\"credential-list-item\" (click)=\"SelectExistingCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Step 3: Test Connection -->\n @if (WizardStep === 3) {\n <div class=\"step-content step-content-centered\">\n <h3 class=\"step-title\">Let's verify everything works</h3>\n\n @if (!TestResult && !IsTesting) {\n <div class=\"test-prompt\">\n <button mjButton\n variant=\"primary\"\n size=\"lg\"\n (click)=\"TestNewConnection()\">\n <i class=\"fa-solid fa-vial\"></i>\n Test Connection\n </button>\n <p class=\"test-hint\">We'll verify we can reach your system and authenticate.</p>\n </div>\n }\n\n @if (IsTesting) {\n <div class=\"test-running\">\n <div class=\"test-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-3x\"></i>\n </div>\n <p>Testing connection...</p>\n </div>\n }\n\n @if (TestResult) {\n <div class=\"test-result\" [class.test-result-success]=\"TestResult.Success\" [class.test-result-failure]=\"!TestResult.Success\">\n <div class=\"test-result-icon\">\n @if (TestResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n </div>\n <div class=\"test-result-message\">{{ TestResult.Message }}</div>\n @if (TestResult.Success && TestResult.ServerVersion) {\n <div class=\"test-result-detail\">\n Server version: {{ TestResult.ServerVersion }}\n </div>\n }\n @if (!TestResult.Success) {\n <button mjButton variant=\"outline\" (click)=\"TestNewConnection()\" class=\"test-retry-btn\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n Retry\n </button>\n }\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- Wizard footer -->\n <div class=\"wizard-footer\">\n <div class=\"footer-left\"></div>\n <div class=\"footer-right\">\n @if (WizardStep > 1) {\n <button mjButton variant=\"outline\" (click)=\"PreviousStep()\">\n Back\n </button>\n }\n <button mjButton\n variant=\"primary\"\n [disabled]=\"IsNextDisabled || IsSaving\"\n (click)=\"FinishWizard()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n {{ NextButtonLabel }}\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n</div>\n\n<!-- Edit panel (slide-in) -->\n<div class=\"edit-panel-backdrop\"\n [class.open]=\"EditPanelOpen\"\n (click)=\"CloseEditPanel()\"></div>\n<div class=\"edit-panel\" [class.open]=\"EditPanelOpen\">\n @if (EditingSummary) {\n <!-- Header -->\n <div class=\"edit-panel-header\">\n <div class=\"edit-panel-title\">\n <div class=\"edit-icon-circle\"\n [style.background-color]=\"GetIconBrandColor(EditingSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(EditingSummary.Integration.Integration, EditingSummary.Icon)\"></i>\n </div>\n <span>Configure Integration</span>\n </div>\n <button class=\"edit-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (IsEditLoading) {\n <div class=\"edit-panel-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Edit form -->\n <div class=\"edit-panel-body\">\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Connection Name</label>\n <input type=\"text\"\n class=\"edit-form-input\"\n [(ngModel)]=\"EditName\"\n placeholder=\"Connection name...\" />\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Status</label>\n <div class=\"edit-toggle-row\">\n <label class=\"toggle-switch\">\n <input type=\"checkbox\" [(ngModel)]=\"EditIsActive\" />\n <span class=\"toggle-slider\"></span>\n </label>\n <span class=\"edit-toggle-label\" [class.active]=\"EditIsActive\">\n {{ EditIsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Credential</label>\n @if (EditCredential) {\n <div class=\"edit-credential-selected\">\n <div class=\"edit-credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ EditCredential.Name }}</span>\n </div>\n <button class=\"edit-credential-clear\" (click)=\"ClearEditCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"edit-credential-actions\">\n <button mjButton variant=\"outline\" size=\"sm\" (click)=\"OpenEditCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i> New Credential\n </button>\n </div>\n @if (EditCredentials.length > 0) {\n <div class=\"edit-credential-list\">\n @for (cred of EditCredentials; track cred.ID) {\n <div class=\"edit-credential-item\" (click)=\"SelectEditCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Integration</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Integration }}\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Company</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Company }}\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"edit-panel-footer\">\n <button mjButton\n variant=\"primary\"\n [disabled]=\"IsEditSaving || !EditName.trim()\"\n (click)=\"SaveEditChanges()\">\n @if (IsEditSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save Changes\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n </div>\n }\n }\n</div>\n\n<!-- Credential dialog (shared between wizard and edit panel) -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n [Visible]=\"true\"\n [PreselectedTypeId]=\"PreselectedCredentialTypeId\"\n (close)=\"EditPanelOpen ? OnEditCredentialDialogClose($event) : OnCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n\n<!-- New Entity dialog -->\n@if (ShowCreateEntity) {\n <div class=\"new-entity-backdrop\" (click)=\"CloseNewEntityDialog()\"></div>\n <div class=\"new-entity-dialog\">\n <div class=\"new-entity-dialog-header\">\n <h3>Create New Entity Table</h3>\n <button class=\"new-entity-dialog-close\" (click)=\"CloseNewEntityDialog()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"new-entity-dialog-body\">\n <p class=\"new-entity-dialog-desc\">\n Generate a SQL migration to create a new database table for this integration's data.\n After running the migration and CodeGen, the new entity will appear in the entity picker.\n </p>\n\n <div class=\"new-entity-dialog-form\">\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Source Object</label>\n <div class=\"new-entity-dialog-value\">\n @if (AddMapSourceObjectName) {\n {{ AddMapSourceObjectName }}\n } @else {\n <span class=\"new-entity-dialog-hint\">Select a source object in the Add Map form first</span>\n }\n </div>\n </div>\n </div>\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Schema</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. hubspot\"\n [(ngModel)]=\"NewEntitySchema\" />\n </div>\n <span class=\"new-entity-dialog-dot\">.</span>\n <div class=\"new-entity-dialog-field new-entity-dialog-field-wide\">\n <label class=\"new-entity-dialog-label\">Table Name</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. Contact\"\n [(ngModel)]=\"NewEntityTable\" />\n </div>\n </div>\n </div>\n\n @if (DDLPreviewWarnings.length > 0) {\n <div class=\"ddl-warnings\">\n @for (warn of DDLPreviewWarnings; track warn) {\n <div class=\"ddl-warning\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ warn }}</div>\n }\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"ddl-preview-block\">\n <div class=\"ddl-preview-header\">\n <span>SQL Preview</span>\n <button class=\"ddl-copy-btn\" (click)=\"CopyDDLToClipboard()\" title=\"Copy to clipboard\">\n @if (DDLCopied) {\n <i class=\"fa-solid fa-check\"></i> Copied\n } @else {\n <i class=\"fa-regular fa-copy\"></i> Copy\n }\n </button>\n </div>\n <pre class=\"ddl-preview-code\">{{ DDLPreview }}</pre>\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"new-entity-next-steps\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Next Steps</h4>\n <ol>\n <li>Copy the SQL above and save it as a migration file</li>\n <li>Run the migration against your database</li>\n <li>Run CodeGen to register the new entity in MemberJunction</li>\n <li>Refresh the page — the new entity will appear in the entity picker</li>\n </ol>\n </div>\n }\n </div>\n <div class=\"new-entity-dialog-footer\">\n <button class=\"new-entity-preview-btn\"\n [disabled]=\"!CanGenerateSQL || IsGeneratingDDL\"\n (click)=\"PreviewDDL()\">\n @if (IsGeneratingDDL) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating...\n } @else {\n <i class=\"fa-solid fa-code\"></i> Generate SQL\n }\n </button>\n <button class=\"new-entity-dialog-done-btn\" (click)=\"CloseNewEntityDialog()\">\n Done\n </button>\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ---------------------------------------------------------------------------\n Host & Container \u2014 flex chain for scrollable detail view\n --------------------------------------------------------------------------- */\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n/* Slot passthrough now in <mj-page-header>; stat badges now via <mj-stat-badge>. */\n\n.connections-container {\n padding: 24px;\n max-width: 1400px;\n width: 100%;\n margin: 0 auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n/* When detail or editor view is active, prevent container scrolling\n so the inner .detail-table-body handles its own scroll */\n.connections-container.detail-active,\n.connections-container.editor-active {\n overflow: hidden;\n}\n\n/* ---------------------------------------------------------------------------\n Loading & Empty States\n --------------------------------------------------------------------------- */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-text-disabled);\n margin-bottom: 16px;\n}\n\n.empty-state h3 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 8px;\n}\n\n.empty-state p {\n font-size: 14px;\n margin: 0 0 24px;\n}\n\n/* ---------------------------------------------------------------------------\n Card Grid\n --------------------------------------------------------------------------- */\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n}\n\n/* ---------------------------------------------------------------------------\n Connection Card\n --------------------------------------------------------------------------- */\n\n.connection-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.connection-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n/* Card Header */\n.card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 16px 0;\n}\n\n.icon-circle {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.icon-large {\n font-size: 22px;\n}\n\n/* Status Badge */\n.status-badge {\n font-size: 12px;\n font-weight: 600;\n padding: 4px 10px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge-connected {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.status-badge-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.status-badge-inactive {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.status-badge-syncing {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n/* Card Body */\n.card-body {\n padding: 12px 16px;\n flex: 1;\n}\n\n.card-name {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.card-company {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin-bottom: 10px;\n}\n\n.card-meta {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.meta-separator {\n margin: 0 6px;\n}\n\n.meta-label {\n font-weight: 500;\n}\n\n.card-sync-info {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.card-sync-info i {\n margin-right: 4px;\n color: var(--mj-text-disabled);\n}\n\n/* Card inline test result */\n.card-test-result {\n font-size: 12px;\n padding: 6px 10px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n}\n\n.card-test-result.test-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.card-test-result.test-failure {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.card-test-result span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Card Footer */\n.card-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.card-footer button {\n font-size: 13px;\n}\n\n/* Sync dropdown menu */\n.sync-menu-wrapper {\n position: relative;\n display: inline-flex;\n}\n\n.sync-caret {\n font-size: 10px;\n margin-left: 4px;\n opacity: 0.8;\n}\n\n.sync-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n min-width: 220px;\n overflow: hidden;\n}\n\n.sync-dropdown-left {\n left: auto;\n right: 0;\n}\n\n.sync-dropdown-group {\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.sync-dropdown-group:last-child {\n border-bottom: none;\n}\n\n.sync-dropdown-label {\n display: block;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n padding: 0 12px 4px;\n}\n\n.sync-dropdown-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 12px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n text-align: left;\n transition: background 0.12s;\n}\n\n.sync-dropdown-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-dropdown-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n/* Card Delete Button */\n.card-delete-btn {\n margin-left: auto;\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: all 0.15s;\n}\n\n.card-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n.menu-trigger:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.card-menu-dropdown {\n position: absolute;\n right: 0;\n top: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n min-width: 160px;\n z-index: 50;\n padding: 4px;\n}\n\n.menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n border-radius: 6px;\n transition: background 0.15s;\n text-align: left;\n}\n\n.menu-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.menu-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.menu-item-danger {\n color: var(--mj-status-error);\n}\n\n.menu-item-danger i {\n color: var(--mj-status-error);\n}\n\n.menu-item-danger:hover {\n background: var(--mj-status-error-bg);\n}\n\n/* ---------------------------------------------------------------------------\n New Connection Card\n --------------------------------------------------------------------------- */\n\n.new-connection-card {\n border: 2px dashed var(--mj-border-strong);\n background: var(--mj-bg-page);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n transition: background 0.2s, border-color 0.2s;\n}\n\n.new-connection-card:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n box-shadow: none;\n transform: none;\n}\n\n.new-card-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.new-card-icon {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--mj-bg-surface-active);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n transition: background 0.2s, color 0.2s;\n}\n\n.new-connection-card:hover .new-card-icon {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.new-card-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.new-connection-card:hover .new-card-label {\n color: var(--mj-brand-primary);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard (inline, replaces card grid)\n --------------------------------------------------------------------------- */\n\n.wizard-inline {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 720px;\n margin: 0 auto;\n}\n\n/* Wizard Header */\n.wizard-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 0 20px;\n}\n\n.wizard-back-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n padding: 6px 10px;\n border-radius: 6px;\n transition: background 0.15s, color 0.15s;\n}\n\n.wizard-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.wizard-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Step Indicator\n --------------------------------------------------------------------------- */\n\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 32px;\n gap: 0;\n}\n\n.step-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n position: relative;\n}\n\n.step-circle {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n border: 2px solid var(--mj-border-default);\n transition: all 0.2s;\n}\n\n.step-active .step-circle {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.step-completed .step-circle {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\n}\n\n.step-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.step-active .step-label {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.step-completed .step-label {\n color: var(--mj-status-success);\n}\n\n.step-line {\n width: 48px;\n height: 2px;\n background: var(--mj-border-default);\n margin: 0 8px;\n margin-bottom: 20px;\n transition: background 0.2s;\n}\n\n.step-line-active {\n background: var(--mj-status-success);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Body\n --------------------------------------------------------------------------- */\n\n.wizard-body {\n flex: 1;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n.step-content {\n min-height: 300px;\n}\n\n.step-content-centered {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.step-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 20px;\n}\n\n.step-content-centered .step-title {\n margin-bottom: 32px;\n}\n\n/* Search bar */\n.search-bar {\n position: relative;\n margin-bottom: 20px;\n}\n\n.search-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.search-input {\n width: 100%;\n padding: 10px 14px 10px 40px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* No integrations */\n.no-integrations {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-disabled);\n text-align: center;\n}\n\n.no-integrations i {\n font-size: 36px;\n margin-bottom: 12px;\n}\n\n.no-integrations p {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin: 0 0 4px;\n}\n\n.no-integrations-hint {\n font-size: 13px;\n}\n\n/* Integration picker grid */\n.integration-picker-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n}\n\n.integration-picker-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n cursor: pointer;\n text-align: center;\n transition: border-color 0.2s, background 0.15s;\n}\n\n.integration-picker-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.integration-picker-card.picker-selected {\n border-color: var(--mj-brand-primary);\n background: var(--mj-status-info-bg);\n}\n\n.picker-icon-circle {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n margin: 0 auto 10px;\n font-size: 18px;\n}\n\n.picker-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.picker-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n line-height: 1.3;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n/* ---------------------------------------------------------------------------\n Form Controls (Step 2)\n --------------------------------------------------------------------------- */\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.optional-label {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input:disabled {\n background: var(--mj-bg-page);\n color: var(--mj-text-muted);\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 72px;\n}\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n/* Credential section */\n.credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n border-radius: 8px;\n}\n\n.credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-success-text);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info i {\n color: var(--mj-status-success);\n}\n\n.credential-clear {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.credential-clear:hover {\n color: var(--mj-status-error);\n}\n\n.credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.credential-actions button {\n font-size: 13px;\n}\n\n.credential-loading {\n padding: 16px 0;\n}\n\n.credential-list {\n margin-top: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.credential-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.credential-list-item:last-child {\n border-bottom: none;\n}\n\n.credential-list-item:hover {\n background: var(--mj-bg-page);\n}\n\n.credential-list-item i {\n color: var(--mj-text-disabled);\n}\n\n/* ---------------------------------------------------------------------------\n Test Connection (Step 3)\n --------------------------------------------------------------------------- */\n\n.test-prompt {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.test-hint {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n.test-running {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n color: var(--mj-brand-primary);\n}\n\n.test-spinner {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.test-running p {\n font-size: 15px;\n font-weight: 500;\n margin: 0;\n}\n\n/* Test result */\n.test-result {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n border-radius: 12px;\n max-width: 400px;\n}\n\n.test-result-success {\n background: var(--mj-status-success-bg);\n}\n\n.test-result-failure {\n background: var(--mj-status-error-bg);\n}\n\n.test-result-icon {\n font-size: 48px;\n animation: scaleIn 0.3s ease-out;\n}\n\n.test-result-success .test-result-icon {\n color: var(--mj-status-success);\n}\n\n.test-result-failure .test-result-icon {\n color: var(--mj-status-error);\n}\n\n@keyframes scaleIn {\n from {\n transform: scale(0.5);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.test-result-message {\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n.test-result-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.test-retry-btn {\n margin-top: 4px;\n}\n\n/* Toggle switch */\n.toggle-switch {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.toggle-switch input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.toggle-slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-border-strong);\n border-radius: 24px;\n transition: background 0.2s;\n}\n\n.toggle-slider::before {\n content: '';\n position: absolute;\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s;\n}\n\n.toggle-switch input:checked + .toggle-slider {\n background: var(--mj-brand-primary);\n}\n\n.toggle-switch input:checked + .toggle-slider::before {\n transform: translateX(20px);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Footer\n --------------------------------------------------------------------------- */\n\n.wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.footer-left {\n display: flex;\n align-items: center;\n}\n\n.footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ---------------------------------------------------------------------------\n Responsive\n --------------------------------------------------------------------------- */\n\n@media (max-width: 768px) {\n .connections-container {\n padding: 16px;\n }\n\n .card-grid {\n grid-template-columns: 1fr;\n }\n\n .integration-picker-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .step-indicator {\n padding: 16px;\n overflow-x: auto;\n }\n\n .step-line {\n width: 24px;\n }\n\n .credential-actions {\n flex-direction: column;\n }\n}\n\n@media (max-width: 480px) {\n .integration-picker-grid {\n grid-template-columns: 1fr;\n }\n\n .card-footer {\n flex-wrap: wrap;\n }\n}\n\n/* ---------------------------------------------------------------------------\n Delete confirmation overlay\n --------------------------------------------------------------------------- */\n\n.delete-confirm-overlay {\n position: absolute;\n inset: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n border-radius: 12px;\n animation: fadeIn 150ms ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.delete-confirm-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 20px;\n text-align: center;\n}\n\n.delete-warn-icon {\n font-size: 28px;\n color: var(--mj-status-error);\n}\n\n.delete-confirm-text {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n max-width: 220px;\n}\n\n.delete-confirm-actions {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n/* ---------------------------------------------------------------------------\n Edit panel (slide-in)\n --------------------------------------------------------------------------- */\n\n.edit-panel-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.1);\n z-index: 99;\n opacity: 0;\n pointer-events: none;\n transition: opacity 300ms ease;\n}\n\n.edit-panel-backdrop.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.edit-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 400px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.08);\n z-index: 100;\n transform: translateX(100%);\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.edit-panel.open {\n transform: translateX(0);\n}\n\n.edit-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.edit-panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.edit-icon-circle {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n}\n\n.edit-close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n font-size: 14px;\n transition: all 150ms ease;\n}\n\n.edit-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.edit-panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n}\n\n.edit-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.edit-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.edit-form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.edit-form-input {\n height: 36px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n transition: border-color 150ms ease;\n}\n\n.edit-form-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.edit-readonly-field {\n padding: 8px 12px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.edit-toggle-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.edit-toggle-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n}\n\n.edit-toggle-label.active {\n color: var(--mj-status-success);\n}\n\n.edit-credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-page);\n}\n\n.edit-credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.edit-credential-info i {\n color: var(--mj-brand-primary);\n}\n\n.edit-credential-clear {\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 150ms ease;\n}\n\n.edit-credential-clear:hover {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.edit-credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-credential-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.edit-credential-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 150ms ease;\n}\n\n.edit-credential-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.edit-credential-item i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.edit-panel-footer {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Card clickable area\n --------------------------------------------------------------------------- */\n\n.card-clickable {\n cursor: pointer;\n}\n\n/* ---------------------------------------------------------------------------\n Detail View (entity maps for a selected integration)\n --------------------------------------------------------------------------- */\n\n.detail-view {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.detail-header-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.detail-header-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detail-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.detail-header-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Schedule section */\n.schedule-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-bottom: 16px;\n}\n\n.schedule-section-header {\n margin-bottom: 12px;\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.schedule-section-title i {\n color: var(--mj-brand-primary);\n}\n\n.schedule-empty {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.schedule-empty-text {\n font-size: 0.85rem;\n color: var(--mj-text-disabled);\n}\n\n.schedule-create-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-active) 100%);\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.schedule-create-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* Detail toolbar */\n.detail-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.detail-toolbar-left {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-map-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.detail-search i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.detail-search input {\n border: none;\n outline: none;\n background: transparent;\n font-size: 13px;\n color: var(--mj-text-primary);\n width: 200px;\n}\n\n.detail-search input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Add Map button */\n.add-map-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.add-map-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n}\n\n.apply-all-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.apply-all-btn:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.apply-all-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.add-map-btn-lg {\n margin-top: 16px;\n padding: 10px 20px;\n font-size: 14px;\n}\n\n/* Add map inline panel */\n.add-map-panel {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: fadeIn 200ms ease;\n}\n\n.add-map-row {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n}\n\n.add-map-field {\n flex: 1;\n min-width: 0;\n}\n\n.add-map-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.add-map-select {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.add-map-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.add-map-direction-col {\n flex-shrink: 0;\n}\n\n.add-map-direction-btns {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.add-map-direction-btns button {\n padding: 7px 12px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n cursor: pointer;\n transition: all 150ms ease;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.add-map-direction-btns button:last-child {\n border-right: none;\n}\n\n.add-map-direction-btns button:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.add-map-direction-btns button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n}\n\n.add-map-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.add-map-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.add-map-save-btn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.add-map-cancel-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.add-map-cancel-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.add-map-loading {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n.add-map-loading i {\n color: var(--mj-brand-primary);\n margin-right: 4px;\n}\n\n.add-map-hint {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n font-style: italic;\n}\n\n/* Entity field needs more room for tree dropdown */\n.add-map-entity-field {\n flex: 2;\n min-width: 280px;\n}\n\n/* Entity picker row: tree dropdown + New button side by side */\n.entity-picker-row {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.entity-picker-row mj-tree-dropdown {\n flex: 1;\n min-width: 0;\n}\n\n.new-entity-btn {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.15s ease;\n}\n\n.new-entity-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------------------------------------------------------------------------\n Sync Result Banner\n --------------------------------------------------------------------------- */\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 12px;\n animation: fadeIn 200ms ease;\n}\n\n.sync-result-banner.sync-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.sync-result-banner.sync-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n/* ---------------------------------------------------------------------------\n Auto-Map Schema Panel\n --------------------------------------------------------------------------- */\n\n.auto-map-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.auto-map-header i {\n color: var(--mj-brand-primary);\n}\n\n.auto-map-result {\n margin-top: 12px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.auto-map-result.auto-map-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.auto-map-result.auto-map-partial {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n}\n\n.auto-map-result.auto-map-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.auto-map-result-summary {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.auto-map-errors {\n margin-top: 6px;\n font-size: 12px;\n}\n\n.auto-map-error {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n}\n\n/* ---------------------------------------------------------------------------\n New Entity Dialog\n --------------------------------------------------------------------------- */\n\n.new-entity-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.15s ease;\n}\n\n.new-entity-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 640px;\n max-width: 90vw;\n max-height: 85vh;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n animation: fadeIn 0.2s ease;\n}\n\n.new-entity-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.new-entity-dialog-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.new-entity-dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-close:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.new-entity-dialog-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.new-entity-dialog-desc {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.new-entity-dialog-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.new-entity-dialog-row {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n}\n\n.new-entity-dialog-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n}\n\n.new-entity-dialog-field-wide {\n flex: 1;\n}\n\n.new-entity-dialog-label {\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.new-entity-dialog-input {\n padding: 8px 12px;\n font-size: var(--mj-text-sm);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.new-entity-dialog-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n}\n\n.new-entity-dialog-dot {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n padding-bottom: 6px;\n user-select: none;\n}\n\n.new-entity-dialog-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint {\n font-style: italic;\n color: var(--mj-text-disabled);\n font-weight: 400;\n}\n\n.new-entity-dialog-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.new-entity-preview-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.15s ease;\n}\n\n.new-entity-preview-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.new-entity-preview-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.new-entity-dialog-done-btn {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n/* Next steps callout inside dialog */\n.new-entity-next-steps {\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: var(--mj-radius-md);\n padding: 14px 16px;\n}\n\n.new-entity-next-steps h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary-hover);\n}\n\n.new-entity-next-steps h4 i {\n margin-right: 6px;\n}\n\n.new-entity-next-steps ol {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n line-height: 1.7;\n}\n\n/* DDL copy button */\n.ddl-copy-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n/* DDL Preview */\n.ddl-warnings {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ddl-warning {\n font-size: 12px;\n color: var(--mj-status-warning);\n background: var(--mj-status-warning-subtle);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.ddl-warning i {\n margin-right: 4px;\n}\n\n.ddl-preview-block {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n max-height: 300px;\n display: flex;\n flex-direction: column;\n}\n\n.ddl-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ddl-preview-code {\n margin: 0;\n padding: 12px 16px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n line-height: 1.6;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n flex: 1;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Detail empty state */\n.detail-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty i {\n font-size: 36px;\n margin-bottom: 12px;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 6px;\n}\n\n.detail-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 400px;\n}\n\n/* Detail table */\n.detail-table-head {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px 8px 0 0;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n\n.detail-table-body {\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.detail-map-row {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n font-size: 13px;\n}\n\n.detail-map-row:last-child {\n border-bottom: none;\n}\n\n.detail-map-row:hover {\n background: var(--mj-bg-page);\n cursor: pointer;\n}\n\n.detail-map-row.sync-disabled {\n opacity: 0.5;\n}\n\n/* Column widths (shared between head and body) */\n.dt-col-toggle {\n width: 60px;\n flex-shrink: 0;\n}\n\n.dt-col-source {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dt-col-direction {\n width: 80px;\n flex-shrink: 0;\n text-align: center;\n}\n\n.dt-col-dest {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.dt-col-meta {\n width: 80px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: flex-end;\n}\n\n/* Direction badge */\n.direction-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n/* Clickable direction toggle button */\nbutton.direction-toggle {\n border: 1px solid transparent;\n cursor: pointer;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\nbutton.direction-toggle:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.direction-badge.pull {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n.direction-badge.push {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.direction-badge.bidirectional {\n background: var(--mj-status-warning-subtle);\n color: var(--mj-status-warning);\n}\n\n/* Create Tables list */\n.create-tables-list {\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n}\n.create-tables-select-all {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n font-weight: 600;\n}\n.create-tables-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n.create-tables-checkbox:hover {\n background: var(--mj-bg-surface-hover);\n}\n.create-tables-checkbox input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n.create-tables-name-hint {\n color: var(--mj-text-muted);\n font-size: 11px;\n margin-left: 8px;\n}\n.create-tables-filters {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n flex-wrap: wrap;\n}\n.create-tables-search {\n flex: 1 1 240px;\n min-width: 200px;\n}\n.create-tables-toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n.create-tables-toggle input[type=\"checkbox\"] {\n margin: 0;\n}\n.create-tables-badge {\n display: inline-block;\n margin-left: 6px;\n padding: 1px 6px;\n font-size: 10px;\n font-weight: 600;\n border-radius: 10px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n line-height: 1.4;\n}\n.create-tables-badge-custom {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n.create-tables-badge-registered {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n.add-map-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n.add-map-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* Config badges */\n.detail-config-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n font-size: 11px;\n}\n\n/* Detail back button (icon-only) */\n.detail-back-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 16px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Detail edit button (icon-only) */\n.detail-edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Chevron hint on entity map rows */\n.map-edit-hint {\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.detail-map-row:hover .map-edit-hint {\n color: var(--mj-brand-primary);\n}\n\n/* Entity map editor header */\n.ve-header-title-inline {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n}\n\n.ve-source-label {\n color: var(--mj-brand-primary);\n}\n\n.ve-direction-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.ve-dest-label {\n color: var(--mj-status-success);\n}\n\n.ve-stat-inline {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.ve-stat-inline strong {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.detail-table-empty {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---------------------------------------------------------------------------\n Discovered Source Objects Section\n --------------------------------------------------------------------------- */\n\n.discovered-objects-section {\n margin: 12px 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.discovered-objects-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.discovered-objects-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.discovered-objects-title i {\n color: var(--mj-brand-primary);\n}\n\n.discovered-count {\n font-weight: 400;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.discovered-objects-actions {\n display: flex;\n gap: 8px;\n}\n\n.discovered-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 3px 10px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.discovered-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.discovered-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.discovered-loading,\n.discovered-empty {\n padding: 16px;\n text-align: center;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.discovered-loading i {\n margin-right: 6px;\n}\n\n.discovered-objects-list {\n max-height: 280px;\n overflow-y: auto;\n}\n\n.discovered-object-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 14px;\n cursor: pointer;\n transition: background 0.1s;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n}\n\n.discovered-object-row:last-child {\n border-bottom: none;\n}\n\n.discovered-object-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.discovered-object-row.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n}\n\n.discovered-object-row input[type=\"checkbox\"] {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.discovered-object-name {\n flex: 1;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.discovered-object-api-name {\n flex: 1;\n color: var(--mj-text-muted);\n font-size: 12px;\n font-family: monospace;\n}\n\n.discovered-object-badges {\n display: flex;\n gap: 4px;\n}\n\n.discovered-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n font-size: 10px;\n}\n\n.discovered-badge.incremental {\n color: var(--mj-status-success);\n background: var(--mj-status-success-bg);\n}\n\n.discovered-badge.writable {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n"] }]
|
|
3222
|
+
args: [{ standalone: false, selector: 'app-integration-connections', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Integrations\"\n Icon=\"fa-solid fa-plug\"\n Subtitle=\"Connected systems and data sources\">\n <!-- [meta] intentionally omitted \u2014 chrome slot discipline audit Task B.\n \"Connections.length integrations\" badge mirrored the visible card\n grid row count. -->\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"LoadData()\"></mj-refresh-button>\n @if (!WizardOpen && !SelectedSummary) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OpenWizard()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">Add Integration</span>\n </button>\n }\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n<!-- Main container -->\n<div class=\"connections-container\" [class.detail-active]=\"!!SelectedSummary\"\n [class.editor-active]=\"!!EditorEntityMap\">\n\n <!-- ======================================================================\n CARD GRID VIEW (shown when no wizard and no detail selected)\n ====================================================================== -->\n @if (!WizardOpen && !SelectedSummary) {\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading integrations...\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && Connections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug empty-icon\"></i>\n <h3>No integrations yet</h3>\n <p>Connect your first external system to start syncing data.</p>\n <button mjButton variant=\"primary\" (click)=\"OpenWizard()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Your First Integration\n </button>\n </div>\n }\n\n <!-- Card grid -->\n @if (!IsLoading && Connections.length > 0) {\n <div class=\"card-grid\">\n @for (summary of Connections; track summary.Integration.ID) {\n <div class=\"connection-card\">\n <!-- Card header + body: clickable to open detail view -->\n <div class=\"card-clickable\" (click)=\"SelectIntegrationCard(summary)\">\n <div class=\"card-header\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(summary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(summary.Integration.Integration, summary.Icon)\" class=\"icon-large\"></i>\n </div>\n <span [class]=\"GetStatusBadgeClass(summary)\">{{ GetStatusBadge(summary) }}</span>\n </div>\n\n <!-- Card body -->\n <div class=\"card-body\">\n <div class=\"card-name\">{{ summary.Integration.Name }}</div>\n <div class=\"card-company\">{{ summary.Integration.Company }}</div>\n <div class=\"card-meta\">\n <span class=\"meta-label\">{{ GetSourceTypeLabel(summary) }}</span>\n <span class=\"meta-separator\">·</span>\n <span class=\"meta-value\">{{ GetCredentialHint(summary) }}</span>\n </div>\n <div class=\"card-sync-info\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Syncing {{ GetEntityMapCount(summary.Integration.ID) }} entities\n </div>\n\n <!-- Inline test result -->\n @if (GetCardTestResult(summary.Integration.ID); as testResult) {\n <div class=\"card-test-result\" [class.test-success]=\"testResult.Success\" [class.test-failure]=\"!testResult.Success\">\n @if (testResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ testResult.Message }}</span>\n </div>\n }\n </div>\n </div><!-- /card-clickable -->\n\n <!-- Delete confirmation overlay -->\n @if (IsDeleteConfirming(summary.Integration.ID)) {\n <div class=\"delete-confirm-overlay\">\n <div class=\"delete-confirm-content\">\n <i class=\"fa-solid fa-triangle-exclamation delete-warn-icon\"></i>\n <span class=\"delete-confirm-text\">Delete this integration and all its entity maps?</span>\n <div class=\"delete-confirm-actions\">\n <button mjButton\n variant=\"danger\"\n [disabled]=\"IsDeleting\"\n (click)=\"ConfirmDelete(summary.Integration.ID)\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Deleting...\n } @else {\n Delete\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"CancelDelete()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Card footer -->\n <div class=\"card-footer\">\n <button mjButton\n variant=\"outline\"\n [disabled]=\"!!TestingCardID\"\n (click)=\"TestExistingConnection(summary.Integration.ID)\">\n @if (IsTestingCard(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Test\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"OnMenuAction('edit', summary)\">\n Configure\n </button>\n @if (IsConnectionActive(summary)) {\n <div class=\"sync-menu-wrapper\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"ToggleSyncMenu(summary.Integration.ID, $event)\">\n @if (IsSyncing(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync\n <i class=\"fa-solid fa-chevron-down sync-caret\"></i>\n }\n </button>\n @if (SyncMenuIntegrationID === summary.Integration.ID) {\n <div class=\"sync-dropdown\">\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Pull (External \u2192 MJ)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Pull', $event)\">\n <i class=\"fa-solid fa-arrow-down-to-line\"></i> Incremental Pull\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Pull', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Pull\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Push (MJ \u2192 External)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Push', $event)\">\n <i class=\"fa-solid fa-arrow-up-from-line\"></i> Incremental Push\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Push', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Push\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Bidirectional</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, false, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Incremental Both\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(summary.Integration.ID, true, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Both\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button class=\"card-delete-btn\" (click)=\"OnMenuAction('delete', summary)\" title=\"Delete integration\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- New connection card -->\n <div class=\"connection-card new-connection-card\" (click)=\"OpenWizard()\">\n <div class=\"new-card-content\">\n <div class=\"new-card-icon\">\n <i class=\"fa-solid fa-plus\"></i>\n </div>\n <span class=\"new-card-label\">Add Integration</span>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ======================================================================\n DETAIL VIEW (entity maps for selected integration)\n ====================================================================== -->\n @if (!WizardOpen && SelectedSummary) {\n <div class=\"detail-view\">\n\n <!-- ================================================================\n ENTITY MAP EDITOR (field mapping detail for a selected map)\n ================================================================ -->\n @if (EditorEntityMap) {\n <app-visual-field-editor\n [EntityMap]=\"EditorEntityMap\"\n [CompanyIntegrationID]=\"SelectedSummary!.Integration.ID\"\n [RunViewProvider]=\"RunViewToUse\"\n (Close)=\"CloseEntityMapEditor()\">\n </app-visual-field-editor>\n\n <!-- ================================================================\n ENTITY MAPS LIST (shown when no editor map is selected)\n ================================================================ -->\n } @else {\n <!-- Detail header -->\n <div class=\"detail-header\">\n <button class=\"detail-back-btn\" (click)=\"CloseDetailView()\" title=\"Back to Integrations\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"detail-header-info\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(SelectedSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(SelectedSummary.Integration.Integration)\" class=\"icon-large\"></i>\n </div>\n <div class=\"detail-header-text\">\n <h2 class=\"detail-title\">{{ SelectedSummary.Integration.Name }}</h2>\n <span class=\"detail-subtitle\">\n {{ SelectedSummary.Integration.Company }}\n <span class=\"meta-separator\">·</span>\n {{ GetSourceTypeLabel(SelectedSummary) }}\n <span class=\"meta-separator\">·</span>\n <span [class]=\"GetStatusBadgeClass(SelectedSummary)\">{{ GetStatusBadge(SelectedSummary) }}</span>\n </span>\n </div>\n </div>\n <div class=\"detail-header-actions\">\n <button class=\"detail-edit-btn\" (click)=\"OpenEditPanel(SelectedSummary)\" title=\"Configure\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n @if (IsConnectionActive(SelectedSummary)) {\n <div class=\"sync-menu-wrapper\">\n <button mjButton variant=\"primary\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"ToggleSyncMenu(SelectedSummary.Integration.ID, $event)\">\n @if (IsSyncing(SelectedSummary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync\n <i class=\"fa-solid fa-chevron-down sync-caret\"></i>\n }\n </button>\n @if (SyncMenuIntegrationID === SelectedSummary.Integration.ID) {\n <div class=\"sync-dropdown sync-dropdown-left\">\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Pull (External \u2192 MJ)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Pull', $event)\">\n <i class=\"fa-solid fa-arrow-down-to-line\"></i> Incremental Pull\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Pull', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Pull\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Push (MJ \u2192 External)</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Push', $event)\">\n <i class=\"fa-solid fa-arrow-up-from-line\"></i> Incremental Push\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Push', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Push\n </button>\n </div>\n <div class=\"sync-dropdown-group\">\n <span class=\"sync-dropdown-label\">Bidirectional</span>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, false, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Incremental Both\n </button>\n <button class=\"sync-dropdown-item\" (click)=\"RunSyncWithDirection(SelectedSummary.Integration.ID, true, 'Bidirectional', $event)\">\n <i class=\"fa-solid fa-rotate\"></i> Full Both\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Schedule section -->\n <div class=\"schedule-section\">\n <div class=\"schedule-section-header\">\n <div class=\"schedule-section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Sync Schedule</span>\n </div>\n </div>\n @if (ScheduledJobID) {\n <mj-scheduled-job-summary\n [ScheduledJobID]=\"ScheduledJobID\"\n (EditRequested)=\"OpenSchedulePanel()\">\n </mj-scheduled-job-summary>\n } @else {\n <div class=\"schedule-empty\">\n <span class=\"schedule-empty-text\">No sync schedule configured</span>\n <button class=\"schedule-create-btn\" (click)=\"OpenSchedulePanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Schedule Sync\n </button>\n </div>\n }\n </div>\n\n <!-- Schedule slide panel -->\n <mj-scheduled-job-slide-panel\n [IsOpen]=\"ShowScheduleSlidePanel\"\n [ScheduledJobID]=\"ScheduledJobID\"\n [JobTypeID]=\"IntegrationSyncJobTypeID\"\n [DefaultConfiguration]=\"ScheduleDefaultConfiguration\"\n [HideJobType]=\"true\"\n (Close)=\"CloseSchedulePanel()\"\n (Saved)=\"OnScheduleSaved()\"\n (Deleted)=\"OnScheduleDeleted()\">\n </mj-scheduled-job-slide-panel>\n\n <!-- Entity maps toolbar -->\n <div class=\"detail-toolbar\">\n <div class=\"detail-toolbar-left\">\n <span class=\"detail-map-count\">\n {{ DetailEntityMaps.length }} entity map{{ DetailEntityMaps.length !== 1 ? 's' : '' }}\n <span class=\"meta-separator\">·</span>\n {{ DetailActiveMapCount }} active\n </span>\n </div>\n <div class=\"detail-toolbar-right\">\n <div class=\"detail-search\">\n <i class=\"fa-solid fa-filter\"></i>\n <input type=\"text\"\n placeholder=\"Filter entity maps...\"\n [value]=\"DetailSearchTerm\"\n (input)=\"OnDetailSearch($event)\" />\n </div>\n <button class=\"add-map-btn\" (click)=\"ToggleCreateTablesPanel()\" [class.active]=\"ShowCreateTablesPanel\"\n title=\"Select source objects and create entity tables\">\n <i class=\"fa-solid fa-table\"></i> Create Tables\n </button>\n <button class=\"add-map-btn\" (click)=\"FindAndAddNewTables()\" [disabled]=\"IsCreatingTables\"\n title=\"Discover and add every source object that isn't mapped yet, in one step\">\n @if (IsCreatingTables) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Finding\u2026\n } @else {\n <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Find New Tables\n }\n </button>\n <button class=\"add-map-btn\" (click)=\"ToggleAutoMapPanel()\" [class.active]=\"ShowAutoMapPanel\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map Schema\n </button>\n <button class=\"add-map-btn\" (click)=\"ToggleAddMapPanel()\" [class.active]=\"ShowAddMapPanel\">\n <i class=\"fa-solid fa-plus\"></i> Add Map\n </button>\n </div>\n </div>\n\n <!-- Sync result banner -->\n @if (SyncResult) {\n <div class=\"sync-result-banner\" [class.sync-success]=\"SyncResult.Success\" [class.sync-failure]=\"!SyncResult.Success\">\n @if (SyncResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ SyncResult.Message || (SyncResult.Success ? 'Sync completed successfully' : 'Sync failed') }}</span>\n </div>\n }\n\n <!-- Auto-Map Schema panel -->\n @if (ShowAutoMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"auto-map-header\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Auto-map all entities in a schema to this integration with 1:1 field mappings</span>\n </div>\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Target Schema</label>\n <select class=\"add-map-select\" [(ngModel)]=\"AutoMapSelectedSchema\">\n <option [ngValue]=\"''\" disabled>Select schema...</option>\n @for (schema of AutoMapSchemas; track schema) {\n <option [value]=\"schema\">{{ schema }}</option>\n }\n </select>\n </div>\n\n <div class=\"add-map-direction-col\">\n <label class=\"add-map-label\">Direction</label>\n <div class=\"add-map-direction-btns\">\n <button [class.active]=\"AutoMapDirection === 'Pull'\" (click)=\"AutoMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Bidirectional'\" (click)=\"AutoMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Push'\" (click)=\"AutoMapDirection = 'Push'\" title=\"Push to source\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanAutoMap\"\n (click)=\"RunAutoMap()\">\n @if (IsAutoMapping) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Mapping...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAutoMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n @if (AutoMapResult) {\n <div class=\"auto-map-result\" [class.auto-map-success]=\"AutoMapResult.Errors.length === 0\"\n [class.auto-map-partial]=\"AutoMapResult.Errors.length > 0 && AutoMapResult.EntityMapsCreated > 0\"\n [class.auto-map-failure]=\"AutoMapResult.EntityMapsCreated === 0 && AutoMapResult.Errors.length > 0\">\n @if (AutoMapResult.EntityMapsCreated > 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-check\"></i>\n Created {{ AutoMapResult.EntityMapsCreated }} entity map{{ AutoMapResult.EntityMapsCreated !== 1 ? 's' : '' }}\n with {{ AutoMapResult.FieldMapsCreated }} field map{{ AutoMapResult.FieldMapsCreated !== 1 ? 's' : '' }}\n </div>\n } @else if (AutoMapResult.Errors.length === 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-info\"></i>\n All entities in this schema are already mapped.\n </div>\n }\n @if (AutoMapResult.Errors.length > 0) {\n <div class=\"auto-map-errors\">\n @for (err of AutoMapResult.Errors; track err) {\n <div class=\"auto-map-error\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ err }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Create Tables panel (select source objects \u2192 create entity tables) -->\n @if (ShowCreateTablesPanel) {\n <div class=\"add-map-panel\">\n <div class=\"auto-map-header\">\n <i class=\"fa-solid fa-table\"></i>\n <span>Select source objects to create as entity tables in your database</span>\n </div>\n\n <div class=\"add-map-row\">\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanCreateTables\"\n (click)=\"RunCreateTables()\">\n @if (IsCreatingTables) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating...\n } @else {\n <i class=\"fa-solid fa-table\"></i> Create {{ CreateTablesSelectedCount }} Table{{ CreateTablesSelectedCount !== 1 ? 's' : '' }}\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseCreateTablesPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n @if (IsLoadingCreateTablesObjects) {\n <mj-loading text=\"Loading source objects...\" size=\"small\"></mj-loading>\n } @else if (CreateTablesObjects.length === 0) {\n <div class=\"auto-map-result auto-map-success\">\n <i class=\"fa-solid fa-circle-info\"></i>\n No source objects available from this connector.\n </div>\n } @else {\n <div class=\"create-tables-filters\">\n <input type=\"text\"\n class=\"create-tables-search mj-input\"\n placeholder=\"Search by name or label...\"\n [(ngModel)]=\"CreateTablesSearch\" />\n </div>\n <div class=\"create-tables-list\">\n <div class=\"create-tables-select-all\">\n <label class=\"create-tables-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"FilteredCreateTablesObjects.length > 0 && CreateTablesSelectedCount === FilteredCreateTablesObjects.length\"\n (change)=\"ToggleAllCreateTablesObjects($any($event.target).checked)\" />\n <span>Select All ({{ FilteredCreateTablesObjects.length }} of {{ CreateTablesObjects.length }})</span>\n </label>\n </div>\n @for (obj of FilteredCreateTablesObjects; track obj.Name) {\n <label class=\"create-tables-checkbox\">\n <input type=\"checkbox\" [(ngModel)]=\"obj.Selected\" />\n <span>{{ obj.Label }}</span>\n @if (obj.Label !== obj.Name) {\n <span class=\"create-tables-name-hint\">{{ obj.Name }}</span>\n }\n @if (obj.IsCustom) {\n <span class=\"create-tables-badge create-tables-badge-custom\">Custom</span>\n }\n @if (obj.AlreadyPersisted) {\n <span class=\"create-tables-badge create-tables-badge-registered\">Registered</span>\n }\n </label>\n }\n </div>\n }\n\n @if (CreateTablesResult) {\n <div class=\"auto-map-result\"\n [class.auto-map-success]=\"CreateTablesResult.Success\"\n [class.auto-map-failure]=\"!CreateTablesResult.Success\">\n @if (CreateTablesResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ CreateTablesResult.Message }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Add Entity Map inline form -->\n @if (ShowAddMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Source Object</label>\n @if (IsLoadingSourceObjects) {\n <div class=\"add-map-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n } @else if (AvailableSourceObjects.length === 0) {\n <div class=\"add-map-hint\">No source objects found in metadata</div>\n } @else {\n <select class=\"add-map-select\" [(ngModel)]=\"AddMapSourceObjectName\">\n <option [ngValue]=\"''\" disabled>Select source object...</option>\n @for (obj of AvailableSourceObjects; track obj.Name) {\n <option [value]=\"obj.Name\">{{ obj.Label || obj.Name }}</option>\n }\n </select>\n }\n </div>\n\n <div class=\"add-map-direction-col\">\n <label class=\"add-map-label\">Direction</label>\n <div class=\"add-map-direction-btns\">\n <button [class.active]=\"AddMapDirection === 'Pull'\" (click)=\"AddMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Bidirectional'\" (click)=\"AddMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Push'\" (click)=\"AddMapDirection = 'Push'\" title=\"Push to source\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"add-map-field add-map-entity-field\">\n <label class=\"add-map-label\">MJ Entity</label>\n <div class=\"entity-picker-row\">\n <mj-tree-dropdown\n #entityTreeDropdown\n [BranchConfig]=\"EntityBranchConfig\"\n [LeafConfig]=\"EntityLeafConfig\"\n [Value]=\"AddMapEntityIDAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search entities by schema...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"OnEntityTreeSelection($event)\">\n </mj-tree-dropdown>\n <button class=\"new-entity-btn\" (click)=\"OpenNewEntityDialog()\" title=\"Create new entity table\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n </div>\n\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanSaveAddMap || IsSavingAddMap\"\n (click)=\"SaveAddMap()\">\n @if (IsSavingAddMap) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-check\"></i> Add\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAddMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Entity maps table -->\n @if (IsDetailLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading entity maps...\"></mj-loading>\n </div>\n } @else if (DetailEntityMaps.length === 0 && !ShowAddMapPanel) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-cube\"></i>\n <h3>No entity maps configured</h3>\n <p>Entity maps define how external objects sync to MJ entities.</p>\n <button class=\"add-map-btn add-map-btn-lg\" (click)=\"ToggleAddMapPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Your First Entity Map\n </button>\n </div>\n } @else if (DetailEntityMaps.length > 0) {\n <!-- Table header -->\n <div class=\"detail-table-head\">\n <span class=\"dt-col-toggle\">Sync</span>\n <span class=\"dt-col-source\">External Object</span>\n <span class=\"dt-col-direction\"></span>\n <span class=\"dt-col-dest\">MJ Entity</span>\n <span class=\"dt-col-meta\">Config</span>\n </div>\n\n <!-- Table body -->\n <div class=\"detail-table-body\">\n @for (em of DetailFilteredMaps; track em.ID) {\n <div class=\"detail-map-row\" [class.sync-disabled]=\"!em.SyncEnabled\" (click)=\"OnEntityMapClick(em)\">\n <span class=\"dt-col-toggle\" (click)=\"$event.stopPropagation()\">\n <label class=\"toggle-switch\" [title]=\"em.SyncEnabled ? 'Sync enabled' : 'Sync disabled'\">\n <input type=\"checkbox\"\n [checked]=\"em.SyncEnabled\"\n (change)=\"OnToggleMapEnabled(em, $event)\" />\n <span class=\"toggle-slider\"></span>\n </label>\n </span>\n <span class=\"dt-col-source\" [title]=\"em.ExternalObjectName\">\n {{ em.ExternalObjectLabel ?? em.ExternalObjectName }}\n </span>\n <span class=\"dt-col-direction\" (click)=\"$event.stopPropagation()\">\n <button class=\"direction-toggle\" [class]=\"DirectionBadgeClass(em.SyncDirection)\"\n (click)=\"CycleSyncDirection(em)\"\n [title]=\"'Click to change sync direction (currently: ' + em.SyncDirection + ')'\">\n {{ DirectionText(em.SyncDirection) }}\n </button>\n </span>\n <span class=\"dt-col-dest\" [title]=\"em.Entity\">\n {{ em.Entity }}\n </span>\n <span class=\"dt-col-meta\">\n @if (em.MatchStrategy) {\n <span class=\"detail-config-badge\" title=\"Match strategy configured\">\n <i class=\"fa-solid fa-link\"></i>\n </span>\n }\n <span class=\"detail-config-badge\" [title]=\"'Conflict: ' + em.ConflictResolution\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </span>\n <span class=\"map-edit-hint\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </span>\n </span>\n </div>\n } @empty {\n <div class=\"detail-table-empty\">\n No entity maps match your filter.\n </div>\n }\n </div>\n }\n }\n\n </div>\n }\n\n <!-- ======================================================================\n WIZARD (inline, replaces card grid when open)\n ====================================================================== -->\n @if (WizardOpen) {\n <div class=\"wizard-inline\">\n <!-- Wizard header -->\n <div class=\"wizard-header\">\n <button class=\"wizard-back-btn\" (click)=\"CloseWizard()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Integrations\n </button>\n <h2 class=\"wizard-title\">New Integration</h2>\n </div>\n\n <!-- Step indicator -->\n <div class=\"step-indicator\">\n @for (step of WizardSteps; track step.Number) {\n <div class=\"step-item\" [class.step-active]=\"IsStepActive(step.Number)\" [class.step-completed]=\"IsStepCompleted(step.Number)\">\n <div class=\"step-circle\">\n @if (IsStepCompleted(step.Number)) {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n {{ step.Number }}\n }\n </div>\n <span class=\"step-label\">{{ step.Label }}</span>\n </div>\n @if (step.Number < WizardSteps.length) {\n <div class=\"step-line\" [class.step-line-active]=\"IsStepCompleted(step.Number)\"></div>\n }\n }\n </div>\n\n <!-- Step content -->\n <div class=\"wizard-body\">\n\n <!-- Step 1: Choose Integration -->\n @if (WizardStep === 1) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">What system do you want to connect?</h3>\n <div class=\"search-bar\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search integrations...\"\n [(ngModel)]=\"SearchQuery\" />\n </div>\n\n @if (FilteredIntegrations.length === 0 && AvailableIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n <p>No integrations configured</p>\n <span class=\"no-integrations-hint\">Configure integration definitions in the admin area first.</span>\n </div>\n } @else if (FilteredIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-search\"></i>\n <p>No matching integrations</p>\n </div>\n } @else {\n <div class=\"integration-picker-grid\">\n @for (def of FilteredIntegrations; track def.ID) {\n <div class=\"integration-picker-card\"\n [class.picker-selected]=\"IsSelectedIntegration(def)\"\n (click)=\"SelectIntegration(def)\">\n <div class=\"picker-icon-circle\" [style.background-color]=\"GetIconBrandColor(def.Name)\">\n <i [class]=\"GetIntegrationIcon(def.Name, def.Get('Icon'))\"></i>\n </div>\n <div class=\"picker-name\">{{ def.Name }}</div>\n @if (def.Description) {\n <div class=\"picker-description\">{{ def.Description }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Step 2: Configure Connection -->\n @if (WizardStep === 2) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">Set up your connection</h3>\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionName\">Connection Name</label>\n <input id=\"connectionName\"\n type=\"text\"\n class=\"form-input\"\n placeholder=\"e.g. Production HubSpot\"\n [(ngModel)]=\"ConnectionName\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"companySelect\">Company</label>\n @if (NeedsCompanyPicker) {\n <select id=\"companySelect\" class=\"form-input\" [(ngModel)]=\"SelectedCompanyID\">\n <option [ngValue]=\"null\" disabled>Select a company...</option>\n @for (company of Companies; track company.ID) {\n <option [value]=\"company.ID\">{{ company.Name }}</option>\n }\n </select>\n } @else if (Companies.length === 1) {\n <input type=\"text\" class=\"form-input\" [value]=\"Companies[0].Name\" disabled />\n } @else {\n <div class=\"form-hint\">No companies available. Create one in the admin area.</div>\n }\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionDescription\">Description <span class=\"optional-label\">(optional)</span></label>\n <textarea id=\"connectionDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"Notes about this connection...\"\n [(ngModel)]=\"ConnectionDescription\"\n rows=\"3\"></textarea>\n </div>\n\n <!-- Credential section -->\n <div class=\"form-group\">\n <label class=\"form-label\">Credential</label>\n @if (SelectedCredential) {\n <div class=\"credential-selected\">\n <div class=\"credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ SelectedCredential.Name }}</span>\n </div>\n <button class=\"credential-clear\" (click)=\"ClearCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"credential-actions\">\n <button mjButton variant=\"outline\" (click)=\"ShowExistingCredentials()\">\n <i class=\"fa-solid fa-key\"></i>\n Choose Existing Credential\n </button>\n <button mjButton variant=\"outline\" (click)=\"OpenCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Credential\n </button>\n </div>\n }\n\n @if (IsLoadingCredentials) {\n <div class=\"credential-loading\">\n <mj-loading text=\"Loading credentials...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsLoadingCredentials && ExistingCredentials.length > 0 && !SelectedCredential) {\n <div class=\"credential-list\">\n @for (cred of ExistingCredentials; track cred.ID) {\n <div class=\"credential-list-item\" (click)=\"SelectExistingCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Step 3: Test Connection -->\n @if (WizardStep === 3) {\n <div class=\"step-content step-content-centered\">\n <h3 class=\"step-title\">Let's verify everything works</h3>\n\n @if (!TestResult && !IsTesting) {\n <div class=\"test-prompt\">\n <button mjButton\n variant=\"primary\"\n size=\"lg\"\n (click)=\"TestNewConnection()\">\n <i class=\"fa-solid fa-vial\"></i>\n Test Connection\n </button>\n <p class=\"test-hint\">We'll verify we can reach your system and authenticate.</p>\n </div>\n }\n\n @if (IsTesting) {\n <div class=\"test-running\">\n <div class=\"test-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-3x\"></i>\n </div>\n <p>Testing connection...</p>\n </div>\n }\n\n @if (TestResult) {\n <div class=\"test-result\" [class.test-result-success]=\"TestResult.Success\" [class.test-result-failure]=\"!TestResult.Success\">\n <div class=\"test-result-icon\">\n @if (TestResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n </div>\n <div class=\"test-result-message\">{{ TestResult.Message }}</div>\n @if (TestResult.Success && TestResult.ServerVersion) {\n <div class=\"test-result-detail\">\n Server version: {{ TestResult.ServerVersion }}\n </div>\n }\n @if (!TestResult.Success) {\n <button mjButton variant=\"outline\" (click)=\"TestNewConnection()\" class=\"test-retry-btn\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n Retry\n </button>\n }\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- Wizard footer -->\n <div class=\"wizard-footer\">\n <div class=\"footer-left\"></div>\n <div class=\"footer-right\">\n @if (WizardStep > 1) {\n <button mjButton variant=\"outline\" (click)=\"PreviousStep()\">\n Back\n </button>\n }\n <button mjButton\n variant=\"primary\"\n [disabled]=\"IsNextDisabled || IsSaving\"\n (click)=\"FinishWizard()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n {{ NextButtonLabel }}\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n</div>\n\n<!-- Edit panel (slide-in) -->\n<div class=\"edit-panel-backdrop\"\n [class.open]=\"EditPanelOpen\"\n (click)=\"CloseEditPanel()\"></div>\n<div class=\"edit-panel\" [class.open]=\"EditPanelOpen\">\n @if (EditingSummary) {\n <!-- Header -->\n <div class=\"edit-panel-header\">\n <div class=\"edit-panel-title\">\n <div class=\"edit-icon-circle\"\n [style.background-color]=\"GetIconBrandColor(EditingSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(EditingSummary.Integration.Integration, EditingSummary.Icon)\"></i>\n </div>\n <span>Configure Integration</span>\n </div>\n <button class=\"edit-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (IsEditLoading) {\n <div class=\"edit-panel-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Edit form -->\n <div class=\"edit-panel-body\">\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Connection Name</label>\n <input type=\"text\"\n class=\"edit-form-input\"\n [(ngModel)]=\"EditName\"\n placeholder=\"Connection name...\" />\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Status</label>\n <div class=\"edit-toggle-row\">\n <label class=\"toggle-switch\">\n <input type=\"checkbox\" [(ngModel)]=\"EditIsActive\" />\n <span class=\"toggle-slider\"></span>\n </label>\n <span class=\"edit-toggle-label\" [class.active]=\"EditIsActive\">\n {{ EditIsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Credential</label>\n @if (EditCredential) {\n <div class=\"edit-credential-selected\">\n <div class=\"edit-credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ EditCredential.Name }}</span>\n </div>\n <button class=\"edit-credential-clear\" (click)=\"ClearEditCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"edit-credential-actions\">\n <button mjButton variant=\"outline\" size=\"sm\" (click)=\"OpenEditCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i> New Credential\n </button>\n </div>\n @if (EditCredentials.length > 0) {\n <div class=\"edit-credential-list\">\n @for (cred of EditCredentials; track cred.ID) {\n <div class=\"edit-credential-item\" (click)=\"SelectEditCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Integration</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Integration }}\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Company</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Company }}\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"edit-panel-footer\">\n <button mjButton\n variant=\"primary\"\n [disabled]=\"IsEditSaving || !EditName.trim()\"\n (click)=\"SaveEditChanges()\">\n @if (IsEditSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save Changes\n }\n </button>\n <button mjButton variant=\"outline\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n </div>\n }\n }\n</div>\n\n<!-- Credential dialog (shared between wizard and edit panel) -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n [Visible]=\"true\"\n [PreselectedTypeId]=\"PreselectedCredentialTypeId\"\n (close)=\"EditPanelOpen ? OnEditCredentialDialogClose($event) : OnCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n\n<!-- New Entity dialog -->\n@if (ShowCreateEntity) {\n <div class=\"new-entity-backdrop\" (click)=\"CloseNewEntityDialog()\"></div>\n <div class=\"new-entity-dialog\">\n <div class=\"new-entity-dialog-header\">\n <h3>Create New Entity Table</h3>\n <button class=\"new-entity-dialog-close\" (click)=\"CloseNewEntityDialog()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"new-entity-dialog-body\">\n <p class=\"new-entity-dialog-desc\">\n Generate a SQL migration to create a new database table for this integration's data.\n After running the migration and CodeGen, the new entity will appear in the entity picker.\n </p>\n\n <div class=\"new-entity-dialog-form\">\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Source Object</label>\n <div class=\"new-entity-dialog-value\">\n @if (AddMapSourceObjectName) {\n {{ AddMapSourceObjectName }}\n } @else {\n <span class=\"new-entity-dialog-hint\">Select a source object in the Add Map form first</span>\n }\n </div>\n </div>\n </div>\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Schema</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. hubspot\"\n [(ngModel)]=\"NewEntitySchema\" />\n </div>\n <span class=\"new-entity-dialog-dot\">.</span>\n <div class=\"new-entity-dialog-field new-entity-dialog-field-wide\">\n <label class=\"new-entity-dialog-label\">Table Name</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. Contact\"\n [(ngModel)]=\"NewEntityTable\" />\n </div>\n </div>\n </div>\n\n @if (DDLPreviewWarnings.length > 0) {\n <div class=\"ddl-warnings\">\n @for (warn of DDLPreviewWarnings; track warn) {\n <div class=\"ddl-warning\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ warn }}</div>\n }\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"ddl-preview-block\">\n <div class=\"ddl-preview-header\">\n <span>SQL Preview</span>\n <button class=\"ddl-copy-btn\" (click)=\"CopyDDLToClipboard()\" title=\"Copy to clipboard\">\n @if (DDLCopied) {\n <i class=\"fa-solid fa-check\"></i> Copied\n } @else {\n <i class=\"fa-regular fa-copy\"></i> Copy\n }\n </button>\n </div>\n <pre class=\"ddl-preview-code\">{{ DDLPreview }}</pre>\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"new-entity-next-steps\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Next Steps</h4>\n <ol>\n <li>Copy the SQL above and save it as a migration file</li>\n <li>Run the migration against your database</li>\n <li>Run CodeGen to register the new entity in MemberJunction</li>\n <li>Refresh the page — the new entity will appear in the entity picker</li>\n </ol>\n </div>\n }\n </div>\n <div class=\"new-entity-dialog-footer\">\n <button class=\"new-entity-preview-btn\"\n [disabled]=\"!CanGenerateSQL || IsGeneratingDDL\"\n (click)=\"PreviewDDL()\">\n @if (IsGeneratingDDL) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating...\n } @else {\n <i class=\"fa-solid fa-code\"></i> Generate SQL\n }\n </button>\n <button class=\"new-entity-dialog-done-btn\" (click)=\"CloseNewEntityDialog()\">\n Done\n </button>\n </div>\n </div>\n}\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* ---------------------------------------------------------------------------\n Host & Container \u2014 flex chain for scrollable detail view\n --------------------------------------------------------------------------- */\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n/* Slot passthrough now in <mj-page-header>; stat badges now via <mj-stat-badge>. */\n\n.connections-container {\n padding: 24px;\n max-width: 1400px;\n width: 100%;\n margin: 0 auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n/* When detail or editor view is active, prevent container scrolling\n so the inner .detail-table-body handles its own scroll */\n.connections-container.detail-active,\n.connections-container.editor-active {\n overflow: hidden;\n}\n\n/* ---------------------------------------------------------------------------\n Loading & Empty States\n --------------------------------------------------------------------------- */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-text-disabled);\n margin-bottom: 16px;\n}\n\n.empty-state h3 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 8px;\n}\n\n.empty-state p {\n font-size: 14px;\n margin: 0 0 24px;\n}\n\n/* ---------------------------------------------------------------------------\n Card Grid\n --------------------------------------------------------------------------- */\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n}\n\n/* ---------------------------------------------------------------------------\n Connection Card\n --------------------------------------------------------------------------- */\n\n.connection-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.connection-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n/* Card Header */\n.card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 16px 0;\n}\n\n.icon-circle {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.icon-large {\n font-size: 22px;\n}\n\n/* Status Badge */\n.status-badge {\n font-size: 12px;\n font-weight: 600;\n padding: 4px 10px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge-connected {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.status-badge-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.status-badge-inactive {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.status-badge-syncing {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n/* Card Body */\n.card-body {\n padding: 12px 16px;\n flex: 1;\n}\n\n.card-name {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.card-company {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin-bottom: 10px;\n}\n\n.card-meta {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.meta-separator {\n margin: 0 6px;\n}\n\n.meta-label {\n font-weight: 500;\n}\n\n.card-sync-info {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.card-sync-info i {\n margin-right: 4px;\n color: var(--mj-text-disabled);\n}\n\n/* Card inline test result */\n.card-test-result {\n font-size: 12px;\n padding: 6px 10px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n}\n\n.card-test-result.test-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.card-test-result.test-failure {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.card-test-result span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Card Footer */\n.card-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.card-footer button {\n font-size: 13px;\n}\n\n/* Sync dropdown menu */\n.sync-menu-wrapper {\n position: relative;\n display: inline-flex;\n}\n\n.sync-caret {\n font-size: 10px;\n margin-left: 4px;\n opacity: 0.8;\n}\n\n.sync-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n min-width: 220px;\n overflow: hidden;\n}\n\n.sync-dropdown-left {\n left: auto;\n right: 0;\n}\n\n.sync-dropdown-group {\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.sync-dropdown-group:last-child {\n border-bottom: none;\n}\n\n.sync-dropdown-label {\n display: block;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n padding: 0 12px 4px;\n}\n\n.sync-dropdown-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 12px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n text-align: left;\n transition: background 0.12s;\n}\n\n.sync-dropdown-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-dropdown-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n/* Card Delete Button */\n.card-delete-btn {\n margin-left: auto;\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: all 0.15s;\n}\n\n.card-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\n}\n\n.menu-trigger:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.card-menu-dropdown {\n position: absolute;\n right: 0;\n top: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n min-width: 160px;\n z-index: 50;\n padding: 4px;\n}\n\n.menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n border-radius: 6px;\n transition: background 0.15s;\n text-align: left;\n}\n\n.menu-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.menu-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.menu-item-danger {\n color: var(--mj-status-error);\n}\n\n.menu-item-danger i {\n color: var(--mj-status-error);\n}\n\n.menu-item-danger:hover {\n background: var(--mj-status-error-bg);\n}\n\n/* ---------------------------------------------------------------------------\n New Connection Card\n --------------------------------------------------------------------------- */\n\n.new-connection-card {\n border: 2px dashed var(--mj-border-strong);\n background: var(--mj-bg-page);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n transition: background 0.2s, border-color 0.2s;\n}\n\n.new-connection-card:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n box-shadow: none;\n transform: none;\n}\n\n.new-card-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.new-card-icon {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--mj-bg-surface-active);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n transition: background 0.2s, color 0.2s;\n}\n\n.new-connection-card:hover .new-card-icon {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.new-card-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.new-connection-card:hover .new-card-label {\n color: var(--mj-brand-primary);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard (inline, replaces card grid)\n --------------------------------------------------------------------------- */\n\n.wizard-inline {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 720px;\n margin: 0 auto;\n}\n\n/* Wizard Header */\n.wizard-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 0 20px;\n}\n\n.wizard-back-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n padding: 6px 10px;\n border-radius: 6px;\n transition: background 0.15s, color 0.15s;\n}\n\n.wizard-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.wizard-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Step Indicator\n --------------------------------------------------------------------------- */\n\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 32px;\n gap: 0;\n}\n\n.step-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n position: relative;\n}\n\n.step-circle {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n border: 2px solid var(--mj-border-default);\n transition: all 0.2s;\n}\n\n.step-active .step-circle {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.step-completed .step-circle {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\n}\n\n.step-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.step-active .step-label {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.step-completed .step-label {\n color: var(--mj-status-success);\n}\n\n.step-line {\n width: 48px;\n height: 2px;\n background: var(--mj-border-default);\n margin: 0 8px;\n margin-bottom: 20px;\n transition: background 0.2s;\n}\n\n.step-line-active {\n background: var(--mj-status-success);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Body\n --------------------------------------------------------------------------- */\n\n.wizard-body {\n flex: 1;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n.step-content {\n min-height: 300px;\n}\n\n.step-content-centered {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.step-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 20px;\n}\n\n.step-content-centered .step-title {\n margin-bottom: 32px;\n}\n\n/* Search bar */\n.search-bar {\n position: relative;\n margin-bottom: 20px;\n}\n\n.search-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.search-input {\n width: 100%;\n padding: 10px 14px 10px 40px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* No integrations */\n.no-integrations {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-disabled);\n text-align: center;\n}\n\n.no-integrations i {\n font-size: 36px;\n margin-bottom: 12px;\n}\n\n.no-integrations p {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin: 0 0 4px;\n}\n\n.no-integrations-hint {\n font-size: 13px;\n}\n\n/* Integration picker grid */\n.integration-picker-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n}\n\n.integration-picker-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n cursor: pointer;\n text-align: center;\n transition: border-color 0.2s, background 0.15s;\n}\n\n.integration-picker-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.integration-picker-card.picker-selected {\n border-color: var(--mj-brand-primary);\n background: var(--mj-status-info-bg);\n}\n\n.picker-icon-circle {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n margin: 0 auto 10px;\n font-size: 18px;\n}\n\n.picker-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.picker-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n line-height: 1.3;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n/* ---------------------------------------------------------------------------\n Form Controls (Step 2)\n --------------------------------------------------------------------------- */\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.optional-label {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input:disabled {\n background: var(--mj-bg-page);\n color: var(--mj-text-muted);\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 72px;\n}\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n/* Credential section */\n.credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n border-radius: 8px;\n}\n\n.credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-success-text);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info i {\n color: var(--mj-status-success);\n}\n\n.credential-clear {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.credential-clear:hover {\n color: var(--mj-status-error);\n}\n\n.credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.credential-actions button {\n font-size: 13px;\n}\n\n.credential-loading {\n padding: 16px 0;\n}\n\n.credential-list {\n margin-top: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.credential-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.credential-list-item:last-child {\n border-bottom: none;\n}\n\n.credential-list-item:hover {\n background: var(--mj-bg-page);\n}\n\n.credential-list-item i {\n color: var(--mj-text-disabled);\n}\n\n/* ---------------------------------------------------------------------------\n Test Connection (Step 3)\n --------------------------------------------------------------------------- */\n\n.test-prompt {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.test-hint {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n.test-running {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n color: var(--mj-brand-primary);\n}\n\n.test-spinner {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.test-running p {\n font-size: 15px;\n font-weight: 500;\n margin: 0;\n}\n\n/* Test result */\n.test-result {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n border-radius: 12px;\n max-width: 400px;\n}\n\n.test-result-success {\n background: var(--mj-status-success-bg);\n}\n\n.test-result-failure {\n background: var(--mj-status-error-bg);\n}\n\n.test-result-icon {\n font-size: 48px;\n animation: scaleIn 0.3s ease-out;\n}\n\n.test-result-success .test-result-icon {\n color: var(--mj-status-success);\n}\n\n.test-result-failure .test-result-icon {\n color: var(--mj-status-error);\n}\n\n@keyframes scaleIn {\n from {\n transform: scale(0.5);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.test-result-message {\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n.test-result-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.test-retry-btn {\n margin-top: 4px;\n}\n\n/* Toggle switch */\n.toggle-switch {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.toggle-switch input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.toggle-slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-border-strong);\n border-radius: 24px;\n transition: background 0.2s;\n}\n\n.toggle-slider::before {\n content: '';\n position: absolute;\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s;\n}\n\n.toggle-switch input:checked + .toggle-slider {\n background: var(--mj-brand-primary);\n}\n\n.toggle-switch input:checked + .toggle-slider::before {\n transform: translateX(20px);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Footer\n --------------------------------------------------------------------------- */\n\n.wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.footer-left {\n display: flex;\n align-items: center;\n}\n\n.footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ---------------------------------------------------------------------------\n Responsive\n --------------------------------------------------------------------------- */\n\n@media (max-width: 768px) {\n .connections-container {\n padding: 16px;\n }\n\n .card-grid {\n grid-template-columns: 1fr;\n }\n\n .integration-picker-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .step-indicator {\n padding: 16px;\n overflow-x: auto;\n }\n\n .step-line {\n width: 24px;\n }\n\n .credential-actions {\n flex-direction: column;\n }\n}\n\n@media (max-width: 480px) {\n .integration-picker-grid {\n grid-template-columns: 1fr;\n }\n\n .card-footer {\n flex-wrap: wrap;\n }\n}\n\n/* ---------------------------------------------------------------------------\n Delete confirmation overlay\n --------------------------------------------------------------------------- */\n\n.delete-confirm-overlay {\n position: absolute;\n inset: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n border-radius: 12px;\n animation: fadeIn 150ms ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.delete-confirm-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 20px;\n text-align: center;\n}\n\n.delete-warn-icon {\n font-size: 28px;\n color: var(--mj-status-error);\n}\n\n.delete-confirm-text {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n max-width: 220px;\n}\n\n.delete-confirm-actions {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n/* ---------------------------------------------------------------------------\n Edit panel (slide-in)\n --------------------------------------------------------------------------- */\n\n.edit-panel-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.1);\n z-index: 99;\n opacity: 0;\n pointer-events: none;\n transition: opacity 300ms ease;\n}\n\n.edit-panel-backdrop.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.edit-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 400px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.08);\n z-index: 100;\n transform: translateX(100%);\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.edit-panel.open {\n transform: translateX(0);\n}\n\n.edit-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.edit-panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.edit-icon-circle {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n}\n\n.edit-close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n font-size: 14px;\n transition: all 150ms ease;\n}\n\n.edit-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.edit-panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n}\n\n.edit-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.edit-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.edit-form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.edit-form-input {\n height: 36px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n transition: border-color 150ms ease;\n}\n\n.edit-form-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.edit-readonly-field {\n padding: 8px 12px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.edit-toggle-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.edit-toggle-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n}\n\n.edit-toggle-label.active {\n color: var(--mj-status-success);\n}\n\n.edit-credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-page);\n}\n\n.edit-credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.edit-credential-info i {\n color: var(--mj-brand-primary);\n}\n\n.edit-credential-clear {\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 150ms ease;\n}\n\n.edit-credential-clear:hover {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.edit-credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-credential-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.edit-credential-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 150ms ease;\n}\n\n.edit-credential-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.edit-credential-item i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.edit-panel-footer {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Card clickable area\n --------------------------------------------------------------------------- */\n\n.card-clickable {\n cursor: pointer;\n}\n\n/* ---------------------------------------------------------------------------\n Detail View (entity maps for a selected integration)\n --------------------------------------------------------------------------- */\n\n.detail-view {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.detail-header-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.detail-header-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detail-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.detail-header-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Schedule section */\n.schedule-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-bottom: 16px;\n}\n\n.schedule-section-header {\n margin-bottom: 12px;\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.schedule-section-title i {\n color: var(--mj-brand-primary);\n}\n\n.schedule-empty {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.schedule-empty-text {\n font-size: 0.85rem;\n color: var(--mj-text-disabled);\n}\n\n.schedule-create-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-active) 100%);\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.schedule-create-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* Detail toolbar */\n.detail-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.detail-toolbar-left {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-map-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.detail-search i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.detail-search input {\n border: none;\n outline: none;\n background: transparent;\n font-size: 13px;\n color: var(--mj-text-primary);\n width: 200px;\n}\n\n.detail-search input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Add Map button */\n.add-map-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.add-map-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n}\n\n.apply-all-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.apply-all-btn:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.apply-all-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.add-map-btn-lg {\n margin-top: 16px;\n padding: 10px 20px;\n font-size: 14px;\n}\n\n/* Add map inline panel */\n.add-map-panel {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: fadeIn 200ms ease;\n}\n\n.add-map-row {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n}\n\n.add-map-field {\n flex: 1;\n min-width: 0;\n}\n\n.add-map-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.add-map-select {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.add-map-select:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.add-map-direction-col {\n flex-shrink: 0;\n}\n\n.add-map-direction-btns {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.add-map-direction-btns button {\n padding: 7px 12px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n cursor: pointer;\n transition: all 150ms ease;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.add-map-direction-btns button:last-child {\n border-right: none;\n}\n\n.add-map-direction-btns button:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.add-map-direction-btns button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n}\n\n.add-map-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.add-map-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-save-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.add-map-save-btn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.add-map-cancel-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.add-map-cancel-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.add-map-loading {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n.add-map-loading i {\n color: var(--mj-brand-primary);\n margin-right: 4px;\n}\n\n.add-map-hint {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n font-style: italic;\n}\n\n/* Entity field needs more room for tree dropdown */\n.add-map-entity-field {\n flex: 2;\n min-width: 280px;\n}\n\n/* Entity picker row: tree dropdown + New button side by side */\n.entity-picker-row {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.entity-picker-row mj-tree-dropdown {\n flex: 1;\n min-width: 0;\n}\n\n.new-entity-btn {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.15s ease;\n}\n\n.new-entity-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------------------------------------------------------------------------\n Sync Result Banner\n --------------------------------------------------------------------------- */\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 12px;\n animation: fadeIn 200ms ease;\n}\n\n.sync-result-banner.sync-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.sync-result-banner.sync-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n/* ---------------------------------------------------------------------------\n Auto-Map Schema Panel\n --------------------------------------------------------------------------- */\n\n.auto-map-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.auto-map-header i {\n color: var(--mj-brand-primary);\n}\n\n.auto-map-result {\n margin-top: 12px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.auto-map-result.auto-map-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.auto-map-result.auto-map-partial {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n}\n\n.auto-map-result.auto-map-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.auto-map-result-summary {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.auto-map-errors {\n margin-top: 6px;\n font-size: 12px;\n}\n\n.auto-map-error {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n}\n\n/* ---------------------------------------------------------------------------\n New Entity Dialog\n --------------------------------------------------------------------------- */\n\n.new-entity-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.15s ease;\n}\n\n.new-entity-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 640px;\n max-width: 90vw;\n max-height: 85vh;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n animation: fadeIn 0.2s ease;\n}\n\n.new-entity-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.new-entity-dialog-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.new-entity-dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-close:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.new-entity-dialog-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.new-entity-dialog-desc {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.new-entity-dialog-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.new-entity-dialog-row {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n}\n\n.new-entity-dialog-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n}\n\n.new-entity-dialog-field-wide {\n flex: 1;\n}\n\n.new-entity-dialog-label {\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.new-entity-dialog-input {\n padding: 8px 12px;\n font-size: var(--mj-text-sm);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.new-entity-dialog-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n}\n\n.new-entity-dialog-dot {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n padding-bottom: 6px;\n user-select: none;\n}\n\n.new-entity-dialog-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint {\n font-style: italic;\n color: var(--mj-text-disabled);\n font-weight: 400;\n}\n\n.new-entity-dialog-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.new-entity-preview-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.15s ease;\n}\n\n.new-entity-preview-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.new-entity-preview-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.new-entity-dialog-done-btn {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n/* Next steps callout inside dialog */\n.new-entity-next-steps {\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: var(--mj-radius-md);\n padding: 14px 16px;\n}\n\n.new-entity-next-steps h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary-hover);\n}\n\n.new-entity-next-steps h4 i {\n margin-right: 6px;\n}\n\n.new-entity-next-steps ol {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n line-height: 1.7;\n}\n\n/* DDL copy button */\n.ddl-copy-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n/* DDL Preview */\n.ddl-warnings {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ddl-warning {\n font-size: 12px;\n color: var(--mj-status-warning);\n background: var(--mj-status-warning-subtle);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.ddl-warning i {\n margin-right: 4px;\n}\n\n.ddl-preview-block {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n max-height: 300px;\n display: flex;\n flex-direction: column;\n}\n\n.ddl-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ddl-preview-code {\n margin: 0;\n padding: 12px 16px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n line-height: 1.6;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n flex: 1;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Detail empty state */\n.detail-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty i {\n font-size: 36px;\n margin-bottom: 12px;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 6px;\n}\n\n.detail-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 400px;\n}\n\n/* Detail table */\n.detail-table-head {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px 8px 0 0;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n\n.detail-table-body {\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.detail-map-row {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n font-size: 13px;\n}\n\n.detail-map-row:last-child {\n border-bottom: none;\n}\n\n.detail-map-row:hover {\n background: var(--mj-bg-page);\n cursor: pointer;\n}\n\n.detail-map-row.sync-disabled {\n opacity: 0.5;\n}\n\n/* Column widths (shared between head and body) */\n.dt-col-toggle {\n width: 60px;\n flex-shrink: 0;\n}\n\n.dt-col-source {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dt-col-direction {\n width: 80px;\n flex-shrink: 0;\n text-align: center;\n}\n\n.dt-col-dest {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.dt-col-meta {\n width: 80px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: flex-end;\n}\n\n/* Direction badge */\n.direction-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n/* Clickable direction toggle button */\nbutton.direction-toggle {\n border: 1px solid transparent;\n cursor: pointer;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\nbutton.direction-toggle:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.direction-badge.pull {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n.direction-badge.push {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.direction-badge.bidirectional {\n background: var(--mj-status-warning-subtle);\n color: var(--mj-status-warning);\n}\n\n/* Create Tables list */\n.create-tables-list {\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n}\n.create-tables-select-all {\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n font-weight: 600;\n}\n.create-tables-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n.create-tables-checkbox:hover {\n background: var(--mj-bg-surface-hover);\n}\n.create-tables-checkbox input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n.create-tables-name-hint {\n color: var(--mj-text-muted);\n font-size: 11px;\n margin-left: 8px;\n}\n.create-tables-filters {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n flex-wrap: wrap;\n}\n.create-tables-search {\n flex: 1 1 240px;\n min-width: 200px;\n}\n.create-tables-toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n.create-tables-toggle input[type=\"checkbox\"] {\n margin: 0;\n}\n.create-tables-badge {\n display: inline-block;\n margin-left: 6px;\n padding: 1px 6px;\n font-size: 10px;\n font-weight: 600;\n border-radius: 10px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n line-height: 1.4;\n}\n.create-tables-badge-custom {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n.create-tables-badge-registered {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n.add-map-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n.add-map-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* Config badges */\n.detail-config-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n font-size: 11px;\n}\n\n/* Detail back button (icon-only) */\n.detail-back-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 16px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Detail edit button (icon-only) */\n.detail-edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Chevron hint on entity map rows */\n.map-edit-hint {\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.detail-map-row:hover .map-edit-hint {\n color: var(--mj-brand-primary);\n}\n\n/* Entity map editor header */\n.ve-header-title-inline {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n}\n\n.ve-source-label {\n color: var(--mj-brand-primary);\n}\n\n.ve-direction-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.ve-dest-label {\n color: var(--mj-status-success);\n}\n\n.ve-stat-inline {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.ve-stat-inline strong {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.detail-table-empty {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---------------------------------------------------------------------------\n Discovered Source Objects Section\n --------------------------------------------------------------------------- */\n\n.discovered-objects-section {\n margin: 12px 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.discovered-objects-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.discovered-objects-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.discovered-objects-title i {\n color: var(--mj-brand-primary);\n}\n\n.discovered-count {\n font-weight: 400;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.discovered-objects-actions {\n display: flex;\n gap: 8px;\n}\n\n.discovered-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n padding: 3px 10px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n}\n\n.discovered-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.discovered-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.discovered-loading,\n.discovered-empty {\n padding: 16px;\n text-align: center;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.discovered-loading i {\n margin-right: 6px;\n}\n\n.discovered-objects-list {\n max-height: 280px;\n overflow-y: auto;\n}\n\n.discovered-object-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 14px;\n cursor: pointer;\n transition: background 0.1s;\n border-bottom: 1px solid var(--mj-border-subtle);\n font-size: 13px;\n}\n\n.discovered-object-row:last-child {\n border-bottom: none;\n}\n\n.discovered-object-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.discovered-object-row.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n}\n\n.discovered-object-row input[type=\"checkbox\"] {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.discovered-object-name {\n flex: 1;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.discovered-object-api-name {\n flex: 1;\n color: var(--mj-text-muted);\n font-size: 12px;\n font-family: monospace;\n}\n\n.discovered-object-badges {\n display: flex;\n gap: 4px;\n}\n\n.discovered-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n font-size: 10px;\n}\n\n.discovered-badge.incremental {\n color: var(--mj-status-success);\n background: var(--mj-status-success-bg);\n}\n\n.discovered-badge.writable {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n"] }]
|
|
3137
3223
|
}], null, { entityTreeDropdown: [{
|
|
3138
3224
|
type: ViewChild,
|
|
3139
3225
|
args: ['entityTreeDropdown']
|