@mj-biz-apps/orders-ng 5.1.0 → 5.2.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.
Files changed (139) hide show
  1. package/dist/checkout-element/main.js +38080 -0
  2. package/dist/lib/checkout-widget/checkout-draft-line.d.ts +25 -0
  3. package/dist/lib/checkout-widget/checkout-draft-line.d.ts.map +1 -0
  4. package/dist/lib/checkout-widget/checkout-draft-line.js +46 -0
  5. package/dist/lib/checkout-widget/checkout-draft-line.js.map +1 -0
  6. package/dist/lib/checkout-widget/checkout-public-host.component.d.ts +80 -0
  7. package/dist/lib/checkout-widget/checkout-public-host.component.d.ts.map +1 -0
  8. package/dist/lib/checkout-widget/checkout-public-host.component.js +360 -0
  9. package/dist/lib/checkout-widget/checkout-public-host.component.js.map +1 -0
  10. package/dist/lib/checkout-widget/checkout-widget.component.d.ts +143 -0
  11. package/dist/lib/checkout-widget/checkout-widget.component.d.ts.map +1 -0
  12. package/dist/lib/checkout-widget/checkout-widget.component.js +873 -0
  13. package/dist/lib/checkout-widget/checkout-widget.component.js.map +1 -0
  14. package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts +1 -0
  15. package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/OrderHeader/order-header-form.component.js +10 -6
  17. package/dist/lib/custom/OrderHeader/order-header-form.component.js.map +1 -1
  18. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts +2 -0
  19. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts.map +1 -1
  20. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js +37 -11
  21. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js.map +1 -1
  22. package/dist/lib/form-panels/party-order-stats.js +2 -2
  23. package/dist/lib/form-panels/party-order-stats.js.map +1 -1
  24. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.d.ts +10 -0
  25. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.d.ts.map +1 -0
  26. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.js +103 -0
  27. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.js.map +1 -0
  28. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.d.ts +10 -0
  29. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.d.ts.map +1 -0
  30. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.js +136 -0
  31. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.js.map +1 -0
  32. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.d.ts +10 -0
  33. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.d.ts.map +1 -0
  34. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.js +106 -0
  35. package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.js.map +1 -0
  36. package/dist/lib/generated/Entities/mjBizAppsOrdersEventOrderLine/mjbizappsorderseventorderline.form.component.js +9 -9
  37. package/dist/lib/generated/Entities/mjBizAppsOrdersEventOrderLine/mjbizappsorderseventorderline.form.component.js.map +1 -1
  38. package/dist/lib/generated/Entities/mjBizAppsOrdersEventProduct/mjbizappsorderseventproduct.form.component.js +12 -12
  39. package/dist/lib/generated/Entities/mjBizAppsOrdersEventProduct/mjbizappsorderseventproduct.form.component.js.map +1 -1
  40. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.d.ts.map +1 -1
  41. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.js +16 -10
  42. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.js.map +1 -1
  43. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.d.ts.map +1 -1
  44. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js +78 -52
  45. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js.map +1 -1
  46. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.d.ts.map +1 -1
  47. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.js +88 -82
  48. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.js.map +1 -1
  49. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js +3 -3
  50. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js.map +1 -1
  51. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.d.ts.map +1 -1
  52. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.js +23 -5
  53. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.js.map +1 -1
  54. package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.d.ts.map +1 -1
  55. package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.js +75 -69
  56. package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.js.map +1 -1
  57. package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.d.ts.map +1 -1
  58. package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.js +37 -31
  59. package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.js.map +1 -1
  60. package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.d.ts.map +1 -1
  61. package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.js +24 -16
  62. package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.js.map +1 -1
  63. package/dist/lib/generated/generated-forms.module.d.ts +54 -51
  64. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  65. package/dist/lib/generated/generated-forms.module.js +27 -18
  66. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  67. package/dist/lib/pages/catalog/pricing.page.d.ts +3 -24
  68. package/dist/lib/pages/catalog/pricing.page.d.ts.map +1 -1
  69. package/dist/lib/pages/catalog/pricing.page.js +158 -214
  70. package/dist/lib/pages/catalog/pricing.page.js.map +1 -1
  71. package/dist/lib/pages/catalog/products.page.d.ts +6 -29
  72. package/dist/lib/pages/catalog/products.page.d.ts.map +1 -1
  73. package/dist/lib/pages/catalog/products.page.js +255 -315
  74. package/dist/lib/pages/catalog/products.page.js.map +1 -1
  75. package/dist/lib/pages/orders/fulfillment.page.d.ts +14 -97
  76. package/dist/lib/pages/orders/fulfillment.page.d.ts.map +1 -1
  77. package/dist/lib/pages/orders/fulfillment.page.js +93 -258
  78. package/dist/lib/pages/orders/fulfillment.page.js.map +1 -1
  79. package/dist/lib/pages/orders/order-document.page.js +1 -1
  80. package/dist/lib/pages/orders/order-document.page.js.map +1 -1
  81. package/dist/lib/pages/orders/orders-dashboard.page.d.ts +29 -58
  82. package/dist/lib/pages/orders/orders-dashboard.page.d.ts.map +1 -1
  83. package/dist/lib/pages/orders/orders-dashboard.page.js +602 -352
  84. package/dist/lib/pages/orders/orders-dashboard.page.js.map +1 -1
  85. package/dist/lib/pages/orders/orders-list.page.d.ts +8 -58
  86. package/dist/lib/pages/orders/orders-list.page.d.ts.map +1 -1
  87. package/dist/lib/pages/orders/orders-list.page.js +52 -237
  88. package/dist/lib/pages/orders/orders-list.page.js.map +1 -1
  89. package/dist/lib/pages/payments/account-credit.page.d.ts +7 -17
  90. package/dist/lib/pages/payments/account-credit.page.d.ts.map +1 -1
  91. package/dist/lib/pages/payments/account-credit.page.js +99 -85
  92. package/dist/lib/pages/payments/account-credit.page.js.map +1 -1
  93. package/dist/lib/pages/payments/payments-dashboard.page.d.ts +4 -15
  94. package/dist/lib/pages/payments/payments-dashboard.page.d.ts.map +1 -1
  95. package/dist/lib/pages/payments/payments-dashboard.page.js +76 -111
  96. package/dist/lib/pages/payments/payments-dashboard.page.js.map +1 -1
  97. package/dist/lib/pages/payments/payments-list.page.d.ts +7 -41
  98. package/dist/lib/pages/payments/payments-list.page.d.ts.map +1 -1
  99. package/dist/lib/pages/payments/payments-list.page.js +51 -130
  100. package/dist/lib/pages/payments/payments-list.page.js.map +1 -1
  101. package/dist/lib/pages/receivables/customer-ar.page.d.ts +6 -8
  102. package/dist/lib/pages/receivables/customer-ar.page.d.ts.map +1 -1
  103. package/dist/lib/pages/receivables/customer-ar.page.js +112 -100
  104. package/dist/lib/pages/receivables/customer-ar.page.js.map +1 -1
  105. package/dist/lib/pages/receivables/overdue.page.d.ts +6 -3
  106. package/dist/lib/pages/receivables/overdue.page.d.ts.map +1 -1
  107. package/dist/lib/pages/receivables/overdue.page.js +61 -65
  108. package/dist/lib/pages/receivables/overdue.page.js.map +1 -1
  109. package/dist/lib/pages/receivables/subscriptions.page.d.ts +5 -9
  110. package/dist/lib/pages/receivables/subscriptions.page.d.ts.map +1 -1
  111. package/dist/lib/pages/receivables/subscriptions.page.js +139 -153
  112. package/dist/lib/pages/receivables/subscriptions.page.js.map +1 -1
  113. package/dist/lib/panels/order-stages.d.ts +12 -16
  114. package/dist/lib/panels/order-stages.d.ts.map +1 -1
  115. package/dist/lib/panels/order-stages.js +6 -42
  116. package/dist/lib/panels/order-stages.js.map +1 -1
  117. package/dist/lib/panels/party-orders-overview.component.d.ts +3 -1
  118. package/dist/lib/panels/party-orders-overview.component.d.ts.map +1 -1
  119. package/dist/lib/panels/party-orders-overview.component.js +18 -6
  120. package/dist/lib/panels/party-orders-overview.component.js.map +1 -1
  121. package/dist/lib/panels/status-stepper.component.d.ts +1 -1
  122. package/dist/lib/panels/status-stepper.component.d.ts.map +1 -1
  123. package/dist/lib/services/pricing-scheduler.service.d.ts +3 -4
  124. package/dist/lib/services/pricing-scheduler.service.d.ts.map +1 -1
  125. package/dist/lib/services/pricing-scheduler.service.js +3 -4
  126. package/dist/lib/services/pricing-scheduler.service.js.map +1 -1
  127. package/dist/public-api.d.ts +3 -2
  128. package/dist/public-api.d.ts.map +1 -1
  129. package/dist/public-api.js +3 -2
  130. package/dist/public-api.js.map +1 -1
  131. package/package.json +28 -16
  132. package/dist/lib/pages/orders/order-editor.page.d.ts +0 -547
  133. package/dist/lib/pages/orders/order-editor.page.d.ts.map +0 -1
  134. package/dist/lib/pages/orders/order-editor.page.js +0 -2269
  135. package/dist/lib/pages/orders/order-editor.page.js.map +0 -1
  136. package/dist/lib/pages/orders/order-workspace.page.d.ts +0 -120
  137. package/dist/lib/pages/orders/order-workspace.page.d.ts.map +0 -1
  138. package/dist/lib/pages/orders/order-workspace.page.js +0 -443
  139. package/dist/lib/pages/orders/order-workspace.page.js.map +0 -1
@@ -2,104 +2,82 @@ import { ChangeDetectorRef, Component, EventEmitter, Output, inject } from '@ang
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MJODayBarsComponent } from '../../panels/day-bars.component.js';
4
4
  import { MJOStatTileComponent, MJOBarListComponent } from '../../panels/stat-tile.component.js';
5
- import { DaysSince, FormatMoney, MJOMoneyPipe } from '../../panels/money-format.js';
6
- import { MJAlertComponent, MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
5
+ import { DaysSince, FormatMoney } from '../../panels/money-format.js';
6
+ import { MJAlertComponent, MJEmptyStateComponent, MJTabNavComponent } from '@memberjunction/ng-ui-components';
7
+ import { EntityViewerModule } from '@memberjunction/ng-entity-viewer';
8
+ import { Metadata } from '@memberjunction/core';
7
9
  import { GetOrders } from '../../data/orders-queries.js';
8
10
  import { LocalDay, ToISODate } from '@mj-biz-apps/orders-entities';
9
11
  import * as i0 from "@angular/core";
12
+ import * as i1 from "@memberjunction/ng-entity-viewer";
10
13
  const _forTrack0 = ($index, $item) => $item.Label;
11
- const _forTrack1 = ($index, $item) => $item.ID;
12
- const _forTrack2 = ($index, $item) => $item.Order.ID;
13
- function MJOOrdersDashboardPageComponent_For_13_Conditional_6_Template(rf, ctx) { if (rf & 1) {
14
- i0.ɵɵelementStart(0, "span", 34);
14
+ const _forTrack1 = ($index, $item) => $item.Order.ID;
15
+ function MJOOrdersDashboardPageComponent_Conditional_3_For_13_Conditional_6_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "span", 40);
15
17
  i0.ɵɵtext(1);
16
18
  i0.ɵɵelementEnd();
17
19
  } if (rf & 2) {
18
- const queue_r2 = i0.ɵɵnextContext().$implicit;
20
+ const queue_r4 = i0.ɵɵnextContext().$implicit;
19
21
  i0.ɵɵadvance();
20
- i0.ɵɵtextInterpolate(queue_r2.Note);
22
+ i0.ɵɵtextInterpolate(queue_r4.Note);
21
23
  } }
22
- function MJOOrdersDashboardPageComponent_For_13_Template(rf, ctx) { if (rf & 1) {
23
- const _r1 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "a", 29);
25
- i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_For_13_Template_a_click_0_listener($event) { const queue_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.go($event, queue_r2.PageId)); });
26
- i0.ɵɵelementStart(1, "span", 30);
27
- i0.ɵɵelement(2, "i", 31);
24
+ function MJOOrdersDashboardPageComponent_Conditional_3_For_13_Template(rf, ctx) { if (rf & 1) {
25
+ const _r3 = i0.ɵɵgetCurrentView();
26
+ i0.ɵɵelementStart(0, "a", 35);
27
+ i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_Conditional_3_For_13_Template_a_click_0_listener($event) { const queue_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.goQueue($event, queue_r4)); });
28
+ i0.ɵɵelementStart(1, "span", 36);
29
+ i0.ɵɵelement(2, "i", 37);
28
30
  i0.ɵɵelementEnd();
29
- i0.ɵɵelementStart(3, "span", 32)(4, "span", 33);
31
+ i0.ɵɵelementStart(3, "span", 38)(4, "span", 39);
30
32
  i0.ɵɵtext(5);
31
33
  i0.ɵɵelementEnd();
32
- i0.ɵɵconditionalCreate(6, MJOOrdersDashboardPageComponent_For_13_Conditional_6_Template, 2, 1, "span", 34);
34
+ i0.ɵɵconditionalCreate(6, MJOOrdersDashboardPageComponent_Conditional_3_For_13_Conditional_6_Template, 2, 1, "span", 40);
33
35
  i0.ɵɵelementEnd();
34
- i0.ɵɵelementStart(7, "b", 35);
36
+ i0.ɵɵelementStart(7, "b", 41);
35
37
  i0.ɵɵtext(8);
36
38
  i0.ɵɵelementEnd();
37
- i0.ɵɵelement(9, "i", 36);
39
+ i0.ɵɵelement(9, "i", 42);
38
40
  i0.ɵɵelementEnd();
39
41
  } if (rf & 2) {
40
- const queue_r2 = ctx.$implicit;
42
+ const queue_r4 = ctx.$implicit;
41
43
  i0.ɵɵadvance();
42
- i0.ɵɵclassMap("mjo-tone-" + queue_r2.Tone);
44
+ i0.ɵɵclassMap("mjo-tone-" + queue_r4.Tone);
43
45
  i0.ɵɵadvance();
44
- i0.ɵɵclassMap(queue_r2.Icon);
46
+ i0.ɵɵclassMap(queue_r4.Icon);
45
47
  i0.ɵɵadvance(3);
46
- i0.ɵɵtextInterpolate(queue_r2.Label);
48
+ i0.ɵɵtextInterpolate(queue_r4.Label);
47
49
  i0.ɵɵadvance();
48
- i0.ɵɵconditional(queue_r2.Note ? 6 : -1);
50
+ i0.ɵɵconditional(queue_r4.Note ? 6 : -1);
49
51
  i0.ɵɵadvance(2);
50
- i0.ɵɵtextInterpolate(queue_r2.Count);
52
+ i0.ɵɵtextInterpolate(queue_r4.Count);
51
53
  } }
52
- function MJOOrdersDashboardPageComponent_ForEmpty_14_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "div", 11);
54
+ function MJOOrdersDashboardPageComponent_Conditional_3_ForEmpty_14_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelementStart(0, "div", 17);
54
56
  i0.ɵɵtext(1, "Nothing is waiting. Unusual, and worth enjoying.");
55
57
  i0.ɵɵelementEnd();
56
58
  } }
57
- function MJOOrdersDashboardPageComponent_For_54_Template(rf, ctx) { if (rf & 1) {
58
- const _r4 = i0.ɵɵgetCurrentView();
59
- i0.ɵɵelementStart(0, "tr", 37);
60
- i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_For_54_Template_tr_click_0_listener() { const order_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OrderOpened.emit(order_r5)); });
61
- i0.ɵɵelementStart(1, "td")(2, "span", 38);
62
- i0.ɵɵtext(3);
63
- i0.ɵɵelementEnd()();
64
- i0.ɵɵelementStart(4, "td");
65
- i0.ɵɵtext(5);
59
+ function MJOOrdersDashboardPageComponent_Conditional_3_Conditional_41_Template(rf, ctx) { if (rf & 1) {
60
+ const _r5 = i0.ɵɵgetCurrentView();
61
+ i0.ɵɵelementStart(0, "mj-entity-viewer", 43);
62
+ i0.ɵɵlistener("RecordOpened", function MJOOrdersDashboardPageComponent_Conditional_3_Conditional_41_Template_mj_entity_viewer_RecordOpened_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRecordOpened($event)); });
66
63
  i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(6, "td")(7, "span", 39);
68
- i0.ɵɵtext(8);
69
- i0.ɵɵelementEnd()();
70
- i0.ɵɵelementStart(9, "td", 24);
71
- i0.ɵɵtext(10);
72
- i0.ɵɵpipe(11, "mjoMoney");
73
- i0.ɵɵelementEnd()();
74
64
  } if (rf & 2) {
75
- const order_r5 = ctx.$implicit;
76
- const ctx_r2 = i0.ɵɵnextContext();
77
- i0.ɵɵadvance(3);
78
- i0.ɵɵtextInterpolate(order_r5.OrderNumber);
79
- i0.ɵɵadvance(2);
80
- i0.ɵɵtextInterpolate(ctx_r2.customerOf(order_r5));
81
- i0.ɵɵadvance(2);
82
- i0.ɵɵclassMap(ctx_r2.statusClass(order_r5));
83
- i0.ɵɵadvance();
84
- i0.ɵɵtextInterpolate1(" ", order_r5.Status, " ");
85
- i0.ɵɵadvance();
86
- i0.ɵɵclassProp("mj-money--neg", (order_r5.TotalGross ?? 0) < 0);
87
- i0.ɵɵadvance();
88
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 8, order_r5.TotalGross ?? 0), " ");
65
+ const ctx_r1 = i0.ɵɵnextContext(2);
66
+ i0.ɵɵproperty("Entity", ctx_r1.OrderEntityInfo);
89
67
  } }
90
- function MJOOrdersDashboardPageComponent_ForEmpty_55_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵelementStart(0, "tr")(1, "td", 40);
92
- i0.ɵɵtext(2, "No orders yet.");
93
- i0.ɵɵelementEnd()();
68
+ function MJOOrdersDashboardPageComponent_Conditional_3_Conditional_42_Template(rf, ctx) { if (rf & 1) {
69
+ i0.ɵɵelementStart(0, "div", 31);
70
+ i0.ɵɵtext(1, "Loading order metadata...");
71
+ i0.ɵɵelementEnd();
94
72
  } }
95
- function MJOOrdersDashboardPageComponent_For_63_Template(rf, ctx) { if (rf & 1) {
73
+ function MJOOrdersDashboardPageComponent_Conditional_3_For_50_Template(rf, ctx) { if (rf & 1) {
96
74
  const _r6 = i0.ɵɵgetCurrentView();
97
- i0.ɵɵelementStart(0, "mj-alert", 27)(1, "strong");
75
+ i0.ɵɵelementStart(0, "mj-alert", 33)(1, "strong");
98
76
  i0.ɵɵtext(2);
99
77
  i0.ɵɵelementEnd();
100
78
  i0.ɵɵtext(3);
101
- i0.ɵɵelementStart(4, "a", 21);
102
- i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_For_63_Template_a_click_4_listener($event) { const item_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openFrom($event, item_r7.Order)); });
79
+ i0.ɵɵelementStart(4, "a", 28);
80
+ i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_Conditional_3_For_50_Template_a_click_4_listener($event) { const item_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFrom($event, item_r7.Order)); });
103
81
  i0.ɵɵtext(5, "Work it \u2192");
104
82
  i0.ɵɵelementEnd()();
105
83
  } if (rf & 2) {
@@ -110,70 +88,304 @@ function MJOOrdersDashboardPageComponent_For_63_Template(rf, ctx) { if (rf & 1)
110
88
  i0.ɵɵadvance();
111
89
  i0.ɵɵtextInterpolate1(" ", item_r7.Detail, " ");
112
90
  } }
113
- function MJOOrdersDashboardPageComponent_ForEmpty_64_Template(rf, ctx) { if (rf & 1) {
114
- i0.ɵɵelement(0, "mj-empty-state", 28);
91
+ function MJOOrdersDashboardPageComponent_Conditional_3_ForEmpty_51_Template(rf, ctx) { if (rf & 1) {
92
+ i0.ɵɵelement(0, "mj-empty-state", 34);
93
+ } }
94
+ function MJOOrdersDashboardPageComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
95
+ const _r1 = i0.ɵɵgetCurrentView();
96
+ i0.ɵɵelementStart(0, "div", 6)(1, "mjo-stat-tile", 7);
97
+ i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Conditional_3_Template_mjo_stat_tile_Clicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenExplorerPreset("all")); });
98
+ i0.ɵɵelementEnd();
99
+ i0.ɵɵelementStart(2, "mjo-stat-tile", 8);
100
+ i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Conditional_3_Template_mjo_stat_tile_Clicked_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenExplorerPreset("unpaid")); });
101
+ i0.ɵɵelementEnd();
102
+ i0.ɵɵelementStart(3, "mjo-stat-tile", 9);
103
+ i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Conditional_3_Template_mjo_stat_tile_Clicked_3_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenExplorerPreset("overdue")); });
104
+ i0.ɵɵelementEnd();
105
+ i0.ɵɵelementStart(4, "mjo-stat-tile", 10);
106
+ i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Conditional_3_Template_mjo_stat_tile_Clicked_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenExplorerPreset("credits")); });
107
+ i0.ɵɵelementEnd()();
108
+ i0.ɵɵelementStart(5, "div", 11)(6, "div", 12)(7, "div", 13);
109
+ i0.ɵɵelement(8, "i", 14);
110
+ i0.ɵɵelementStart(9, "h3");
111
+ i0.ɵɵtext(10, "Needs someone");
112
+ i0.ɵɵelementEnd()();
113
+ i0.ɵɵelementStart(11, "div", 15);
114
+ i0.ɵɵrepeaterCreate(12, MJOOrdersDashboardPageComponent_Conditional_3_For_13_Template, 10, 7, "a", 16, _forTrack0, false, MJOOrdersDashboardPageComponent_Conditional_3_ForEmpty_14_Template, 2, 0, "div", 17);
115
+ i0.ɵɵelementEnd()();
116
+ i0.ɵɵelementStart(15, "div", 12)(16, "div", 13);
117
+ i0.ɵɵelement(17, "i", 18);
118
+ i0.ɵɵelementStart(18, "h3");
119
+ i0.ɵɵtext(19, "Orders per day");
120
+ i0.ɵɵelementEnd();
121
+ i0.ɵɵelementStart(20, "span", 19);
122
+ i0.ɵɵtext(21, "last 7 days");
123
+ i0.ɵɵelementEnd()();
124
+ i0.ɵɵelementStart(22, "div", 20);
125
+ i0.ɵɵelement(23, "mjo-day-bars", 21);
126
+ i0.ɵɵelementEnd()();
127
+ i0.ɵɵelementStart(24, "div", 12)(25, "div", 13);
128
+ i0.ɵɵelement(26, "i", 22);
129
+ i0.ɵɵelementStart(27, "h3");
130
+ i0.ɵɵtext(28, "Where orders are sitting");
131
+ i0.ɵɵelementEnd()();
132
+ i0.ɵɵelementStart(29, "div", 20);
133
+ i0.ɵɵelement(30, "mjo-bar-list", 23);
134
+ i0.ɵɵelementEnd()()();
135
+ i0.ɵɵelementStart(31, "div", 24)(32, "div", 25)(33, "div", 13);
136
+ i0.ɵɵelement(34, "i", 26);
137
+ i0.ɵɵelementStart(35, "h3");
138
+ i0.ɵɵtext(36, "Active Orders");
139
+ i0.ɵɵelementEnd();
140
+ i0.ɵɵelementStart(37, "span", 27)(38, "a", 28);
141
+ i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_Conditional_3_Template_a_click_38_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTabChange("explorer")); });
142
+ i0.ɵɵtext(39, "Full-screen Explorer \u2192");
143
+ i0.ɵɵelementEnd()()();
144
+ i0.ɵɵelementStart(40, "div", 29);
145
+ i0.ɵɵconditionalCreate(41, MJOOrdersDashboardPageComponent_Conditional_3_Conditional_41_Template, 1, 1, "mj-entity-viewer", 30)(42, MJOOrdersDashboardPageComponent_Conditional_3_Conditional_42_Template, 2, 0, "div", 31);
146
+ i0.ɵɵelementEnd()();
147
+ i0.ɵɵelementStart(43, "div", 12)(44, "div", 13);
148
+ i0.ɵɵelement(45, "i", 32);
149
+ i0.ɵɵelementStart(46, "h3");
150
+ i0.ɵɵtext(47, "Worth a look");
151
+ i0.ɵɵelementEnd()();
152
+ i0.ɵɵelementStart(48, "div", 20);
153
+ i0.ɵɵrepeaterCreate(49, MJOOrdersDashboardPageComponent_Conditional_3_For_50_Template, 6, 4, "mj-alert", 33, _forTrack1, false, MJOOrdersDashboardPageComponent_Conditional_3_ForEmpty_51_Template, 1, 0, "mj-empty-state", 34);
154
+ i0.ɵɵelementEnd()()();
155
+ } if (rf & 2) {
156
+ const ctx_r1 = i0.ɵɵnextContext();
157
+ i0.ɵɵadvance();
158
+ i0.ɵɵproperty("Value", ctx_r1.OpenCountDisplay)("Detail", ctx_r1.OpenValueDisplay);
159
+ i0.ɵɵadvance();
160
+ i0.ɵɵproperty("Value", ctx_r1.OpenBalanceDisplay);
161
+ i0.ɵɵadvance();
162
+ i0.ɵɵproperty("Value", ctx_r1.OverdueValueDisplay)("Detail", ctx_r1.OverdueDetail);
163
+ i0.ɵɵadvance();
164
+ i0.ɵɵproperty("Value", ctx_r1.CreditsDisplay);
165
+ i0.ɵɵadvance(8);
166
+ i0.ɵɵrepeater(ctx_r1.Queues);
167
+ i0.ɵɵadvance(11);
168
+ i0.ɵɵproperty("Bars", ctx_r1.OrdersPerDay);
169
+ i0.ɵɵadvance(7);
170
+ i0.ɵɵproperty("Rows", ctx_r1.StatusMix);
171
+ i0.ɵɵadvance(11);
172
+ i0.ɵɵconditional(ctx_r1.OrderEntityInfo ? 41 : 42);
173
+ i0.ɵɵadvance(8);
174
+ i0.ɵɵrepeater(ctx_r1.WorthALook);
175
+ } }
176
+ function MJOOrdersDashboardPageComponent_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
177
+ const _r8 = i0.ɵɵgetCurrentView();
178
+ i0.ɵɵelementStart(0, "mj-entity-viewer", 45);
179
+ i0.ɵɵlistener("RecordOpened", function MJOOrdersDashboardPageComponent_Conditional_4_Conditional_1_Template_mj_entity_viewer_RecordOpened_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRecordOpened($event)); });
180
+ i0.ɵɵelementEnd();
181
+ } if (rf & 2) {
182
+ const ctx_r1 = i0.ɵɵnextContext(2);
183
+ i0.ɵɵproperty("Entity", ctx_r1.OrderEntityInfo)("ViewEntity", ctx_r1.ExplorerView);
184
+ } }
185
+ function MJOOrdersDashboardPageComponent_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
186
+ i0.ɵɵelementStart(0, "div", 31);
187
+ i0.ɵɵtext(1, "Loading order metadata...");
188
+ i0.ɵɵelementEnd();
189
+ } }
190
+ function MJOOrdersDashboardPageComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
191
+ i0.ɵɵelementStart(0, "div", 3);
192
+ i0.ɵɵconditionalCreate(1, MJOOrdersDashboardPageComponent_Conditional_4_Conditional_1_Template, 1, 2, "mj-entity-viewer", 44)(2, MJOOrdersDashboardPageComponent_Conditional_4_Conditional_2_Template, 2, 0, "div", 31);
193
+ i0.ɵɵelementEnd();
194
+ } if (rf & 2) {
195
+ const ctx_r1 = i0.ɵɵnextContext();
196
+ i0.ɵɵadvance();
197
+ i0.ɵɵconditional(ctx_r1.OrderEntityInfo ? 1 : 2);
198
+ } }
199
+ function MJOOrdersDashboardPageComponent_Conditional_5_Conditional_5_Template(rf, ctx) { if (rf & 1) {
200
+ const _r9 = i0.ɵɵgetCurrentView();
201
+ i0.ɵɵelementStart(0, "mj-entity-viewer", 45);
202
+ i0.ɵɵlistener("RecordOpened", function MJOOrdersDashboardPageComponent_Conditional_5_Conditional_5_Template_mj_entity_viewer_RecordOpened_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRecordOpened($event)); });
203
+ i0.ɵɵelementEnd();
204
+ } if (rf & 2) {
205
+ const ctx_r1 = i0.ɵɵnextContext(2);
206
+ i0.ɵɵproperty("Entity", ctx_r1.OrderLineEntityInfo)("ViewEntity", ctx_r1.FulfillmentQueueView);
207
+ } }
208
+ function MJOOrdersDashboardPageComponent_Conditional_5_Conditional_6_Template(rf, ctx) { if (rf & 1) {
209
+ i0.ɵɵelementStart(0, "div", 31);
210
+ i0.ɵɵtext(1, "Loading fulfillment queue...");
211
+ i0.ɵɵelementEnd();
212
+ } }
213
+ function MJOOrdersDashboardPageComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "div", 4)(1, "p", 46);
215
+ i0.ɵɵelement(2, "i", 47);
216
+ i0.ɵɵtext(3, " Everything here is already paid for and booked. What is outstanding is the goods, and what this queue controls is the physical line fulfillment state. ");
217
+ i0.ɵɵelementEnd();
218
+ i0.ɵɵelementStart(4, "div", 3);
219
+ i0.ɵɵconditionalCreate(5, MJOOrdersDashboardPageComponent_Conditional_5_Conditional_5_Template, 1, 2, "mj-entity-viewer", 44)(6, MJOOrdersDashboardPageComponent_Conditional_5_Conditional_6_Template, 2, 0, "div", 31);
220
+ i0.ɵɵelementEnd()();
221
+ } if (rf & 2) {
222
+ const ctx_r1 = i0.ɵɵnextContext();
223
+ i0.ɵɵadvance(5);
224
+ i0.ɵɵconditional(ctx_r1.OrderLineEntityInfo ? 5 : 6);
225
+ } }
226
+ function MJOOrdersDashboardPageComponent_Conditional_6_Conditional_16_Template(rf, ctx) { if (rf & 1) {
227
+ const _r11 = i0.ɵɵgetCurrentView();
228
+ i0.ɵɵelementStart(0, "mj-entity-viewer", 45);
229
+ i0.ɵɵlistener("RecordOpened", function MJOOrdersDashboardPageComponent_Conditional_6_Conditional_16_Template_mj_entity_viewer_RecordOpened_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRecordOpened($event)); });
230
+ i0.ɵɵelementEnd();
231
+ } if (rf & 2) {
232
+ const ctx_r1 = i0.ɵɵnextContext(2);
233
+ i0.ɵɵproperty("Entity", ctx_r1.OrderEntityInfo)("ViewEntity", ctx_r1.AgingOverdueView);
234
+ } }
235
+ function MJOOrdersDashboardPageComponent_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
236
+ i0.ɵɵelementStart(0, "div", 31);
237
+ i0.ɵɵtext(1, "Loading order metadata...");
238
+ i0.ɵɵelementEnd();
239
+ } }
240
+ function MJOOrdersDashboardPageComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
241
+ const _r10 = i0.ɵɵgetCurrentView();
242
+ i0.ɵɵelementStart(0, "div", 5)(1, "div", 6);
243
+ i0.ɵɵelement(2, "mjo-stat-tile", 48)(3, "mjo-stat-tile", 49)(4, "mjo-stat-tile", 50)(5, "mjo-stat-tile", 51);
244
+ i0.ɵɵelementEnd();
245
+ i0.ɵɵelementStart(6, "div", 52)(7, "div", 53)(8, "div", 13);
246
+ i0.ɵɵelement(9, "i", 54);
247
+ i0.ɵɵelementStart(10, "h3");
248
+ i0.ɵɵtext(11, "Overdue Collections Worklist");
249
+ i0.ɵɵelementEnd();
250
+ i0.ɵɵelementStart(12, "span", 27)(13, "a", 28);
251
+ i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_Conditional_6_Template_a_click_13_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenExplorerPreset("overdue")); });
252
+ i0.ɵɵtext(14, "Open in Explorer \u2192");
253
+ i0.ɵɵelementEnd()()();
254
+ i0.ɵɵelementStart(15, "div", 55);
255
+ i0.ɵɵconditionalCreate(16, MJOOrdersDashboardPageComponent_Conditional_6_Conditional_16_Template, 1, 2, "mj-entity-viewer", 44)(17, MJOOrdersDashboardPageComponent_Conditional_6_Conditional_17_Template, 2, 0, "div", 31);
256
+ i0.ɵɵelementEnd()()()();
257
+ } if (rf & 2) {
258
+ const ctx_r1 = i0.ɵɵnextContext();
259
+ i0.ɵɵadvance(2);
260
+ i0.ɵɵproperty("Value", ctx_r1.AgingCurrentDisplay);
261
+ i0.ɵɵadvance();
262
+ i0.ɵɵproperty("Value", ctx_r1.Aging30Display);
263
+ i0.ɵɵadvance();
264
+ i0.ɵɵproperty("Value", ctx_r1.Aging60Display);
265
+ i0.ɵɵadvance();
266
+ i0.ɵɵproperty("Value", ctx_r1.Aging90Display);
267
+ i0.ɵɵadvance(11);
268
+ i0.ɵɵconditional(ctx_r1.OrderEntityInfo ? 16 : 17);
115
269
  } }
116
270
  /**
117
- * `mjo-orders-dashboard-page` — is today normal, and what needs a person?
118
- *
119
- * WORK QUEUES ABOVE THE TREND. What earns space on an operational dashboard is
120
- * what someone can act on. A chart of orders per day is interesting once a week;
121
- * "three drafts are sitting unfinished and four invoices are overdue" is
122
- * actionable now, so it comes first and it is clickable.
271
+ * `mjo-orders-dashboard-page` — Option B: Tabbed Command Workspace.
123
272
  *
124
- * EVERY FIGURE IS A CHEAP COUNT over rows the list screens already fetch. No
125
- * on-demand aggregate, no long-running rollup — a dashboard that takes four
126
- * seconds to load gets closed, and then it answers nothing.
127
- *
128
- * ## Example
129
- *
130
- * ```html
131
- * <mjo-orders-dashboard-page (NavigateRequested)="section.OnPageSelected($event)" />
132
- * ```
273
+ * Provides a unified workspace with 3 tabs:
274
+ * 1. Executive Overview & Action Queues
275
+ * 2. Full-featured Orders Explorer (<mj-entity-viewer>)
276
+ * 3. Receivables & Aging Breakdown
133
277
  */
134
278
  export class MJOOrdersDashboardPageComponent {
135
- /**
136
- * Render what was just loaded.
137
- *
138
- * These pages are created imperatively by the section shell through
139
- * `ViewContainerRef.createComponent`. When an async load assigns across
140
- * Angular's check/verify boundary, dev mode raises NG0100 and ABORTS the DOM
141
- * write. Nothing re-renders afterwards, so the recorded "previous" value stays
142
- * pre-load while the getter returns the loaded one — the mismatch then repeats
143
- * on every tick and the view is frozen for good. It is not a flicker: this
144
- * dashboard sat at "0 open orders / $0.00" against 73 real orders, reading as a
145
- * quiet day rather than a broken screen.
146
- *
147
- * Writing the DOM here ends it: the rendered value matches the getter from the
148
- * first pass on, so later verify passes agree.
149
- */
150
279
  cdr = inject(ChangeDetectorRef);
151
- /** A tile or queue was activated. Carries the rail page id to open. */
152
280
  NavigateRequested = new EventEmitter();
153
- /** A row was chosen. The section routes it. */
154
281
  OrderOpened = new EventEmitter();
282
+ ActiveTab = 'overview';
283
+ Tabs = [
284
+ { key: 'overview', label: 'Executive Overview', icon: 'fa-solid fa-chart-pie' },
285
+ { key: 'explorer', label: 'Orders Explorer', icon: 'fa-solid fa-table-list' },
286
+ { key: 'fulfillment', label: 'Fulfillment Queue', icon: 'fa-solid fa-dolly' },
287
+ { key: 'aging', label: 'Receivables & Aging', icon: 'fa-solid fa-hourglass-half' }
288
+ ];
289
+ OrderEntityInfo = null;
290
+ OrderLineEntityInfo = null;
291
+ ExplorerView = null;
292
+ get AgingOverdueView() {
293
+ if (!this.OrderEntityInfo)
294
+ return null;
295
+ const today = new Date().toISOString().slice(0, 10);
296
+ return {
297
+ EntityID: this.OrderEntityInfo.ID,
298
+ Entity: this.OrderEntityInfo.Name,
299
+ WhereClause: `Balance > 0 AND DueDate IS NOT NULL AND DueDate < '${today}' AND Status NOT IN ('Draft','Quoted','Voided')`,
300
+ ID: 'preset-aging-overdue',
301
+ Name: 'Overdue Collections'
302
+ };
303
+ }
304
+ get FulfillmentQueueView() {
305
+ if (!this.OrderLineEntityInfo)
306
+ return null;
307
+ return {
308
+ EntityID: this.OrderLineEntityInfo.ID,
309
+ Entity: this.OrderLineEntityInfo.Name,
310
+ WhereClause: `FulfillmentStatus IN ('Pending', 'PartiallyFulfilled', 'Unfulfilled')`,
311
+ ID: 'preset-fulfillment-queue',
312
+ Name: 'Fulfillment Queue'
313
+ };
314
+ }
155
315
  orders = [];
156
316
  async ngOnInit() {
317
+ const md = new Metadata();
318
+ this.OrderEntityInfo = md.Entities.find(e => e.Name === 'MJ_BizApps_Orders: Order Headers') || null;
319
+ this.OrderLineEntityInfo = md.Entities.find(e => e.Name === 'MJ_BizApps_Orders: Order Lines') || null;
157
320
  this.orders = await GetOrders({ Preset: 'all' });
158
321
  this.cdr.detectChanges();
159
322
  }
160
- /* ── Recent activity ────────────────────────────────────────────────── */
161
- /**
162
- * The last seven days, oldest first.
163
- *
164
- * Built from the orders ALREADY loaded rather than a grouped query. The
165
- * dashboard has them in hand, and a GROUP BY round trip to bucket rows this
166
- * screen is already holding is work with no answer attached to it.
167
- */
323
+ OnTabChange(tabKey) {
324
+ this.ActiveTab = tabKey;
325
+ if (tabKey !== 'explorer') {
326
+ this.ExplorerView = null;
327
+ }
328
+ this.cdr.detectChanges();
329
+ }
330
+ OpenExplorerPreset(preset) {
331
+ const today = new Date().toISOString().slice(0, 10);
332
+ let whereClause = null;
333
+ let presetName = 'All Orders';
334
+ switch (preset) {
335
+ case 'overdue':
336
+ whereClause = `Balance > 0 AND DueDate IS NOT NULL AND DueDate < '${today}' AND Status NOT IN ('Draft','Quoted','Voided')`;
337
+ presetName = 'Overdue Orders';
338
+ break;
339
+ case 'unpaid':
340
+ whereClause = `Balance > 0 AND Status NOT IN ('Draft','Quoted','Voided')`;
341
+ presetName = 'Unpaid Orders';
342
+ break;
343
+ case 'drafts':
344
+ whereClause = `Status IN ('Draft','Quoted')`;
345
+ presetName = 'Draft & Quoted Orders';
346
+ break;
347
+ case 'credits':
348
+ whereClause = `Balance < 0 AND Status NOT IN ('Draft','Quoted','Voided')`;
349
+ presetName = 'Credit Balance Orders';
350
+ break;
351
+ default:
352
+ whereClause = null;
353
+ break;
354
+ }
355
+ if (whereClause && this.OrderEntityInfo) {
356
+ this.ExplorerView = {
357
+ EntityID: this.OrderEntityInfo.ID,
358
+ Entity: this.OrderEntityInfo.Name,
359
+ WhereClause: whereClause,
360
+ ID: `preset-${preset}`,
361
+ Name: presetName
362
+ };
363
+ }
364
+ else {
365
+ this.ExplorerView = null;
366
+ }
367
+ this.ActiveTab = 'explorer';
368
+ this.cdr.detectChanges();
369
+ }
370
+ OnRecordOpened(event) {
371
+ const id = (event.compositeKey?.GetValueByFieldName('ID') ?? event.record?.['ID']);
372
+ if (id) {
373
+ const match = this.orders.find(o => o.ID === id);
374
+ if (match) {
375
+ this.OrderOpened.emit(match);
376
+ }
377
+ else {
378
+ const surrogate = { ID: id };
379
+ this.OrderOpened.emit(surrogate);
380
+ }
381
+ }
382
+ }
168
383
  get OrdersPerDay() {
169
384
  const days = [];
170
385
  const today = new Date();
171
386
  for (let back = 6; back >= 0; back--) {
172
387
  const day = new Date(today);
173
388
  day.setDate(day.getDate() - back);
174
- // LOCAL day for the key, matching the LOCAL day the label is built from. `toISOString()`
175
- // here names tomorrow all evening east of the meridian, so the bar would say "Mon" and
176
- // count Tuesday's orders.
177
389
  const iso = LocalDay(day);
178
390
  days.push({
179
391
  Label: day.toLocaleDateString('en-US', { weekday: 'short' }),
@@ -183,20 +395,11 @@ export class MJOOrdersDashboardPageComponent {
183
395
  }
184
396
  return days;
185
397
  }
186
- /** Newest first — what just happened, not what matters most. */
187
398
  get LatestOrders() {
188
399
  return [...this.orders]
189
400
  .sort((a, b) => String(b.OrderDate ?? '').localeCompare(String(a.OrderDate ?? '')))
190
401
  .slice(0, 7);
191
402
  }
192
- /**
193
- * Named, specific things to act on.
194
- *
195
- * Deliberately NOT a count. "4 overdue invoices" is a number someone has to
196
- * go and decode; "ORD-0961 is 90 days past due, $890 from Marcus Webb" is
197
- * already the decision. A vague attention panel trains people to skip it, so
198
- * an empty one is better than a general one.
199
- */
200
403
  get WorthALook() {
201
404
  const today = new Date().toISOString().slice(0, 10);
202
405
  const items = [];
@@ -227,16 +430,14 @@ export class MJOOrdersDashboardPageComponent {
227
430
  }
228
431
  return items;
229
432
  }
230
- /** Who the order is for, however the customer is recorded. */
231
433
  customerOf(order) {
232
434
  return (order.BillToOrganization ?? order.BillToPerson ?? '—');
233
435
  }
234
436
  statusClass(order) {
235
437
  switch (order.Status) {
236
- case 'Posted':
237
- case 'Fulfilled':
238
- return 'mj-chip--success';
239
438
  case 'Confirmed':
439
+ return 'mj-chip--success';
440
+ case 'Quoted':
240
441
  return 'mj-chip--info';
241
442
  case 'Voided':
242
443
  return 'mj-chip--outline';
@@ -244,12 +445,10 @@ export class MJOOrdersDashboardPageComponent {
244
445
  return '';
245
446
  }
246
447
  }
247
- /** Named `openFrom`, not `open` — `open` is already the set of open orders. */
248
448
  openFrom(event, order) {
249
449
  event.preventDefault();
250
450
  this.OrderOpened.emit(order);
251
451
  }
252
- /* ── Tiles ──────────────────────────────────────────────────────────── */
253
452
  get open() {
254
453
  return this.orders.filter((o) => !['Draft', 'Quoted', 'Voided'].includes(o.Status));
255
454
  }
@@ -283,22 +482,55 @@ export class MJOOrdersDashboardPageComponent {
283
482
  const total = this.credits.reduce((s, o) => s + Math.abs((o.Balance ?? 0)), 0);
284
483
  return FormatMoney(total, { Zero: '—' });
285
484
  }
286
- /* ── Queues ─────────────────────────────────────────────────────────── */
287
- /** Only queues with something in them — an empty queue is not a call to action. */
485
+ get AgingCurrentDisplay() {
486
+ const today = new Date().toISOString().slice(0, 10);
487
+ const current = this.owing.filter((o) => !o.DueDate || DaysSince(o.DueDate, today) <= 30);
488
+ return FormatMoney(current.reduce((s, o) => s + (o.Balance ?? 0), 0), { Round: true });
489
+ }
490
+ get Aging30Display() {
491
+ const today = new Date().toISOString().slice(0, 10);
492
+ const b30 = this.owing.filter((o) => {
493
+ if (!o.DueDate)
494
+ return false;
495
+ const days = DaysSince(o.DueDate, today);
496
+ return days > 30 && days <= 60;
497
+ });
498
+ return FormatMoney(b30.reduce((s, o) => s + (o.Balance ?? 0), 0), { Round: true });
499
+ }
500
+ get Aging60Display() {
501
+ const today = new Date().toISOString().slice(0, 10);
502
+ const b60 = this.owing.filter((o) => {
503
+ if (!o.DueDate)
504
+ return false;
505
+ const days = DaysSince(o.DueDate, today);
506
+ return days > 60 && days <= 90;
507
+ });
508
+ return FormatMoney(b60.reduce((s, o) => s + (o.Balance ?? 0), 0), { Round: true });
509
+ }
510
+ get Aging90Display() {
511
+ const today = new Date().toISOString().slice(0, 10);
512
+ const b90 = this.owing.filter((o) => {
513
+ if (!o.DueDate)
514
+ return false;
515
+ const days = DaysSince(o.DueDate, today);
516
+ return days > 90;
517
+ });
518
+ return FormatMoney(b90.reduce((s, o) => s + (o.Balance ?? 0), 0), { Round: true });
519
+ }
288
520
  get Queues() {
289
521
  const drafts = this.orders.filter((o) => o.Status === 'Draft' || o.Status === 'Quoted').length;
290
- const notPosted = this.orders.filter((o) => o.Status === 'Confirmed').length;
522
+ const awaitingFulfillment = this.orders.filter((o) => o.Status === 'Confirmed' && (o.FulfillmentStatus === 'Pending' || o.FulfillmentStatus === 'PartiallyFulfilled')).length;
291
523
  const all = [
292
- { Label: 'Drafts waiting to be finished', Count: drafts, Icon: 'fa-solid fa-pen-ruler', Tone: 'neutral', PageId: 'list' },
524
+ { Label: 'Drafts waiting to be finished', Count: drafts, Icon: 'fa-solid fa-pen-ruler', Tone: 'neutral', PageId: 'list', Preset: 'drafts' },
293
525
  {
294
- Label: 'Confirmed but not posted',
295
- Note: 'Normally seconds — investigate if one lingers',
296
- Count: notPosted,
297
- Icon: 'fa-solid fa-clock',
298
- Tone: 'info',
299
- PageId: 'list',
526
+ Label: 'Fulfillment queue (items waiting to ship)',
527
+ Note: 'Order lines ready for picking and shipment',
528
+ Count: awaitingFulfillment,
529
+ Icon: 'fa-solid fa-dolly',
530
+ Tone: 'warning',
531
+ PageId: 'fulfillment'
300
532
  },
301
- { Label: 'Overdue invoices', Count: this.overdue.length, Icon: 'fa-solid fa-hourglass-half', Tone: 'error', PageId: 'list' },
533
+ { Label: 'Overdue invoices', Count: this.overdue.length, Icon: 'fa-solid fa-hourglass-half', Tone: 'error', PageId: 'list', Preset: 'overdue' },
302
534
  {
303
535
  Label: 'Credits customers are holding',
304
536
  Note: 'Spendable — offer them before invoicing again',
@@ -306,264 +538,282 @@ export class MJOOrdersDashboardPageComponent {
306
538
  Icon: 'fa-solid fa-piggy-bank',
307
539
  Tone: 'success',
308
540
  PageId: 'list',
541
+ Preset: 'credits'
309
542
  },
310
543
  ];
311
544
  return all.filter((q) => q.Count > 0);
312
545
  }
313
- /* ── Status mix ─────────────────────────────────────────────────────── */
314
546
  get StatusMix() {
315
547
  const counts = new Map();
316
548
  for (const order of this.orders) {
317
549
  counts.set(order.Status, (counts.get(order.Status) ?? 0) + 1);
318
550
  }
319
- // Lifecycle order, not alphabetical — the sequence is the story.
320
- const order = ['Draft', 'Quoted', 'Confirmed', 'Posted', 'Fulfilled'];
551
+ const order = ['Draft', 'Quoted', 'Confirmed', 'Voided'];
321
552
  return order
322
553
  .filter((s) => counts.has(s))
323
554
  .map((s) => ({ Label: s, Value: counts.get(s), Display: String(counts.get(s)) }));
324
555
  }
325
- go(event, pageId) {
556
+ goQueue(event, queue) {
326
557
  event.preventDefault();
327
- this.NavigateRequested.emit(pageId);
558
+ if (queue.PageId === 'fulfillment') {
559
+ this.OnTabChange('fulfillment');
560
+ return;
561
+ }
562
+ if (queue.Preset) {
563
+ this.OpenExplorerPreset(queue.Preset);
564
+ }
565
+ else {
566
+ this.NavigateRequested.emit(queue.PageId);
567
+ }
328
568
  }
329
569
  static ɵfac = function MJOOrdersDashboardPageComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJOOrdersDashboardPageComponent)(); };
330
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJOOrdersDashboardPageComponent, selectors: [["mjo-orders-dashboard-page"]], outputs: { NavigateRequested: "NavigateRequested", OrderOpened: "OrderOpened" }, decls: 65, vars: 11, consts: [[1, "mj-stat-grid"], ["Label", "Open orders", "Icon", "fa-solid fa-file-invoice-dollar", 3, "Value", "Detail"], ["Label", "Open balance", "Icon", "fa-solid fa-scale-balanced", "Detail", "Confirmed orders still carrying a balance", 3, "Value"], ["Label", "Overdue", "Icon", "fa-solid fa-hourglass-half", "Tone", "alert", 3, "Clicked", "Value", "Detail"], ["Label", "Credits held", "Icon", "fa-solid fa-piggy-bank", "Detail", "Offer these before invoicing again", 3, "Clicked", "Value"], [1, "mjo-dash__split"], [1, "mj-card"], [1, "mj-card-head"], ["aria-hidden", "true", 1, "fa-solid", "fa-list-check"], [1, "mj-card-pad", "mjo-dash__queues"], ["href", "#", 1, "mjo-dash__queue"], [1, "small", "muted"], ["aria-hidden", "true", 1, "fa-solid", "fa-chart-simple"], [1, "right", "small", "muted"], [1, "mj-card-pad"], ["Unit", "orders", 3, "Bars"], ["aria-hidden", "true", 1, "fa-solid", "fa-layer-group"], ["EmptyText", "No orders yet.", 3, "Rows"], [1, "mjo-dash__split", "mjo-dash__split--wide"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], [1, "right"], ["href", "#", 1, "small", 3, "click"], [1, "mj-table-wrap"], [1, "mj-table", "mj-table--compact"], [1, "num"], [1, "is-clickable"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], ["Role", "note", 3, "Variant", "Icon"], ["Icon", "fa-solid fa-circle-check", "Title", "Nothing is asking for attention", "Size", "compact"], ["href", "#", 1, "mjo-dash__queue", 3, "click"], [1, "mjo-dash__icon"], ["aria-hidden", "true"], [1, "mjo-dash__queue-body"], [1, "mjo-dash__queue-label"], [1, "small", "muted", "mjo-dash__queue-note"], [1, "mj-num", "mjo-dash__count"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-right", "muted", "tiny"], [1, "is-clickable", 3, "click"], [1, "mono"], [1, "mj-chip"], ["colspan", "4", 1, "small", "muted"]], template: function MJOOrdersDashboardPageComponent_Template(rf, ctx) { if (rf & 1) {
331
- i0.ɵɵelementStart(0, "div", 0);
332
- i0.ɵɵelement(1, "mjo-stat-tile", 1)(2, "mjo-stat-tile", 2);
333
- i0.ɵɵelementStart(3, "mjo-stat-tile", 3);
334
- i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Template_mjo_stat_tile_Clicked_3_listener() { return ctx.NavigateRequested.emit("list"); });
335
- i0.ɵɵelementEnd();
336
- i0.ɵɵelementStart(4, "mjo-stat-tile", 4);
337
- i0.ɵɵlistener("Clicked", function MJOOrdersDashboardPageComponent_Template_mjo_stat_tile_Clicked_4_listener() { return ctx.NavigateRequested.emit("list"); });
338
- i0.ɵɵelementEnd()();
339
- i0.ɵɵelementStart(5, "div", 5)(6, "div", 6)(7, "div", 7);
340
- i0.ɵɵelement(8, "i", 8);
341
- i0.ɵɵelementStart(9, "h3");
342
- i0.ɵɵtext(10, "Needs someone");
570
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJOOrdersDashboardPageComponent, selectors: [["mjo-orders-dashboard-page"]], outputs: { NavigateRequested: "NavigateRequested", OrderOpened: "OrderOpened" }, decls: 7, vars: 3, consts: [[1, "mjo-dashboard-container"], [1, "mjo-tab-container"], [3, "TabChange", "Tabs", "ActiveKey"], [1, "mjo-explorer-wrapper"], [1, "mjo-fulfillment-pane"], [1, "mjo-aging-pane"], [1, "mj-stat-grid"], ["Label", "Open orders", "Icon", "fa-solid fa-file-invoice-dollar", 3, "Clicked", "Value", "Detail"], ["Label", "Open balance", "Icon", "fa-solid fa-scale-balanced", "Detail", "Confirmed orders still carrying a balance", 3, "Clicked", "Value"], ["Label", "Overdue", "Icon", "fa-solid fa-hourglass-half", "Tone", "alert", 3, "Clicked", "Value", "Detail"], ["Label", "Credits held", "Icon", "fa-solid fa-piggy-bank", "Detail", "Offer these before invoicing again", 3, "Clicked", "Value"], [1, "mjo-dash__split"], [1, "mj-card"], [1, "mj-card-head"], ["aria-hidden", "true", 1, "fa-solid", "fa-list-check"], [1, "mj-card-pad", "mjo-dash__queues"], ["href", "#", 1, "mjo-dash__queue"], [1, "small", "muted"], ["aria-hidden", "true", 1, "fa-solid", "fa-chart-simple"], [1, "right", "small", "muted"], [1, "mj-card-pad"], ["Unit", "orders", 3, "Bars"], ["aria-hidden", "true", 1, "fa-solid", "fa-layer-group"], ["EmptyText", "No orders yet.", 3, "Rows"], [1, "mjo-dash__split", "mjo-dash__split--wide"], [1, "mj-card", "mjo-dash__viewer-card"], ["aria-hidden", "true", 1, "fa-solid", "fa-table-list"], [1, "right"], ["href", "#", 1, "small", 3, "click"], [1, "mjo-dash__viewer-host"], [3, "Entity"], [1, "small", "muted", 2, "padding", "24px"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], ["Role", "note", 3, "Variant", "Icon"], ["Icon", "fa-solid fa-circle-check", "Title", "Nothing is asking for attention", "Size", "compact"], ["href", "#", 1, "mjo-dash__queue", 3, "click"], [1, "mjo-dash__icon"], ["aria-hidden", "true"], [1, "mjo-dash__queue-body"], [1, "mjo-dash__queue-label"], [1, "small", "muted", "mjo-dash__queue-note"], [1, "mj-num", "mjo-dash__count"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-right", "muted", "tiny"], [3, "RecordOpened", "Entity"], [3, "Entity", "ViewEntity"], [3, "RecordOpened", "Entity", "ViewEntity"], [1, "mjo-note", "mjo-fq__note"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-info"], ["Label", "Current (0-30 days)", "Icon", "fa-solid fa-check", "Detail", "Due or recently invoiced", 3, "Value"], ["Label", "31\u201360 days", "Icon", "fa-solid fa-clock", "Tone", "default", "Detail", "First reminder interval", 3, "Value"], ["Label", "61\u201390 days", "Icon", "fa-solid fa-triangle-exclamation", "Tone", "alert", "Detail", "Escalated collection required", 3, "Value"], ["Label", "90+ days overdue", "Icon", "fa-solid fa-circle-xmark", "Tone", "alert", "Detail", "High risk receivables", 3, "Value"], [1, "mjo-dash__split", "mjo-dash__split--wide", 2, "margin-top", "var(--mj-space-6)"], [1, "mj-card", "mjo-dash__viewer-card", 2, "grid-column", "1 / -1", "height", "600px"], ["aria-hidden", "true", 1, "fa-solid", "fa-hourglass-half"], [1, "mjo-dash__viewer-host", 2, "min-height", "520px"]], template: function MJOOrdersDashboardPageComponent_Template(rf, ctx) { if (rf & 1) {
571
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "mj-tab-nav", 2);
572
+ i0.ɵɵlistener("TabChange", function MJOOrdersDashboardPageComponent_Template_mj_tab_nav_TabChange_2_listener($event) { return ctx.OnTabChange($event); });
343
573
  i0.ɵɵelementEnd()();
344
- i0.ɵɵelementStart(11, "div", 9);
345
- i0.ɵɵrepeaterCreate(12, MJOOrdersDashboardPageComponent_For_13_Template, 10, 7, "a", 10, _forTrack0, false, MJOOrdersDashboardPageComponent_ForEmpty_14_Template, 2, 0, "div", 11);
346
- i0.ɵɵelementEnd()();
347
- i0.ɵɵelementStart(15, "div", 6)(16, "div", 7);
348
- i0.ɵɵelement(17, "i", 12);
349
- i0.ɵɵelementStart(18, "h3");
350
- i0.ɵɵtext(19, "Orders per day");
351
- i0.ɵɵelementEnd();
352
- i0.ɵɵelementStart(20, "span", 13);
353
- i0.ɵɵtext(21, "last 7 days");
354
- i0.ɵɵelementEnd()();
355
- i0.ɵɵelementStart(22, "div", 14);
356
- i0.ɵɵelement(23, "mjo-day-bars", 15);
357
- i0.ɵɵelementEnd()();
358
- i0.ɵɵelementStart(24, "div", 6)(25, "div", 7);
359
- i0.ɵɵelement(26, "i", 16);
360
- i0.ɵɵelementStart(27, "h3");
361
- i0.ɵɵtext(28, "Where orders are sitting");
362
- i0.ɵɵelementEnd()();
363
- i0.ɵɵelementStart(29, "div", 14);
364
- i0.ɵɵelement(30, "mjo-bar-list", 17);
365
- i0.ɵɵelementEnd()()();
366
- i0.ɵɵelementStart(31, "div", 18)(32, "div", 6)(33, "div", 7);
367
- i0.ɵɵelement(34, "i", 19);
368
- i0.ɵɵelementStart(35, "h3");
369
- i0.ɵɵtext(36, "Latest orders");
370
- i0.ɵɵelementEnd();
371
- i0.ɵɵelementStart(37, "span", 20)(38, "a", 21);
372
- i0.ɵɵlistener("click", function MJOOrdersDashboardPageComponent_Template_a_click_38_listener($event) { return ctx.go($event, "list"); });
373
- i0.ɵɵtext(39, "All orders \u2192");
374
- i0.ɵɵelementEnd()()();
375
- i0.ɵɵelementStart(40, "div", 22)(41, "table", 23)(42, "thead")(43, "tr")(44, "th");
376
- i0.ɵɵtext(45, "Order");
574
+ i0.ɵɵconditionalCreate(3, MJOOrdersDashboardPageComponent_Conditional_3_Template, 52, 11)(4, MJOOrdersDashboardPageComponent_Conditional_4_Template, 3, 1, "div", 3)(5, MJOOrdersDashboardPageComponent_Conditional_5_Template, 7, 1, "div", 4)(6, MJOOrdersDashboardPageComponent_Conditional_6_Template, 18, 5, "div", 5);
377
575
  i0.ɵɵelementEnd();
378
- i0.ɵɵelementStart(46, "th");
379
- i0.ɵɵtext(47, "Customer");
380
- i0.ɵɵelementEnd();
381
- i0.ɵɵelementStart(48, "th");
382
- i0.ɵɵtext(49, "Status");
383
- i0.ɵɵelementEnd();
384
- i0.ɵɵelementStart(50, "th", 24);
385
- i0.ɵɵtext(51, "Total");
386
- i0.ɵɵelementEnd()()();
387
- i0.ɵɵelementStart(52, "tbody");
388
- i0.ɵɵrepeaterCreate(53, MJOOrdersDashboardPageComponent_For_54_Template, 12, 10, "tr", 25, _forTrack1, false, MJOOrdersDashboardPageComponent_ForEmpty_55_Template, 3, 0, "tr");
389
- i0.ɵɵelementEnd()()()();
390
- i0.ɵɵelementStart(56, "div", 6)(57, "div", 7);
391
- i0.ɵɵelement(58, "i", 26);
392
- i0.ɵɵelementStart(59, "h3");
393
- i0.ɵɵtext(60, "Worth a look");
394
- i0.ɵɵelementEnd()();
395
- i0.ɵɵelementStart(61, "div", 14);
396
- i0.ɵɵrepeaterCreate(62, MJOOrdersDashboardPageComponent_For_63_Template, 6, 4, "mj-alert", 27, _forTrack2, false, MJOOrdersDashboardPageComponent_ForEmpty_64_Template, 1, 0, "mj-empty-state", 28);
397
- i0.ɵɵelementEnd()()();
398
576
  } if (rf & 2) {
577
+ i0.ɵɵadvance(2);
578
+ i0.ɵɵproperty("Tabs", ctx.Tabs)("ActiveKey", ctx.ActiveTab);
399
579
  i0.ɵɵadvance();
400
- i0.ɵɵproperty("Value", ctx.OpenCountDisplay)("Detail", ctx.OpenValueDisplay);
401
- i0.ɵɵadvance();
402
- i0.ɵɵproperty("Value", ctx.OpenBalanceDisplay);
403
- i0.ɵɵadvance();
404
- i0.ɵɵproperty("Value", ctx.OverdueValueDisplay)("Detail", ctx.OverdueDetail);
405
- i0.ɵɵadvance();
406
- i0.ɵɵproperty("Value", ctx.CreditsDisplay);
407
- i0.ɵɵadvance(8);
408
- i0.ɵɵrepeater(ctx.Queues);
409
- i0.ɵɵadvance(11);
410
- i0.ɵɵproperty("Bars", ctx.OrdersPerDay);
411
- i0.ɵɵadvance(7);
412
- i0.ɵɵproperty("Rows", ctx.StatusMix);
413
- i0.ɵɵadvance(23);
414
- i0.ɵɵrepeater(ctx.LatestOrders);
415
- i0.ɵɵadvance(9);
416
- i0.ɵɵrepeater(ctx.WorthALook);
417
- } }, dependencies: [CommonModule, MJAlertComponent, MJEmptyStateComponent, MJOStatTileComponent, MJOBarListComponent, MJODayBarsComponent, MJOMoneyPipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow: auto;\n padding: var(--mj-space-6);\n }\n \n\n .mjo-dash__split--wide[_ngcontent-%COMP%] {\n grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);\n margin-top: var(--mj-space-4);\n }\n .mjo-dash__split[_ngcontent-%COMP%] {\n display: grid;\n \n\n\n grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1fr);\n gap: var(--mj-space-4);\n margin-top: var(--mj-space-6);\n }\n .mjo-dash__queue[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: inherit;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:hover {\n text-decoration: none;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:hover .mjo-dash__queue-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n .mjo-dash__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n }\n .mjo-tone-neutral[_ngcontent-%COMP%] { background: var(--mj-status-neutral-bg); color: var(--mj-status-neutral-text); }\n .mjo-tone-info[_ngcontent-%COMP%] { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n .mjo-tone-warning[_ngcontent-%COMP%] { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .mjo-tone-error[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .mjo-tone-success[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .mjo-tone-violet[_ngcontent-%COMP%] { background: var(--mj-status-violet-bg); color: var(--mj-status-violet-text); }\n .mjo-dash__queue-body[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .mjo-dash__queue-label[_ngcontent-%COMP%] { font-weight: var(--mj-font-medium); }\n .mjo-dash__queue-note[_ngcontent-%COMP%] { display: block; }\n .mjo-dash__count[_ngcontent-%COMP%] { font-size: 16px; }\n .mjo-dash__note[_ngcontent-%COMP%] { margin-top: var(--mj-space-3); }\n\n @media (max-width: 1200px) {\n \n\n\n .mjo-dash__split[_ngcontent-%COMP%] { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n }\n @media (max-width: 1000px) {\n .mjo-dash__split[_ngcontent-%COMP%], \n .mjo-dash__split--wide[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }\n @media (max-width: 760px) {\n [_nghost-%COMP%] {\n padding: var(--mj-space-4);\n }\n }"] });
580
+ i0.ɵɵconditional(ctx.ActiveTab === "overview" ? 3 : ctx.ActiveTab === "explorer" ? 4 : ctx.ActiveTab === "fulfillment" ? 5 : ctx.ActiveTab === "aging" ? 6 : -1);
581
+ } }, dependencies: [CommonModule,
582
+ MJTabNavComponent,
583
+ EntityViewerModule, i1.EntityViewerComponent, MJAlertComponent,
584
+ MJEmptyStateComponent,
585
+ MJOStatTileComponent,
586
+ MJOBarListComponent,
587
+ MJODayBarsComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n overflow: hidden;\n }\n .mjo-dashboard-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n overflow-y: auto;\n padding: var(--mj-space-6);\n box-sizing: border-box;\n gap: var(--mj-space-4);\n }\n .mjo-tab-container[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-bottom: var(--mj-space-2);\n }\n .mjo-explorer-wrapper[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 600px;\n height: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .mjo-fulfillment-pane[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n height: 100%;\n display: flex;\n flex-direction: column;\n min-height: 600px;\n gap: var(--mj-space-4);\n }\n .mjo-dash__viewer-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 560px;\n min-height: 480px;\n }\n .mjo-dash__viewer-host[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n height: 100%;\n min-height: 400px;\n display: flex;\n flex-direction: column;\n }\n mj-entity-viewer[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n height: 100%;\n min-height: 350px;\n width: 100%;\n }\n .mjo-aging-pane[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n }\n .mjo-dash__split--wide[_ngcontent-%COMP%] {\n grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);\n margin-top: var(--mj-space-4);\n }\n .mjo-dash__split[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1fr);\n gap: var(--mj-space-4);\n margin-top: var(--mj-space-6);\n }\n .mjo-dash__queue[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: inherit;\n cursor: pointer;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:hover {\n text-decoration: none;\n }\n .mjo-dash__queue[_ngcontent-%COMP%]:hover .mjo-dash__queue-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n .mjo-dash__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n }\n .mjo-tone-neutral[_ngcontent-%COMP%] { background: var(--mj-status-neutral-bg); color: var(--mj-status-neutral-text); }\n .mjo-tone-info[_ngcontent-%COMP%] { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n .mjo-tone-warning[_ngcontent-%COMP%] { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .mjo-tone-error[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .mjo-tone-success[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .mjo-tone-violet[_ngcontent-%COMP%] { background: var(--mj-status-violet-bg); color: var(--mj-status-violet-text); }\n .mjo-dash__queue-body[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .mjo-dash__queue-label[_ngcontent-%COMP%] { font-weight: var(--mj-font-medium); }\n .mjo-dash__queue-note[_ngcontent-%COMP%] { display: block; }\n .mjo-dash__count[_ngcontent-%COMP%] { font-size: 16px; }\n\n @media (max-width: 1200px) {\n .mjo-dash__split[_ngcontent-%COMP%] { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n }\n @media (max-width: 1000px) {\n .mjo-dash__split[_ngcontent-%COMP%], \n .mjo-dash__split--wide[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }\n @media (max-width: 760px) {\n .mjo-dashboard-container[_ngcontent-%COMP%] {\n padding: var(--mj-space-4);\n }\n }"] });
418
588
  }
419
589
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJOOrdersDashboardPageComponent, [{
420
590
  type: Component,
421
- args: [{ selector: 'mjo-orders-dashboard-page', standalone: true, imports: [CommonModule, MJAlertComponent, MJEmptyStateComponent, MJOStatTileComponent, MJOBarListComponent, MJODayBarsComponent, MJOMoneyPipe], template: `
422
- <div class="mj-stat-grid">
423
- <mjo-stat-tile
424
- Label="Open orders"
425
- Icon="fa-solid fa-file-invoice-dollar"
426
- [Value]="OpenCountDisplay"
427
- [Detail]="OpenValueDisplay" />
591
+ args: [{ selector: 'mjo-orders-dashboard-page', standalone: true, imports: [
592
+ CommonModule,
593
+ MJTabNavComponent,
594
+ EntityViewerModule,
595
+ MJAlertComponent,
596
+ MJEmptyStateComponent,
597
+ MJOStatTileComponent,
598
+ MJOBarListComponent,
599
+ MJODayBarsComponent
600
+ ], template: `
601
+ <div class="mjo-dashboard-container">
602
+ <div class="mjo-tab-container">
603
+ <mj-tab-nav [Tabs]="Tabs" [ActiveKey]="ActiveTab" (TabChange)="OnTabChange($event)"></mj-tab-nav>
604
+ </div>
428
605
 
429
- <mjo-stat-tile
430
- Label="Open balance"
431
- Icon="fa-solid fa-scale-balanced"
432
- [Value]="OpenBalanceDisplay"
433
- Detail="Confirmed orders still carrying a balance" />
606
+ @if (ActiveTab === 'overview') {
607
+ <div class="mj-stat-grid">
608
+ <mjo-stat-tile
609
+ Label="Open orders"
610
+ Icon="fa-solid fa-file-invoice-dollar"
611
+ [Value]="OpenCountDisplay"
612
+ [Detail]="OpenValueDisplay"
613
+ (Clicked)="OpenExplorerPreset('all')" />
434
614
 
435
- <mjo-stat-tile
436
- Label="Overdue"
437
- Icon="fa-solid fa-hourglass-half"
438
- Tone="alert"
439
- [Value]="OverdueValueDisplay"
440
- [Detail]="OverdueDetail"
441
- (Clicked)="NavigateRequested.emit('list')" />
615
+ <mjo-stat-tile
616
+ Label="Open balance"
617
+ Icon="fa-solid fa-scale-balanced"
618
+ [Value]="OpenBalanceDisplay"
619
+ Detail="Confirmed orders still carrying a balance"
620
+ (Clicked)="OpenExplorerPreset('unpaid')" />
442
621
 
443
- <mjo-stat-tile
444
- Label="Credits held"
445
- Icon="fa-solid fa-piggy-bank"
446
- [Value]="CreditsDisplay"
447
- Detail="Offer these before invoicing again"
448
- (Clicked)="NavigateRequested.emit('list')" />
449
- </div>
622
+ <mjo-stat-tile
623
+ Label="Overdue"
624
+ Icon="fa-solid fa-hourglass-half"
625
+ Tone="alert"
626
+ [Value]="OverdueValueDisplay"
627
+ [Detail]="OverdueDetail"
628
+ (Clicked)="OpenExplorerPreset('overdue')" />
450
629
 
451
- <div class="mjo-dash__split">
452
- <div class="mj-card">
453
- <div class="mj-card-head">
454
- <i class="fa-solid fa-list-check" aria-hidden="true"></i>
455
- <h3>Needs someone</h3>
456
- </div>
457
- <div class="mj-card-pad mjo-dash__queues">
458
- @for (queue of Queues; track queue.Label) {
459
- <a href="#" class="mjo-dash__queue" (click)="go($event, queue.PageId)">
460
- <span class="mjo-dash__icon" [class]="'mjo-tone-' + queue.Tone">
461
- <i [class]="queue.Icon" aria-hidden="true"></i>
462
- </span>
463
- <span class="mjo-dash__queue-body">
464
- <span class="mjo-dash__queue-label">{{ queue.Label }}</span>
465
- @if (queue.Note) {
466
- <span class="small muted mjo-dash__queue-note">{{ queue.Note }}</span>
467
- }
468
- </span>
469
- <b class="mj-num mjo-dash__count">{{ queue.Count }}</b>
470
- <i class="fa-solid fa-chevron-right muted tiny" aria-hidden="true"></i>
471
- </a>
472
- } @empty {
473
- <div class="small muted">Nothing is waiting. Unusual, and worth enjoying.</div>
474
- }
630
+ <mjo-stat-tile
631
+ Label="Credits held"
632
+ Icon="fa-solid fa-piggy-bank"
633
+ [Value]="CreditsDisplay"
634
+ Detail="Offer these before invoicing again"
635
+ (Clicked)="OpenExplorerPreset('credits')" />
475
636
  </div>
476
- </div>
477
637
 
478
- <div class="mj-card">
479
- <div class="mj-card-head">
480
- <i class="fa-solid fa-chart-simple" aria-hidden="true"></i>
481
- <h3>Orders per day</h3>
482
- <span class="right small muted">last 7 days</span>
483
- </div>
484
- <div class="mj-card-pad">
485
- <mjo-day-bars [Bars]="OrdersPerDay" Unit="orders" />
486
- </div>
487
- </div>
638
+ <div class="mjo-dash__split">
639
+ <div class="mj-card">
640
+ <div class="mj-card-head">
641
+ <i class="fa-solid fa-list-check" aria-hidden="true"></i>
642
+ <h3>Needs someone</h3>
643
+ </div>
644
+ <div class="mj-card-pad mjo-dash__queues">
645
+ @for (queue of Queues; track queue.Label) {
646
+ <a href="#" class="mjo-dash__queue" (click)="goQueue($event, queue)">
647
+ <span class="mjo-dash__icon" [class]="'mjo-tone-' + queue.Tone">
648
+ <i [class]="queue.Icon" aria-hidden="true"></i>
649
+ </span>
650
+ <span class="mjo-dash__queue-body">
651
+ <span class="mjo-dash__queue-label">{{ queue.Label }}</span>
652
+ @if (queue.Note) {
653
+ <span class="small muted mjo-dash__queue-note">{{ queue.Note }}</span>
654
+ }
655
+ </span>
656
+ <b class="mj-num mjo-dash__count">{{ queue.Count }}</b>
657
+ <i class="fa-solid fa-chevron-right muted tiny" aria-hidden="true"></i>
658
+ </a>
659
+ } @empty {
660
+ <div class="small muted">Nothing is waiting. Unusual, and worth enjoying.</div>
661
+ }
662
+ </div>
663
+ </div>
488
664
 
489
- <div class="mj-card">
490
- <div class="mj-card-head">
491
- <i class="fa-solid fa-layer-group" aria-hidden="true"></i>
492
- <h3>Where orders are sitting</h3>
493
- </div>
494
- <div class="mj-card-pad">
495
- <mjo-bar-list [Rows]="StatusMix" EmptyText="No orders yet." />
496
- </div>
497
- </div>
498
- </div>
665
+ <div class="mj-card">
666
+ <div class="mj-card-head">
667
+ <i class="fa-solid fa-chart-simple" aria-hidden="true"></i>
668
+ <h3>Orders per day</h3>
669
+ <span class="right small muted">last 7 days</span>
670
+ </div>
671
+ <div class="mj-card-pad">
672
+ <mjo-day-bars [Bars]="OrdersPerDay" Unit="orders" />
673
+ </div>
674
+ </div>
499
675
 
500
- <div class="mjo-dash__split mjo-dash__split--wide">
501
- <div class="mj-card">
502
- <div class="mj-card-head">
503
- <i class="fa-solid fa-clock-rotate-left" aria-hidden="true"></i>
504
- <h3>Latest orders</h3>
505
- <span class="right">
506
- <a href="#" class="small" (click)="go($event, 'list')">All orders →</a>
507
- </span>
676
+ <div class="mj-card">
677
+ <div class="mj-card-head">
678
+ <i class="fa-solid fa-layer-group" aria-hidden="true"></i>
679
+ <h3>Where orders are sitting</h3>
680
+ </div>
681
+ <div class="mj-card-pad">
682
+ <mjo-bar-list [Rows]="StatusMix" EmptyText="No orders yet." />
683
+ </div>
684
+ </div>
508
685
  </div>
509
- <div class="mj-table-wrap">
510
- <table class="mj-table mj-table--compact">
511
- <thead>
512
- <tr>
513
- <th>Order</th>
514
- <th>Customer</th>
515
- <th>Status</th>
516
- <th class="num">Total</th>
517
- </tr>
518
- </thead>
519
- <tbody>
520
- @for (order of LatestOrders; track order.ID) {
521
- <tr class="is-clickable" (click)="OrderOpened.emit(order)">
522
- <td><span class="mono">{{ order.OrderNumber }}</span></td>
523
- <td>{{ customerOf(order) }}</td>
524
- <td>
525
- <span class="mj-chip" [class]="statusClass(order)">
526
- {{ order.Status }}
527
- </span>
528
- </td>
529
- <td class="num" [class.mj-money--neg]="(order.TotalGross ?? 0) < 0">
530
- {{ (order.TotalGross ?? 0) | mjoMoney }}
531
- </td>
532
- </tr>
533
- } @empty {
534
- <tr><td colspan="4" class="small muted">No orders yet.</td></tr>
686
+
687
+ <div class="mjo-dash__split mjo-dash__split--wide">
688
+ <div class="mj-card mjo-dash__viewer-card">
689
+ <div class="mj-card-head">
690
+ <i class="fa-solid fa-table-list" aria-hidden="true"></i>
691
+ <h3>Active Orders</h3>
692
+ <span class="right">
693
+ <a href="#" class="small" (click)="OnTabChange('explorer')">Full-screen Explorer →</a>
694
+ </span>
695
+ </div>
696
+ <div class="mjo-dash__viewer-host">
697
+ @if (OrderEntityInfo) {
698
+ <mj-entity-viewer
699
+ [Entity]="OrderEntityInfo"
700
+ (RecordOpened)="OnRecordOpened($event)">
701
+ </mj-entity-viewer>
702
+ } @else {
703
+ <div class="small muted" style="padding: 24px;">Loading order metadata...</div>
535
704
  }
536
- </tbody>
537
- </table>
538
- </div>
539
- </div>
705
+ </div>
706
+ </div>
540
707
 
541
- <div class="mj-card">
542
- <div class="mj-card-head">
543
- <i class="fa-solid fa-triangle-exclamation" aria-hidden="true"></i>
544
- <h3>Worth a look</h3>
708
+ <div class="mj-card">
709
+ <div class="mj-card-head">
710
+ <i class="fa-solid fa-triangle-exclamation" aria-hidden="true"></i>
711
+ <h3>Worth a look</h3>
712
+ </div>
713
+ <div class="mj-card-pad">
714
+ @for (item of WorthALook; track item.Order.ID) {
715
+ <mj-alert [Variant]="item.Tone" [Icon]="item.Icon" Role="note">
716
+ <strong>{{ item.Headline }}</strong>
717
+ {{ item.Detail }}
718
+ <a href="#" class="small" (click)="openFrom($event, item.Order)">Work it →</a>
719
+ </mj-alert>
720
+ } @empty {
721
+ <mj-empty-state
722
+ Icon="fa-solid fa-circle-check"
723
+ Title="Nothing is asking for attention"
724
+ Size="compact" />
725
+ }
726
+ </div>
727
+ </div>
545
728
  </div>
546
- <div class="mj-card-pad">
547
- @for (item of WorthALook; track item.Order.ID) {
548
- <mj-alert [Variant]="item.Tone" [Icon]="item.Icon" Role="note">
549
- <strong>{{ item.Headline }}</strong>
550
- {{ item.Detail }}
551
- <a href="#" class="small" (click)="openFrom($event, item.Order)">Work it →</a>
552
- </mj-alert>
553
- } @empty {
554
- <mj-empty-state
555
- Icon="fa-solid fa-circle-check"
556
- Title="Nothing is asking for attention"
557
- Size="compact" />
729
+ } @else if (ActiveTab === 'explorer') {
730
+ <div class="mjo-explorer-wrapper">
731
+ @if (OrderEntityInfo) {
732
+ <mj-entity-viewer
733
+ [Entity]="OrderEntityInfo"
734
+ [ViewEntity]="ExplorerView"
735
+ (RecordOpened)="OnRecordOpened($event)">
736
+ </mj-entity-viewer>
737
+ } @else {
738
+ <div class="small muted" style="padding: 24px;">Loading order metadata...</div>
558
739
  }
559
740
  </div>
560
- </div>
741
+ } @else if (ActiveTab === 'fulfillment') {
742
+ <div class="mjo-fulfillment-pane">
743
+ <p class="mjo-note mjo-fq__note">
744
+ <i class="fa-solid fa-circle-info" aria-hidden="true"></i>
745
+ Everything here is already paid for and booked. What is outstanding is the goods, and what this queue controls is the physical line fulfillment state.
746
+ </p>
747
+ <div class="mjo-explorer-wrapper">
748
+ @if (OrderLineEntityInfo) {
749
+ <mj-entity-viewer
750
+ [Entity]="OrderLineEntityInfo"
751
+ [ViewEntity]="FulfillmentQueueView"
752
+ (RecordOpened)="OnRecordOpened($event)">
753
+ </mj-entity-viewer>
754
+ } @else {
755
+ <div class="small muted" style="padding: 24px;">Loading fulfillment queue...</div>
756
+ }
757
+ </div>
758
+ </div>
759
+ } @else if (ActiveTab === 'aging') {
760
+ <div class="mjo-aging-pane">
761
+ <div class="mj-stat-grid">
762
+ <mjo-stat-tile
763
+ Label="Current (0-30 days)"
764
+ Icon="fa-solid fa-check"
765
+ [Value]="AgingCurrentDisplay"
766
+ Detail="Due or recently invoiced" />
767
+ <mjo-stat-tile
768
+ Label="31–60 days"
769
+ Icon="fa-solid fa-clock"
770
+ Tone="default"
771
+ [Value]="Aging30Display"
772
+ Detail="First reminder interval" />
773
+ <mjo-stat-tile
774
+ Label="61–90 days"
775
+ Icon="fa-solid fa-triangle-exclamation"
776
+ Tone="alert"
777
+ [Value]="Aging60Display"
778
+ Detail="Escalated collection required" />
779
+ <mjo-stat-tile
780
+ Label="90+ days overdue"
781
+ Icon="fa-solid fa-circle-xmark"
782
+ Tone="alert"
783
+ [Value]="Aging90Display"
784
+ Detail="High risk receivables" />
785
+ </div>
786
+
787
+ <div class="mjo-dash__split mjo-dash__split--wide" style="margin-top: var(--mj-space-6);">
788
+ <div class="mj-card mjo-dash__viewer-card" style="grid-column: 1 / -1; height: 600px;">
789
+ <div class="mj-card-head">
790
+ <i class="fa-solid fa-hourglass-half" aria-hidden="true"></i>
791
+ <h3>Overdue Collections Worklist</h3>
792
+ <span class="right">
793
+ <a href="#" class="small" (click)="OpenExplorerPreset('overdue')">Open in Explorer →</a>
794
+ </span>
795
+ </div>
796
+ <div class="mjo-dash__viewer-host" style="min-height: 520px;">
797
+ @if (OrderEntityInfo) {
798
+ <mj-entity-viewer
799
+ [Entity]="OrderEntityInfo"
800
+ [ViewEntity]="AgingOverdueView"
801
+ (RecordOpened)="OnRecordOpened($event)">
802
+ </mj-entity-viewer>
803
+ } @else {
804
+ <div class="small muted" style="padding: 24px;">Loading order metadata...</div>
805
+ }
806
+ </div>
807
+ </div>
808
+ </div>
809
+ </div>
810
+ }
561
811
  </div>
562
- `, styles: ["\n :host {\n display: block;\n height: 100%;\n overflow: auto;\n padding: var(--mj-space-6);\n }\n /* The bottom row is two panels, not three \u2014 a table needs the width. */\n .mjo-dash__split--wide {\n grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);\n margin-top: var(--mj-space-4);\n }\n .mjo-dash__split {\n display: grid;\n /* Queues, the per-day chart, and the status mix. The queues get the\n most room because they are the only column anyone acts on. */\n grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1fr);\n gap: var(--mj-space-4);\n margin-top: var(--mj-space-6);\n }\n .mjo-dash__queue {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: inherit;\n }\n .mjo-dash__queue:last-child {\n border-bottom: none;\n }\n .mjo-dash__queue:hover {\n text-decoration: none;\n }\n .mjo-dash__queue:hover .mjo-dash__queue-label {\n color: var(--mj-brand-primary);\n }\n .mjo-dash__icon {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n }\n .mjo-tone-neutral { background: var(--mj-status-neutral-bg); color: var(--mj-status-neutral-text); }\n .mjo-tone-info { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n .mjo-tone-warning { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .mjo-tone-error { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .mjo-tone-success { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .mjo-tone-violet { background: var(--mj-status-violet-bg); color: var(--mj-status-violet-text); }\n .mjo-dash__queue-body { flex: 1; min-width: 0; }\n .mjo-dash__queue-label { font-weight: var(--mj-font-medium); }\n .mjo-dash__queue-note { display: block; }\n .mjo-dash__count { font-size: 16px; }\n .mjo-dash__note { margin-top: var(--mj-space-3); }\n\n @media (max-width: 1200px) {\n /* Three panels do not survive this width; the chart is the one\n that reads worst when squeezed, so it wraps first. */\n .mjo-dash__split { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n }\n @media (max-width: 1000px) {\n .mjo-dash__split,\n .mjo-dash__split--wide { grid-template-columns: 1fr; }\n }\n @media (max-width: 760px) {\n :host {\n padding: var(--mj-space-4);\n }\n }\n "] }]
812
+ `, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n overflow: hidden;\n }\n .mjo-dashboard-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n overflow-y: auto;\n padding: var(--mj-space-6);\n box-sizing: border-box;\n gap: var(--mj-space-4);\n }\n .mjo-tab-container {\n flex-shrink: 0;\n margin-bottom: var(--mj-space-2);\n }\n .mjo-explorer-wrapper {\n flex: 1 1 auto;\n min-height: 600px;\n height: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .mjo-fulfillment-pane {\n flex: 1 1 auto;\n height: 100%;\n display: flex;\n flex-direction: column;\n min-height: 600px;\n gap: var(--mj-space-4);\n }\n .mjo-dash__viewer-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 560px;\n min-height: 480px;\n }\n .mjo-dash__viewer-host {\n flex: 1 1 auto;\n height: 100%;\n min-height: 400px;\n display: flex;\n flex-direction: column;\n }\n mj-entity-viewer {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n height: 100%;\n min-height: 350px;\n width: 100%;\n }\n .mjo-aging-pane {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n }\n .mjo-dash__split--wide {\n grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);\n margin-top: var(--mj-space-4);\n }\n .mjo-dash__split {\n display: grid;\n grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1fr);\n gap: var(--mj-space-4);\n margin-top: var(--mj-space-6);\n }\n .mjo-dash__queue {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: inherit;\n cursor: pointer;\n }\n .mjo-dash__queue:last-child {\n border-bottom: none;\n }\n .mjo-dash__queue:hover {\n text-decoration: none;\n }\n .mjo-dash__queue:hover .mjo-dash__queue-label {\n color: var(--mj-brand-primary);\n }\n .mjo-dash__icon {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n }\n .mjo-tone-neutral { background: var(--mj-status-neutral-bg); color: var(--mj-status-neutral-text); }\n .mjo-tone-info { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n .mjo-tone-warning { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .mjo-tone-error { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .mjo-tone-success { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .mjo-tone-violet { background: var(--mj-status-violet-bg); color: var(--mj-status-violet-text); }\n .mjo-dash__queue-body { flex: 1; min-width: 0; }\n .mjo-dash__queue-label { font-weight: var(--mj-font-medium); }\n .mjo-dash__queue-note { display: block; }\n .mjo-dash__count { font-size: 16px; }\n\n @media (max-width: 1200px) {\n .mjo-dash__split { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n }\n @media (max-width: 1000px) {\n .mjo-dash__split,\n .mjo-dash__split--wide { grid-template-columns: 1fr; }\n }\n @media (max-width: 760px) {\n .mjo-dashboard-container {\n padding: var(--mj-space-4);\n }\n }\n "] }]
563
813
  }], null, { NavigateRequested: [{
564
814
  type: Output
565
815
  }], OrderOpened: [{
566
816
  type: Output
567
817
  }] }); })();
568
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJOOrdersDashboardPageComponent, { className: "MJOOrdersDashboardPageComponent", filePath: "lib/pages/orders/orders-dashboard.page.ts", lineNumber: 272 }); })();
818
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJOOrdersDashboardPageComponent, { className: "MJOOrdersDashboardPageComponent", filePath: "lib/pages/orders/orders-dashboard.page.ts", lineNumber: 406 }); })();
569
819
  //# sourceMappingURL=orders-dashboard.page.js.map