@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.
- package/dist/checkout-element/main.js +38080 -0
- package/dist/lib/checkout-widget/checkout-draft-line.d.ts +25 -0
- package/dist/lib/checkout-widget/checkout-draft-line.d.ts.map +1 -0
- package/dist/lib/checkout-widget/checkout-draft-line.js +46 -0
- package/dist/lib/checkout-widget/checkout-draft-line.js.map +1 -0
- package/dist/lib/checkout-widget/checkout-public-host.component.d.ts +80 -0
- package/dist/lib/checkout-widget/checkout-public-host.component.d.ts.map +1 -0
- package/dist/lib/checkout-widget/checkout-public-host.component.js +360 -0
- package/dist/lib/checkout-widget/checkout-public-host.component.js.map +1 -0
- package/dist/lib/checkout-widget/checkout-widget.component.d.ts +143 -0
- package/dist/lib/checkout-widget/checkout-widget.component.d.ts.map +1 -0
- package/dist/lib/checkout-widget/checkout-widget.component.js +873 -0
- package/dist/lib/checkout-widget/checkout-widget.component.js.map +1 -0
- package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts +1 -0
- package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts.map +1 -1
- package/dist/lib/custom/OrderHeader/order-header-form.component.js +10 -6
- package/dist/lib/custom/OrderHeader/order-header-form.component.js.map +1 -1
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts +2 -0
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts.map +1 -1
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.js +37 -11
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.js.map +1 -1
- package/dist/lib/form-panels/party-order-stats.js +2 -2
- package/dist/lib/form-panels/party-order-stats.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.js +103 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutSession/mjbizappsorderscheckoutsession.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.js +136 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidget/mjbizappsorderscheckoutwidget.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.js +106 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersCheckoutWidgetDistribution/mjbizappsorderscheckoutwidgetdistribution.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersEventOrderLine/mjbizappsorderseventorderline.form.component.js +9 -9
- package/dist/lib/generated/Entities/mjBizAppsOrdersEventOrderLine/mjbizappsorderseventorderline.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersEventProduct/mjbizappsorderseventproduct.form.component.js +12 -12
- package/dist/lib/generated/Entities/mjBizAppsOrdersEventProduct/mjbizappsorderseventproduct.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.js +16 -10
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderCompanyPolicy/mjbizappsordersordercompanypolicy.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js +78 -52
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.js +88 -82
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLine/mjbizappsordersorderline.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js +3 -3
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.js +23 -5
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentIntent/mjbizappsorderspaymentintent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.js +75 -69
- package/dist/lib/generated/Entities/mjBizAppsOrdersProduct/mjbizappsordersproduct.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.js +37 -31
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductCategory/mjbizappsordersproductcategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.js +24 -16
- package/dist/lib/generated/Entities/mjBizAppsOrdersProductType/mjbizappsordersproducttype.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +54 -51
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +27 -18
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/pages/catalog/pricing.page.d.ts +3 -24
- package/dist/lib/pages/catalog/pricing.page.d.ts.map +1 -1
- package/dist/lib/pages/catalog/pricing.page.js +158 -214
- package/dist/lib/pages/catalog/pricing.page.js.map +1 -1
- package/dist/lib/pages/catalog/products.page.d.ts +6 -29
- package/dist/lib/pages/catalog/products.page.d.ts.map +1 -1
- package/dist/lib/pages/catalog/products.page.js +255 -315
- package/dist/lib/pages/catalog/products.page.js.map +1 -1
- package/dist/lib/pages/orders/fulfillment.page.d.ts +14 -97
- package/dist/lib/pages/orders/fulfillment.page.d.ts.map +1 -1
- package/dist/lib/pages/orders/fulfillment.page.js +93 -258
- package/dist/lib/pages/orders/fulfillment.page.js.map +1 -1
- package/dist/lib/pages/orders/order-document.page.js +1 -1
- package/dist/lib/pages/orders/order-document.page.js.map +1 -1
- package/dist/lib/pages/orders/orders-dashboard.page.d.ts +29 -58
- package/dist/lib/pages/orders/orders-dashboard.page.d.ts.map +1 -1
- package/dist/lib/pages/orders/orders-dashboard.page.js +602 -352
- package/dist/lib/pages/orders/orders-dashboard.page.js.map +1 -1
- package/dist/lib/pages/orders/orders-list.page.d.ts +8 -58
- package/dist/lib/pages/orders/orders-list.page.d.ts.map +1 -1
- package/dist/lib/pages/orders/orders-list.page.js +52 -237
- package/dist/lib/pages/orders/orders-list.page.js.map +1 -1
- package/dist/lib/pages/payments/account-credit.page.d.ts +7 -17
- package/dist/lib/pages/payments/account-credit.page.d.ts.map +1 -1
- package/dist/lib/pages/payments/account-credit.page.js +99 -85
- package/dist/lib/pages/payments/account-credit.page.js.map +1 -1
- package/dist/lib/pages/payments/payments-dashboard.page.d.ts +4 -15
- package/dist/lib/pages/payments/payments-dashboard.page.d.ts.map +1 -1
- package/dist/lib/pages/payments/payments-dashboard.page.js +76 -111
- package/dist/lib/pages/payments/payments-dashboard.page.js.map +1 -1
- package/dist/lib/pages/payments/payments-list.page.d.ts +7 -41
- package/dist/lib/pages/payments/payments-list.page.d.ts.map +1 -1
- package/dist/lib/pages/payments/payments-list.page.js +51 -130
- package/dist/lib/pages/payments/payments-list.page.js.map +1 -1
- package/dist/lib/pages/receivables/customer-ar.page.d.ts +6 -8
- package/dist/lib/pages/receivables/customer-ar.page.d.ts.map +1 -1
- package/dist/lib/pages/receivables/customer-ar.page.js +112 -100
- package/dist/lib/pages/receivables/customer-ar.page.js.map +1 -1
- package/dist/lib/pages/receivables/overdue.page.d.ts +6 -3
- package/dist/lib/pages/receivables/overdue.page.d.ts.map +1 -1
- package/dist/lib/pages/receivables/overdue.page.js +61 -65
- package/dist/lib/pages/receivables/overdue.page.js.map +1 -1
- package/dist/lib/pages/receivables/subscriptions.page.d.ts +5 -9
- package/dist/lib/pages/receivables/subscriptions.page.d.ts.map +1 -1
- package/dist/lib/pages/receivables/subscriptions.page.js +139 -153
- package/dist/lib/pages/receivables/subscriptions.page.js.map +1 -1
- package/dist/lib/panels/order-stages.d.ts +12 -16
- package/dist/lib/panels/order-stages.d.ts.map +1 -1
- package/dist/lib/panels/order-stages.js +6 -42
- package/dist/lib/panels/order-stages.js.map +1 -1
- package/dist/lib/panels/party-orders-overview.component.d.ts +3 -1
- package/dist/lib/panels/party-orders-overview.component.d.ts.map +1 -1
- package/dist/lib/panels/party-orders-overview.component.js +18 -6
- package/dist/lib/panels/party-orders-overview.component.js.map +1 -1
- package/dist/lib/panels/status-stepper.component.d.ts +1 -1
- package/dist/lib/panels/status-stepper.component.d.ts.map +1 -1
- package/dist/lib/services/pricing-scheduler.service.d.ts +3 -4
- package/dist/lib/services/pricing-scheduler.service.d.ts.map +1 -1
- package/dist/lib/services/pricing-scheduler.service.js +3 -4
- package/dist/lib/services/pricing-scheduler.service.js.map +1 -1
- package/dist/public-api.d.ts +3 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -2
- package/dist/public-api.js.map +1 -1
- package/package.json +28 -16
- package/dist/lib/pages/orders/order-editor.page.d.ts +0 -547
- package/dist/lib/pages/orders/order-editor.page.d.ts.map +0 -1
- package/dist/lib/pages/orders/order-editor.page.js +0 -2269
- package/dist/lib/pages/orders/order-editor.page.js.map +0 -1
- package/dist/lib/pages/orders/order-workspace.page.d.ts +0 -120
- package/dist/lib/pages/orders/order-workspace.page.d.ts.map +0 -1
- package/dist/lib/pages/orders/order-workspace.page.js +0 -443
- 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
|
|
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
|
-
|
|
13
|
-
|
|
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
|
|
20
|
+
const queue_r4 = i0.ɵɵnextContext().$implicit;
|
|
19
21
|
i0.ɵɵadvance();
|
|
20
|
-
i0.ɵɵtextInterpolate(
|
|
22
|
+
i0.ɵɵtextInterpolate(queue_r4.Note);
|
|
21
23
|
} }
|
|
22
|
-
function
|
|
23
|
-
const
|
|
24
|
-
i0.ɵɵelementStart(0, "a",
|
|
25
|
-
i0.ɵɵlistener("click", function
|
|
26
|
-
i0.ɵɵelementStart(1, "span",
|
|
27
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
31
|
+
i0.ɵɵelementStart(3, "span", 38)(4, "span", 39);
|
|
30
32
|
i0.ɵɵtext(5);
|
|
31
33
|
i0.ɵɵelementEnd();
|
|
32
|
-
i0.ɵɵconditionalCreate(6,
|
|
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",
|
|
36
|
+
i0.ɵɵelementStart(7, "b", 41);
|
|
35
37
|
i0.ɵɵtext(8);
|
|
36
38
|
i0.ɵɵelementEnd();
|
|
37
|
-
i0.ɵɵelement(9, "i",
|
|
39
|
+
i0.ɵɵelement(9, "i", 42);
|
|
38
40
|
i0.ɵɵelementEnd();
|
|
39
41
|
} if (rf & 2) {
|
|
40
|
-
const
|
|
42
|
+
const queue_r4 = ctx.$implicit;
|
|
41
43
|
i0.ɵɵadvance();
|
|
42
|
-
i0.ɵɵclassMap("mjo-tone-" +
|
|
44
|
+
i0.ɵɵclassMap("mjo-tone-" + queue_r4.Tone);
|
|
43
45
|
i0.ɵɵadvance();
|
|
44
|
-
i0.ɵɵclassMap(
|
|
46
|
+
i0.ɵɵclassMap(queue_r4.Icon);
|
|
45
47
|
i0.ɵɵadvance(3);
|
|
46
|
-
i0.ɵɵtextInterpolate(
|
|
48
|
+
i0.ɵɵtextInterpolate(queue_r4.Label);
|
|
47
49
|
i0.ɵɵadvance();
|
|
48
|
-
i0.ɵɵconditional(
|
|
50
|
+
i0.ɵɵconditional(queue_r4.Note ? 6 : -1);
|
|
49
51
|
i0.ɵɵadvance(2);
|
|
50
|
-
i0.ɵɵtextInterpolate(
|
|
52
|
+
i0.ɵɵtextInterpolate(queue_r4.Count);
|
|
51
53
|
} }
|
|
52
|
-
function
|
|
53
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
58
|
-
const
|
|
59
|
-
i0.ɵɵelementStart(0, "
|
|
60
|
-
i0.ɵɵlistener("
|
|
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
|
|
76
|
-
|
|
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
|
|
91
|
-
i0.ɵɵelementStart(0, "
|
|
92
|
-
i0.ɵɵtext(
|
|
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
|
|
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",
|
|
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",
|
|
102
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
114
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
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` —
|
|
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
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
287
|
-
|
|
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
|
|
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: '
|
|
295
|
-
Note: '
|
|
296
|
-
Count:
|
|
297
|
-
Icon: 'fa-solid fa-
|
|
298
|
-
Tone: '
|
|
299
|
-
PageId: '
|
|
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
|
-
|
|
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
|
-
|
|
556
|
+
goQueue(event, queue) {
|
|
326
557
|
event.preventDefault();
|
|
327
|
-
|
|
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:
|
|
331
|
-
i0.ɵɵelementStart(0, "div", 0);
|
|
332
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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.ɵɵ
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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: [
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
<
|
|
517
|
-
</
|
|
518
|
-
</
|
|
519
|
-
<
|
|
520
|
-
@
|
|
521
|
-
<
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
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
|
-
</
|
|
537
|
-
</
|
|
538
|
-
</div>
|
|
539
|
-
</div>
|
|
705
|
+
</div>
|
|
706
|
+
</div>
|
|
540
707
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|