@mj-biz-apps/sales-ng 6.8.1 → 6.8.2

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.
@@ -371,18 +371,19 @@ const _forTrack0 = ($index, $item) => $item.name;
371
371
  const _forTrack1 = ($index, $item) => $item.ID;
372
372
  function MJSDealPipelinePanel_For_3_Template(rf, ctx) { if (rf & 1) {
373
373
  const _r1 = i0.ɵɵgetCurrentView();
374
- i0.ɵɵelementStart(0, "div", 3)(1, "mj-form-field", 9);
374
+ i0.ɵɵelementStart(0, "div", 9)(1, "mj-form-field", 10);
375
375
  i0.ɵɵlistener("Navigate", function MJSDealPipelinePanel_For_3_Template_mj_form_field_Navigate_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.FormComponent.OnFormNavigate($event)); });
376
376
  i0.ɵɵelementEnd()();
377
377
  } if (rf & 2) {
378
378
  const f_r3 = ctx.$implicit;
379
379
  const ctx_r1 = i0.ɵɵnextContext();
380
380
  i0.ɵɵclassProp("mjs-field--span", f_r3.span);
381
+ i0.ɵɵattribute("data-field", f_r3.name);
381
382
  i0.ɵɵadvance();
382
383
  i0.ɵɵproperty("Record", ctx_r1.Record)("ShowLabel", true)("FieldName", f_r3.name)("Type", f_r3.type)("EditMode", ctx_r1.EditMode && ctx_r1.FieldEditable(f_r3.name))("FormContext", ctx_r1.FormContext)("LinkType", f_r3.link ?? "None");
383
384
  } }
384
385
  function MJSDealPipelinePanel_Conditional_8_For_4_Template(rf, ctx) { if (rf & 1) {
385
- i0.ɵɵelementStart(0, "option", 12);
386
+ i0.ɵɵelementStart(0, "option", 13);
386
387
  i0.ɵɵtext(1);
387
388
  i0.ɵɵelementEnd();
388
389
  } if (rf & 2) {
@@ -392,7 +393,7 @@ function MJSDealPipelinePanel_Conditional_8_For_4_Template(rf, ctx) { if (rf & 1
392
393
  i0.ɵɵtextInterpolate(s_r5.Name);
393
394
  } }
394
395
  function MJSDealPipelinePanel_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
395
- i0.ɵɵelementStart(0, "option", 13);
396
+ i0.ɵɵelementStart(0, "option", 14);
396
397
  i0.ɵɵtext(1);
397
398
  i0.ɵɵelementEnd();
398
399
  } if (rf & 2) {
@@ -402,7 +403,7 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_5_Template(rf, ctx) { if
402
403
  i0.ɵɵtextInterpolate(ctx_r1.CurrentStatusName);
403
404
  } }
404
405
  function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_For_7_Template(rf, ctx) { if (rf & 1) {
405
- i0.ɵɵelementStart(0, "option", 12);
406
+ i0.ɵɵelementStart(0, "option", 13);
406
407
  i0.ɵɵtext(1);
407
408
  i0.ɵɵelementEnd();
408
409
  } if (rf & 2) {
@@ -413,12 +414,12 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_For_7_Te
413
414
  } }
414
415
  function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
415
416
  const _r9 = i0.ɵɵgetCurrentView();
416
- i0.ɵɵelementStart(0, "label", 16)(1, "span");
417
+ i0.ɵɵelementStart(0, "label", 18)(1, "span");
417
418
  i0.ɵɵtext(2, "Loss notes ");
418
419
  i0.ɵɵelementStart(3, "em");
419
420
  i0.ɵɵtext(4, "(required for this reason)");
420
421
  i0.ɵɵelementEnd()();
421
- i0.ɵɵelementStart(5, "textarea", 17);
422
+ i0.ɵɵelementStart(5, "textarea", 24);
422
423
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Conditional_8_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.LossNotes, $event) || (ctx_r1.LossNotes = $event); return i0.ɵɵresetView($event); });
423
424
  i0.ɵɵelementEnd()();
424
425
  } if (rf & 2) {
@@ -429,18 +430,18 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Conditio
429
430
  } }
430
431
  function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
431
432
  const _r7 = i0.ɵɵgetCurrentView();
432
- i0.ɵɵelementStart(0, "label", 16)(1, "span");
433
+ i0.ɵɵelementStart(0, "label", 18)(1, "span");
433
434
  i0.ɵɵtext(2, "Loss reason");
434
435
  i0.ɵɵelementEnd();
435
- i0.ɵɵelementStart(3, "select", 21);
436
+ i0.ɵɵelementStart(3, "select", 23);
436
437
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.LossReasonID, $event) || (ctx_r1.LossReasonID = $event); return i0.ɵɵresetView($event); });
437
438
  i0.ɵɵlistener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Template_select_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnLossReasonChange()); });
438
- i0.ɵɵelementStart(4, "option", 12);
439
+ i0.ɵɵelementStart(4, "option", 13);
439
440
  i0.ɵɵtext(5, "\u2014 choose \u2014");
440
441
  i0.ɵɵelementEnd();
441
- i0.ɵɵrepeaterCreate(6, MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_For_7_Template, 2, 2, "option", 12, _forTrack1);
442
+ i0.ɵɵrepeaterCreate(6, MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_For_7_Template, 2, 2, "option", 13, _forTrack1);
442
443
  i0.ɵɵelementEnd()();
443
- i0.ɵɵconditionalCreate(8, MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Conditional_8_Template, 6, 2, "label", 16);
444
+ i0.ɵɵconditionalCreate(8, MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Conditional_8_Template, 6, 2, "label", 18);
444
445
  } if (rf & 2) {
445
446
  const ctx_r1 = i0.ɵɵnextContext(3);
446
447
  i0.ɵɵadvance(3);
@@ -455,21 +456,21 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Template
455
456
  } }
456
457
  function MJSDealPipelinePanel_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
457
458
  const _r6 = i0.ɵɵgetCurrentView();
458
- i0.ɵɵelementStart(0, "div", 14);
459
+ i0.ɵɵelementStart(0, "div", 15);
459
460
  i0.ɵɵconditionalCreate(1, MJSDealPipelinePanel_Conditional_8_Conditional_6_Conditional_1_Template, 9, 4);
460
- i0.ɵɵelementStart(2, "label", 16)(3, "span");
461
+ i0.ɵɵelementStart(2, "label", 18)(3, "span");
461
462
  i0.ɵɵtext(4, "Notes ");
462
463
  i0.ɵɵelementStart(5, "em");
463
464
  i0.ɵɵtext(6, "(optional)");
464
465
  i0.ɵɵelementEnd()();
465
- i0.ɵɵelementStart(7, "textarea", 17);
466
+ i0.ɵɵelementStart(7, "textarea", 19);
466
467
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.CloseNotes, $event) || (ctx_r1.CloseNotes = $event); return i0.ɵɵresetView($event); });
467
468
  i0.ɵɵelementEnd()();
468
- i0.ɵɵelementStart(8, "div", 18)(9, "button", 19);
469
+ i0.ɵɵelementStart(8, "div", 20)(9, "button", 21);
469
470
  i0.ɵɵlistener("click", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ConfirmClose()); });
470
471
  i0.ɵɵtext(10);
471
472
  i0.ɵɵelementEnd();
472
- i0.ɵɵelementStart(11, "button", 20);
473
+ i0.ɵɵelementStart(11, "button", 22);
473
474
  i0.ɵɵlistener("click", function MJSDealPipelinePanel_Conditional_8_Conditional_6_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CancelClose()); });
474
475
  i0.ɵɵtext(12, "Cancel");
475
476
  i0.ɵɵelementEnd()()();
@@ -489,19 +490,19 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_6_Template(rf, ctx) { if
489
490
  } }
490
491
  function MJSDealPipelinePanel_Conditional_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
491
492
  const _r10 = i0.ɵɵgetCurrentView();
492
- i0.ɵɵelementStart(0, "div", 14)(1, "label", 16)(2, "span");
493
+ i0.ɵɵelementStart(0, "div", 16)(1, "label", 18)(2, "span");
493
494
  i0.ɵɵtext(3);
494
495
  i0.ɵɵelementStart(4, "em");
495
496
  i0.ɵɵtext(5, "(optional)");
496
497
  i0.ɵɵelementEnd()();
497
- i0.ɵɵelementStart(6, "textarea", 17);
498
+ i0.ɵɵelementStart(6, "textarea", 25);
498
499
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Conditional_7_Template_textarea_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ReopenReason, $event) || (ctx_r1.ReopenReason = $event); return i0.ɵɵresetView($event); });
499
500
  i0.ɵɵelementEnd()();
500
- i0.ɵɵelementStart(7, "div", 18)(8, "button", 19);
501
+ i0.ɵɵelementStart(7, "div", 20)(8, "button", 26);
501
502
  i0.ɵɵlistener("click", function MJSDealPipelinePanel_Conditional_8_Conditional_7_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ConfirmReopen()); });
502
503
  i0.ɵɵtext(9);
503
504
  i0.ɵɵelementEnd();
504
- i0.ɵɵelementStart(10, "button", 20);
505
+ i0.ɵɵelementStart(10, "button", 22);
505
506
  i0.ɵɵlistener("click", function MJSDealPipelinePanel_Conditional_8_Conditional_7_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CancelReopen()); });
506
507
  i0.ɵɵtext(11, "Cancel");
507
508
  i0.ɵɵelementEnd()()();
@@ -520,28 +521,28 @@ function MJSDealPipelinePanel_Conditional_8_Conditional_7_Template(rf, ctx) { if
520
521
  i0.ɵɵproperty("disabled", ctx_r1.Busy);
521
522
  } }
522
523
  function MJSDealPipelinePanel_Conditional_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
523
- i0.ɵɵelementStart(0, "small", 15);
524
+ i0.ɵɵelementStart(0, "small", 17);
524
525
  i0.ɵɵtext(1, "Closed. Pick an open status to reopen it, or use Reopen on the Close panel.");
525
526
  i0.ɵɵelementEnd();
526
527
  } }
527
528
  function MJSDealPipelinePanel_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
528
- i0.ɵɵelementStart(0, "small", 15);
529
+ i0.ɵɵelementStart(0, "small", 17);
529
530
  i0.ɵɵtext(1, "Open. Pick a closing status to close the deal, or use Close on the Close panel.");
530
531
  i0.ɵɵelementEnd();
531
532
  } }
532
533
  function MJSDealPipelinePanel_Conditional_8_Template(rf, ctx) { if (rf & 1) {
533
534
  const _r4 = i0.ɵɵgetCurrentView();
534
- i0.ɵɵelementStart(0, "select", 10);
535
+ i0.ɵɵelementStart(0, "select", 11);
535
536
  i0.ɵɵlistener("ngModelChange", function MJSDealPipelinePanel_Conditional_8_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetStatus($event)); });
536
- i0.ɵɵelementStart(1, "option", 11);
537
+ i0.ɵɵelementStart(1, "option", 12);
537
538
  i0.ɵɵtext(2, "\u2014 choose \u2014");
538
539
  i0.ɵɵelementEnd();
539
- i0.ɵɵrepeaterCreate(3, MJSDealPipelinePanel_Conditional_8_For_4_Template, 2, 2, "option", 12, _forTrack1);
540
- i0.ɵɵconditionalCreate(5, MJSDealPipelinePanel_Conditional_8_Conditional_5_Template, 2, 2, "option", 13);
540
+ i0.ɵɵrepeaterCreate(3, MJSDealPipelinePanel_Conditional_8_For_4_Template, 2, 2, "option", 13, _forTrack1);
541
+ i0.ɵɵconditionalCreate(5, MJSDealPipelinePanel_Conditional_8_Conditional_5_Template, 2, 2, "option", 14);
541
542
  i0.ɵɵelementEnd();
542
- i0.ɵɵconditionalCreate(6, MJSDealPipelinePanel_Conditional_8_Conditional_6_Template, 13, 6, "div", 14);
543
- i0.ɵɵconditionalCreate(7, MJSDealPipelinePanel_Conditional_8_Conditional_7_Template, 12, 6, "div", 14);
544
- i0.ɵɵconditionalCreate(8, MJSDealPipelinePanel_Conditional_8_Conditional_8_Template, 2, 0, "small", 15)(9, MJSDealPipelinePanel_Conditional_8_Conditional_9_Template, 2, 0, "small", 15);
543
+ i0.ɵɵconditionalCreate(6, MJSDealPipelinePanel_Conditional_8_Conditional_6_Template, 13, 6, "div", 15);
544
+ i0.ɵɵconditionalCreate(7, MJSDealPipelinePanel_Conditional_8_Conditional_7_Template, 12, 6, "div", 16);
545
+ i0.ɵɵconditionalCreate(8, MJSDealPipelinePanel_Conditional_8_Conditional_8_Template, 2, 0, "small", 17)(9, MJSDealPipelinePanel_Conditional_8_Conditional_9_Template, 2, 0, "small", 17);
545
546
  } if (rf & 2) {
546
547
  const ctx_r1 = i0.ɵɵnextContext();
547
548
  i0.ɵɵproperty("ngModel", ctx_r1.Record.DealStatusTypeID)("compareWith", ctx_r1.CompareStatus)("disabled", !ctx_r1.StatusIsEditable);
@@ -568,7 +569,7 @@ function MJSDealPipelinePanel_Conditional_9_Template(rf, ctx) { if (rf & 1) {
568
569
  i0.ɵɵtextInterpolate(ctx_r1.CurrentStatusName || "\u2014");
569
570
  } }
570
571
  function MJSDealPipelinePanel_Conditional_10_Template(rf, ctx) { if (rf & 1) {
571
- i0.ɵɵelementStart(0, "div", 22);
572
+ i0.ɵɵelementStart(0, "div", 27);
572
573
  i0.ɵɵtext(1);
573
574
  i0.ɵɵelementEnd();
574
575
  } if (rf & 2) {
@@ -595,6 +596,7 @@ function MJSDealPartyPanel_For_3_Template(rf, ctx) { if (rf & 1) {
595
596
  const f_r3 = ctx.$implicit;
596
597
  const ctx_r1 = i0.ɵɵnextContext();
597
598
  i0.ɵɵclassProp("mjs-field--span", f_r3.span);
599
+ i0.ɵɵattribute("data-field", f_r3.name);
598
600
  i0.ɵɵadvance();
599
601
  i0.ɵɵproperty("Record", ctx_r1.Record)("ShowLabel", true)("FieldName", f_r3.name)("Type", f_r3.type)("EditMode", ctx_r1.EditMode && ctx_r1.FieldEditable(f_r3.name))("FormContext", ctx_r1.FormContext)("LinkType", f_r3.link ?? "None");
600
602
  } }
@@ -639,6 +641,7 @@ function MJSDealCommercialPanel_For_3_Template(rf, ctx) { if (rf & 1) {
639
641
  const f_r1 = ctx.$implicit;
640
642
  const ctx_r1 = i0.ɵɵnextContext();
641
643
  i0.ɵɵclassProp("mjs-field--span", f_r1.span);
644
+ i0.ɵɵattribute("data-field", f_r1.name);
642
645
  i0.ɵɵadvance();
643
646
  i0.ɵɵconditional(ctx_r1.DrawsOwnMoney(f_r1) ? 1 : 2);
644
647
  } }
@@ -701,6 +704,7 @@ function MJSDealMotionPanel_For_3_Template(rf, ctx) { if (rf & 1) {
701
704
  const f_r3 = ctx.$implicit;
702
705
  const ctx_r1 = i0.ɵɵnextContext();
703
706
  i0.ɵɵclassProp("mjs-field--span", f_r3.span);
707
+ i0.ɵɵattribute("data-field", f_r3.name);
704
708
  i0.ɵɵadvance();
705
709
  i0.ɵɵproperty("Record", ctx_r1.Record)("ShowLabel", true)("FieldName", f_r3.name)("Type", f_r3.type)("EditMode", ctx_r1.EditMode && ctx_r1.FieldEditable(f_r3.name))("FormContext", ctx_r1.FormContext)("LinkType", f_r3.link ?? "None");
706
710
  } }
@@ -750,7 +754,7 @@ function MJSDealClosePanel_Conditional_1_Conditional_2_Conditional_4_Conditional
750
754
  i0.ɵɵelementStart(3, "em");
751
755
  i0.ɵɵtext(4, "(required for this reason)");
752
756
  i0.ɵɵelementEnd()();
753
- i0.ɵɵelementStart(5, "textarea", 10);
757
+ i0.ɵɵelementStart(5, "textarea", 16);
754
758
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealClosePanel_Conditional_1_Conditional_2_Conditional_4_Conditional_8_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.LossNotes, $event) || (ctx_r1.LossNotes = $event); return i0.ɵɵresetView($event); });
755
759
  i0.ɵɵelementEnd()();
756
760
  } if (rf & 2) {
@@ -834,9 +838,9 @@ function MJSDealClosePanel_Conditional_1_Template(rf, ctx) { if (rf & 1) {
834
838
  } }
835
839
  function MJSDealClosePanel_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
836
840
  const _r9 = i0.ɵɵgetCurrentView();
837
- i0.ɵɵelementStart(0, "button", 5);
841
+ i0.ɵɵelementStart(0, "button", 18);
838
842
  i0.ɵɵlistener("click", function MJSDealClosePanel_Conditional_2_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenReopenPanel()); });
839
- i0.ɵɵelement(1, "i", 16);
843
+ i0.ɵɵelement(1, "i", 19);
840
844
  i0.ɵɵtext(2, " Reopen this deal ");
841
845
  i0.ɵɵelementEnd();
842
846
  i0.ɵɵelementStart(3, "small", 7);
@@ -845,15 +849,15 @@ function MJSDealClosePanel_Conditional_2_Conditional_1_Template(rf, ctx) { if (r
845
849
  } }
846
850
  function MJSDealClosePanel_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
847
851
  const _r10 = i0.ɵɵgetCurrentView();
848
- i0.ɵɵelementStart(0, "div", 4)(1, "label", 9)(2, "span");
852
+ i0.ɵɵelementStart(0, "div", 17)(1, "label", 9)(2, "span");
849
853
  i0.ɵɵtext(3, "Reason ");
850
854
  i0.ɵɵelementStart(4, "em");
851
855
  i0.ɵɵtext(5, "(optional)");
852
856
  i0.ɵɵelementEnd()();
853
- i0.ɵɵelementStart(6, "textarea", 10);
857
+ i0.ɵɵelementStart(6, "textarea", 20);
854
858
  i0.ɵɵtwoWayListener("ngModelChange", function MJSDealClosePanel_Conditional_2_Conditional_2_Template_textarea_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ReopenReason, $event) || (ctx_r1.ReopenReason = $event); return i0.ɵɵresetView($event); });
855
859
  i0.ɵɵelementEnd()();
856
- i0.ɵɵelementStart(7, "div", 8)(8, "button", 11);
860
+ i0.ɵɵelementStart(7, "div", 8)(8, "button", 21);
857
861
  i0.ɵɵlistener("click", function MJSDealClosePanel_Conditional_2_Conditional_2_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ConfirmReopen()); });
858
862
  i0.ɵɵtext(9);
859
863
  i0.ɵɵelementEnd();
@@ -875,7 +879,7 @@ function MJSDealClosePanel_Conditional_2_Conditional_2_Template(rf, ctx) { if (r
875
879
  } }
876
880
  function MJSDealClosePanel_Conditional_2_Template(rf, ctx) { if (rf & 1) {
877
881
  i0.ɵɵelementStart(0, "div", 1);
878
- i0.ɵɵconditionalCreate(1, MJSDealClosePanel_Conditional_2_Conditional_1_Template, 5, 0)(2, MJSDealClosePanel_Conditional_2_Conditional_2_Template, 12, 5, "div", 4);
882
+ i0.ɵɵconditionalCreate(1, MJSDealClosePanel_Conditional_2_Conditional_1_Template, 5, 0)(2, MJSDealClosePanel_Conditional_2_Conditional_2_Template, 12, 5, "div", 17);
879
883
  i0.ɵɵelementEnd();
880
884
  } if (rf & 2) {
881
885
  const ctx_r1 = i0.ɵɵnextContext();
@@ -883,7 +887,7 @@ function MJSDealClosePanel_Conditional_2_Template(rf, ctx) { if (rf & 1) {
883
887
  i0.ɵɵconditional(!ctx_r1.ReopenPanelOpen ? 1 : 2);
884
888
  } }
885
889
  function MJSDealClosePanel_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
886
- i0.ɵɵelementStart(0, "div", 19);
890
+ i0.ɵɵelementStart(0, "div", 24);
887
891
  i0.ɵɵtext(1);
888
892
  i0.ɵɵelementEnd();
889
893
  } if (rf & 2) {
@@ -893,7 +897,7 @@ function MJSDealClosePanel_Conditional_3_Conditional_1_Template(rf, ctx) { if (r
893
897
  i0.ɵɵtextInterpolate(ctx_r1.Message);
894
898
  } }
895
899
  function MJSDealClosePanel_Conditional_3_For_3_Template(rf, ctx) { if (rf & 1) {
896
- i0.ɵɵelementStart(0, "div", 18);
900
+ i0.ɵɵelementStart(0, "div", 23);
897
901
  i0.ɵɵtext(1);
898
902
  i0.ɵɵelementEnd();
899
903
  } if (rf & 2) {
@@ -903,8 +907,8 @@ function MJSDealClosePanel_Conditional_3_For_3_Template(rf, ctx) { if (rf & 1) {
903
907
  } }
904
908
  function MJSDealClosePanel_Conditional_3_Template(rf, ctx) { if (rf & 1) {
905
909
  i0.ɵɵelementStart(0, "div", 1);
906
- i0.ɵɵconditionalCreate(1, MJSDealClosePanel_Conditional_3_Conditional_1_Template, 2, 3, "div", 17);
907
- i0.ɵɵrepeaterCreate(2, MJSDealClosePanel_Conditional_3_For_3_Template, 2, 1, "div", 18, i0.ɵɵrepeaterTrackByIndex);
910
+ i0.ɵɵconditionalCreate(1, MJSDealClosePanel_Conditional_3_Conditional_1_Template, 2, 3, "div", 22);
911
+ i0.ɵɵrepeaterCreate(2, MJSDealClosePanel_Conditional_3_For_3_Template, 2, 1, "div", 23, i0.ɵɵrepeaterTrackByIndex);
908
912
  i0.ɵɵelementEnd();
909
913
  } if (rf & 2) {
910
914
  const ctx_r1 = i0.ɵɵnextContext();
@@ -915,13 +919,14 @@ function MJSDealClosePanel_Conditional_3_Template(rf, ctx) { if (rf & 1) {
915
919
  } }
916
920
  function MJSDealClosePanel_For_6_Template(rf, ctx) { if (rf & 1) {
917
921
  const _r12 = i0.ɵɵgetCurrentView();
918
- i0.ɵɵelementStart(0, "div", 20)(1, "mj-form-field", 21);
922
+ i0.ɵɵelementStart(0, "div", 25)(1, "mj-form-field", 26);
919
923
  i0.ɵɵlistener("Navigate", function MJSDealClosePanel_For_6_Template_mj_form_field_Navigate_1_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.FormComponent.OnFormNavigate($event)); });
920
924
  i0.ɵɵelementEnd()();
921
925
  } if (rf & 2) {
922
926
  const f_r13 = ctx.$implicit;
923
927
  const ctx_r1 = i0.ɵɵnextContext();
924
928
  i0.ɵɵclassProp("mjs-field--span", f_r13.span);
929
+ i0.ɵɵattribute("data-field", f_r13.name);
925
930
  i0.ɵɵadvance();
926
931
  i0.ɵɵproperty("Record", ctx_r1.Record)("ShowLabel", true)("FieldName", f_r13.name)("Type", f_r13.type)("EditMode", ctx_r1.EditMode && ctx_r1.FieldEditable(f_r13.name))("FormContext", ctx_r1.FormContext)("LinkType", f_r13.link ?? "None");
927
932
  } }
@@ -2456,9 +2461,9 @@ let MJSDealPipelinePanel = class MJSDealPipelinePanel extends MJSDealFieldPanel
2456
2461
  ];
2457
2462
  }
2458
2463
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJSDealPipelinePanel_BaseFactory; return function MJSDealPipelinePanel_Factory(__ngFactoryType__) { return (ɵMJSDealPipelinePanel_BaseFactory || (ɵMJSDealPipelinePanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJSDealPipelinePanel)))(__ngFactoryType__ || MJSDealPipelinePanel); }; })();
2459
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealPipelinePanel, selectors: [["mjs-deal-pipeline-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 4, consts: [["SectionKey", "pipeline", "SectionName", "Pipeline", "Icon", "fa-solid fa-diagram-project", 3, "Form", "FormContext"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], [1, "mjs-field"], [1, "mj-forms-field"], [1, "mj-forms-field-label"], [1, "mj-forms-field-value"], [1, "mjs-reopen__msg", 3, "is-error"], [1, "mjs-reopen__issue"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"], [3, "ngModelChange", "ngModel", "compareWith", "disabled"], [3, "ngValue", "disabled"], [3, "ngValue"], ["disabled", "", 3, "ngValue"], [1, "mjs-reopen"], [1, "mjs-field__hint"], [1, "mjs-reopen__field"], ["rows", "2", 3, "ngModelChange", "ngModel", "disabled"], [1, "mjs-reopen__row"], ["type", "button", 1, "mjs-reopen__confirm", 3, "click", "disabled"], ["type", "button", 1, "mjs-reopen__cancel", 3, "click", "disabled"], [3, "ngModelChange", "ngModel", "disabled"], [1, "mjs-reopen__msg"]], template: function MJSDealPipelinePanel_Template(rf, ctx) { if (rf & 1) {
2464
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealPipelinePanel, selectors: [["mjs-deal-pipeline-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 4, consts: [["SectionKey", "pipeline", "SectionName", "Pipeline", "Icon", "fa-solid fa-diagram-project", 3, "Form", "FormContext"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], ["data-field", "DealStatusTypeID", 1, "mjs-field"], [1, "mj-forms-field"], [1, "mj-forms-field-label"], [1, "mj-forms-field-value"], [1, "mjs-reopen__msg", 3, "is-error"], [1, "mjs-reopen__issue"], [1, "mjs-field"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"], ["data-testid", "deal-status", 3, "ngModelChange", "ngModel", "compareWith", "disabled"], [3, "ngValue", "disabled"], [3, "ngValue"], ["disabled", "", 3, "ngValue"], ["data-testid", "status-close-panel", 1, "mjs-reopen"], ["data-testid", "status-reopen-panel", 1, "mjs-reopen"], [1, "mjs-field__hint"], [1, "mjs-reopen__field"], ["data-testid", "status-close-notes", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], [1, "mjs-reopen__row"], ["type", "button", "data-testid", "status-close-confirm", 1, "mjs-reopen__confirm", 3, "click", "disabled"], ["type", "button", 1, "mjs-reopen__cancel", 3, "click", "disabled"], ["data-testid", "status-close-loss-reason", 3, "ngModelChange", "ngModel", "disabled"], ["data-testid", "status-close-loss-notes", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["data-testid", "status-reopen-reason", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["type", "button", "data-testid", "status-reopen-confirm", 1, "mjs-reopen__confirm", 3, "click", "disabled"], [1, "mjs-reopen__msg"]], template: function MJSDealPipelinePanel_Template(rf, ctx) { if (rf & 1) {
2460
2465
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1);
2461
- i0.ɵɵrepeaterCreate(2, MJSDealPipelinePanel_For_3_Template, 2, 9, "div", 2, _forTrack0);
2466
+ i0.ɵɵrepeaterCreate(2, MJSDealPipelinePanel_For_3_Template, 2, 10, "div", 2, _forTrack0);
2462
2467
  i0.ɵɵelementStart(4, "div", 3)(5, "div", 4)(6, "label", 5);
2463
2468
  i0.ɵɵtext(7, "Status");
2464
2469
  i0.ɵɵelementEnd();
@@ -2503,7 +2508,7 @@ export { MJSDealPipelinePanel };
2503
2508
  [Form]="FormComponent" [FormContext]="FormContext">
2504
2509
  <div class="mjs-fields">
2505
2510
  @for (f of Fields; track f.name) {
2506
- <div class="mjs-field" [class.mjs-field--span]="f.span">
2511
+ <div class="mjs-field" [class.mjs-field--span]="f.span" [attr.data-field]="f.name">
2507
2512
  <mj-form-field [Record]="Record" [ShowLabel]="true" [FieldName]="f.name" [Type]="f.type"
2508
2513
  [EditMode]="EditMode && FieldEditable(f.name)" [FormContext]="FormContext" [LinkType]="f.link ?? 'None'"
2509
2514
  (Navigate)="FormComponent.OnFormNavigate($event)"></mj-form-field>
@@ -2516,11 +2521,11 @@ export { MJSDealPipelinePanel };
2516
2521
  the close running. The deal workspace has never offered them; this brings the form
2517
2522
  into line with it rather than the other way round. One door, and it is the audited
2518
2523
  one. -->
2519
- <div class="mjs-field">
2524
+ <div class="mjs-field" data-field="DealStatusTypeID">
2520
2525
  <div class="mj-forms-field">
2521
2526
  <label class="mj-forms-field-label">Status</label>
2522
2527
  @if (EditMode) {
2523
- <select [ngModel]="Record.DealStatusTypeID"
2528
+ <select [ngModel]="Record.DealStatusTypeID" data-testid="deal-status"
2524
2529
  (ngModelChange)="SetStatus($event)"
2525
2530
  [compareWith]="CompareStatus"
2526
2531
  [disabled]="!StatusIsEditable">
@@ -2540,11 +2545,11 @@ export { MJSDealPipelinePanel };
2540
2545
  <!-- golive#205: "Changing Deal Status to Won or Lost should close the
2541
2546
  deal properly." Picking it does not WRITE it -- the close has to
2542
2547
  run, and a Lost close needs a reason the dropdown cannot carry. -->
2543
- <div class="mjs-reopen">
2548
+ <div class="mjs-reopen" data-testid="status-close-panel">
2544
2549
  @if (PendingCloseStatus?.IsLost) {
2545
2550
  <label class="mjs-reopen__field">
2546
2551
  <span>Loss reason</span>
2547
- <select [(ngModel)]="LossReasonID" (ngModelChange)="OnLossReasonChange()"
2552
+ <select data-testid="status-close-loss-reason" [(ngModel)]="LossReasonID" (ngModelChange)="OnLossReasonChange()"
2548
2553
  [disabled]="Busy">
2549
2554
  <option [ngValue]="null">— choose —</option>
2550
2555
  @for (r of LossReasons(); track r.ID) {
@@ -2555,16 +2560,16 @@ export { MJSDealPipelinePanel };
2555
2560
  @if (LossReasonRequiresNotes) {
2556
2561
  <label class="mjs-reopen__field">
2557
2562
  <span>Loss notes <em>(required for this reason)</em></span>
2558
- <textarea rows="2" [(ngModel)]="LossNotes" [disabled]="Busy"></textarea>
2563
+ <textarea data-testid="status-close-loss-notes" rows="2" [(ngModel)]="LossNotes" [disabled]="Busy"></textarea>
2559
2564
  </label>
2560
2565
  }
2561
2566
  }
2562
2567
  <label class="mjs-reopen__field">
2563
2568
  <span>Notes <em>(optional)</em></span>
2564
- <textarea rows="2" [(ngModel)]="CloseNotes" [disabled]="Busy"></textarea>
2569
+ <textarea data-testid="status-close-notes" rows="2" [(ngModel)]="CloseNotes" [disabled]="Busy"></textarea>
2565
2570
  </label>
2566
2571
  <div class="mjs-reopen__row">
2567
- <button type="button" class="mjs-reopen__confirm"
2572
+ <button type="button" class="mjs-reopen__confirm" data-testid="status-close-confirm"
2568
2573
  [disabled]="!CanConfirmClose" (click)="ConfirmClose()">
2569
2574
  {{ Busy ? 'Closing\u2026' : 'Close as ' + PendingCloseStatusName }}
2570
2575
  </button>
@@ -2585,13 +2590,13 @@ export { MJSDealPipelinePanel };
2585
2590
  plan 7.3 requires undoing a lock to be explainable, and an
2586
2591
  unexplained reopen in the audit trail is what that rule is against.
2587
2592
  Not prompting is not the same as not recording. -->
2588
- <div class="mjs-reopen">
2593
+ <div class="mjs-reopen" data-testid="status-reopen-panel">
2589
2594
  <label class="mjs-reopen__field">
2590
2595
  <span>Reopen as {{ PendingReopenStatusName }} — reason <em>(optional)</em></span>
2591
- <textarea rows="2" [(ngModel)]="ReopenReason" [disabled]="Busy"></textarea>
2596
+ <textarea data-testid="status-reopen-reason" rows="2" [(ngModel)]="ReopenReason" [disabled]="Busy"></textarea>
2592
2597
  </label>
2593
2598
  <div class="mjs-reopen__row">
2594
- <button type="button" class="mjs-reopen__confirm"
2599
+ <button type="button" class="mjs-reopen__confirm" data-testid="status-reopen-confirm"
2595
2600
  [disabled]="!CanConfirmReopen" (click)="ConfirmReopen()">
2596
2601
  {{ Busy ? 'Reopening…' : 'Reopen deal' }}
2597
2602
  </button>
@@ -2683,7 +2688,7 @@ let MJSDealPartyPanel = class MJSDealPartyPanel extends MJSDealFieldPanel {
2683
2688
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJSDealPartyPanel_BaseFactory; return function MJSDealPartyPanel_Factory(__ngFactoryType__) { return (ɵMJSDealPartyPanel_BaseFactory || (ɵMJSDealPartyPanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJSDealPartyPanel)))(__ngFactoryType__ || MJSDealPartyPanel); }; })();
2684
2689
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealPartyPanel, selectors: [["mjs-deal-party-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [["SectionKey", "party", "SectionName", "Account & people", "Icon", "fa-solid fa-building", 3, "Form", "FormContext"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], [1, "mjs-field"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"]], template: function MJSDealPartyPanel_Template(rf, ctx) { if (rf & 1) {
2685
2690
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1);
2686
- i0.ɵɵrepeaterCreate(2, MJSDealPartyPanel_For_3_Template, 2, 9, "div", 2, _forTrack0);
2691
+ i0.ɵɵrepeaterCreate(2, MJSDealPartyPanel_For_3_Template, 2, 10, "div", 2, _forTrack0);
2687
2692
  i0.ɵɵelementEnd()();
2688
2693
  } if (rf & 2) {
2689
2694
  i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
@@ -2706,7 +2711,7 @@ export { MJSDealPartyPanel };
2706
2711
  [Form]="FormComponent" [FormContext]="FormContext">
2707
2712
  <div class="mjs-fields">
2708
2713
  @for (f of Fields; track f.name) {
2709
- <div class="mjs-field" [class.mjs-field--span]="f.span">
2714
+ <div class="mjs-field" [class.mjs-field--span]="f.span" [attr.data-field]="f.name">
2710
2715
  <mj-form-field [Record]="Record" [ShowLabel]="true" [FieldName]="f.name" [Type]="f.type"
2711
2716
  [EditMode]="EditMode && FieldEditable(f.name)" [FormContext]="FormContext" [LinkType]="f.link ?? 'None'"
2712
2717
  (Navigate)="FormComponent.OnFormNavigate($event)"></mj-form-field>
@@ -2748,7 +2753,7 @@ let MJSDealCommercialPanel = class MJSDealCommercialPanel extends MJSDealFieldPa
2748
2753
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJSDealCommercialPanel_BaseFactory; return function MJSDealCommercialPanel_Factory(__ngFactoryType__) { return (ɵMJSDealCommercialPanel_BaseFactory || (ɵMJSDealCommercialPanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJSDealCommercialPanel)))(__ngFactoryType__ || MJSDealCommercialPanel); }; })();
2749
2754
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealCommercialPanel, selectors: [["mjs-deal-commercial-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [["SectionKey", "commercial", "SectionName", "Commercial", "Icon", "fa-solid fa-coins", 3, "Form", "FormContext"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], [1, "mjs-field"], [3, "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"], [1, "mj-forms-field"], [1, "mj-forms-field-label"], [1, "mj-forms-field-value", "mjs-field__money"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"]], template: function MJSDealCommercialPanel_Template(rf, ctx) { if (rf & 1) {
2750
2755
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1);
2751
- i0.ɵɵrepeaterCreate(2, MJSDealCommercialPanel_For_3_Template, 3, 3, "div", 2, _forTrack0);
2756
+ i0.ɵɵrepeaterCreate(2, MJSDealCommercialPanel_For_3_Template, 3, 4, "div", 2, _forTrack0);
2752
2757
  i0.ɵɵelementEnd()();
2753
2758
  } if (rf & 2) {
2754
2759
  i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
@@ -2771,7 +2776,7 @@ export { MJSDealCommercialPanel };
2771
2776
  [Form]="FormComponent" [FormContext]="FormContext">
2772
2777
  <div class="mjs-fields">
2773
2778
  @for (f of Fields; track f.name) {
2774
- <div class="mjs-field" [class.mjs-field--span]="f.span">
2779
+ <div class="mjs-field" [class.mjs-field--span]="f.span" [attr.data-field]="f.name">
2775
2780
  @if (DrawsOwnMoney(f)) {
2776
2781
  <!-- Read-only money. See DealFieldSpec.currency for why this is not
2777
2782
  mj-form-field; the class names are the shared control's own, so the
@@ -2950,7 +2955,7 @@ let MJSDealLinesPanel = class MJSDealLinesPanel extends BaseFormPanel {
2950
2955
  } if (rf & 2) {
2951
2956
  let _t;
2952
2957
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.linesGrid = _t.first);
2953
- } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 6, consts: [["SectionKey", "lines", "SectionName", "What's being sold", "Icon", "fa-solid fa-boxes-stacked", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded", "BadgeCount"], [1, "mjs-deal-empty"], [3, "Deal", "LineID"], [1, "mjs-deal-lines__bar"], [3, "AfterRowDoubleClick", "AfterDataLoad", "Params", "AllowLoad", "ShowToolbar", "ShowNewButton", "NavigateOnDoubleClick"], ["type", "button", 1, "mjs-deal-lines__add", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], ["aria-hidden", "true", 1, "fa-solid", "fa-lock"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-info"], [3, "Saved", "Closed", "Deal", "LineID"]], template: function MJSDealLinesPanel_Template(rf, ctx) { if (rf & 1) {
2958
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 6, consts: [["SectionKey", "lines", "SectionName", "What's being sold", "Icon", "fa-solid fa-boxes-stacked", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded", "BadgeCount"], [1, "mjs-deal-empty"], [3, "Deal", "LineID"], [1, "mjs-deal-lines__bar"], [3, "AfterRowDoubleClick", "AfterDataLoad", "Params", "AllowLoad", "ShowToolbar", "ShowNewButton", "NavigateOnDoubleClick"], ["type", "button", "data-testid", "lines-add", 1, "mjs-deal-lines__add", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], ["aria-hidden", "true", 1, "fa-solid", "fa-lock"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-info"], [3, "Saved", "Closed", "Deal", "LineID"]], template: function MJSDealLinesPanel_Template(rf, ctx) { if (rf & 1) {
2954
2959
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0);
2955
2960
  i0.ɵɵconditionalCreate(1, MJSDealLinesPanel_Conditional_1_Template, 3, 6)(2, MJSDealLinesPanel_Conditional_2_Template, 3, 0, "p", 1)(3, MJSDealLinesPanel_Conditional_3_Template, 2, 0, "p", 1);
2956
2961
  i0.ɵɵconditionalCreate(4, MJSDealLinesPanel_Conditional_4_Template, 1, 2, "mjs-deal-line-editor", 2);
@@ -2982,7 +2987,7 @@ export { MJSDealLinesPanel };
2982
2987
  (golive#229). Hidden on a locked deal for the same reason the grid's New was. -->
2983
2988
  @if (!IsLocked) {
2984
2989
  <div class="mjs-deal-lines__bar">
2985
- <button type="button" class="mjs-deal-lines__add" (click)="AddLine()">
2990
+ <button type="button" class="mjs-deal-lines__add" data-testid="lines-add" (click)="AddLine()">
2986
2991
  <i class="fa-solid fa-plus" aria-hidden="true"></i> Add a product
2987
2992
  </button>
2988
2993
  </div>
@@ -3108,7 +3113,7 @@ let MJSDealMotionPanel = class MJSDealMotionPanel extends MJSDealFieldPanel {
3108
3113
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJSDealMotionPanel_BaseFactory; return function MJSDealMotionPanel_Factory(__ngFactoryType__) { return (ɵMJSDealMotionPanel_BaseFactory || (ɵMJSDealMotionPanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJSDealMotionPanel)))(__ngFactoryType__ || MJSDealMotionPanel); }; })();
3109
3114
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealMotionPanel, selectors: [["mjs-deal-motion-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [["SectionKey", "motion", "SectionName", "Motion", "Icon", "fa-solid fa-person-walking", 3, "Form", "FormContext"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], [1, "mjs-field"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"]], template: function MJSDealMotionPanel_Template(rf, ctx) { if (rf & 1) {
3110
3115
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1);
3111
- i0.ɵɵrepeaterCreate(2, MJSDealMotionPanel_For_3_Template, 2, 9, "div", 2, _forTrack0);
3116
+ i0.ɵɵrepeaterCreate(2, MJSDealMotionPanel_For_3_Template, 2, 10, "div", 2, _forTrack0);
3112
3117
  i0.ɵɵelementEnd()();
3113
3118
  } if (rf & 2) {
3114
3119
  i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
@@ -3131,7 +3136,7 @@ export { MJSDealMotionPanel };
3131
3136
  [Form]="FormComponent" [FormContext]="FormContext">
3132
3137
  <div class="mjs-fields">
3133
3138
  @for (f of Fields; track f.name) {
3134
- <div class="mjs-field" [class.mjs-field--span]="f.span">
3139
+ <div class="mjs-field" [class.mjs-field--span]="f.span" [attr.data-field]="f.name">
3135
3140
  <mj-form-field [Record]="Record" [ShowLabel]="true" [FieldName]="f.name" [Type]="f.type"
3136
3141
  [EditMode]="EditMode && FieldEditable(f.name)" [FormContext]="FormContext" [LinkType]="f.link ?? 'None'"
3137
3142
  (Navigate)="FormComponent.OnFormNavigate($event)"></mj-form-field>
@@ -3500,13 +3505,13 @@ let MJSDealClosePanel = class MJSDealClosePanel extends MJSDealFieldPanel {
3500
3505
  { name: 'LossNotes', type: 'textarea', span: true },
3501
3506
  ];
3502
3507
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJSDealClosePanel_BaseFactory; return function MJSDealClosePanel_Factory(__ngFactoryType__) { return (ɵMJSDealClosePanel_BaseFactory || (ɵMJSDealClosePanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJSDealClosePanel)))(__ngFactoryType__ || MJSDealClosePanel); }; })();
3503
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealClosePanel, selectors: [["mjs-deal-close-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 5, consts: [["SectionKey", "close", "SectionName", "Close", "Icon", "fa-solid fa-flag-checkered", 3, "Form", "FormContext"], [1, "mjs-close-action"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], [1, "mjs-close-action__form"], ["type", "button", 1, "mjs-close-action__start", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-flag-checkered"], [1, "mjs-close-action__hint"], [1, "mjs-close-action__row"], [1, "mjs-close-action__field"], ["rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["type", "button", 1, "mjs-close-action__confirm", 3, "click", "disabled"], ["type", "button", 1, "mjs-close-action__cancel", 3, "click", "disabled"], ["type", "radio", "name", "dealCloseTarget", 3, "ngModelChange", "value", "ngModel", "disabled"], [3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-left"], [1, "mjs-close-action__msg", 3, "is-error"], [1, "mjs-close-action__issue"], [1, "mjs-close-action__msg"], [1, "mjs-field"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"]], template: function MJSDealClosePanel_Template(rf, ctx) { if (rf & 1) {
3508
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJSDealClosePanel, selectors: [["mjs-deal-close-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 5, consts: [["SectionKey", "close", "SectionName", "Close", "Icon", "fa-solid fa-flag-checkered", 3, "Form", "FormContext"], [1, "mjs-close-action"], [1, "mjs-fields"], [1, "mjs-field", 3, "mjs-field--span"], ["data-testid", "close-panel", 1, "mjs-close-action__form"], ["type", "button", "data-testid", "close-open", 1, "mjs-close-action__start", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-flag-checkered"], [1, "mjs-close-action__hint"], [1, "mjs-close-action__row"], [1, "mjs-close-action__field"], ["data-testid", "close-notes", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["type", "button", "data-testid", "close-confirm", 1, "mjs-close-action__confirm", 3, "click", "disabled"], ["type", "button", 1, "mjs-close-action__cancel", 3, "click", "disabled"], ["type", "radio", "name", "dealCloseTarget", "data-testid", "close-target", 3, "ngModelChange", "value", "ngModel", "disabled"], ["data-testid", "close-loss-reason", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["data-testid", "close-loss-notes", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["data-testid", "reopen-panel", 1, "mjs-close-action__form"], ["type", "button", "data-testid", "reopen-open", 1, "mjs-close-action__start", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-left"], ["data-testid", "reopen-reason", "rows", "2", 3, "ngModelChange", "ngModel", "disabled"], ["type", "button", "data-testid", "reopen-confirm", 1, "mjs-close-action__confirm", 3, "click", "disabled"], ["data-testid", "close-message", 1, "mjs-close-action__msg", 3, "is-error"], [1, "mjs-close-action__issue"], ["data-testid", "close-message", 1, "mjs-close-action__msg"], [1, "mjs-field"], [3, "Navigate", "Record", "ShowLabel", "FieldName", "Type", "EditMode", "FormContext", "LinkType"]], template: function MJSDealClosePanel_Template(rf, ctx) { if (rf & 1) {
3504
3509
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0);
3505
3510
  i0.ɵɵconditionalCreate(1, MJSDealClosePanel_Conditional_1_Template, 3, 1, "div", 1);
3506
3511
  i0.ɵɵconditionalCreate(2, MJSDealClosePanel_Conditional_2_Template, 3, 1, "div", 1);
3507
3512
  i0.ɵɵconditionalCreate(3, MJSDealClosePanel_Conditional_3_Template, 4, 1, "div", 1);
3508
3513
  i0.ɵɵelementStart(4, "div", 2);
3509
- i0.ɵɵrepeaterCreate(5, MJSDealClosePanel_For_6_Template, 2, 9, "div", 3, _forTrack0);
3514
+ i0.ɵɵrepeaterCreate(5, MJSDealClosePanel_For_6_Template, 2, 10, "div", 3, _forTrack0);
3510
3515
  i0.ɵɵelementEnd()();
3511
3516
  } if (rf & 2) {
3512
3517
  i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
@@ -3542,7 +3547,7 @@ export { MJSDealClosePanel };
3542
3547
  @if (CanClose) {
3543
3548
  <div class="mjs-close-action">
3544
3549
  @if (!PanelOpen) {
3545
- <button type="button" class="mjs-close-action__start" (click)="OpenPanel()">
3550
+ <button type="button" class="mjs-close-action__start" data-testid="close-open" (click)="OpenPanel()">
3546
3551
  <i class="fa-solid fa-flag-checkered" aria-hidden="true"></i> Close this deal
3547
3552
  </button>
3548
3553
  <small class="mjs-close-action__hint">
@@ -3550,7 +3555,7 @@ export { MJSDealClosePanel };
3550
3555
  the contract and finance tasks.
3551
3556
  </small>
3552
3557
  } @else {
3553
- <div class="mjs-close-action__form">
3558
+ <div class="mjs-close-action__form" data-testid="close-panel">
3554
3559
  <!-- The real closing statuses, by name, from the flags. A Won/Lost pair
3555
3560
  could not express a deployment with more than one losing status, and
3556
3561
  this one has two: Lost and Abandoned both carry IsLost, so resolving
@@ -3559,7 +3564,7 @@ export { MJSDealClosePanel };
3559
3564
  <div class="mjs-close-action__row">
3560
3565
  @for (s of ClosingStatuses; track s.ID) {
3561
3566
  <label>
3562
- <input type="radio" name="dealCloseTarget" [value]="s.ID"
3567
+ <input type="radio" name="dealCloseTarget" data-testid="close-target" [value]="s.ID"
3563
3568
  [(ngModel)]="TargetStatusID" (ngModelChange)="OnTargetChange()"
3564
3569
  [disabled]="Closing" /> {{ s.Name }}
3565
3570
  </label>
@@ -3569,7 +3574,7 @@ export { MJSDealClosePanel };
3569
3574
  @if (SelectedStatus?.IsLost) {
3570
3575
  <label class="mjs-close-action__field">
3571
3576
  <span>Loss reason</span>
3572
- <select [(ngModel)]="LossReasonID" (ngModelChange)="OnLossReasonChange()"
3577
+ <select data-testid="close-loss-reason" [(ngModel)]="LossReasonID" (ngModelChange)="OnLossReasonChange()"
3573
3578
  [disabled]="Closing">
3574
3579
  <option [ngValue]="null">— choose —</option>
3575
3580
  @for (r of LossReasons(); track r.ID) {
@@ -3580,18 +3585,18 @@ export { MJSDealClosePanel };
3580
3585
  @if (LossReasonRequiresNotes) {
3581
3586
  <label class="mjs-close-action__field">
3582
3587
  <span>Loss notes <em>(required for this reason)</em></span>
3583
- <textarea rows="2" [(ngModel)]="LossNotes" [disabled]="Closing"></textarea>
3588
+ <textarea data-testid="close-loss-notes" rows="2" [(ngModel)]="LossNotes" [disabled]="Closing"></textarea>
3584
3589
  </label>
3585
3590
  }
3586
3591
  }
3587
3592
 
3588
3593
  <label class="mjs-close-action__field">
3589
3594
  <span>Notes <em>(optional)</em></span>
3590
- <textarea rows="2" [(ngModel)]="Notes" [disabled]="Closing"></textarea>
3595
+ <textarea data-testid="close-notes" rows="2" [(ngModel)]="Notes" [disabled]="Closing"></textarea>
3591
3596
  </label>
3592
3597
 
3593
3598
  <div class="mjs-close-action__row">
3594
- <button type="button" class="mjs-close-action__confirm"
3599
+ <button type="button" class="mjs-close-action__confirm" data-testid="close-confirm"
3595
3600
  [disabled]="!CanConfirm" (click)="ConfirmClose()">
3596
3601
  {{ Closing ? 'Closing…' : 'Close deal' }}
3597
3602
  </button>
@@ -3612,7 +3617,7 @@ export { MJSDealClosePanel };
3612
3617
  @if (CanReopen) {
3613
3618
  <div class="mjs-close-action">
3614
3619
  @if (!ReopenPanelOpen) {
3615
- <button type="button" class="mjs-close-action__start" (click)="OpenReopenPanel()">
3620
+ <button type="button" class="mjs-close-action__start" data-testid="reopen-open" (click)="OpenReopenPanel()">
3616
3621
  <i class="fa-solid fa-rotate-left" aria-hidden="true"></i> Reopen this deal
3617
3622
  </button>
3618
3623
  <small class="mjs-close-action__hint">
@@ -3620,13 +3625,13 @@ export { MJSDealClosePanel };
3620
3625
  the order to the pipeline. Refused if the order has already booked.
3621
3626
  </small>
3622
3627
  } @else {
3623
- <div class="mjs-close-action__form">
3628
+ <div class="mjs-close-action__form" data-testid="reopen-panel">
3624
3629
  <label class="mjs-close-action__field">
3625
3630
  <span>Reason <em>(optional)</em></span>
3626
- <textarea rows="2" [(ngModel)]="ReopenReason" [disabled]="Closing"></textarea>
3631
+ <textarea data-testid="reopen-reason" rows="2" [(ngModel)]="ReopenReason" [disabled]="Closing"></textarea>
3627
3632
  </label>
3628
3633
  <div class="mjs-close-action__row">
3629
- <button type="button" class="mjs-close-action__confirm"
3634
+ <button type="button" class="mjs-close-action__confirm" data-testid="reopen-confirm"
3630
3635
  [disabled]="!CanConfirmReopen" (click)="ConfirmReopen()">
3631
3636
  {{ Closing ? 'Reopening…' : 'Reopen deal' }}
3632
3637
  </button>
@@ -3648,7 +3653,7 @@ export { MJSDealClosePanel };
3648
3653
  @if (Message || Issues.length) {
3649
3654
  <div class="mjs-close-action">
3650
3655
  @if (Message) {
3651
- <div class="mjs-close-action__msg" [class.is-error]="MessageIsError">{{ Message }}</div>
3656
+ <div class="mjs-close-action__msg" data-testid="close-message" [class.is-error]="MessageIsError">{{ Message }}</div>
3652
3657
  }
3653
3658
  <!-- Tracked by index: the operation pushes one issue per task, so two tasks
3654
3659
  failing the same way produce two identical strings, and tracking by the string
@@ -3661,7 +3666,7 @@ export { MJSDealClosePanel };
3661
3666
 
3662
3667
  <div class="mjs-fields">
3663
3668
  @for (f of Fields; track f.name) {
3664
- <div class="mjs-field" [class.mjs-field--span]="f.span">
3669
+ <div class="mjs-field" [class.mjs-field--span]="f.span" [attr.data-field]="f.name">
3665
3670
  <mj-form-field [Record]="Record" [ShowLabel]="true" [FieldName]="f.name" [Type]="f.type"
3666
3671
  [EditMode]="EditMode && FieldEditable(f.name)" [FormContext]="FormContext" [LinkType]="f.link ?? 'None'"
3667
3672
  (Navigate)="FormComponent.OnFormNavigate($event)"></mj-form-field>