@mj-biz-apps/orders-ng 5.18.0 → 5.20.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 +1 -3
- package/dist/lib/checkout-widget/checkout-draft-line.d.ts +4 -1
- package/dist/lib/checkout-widget/checkout-draft-line.d.ts.map +1 -1
- package/dist/lib/checkout-widget/checkout-draft-line.js +5 -3
- package/dist/lib/checkout-widget/checkout-draft-line.js.map +1 -1
- package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts +3 -1
- package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts.map +1 -1
- package/dist/lib/custom/OrderHeader/order-header-form.component.js +38 -25
- package/dist/lib/custom/OrderHeader/order-header-form.component.js.map +1 -1
- package/dist/lib/custom/OrderHeader/order-header-prefs.d.ts +15 -0
- package/dist/lib/custom/OrderHeader/order-header-prefs.d.ts.map +1 -1
- package/dist/lib/custom/OrderHeader/order-header-prefs.js +18 -0
- package/dist/lib/custom/OrderHeader/order-header-prefs.js.map +1 -1
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts +16 -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 +169 -60
- package/dist/lib/custom/OrderHeader/order-lines-editor.component.js.map +1 -1
- package/dist/lib/custom/OrderHeader/party-address-picker.component.d.ts.map +1 -1
- package/dist/lib/custom/OrderHeader/party-address-picker.component.js +7 -3
- package/dist/lib/custom/OrderHeader/party-address-picker.component.js.map +1 -1
- package/dist/lib/custom/PaymentHeader/payment-header-form.component.d.ts +23 -0
- package/dist/lib/custom/PaymentHeader/payment-header-form.component.d.ts.map +1 -1
- package/dist/lib/custom/PaymentHeader/payment-header-form.component.js +276 -189
- package/dist/lib/custom/PaymentHeader/payment-header-form.component.js.map +1 -1
- package/dist/lib/form-panels/document-forms.module.d.ts +8 -7
- package/dist/lib/form-panels/document-forms.module.d.ts.map +1 -1
- package/dist/lib/form-panels/document-forms.module.js +10 -3
- package/dist/lib/form-panels/document-forms.module.js.map +1 -1
- package/dist/lib/form-panels/external-invoices.panel.d.ts +104 -0
- package/dist/lib/form-panels/external-invoices.panel.d.ts.map +1 -0
- package/dist/lib/form-panels/external-invoices.panel.js +667 -0
- package/dist/lib/form-panels/external-invoices.panel.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.js +65 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.js +95 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.js +83 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js +50 -14
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.js +85 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js +25 -7
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.js +106 -27
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.js +67 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.js +29 -21
- package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +24 -19
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +17 -2
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/pages/orders/order-document.page.d.ts +3 -1
- package/dist/lib/pages/orders/order-document.page.d.ts.map +1 -1
- package/dist/lib/pages/orders/order-document.page.js +9 -3
- package/dist/lib/pages/orders/order-document.page.js.map +1 -1
- package/dist/lib/pages/receivables/billing.page.d.ts +9 -0
- package/dist/lib/pages/receivables/billing.page.d.ts.map +1 -1
- package/dist/lib/pages/receivables/billing.page.js +49 -1
- package/dist/lib/pages/receivables/billing.page.js.map +1 -1
- package/dist/lib/pages/receivables/external-invoicing-queue.page.d.ts +85 -0
- package/dist/lib/pages/receivables/external-invoicing-queue.page.d.ts.map +1 -0
- package/dist/lib/pages/receivables/external-invoicing-queue.page.js +504 -0
- package/dist/lib/pages/receivables/external-invoicing-queue.page.js.map +1 -0
- package/dist/lib/pages/receivables/progress.page.d.ts +64 -0
- package/dist/lib/pages/receivables/progress.page.d.ts.map +1 -0
- package/dist/lib/pages/receivables/progress.page.js +383 -0
- package/dist/lib/pages/receivables/progress.page.js.map +1 -0
- package/dist/lib/panels/external-invoice-view.d.ts +70 -0
- package/dist/lib/panels/external-invoice-view.d.ts.map +1 -0
- package/dist/lib/panels/external-invoice-view.js +117 -0
- package/dist/lib/panels/external-invoice-view.js.map +1 -0
- package/dist/lib/sections/orders-sections.component.d.ts.map +1 -1
- package/dist/lib/sections/orders-sections.component.js +10 -4
- package/dist/lib/sections/orders-sections.component.js.map +1 -1
- package/dist/lib/sections/section-nav.model.d.ts.map +1 -1
- package/dist/lib/sections/section-nav.model.js +2 -0
- package/dist/lib/sections/section-nav.model.js.map +1 -1
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +2 -2
|
@@ -37659,9 +37659,7 @@ function stripeConfirmAlreadyCollected(error) {
|
|
|
37659
37659
|
return msg.includes("already succeeded") || msg.includes("already been confirmed") || msg.includes("already been captured");
|
|
37660
37660
|
}
|
|
37661
37661
|
function formatStripeError(error) {
|
|
37662
|
-
|
|
37663
|
-
const code = error?.code?.trim();
|
|
37664
|
-
return code && !msg.includes(code) ? `${msg} (${code})` : msg;
|
|
37662
|
+
return error?.message?.trim() || "Payment failed.";
|
|
37665
37663
|
}
|
|
37666
37664
|
|
|
37667
37665
|
// dist/lib/checkout-widget/checkout-public-host.component.js
|
|
@@ -18,8 +18,11 @@ export declare function stripeConfirmAlreadyCollected(error: {
|
|
|
18
18
|
message?: string;
|
|
19
19
|
decline_code?: string;
|
|
20
20
|
} | null | undefined): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Buyer-facing text for a failed Stripe confirmation: the gateway's message only.
|
|
23
|
+
* The error code is for support, and the host logs the full error to the console.
|
|
24
|
+
*/
|
|
21
25
|
export declare function formatStripeError(error: {
|
|
22
|
-
code?: string;
|
|
23
26
|
message?: string;
|
|
24
27
|
} | null | undefined): string;
|
|
25
28
|
//# sourceMappingURL=checkout-draft-line.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-draft-line.d.ts","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO3I;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,
|
|
1
|
+
{"version":3,"file":"checkout-draft-line.d.ts","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO3I;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAExF"}
|
|
@@ -38,9 +38,11 @@ export function stripeConfirmAlreadyCollected(error) {
|
|
|
38
38
|
}
|
|
39
39
|
return msg.includes('already succeeded') || msg.includes('already been confirmed') || msg.includes('already been captured');
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Buyer-facing text for a failed Stripe confirmation: the gateway's message only.
|
|
43
|
+
* The error code is for support, and the host logs the full error to the console.
|
|
44
|
+
*/
|
|
41
45
|
export function formatStripeError(error) {
|
|
42
|
-
|
|
43
|
-
const code = error?.code?.trim();
|
|
44
|
-
return code && !msg.includes(code) ? `${msg} (${code})` : msg;
|
|
46
|
+
return error?.message?.trim() || 'Payment failed.';
|
|
45
47
|
}
|
|
46
48
|
//# sourceMappingURL=checkout-draft-line.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-draft-line.js","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,SAAiB,EACjB,KAA8B;IAE9B,MAAM,IAAI,GAA4B;QAClC,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,aAAa,GAAG;YACjB,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU;YAC3C,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACf,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAAoF;IAC9H,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAChI,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"checkout-draft-line.js","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,SAAiB,EACjB,KAA8B;IAE9B,MAAM,IAAI,GAA4B;QAClC,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,aAAa,GAAG;YACjB,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU;YAC3C,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACf,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAAoF;IAC9H,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAChI,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA8C;IAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;AACvD,CAAC"}
|
|
@@ -57,7 +57,7 @@ export declare class BizAppsOrderHeaderFormComponent extends mjBizAppsOrdersOrde
|
|
|
57
57
|
AccountingAsOf: string | null;
|
|
58
58
|
AccountingBasis: OrderJournalDateBasis;
|
|
59
59
|
Confirming: boolean;
|
|
60
|
-
|
|
60
|
+
StatusError: string | null;
|
|
61
61
|
PaymentTypes: mjBizAppsOrdersPaymentTypeEntity[];
|
|
62
62
|
get ContextTabs(): TabConfig[];
|
|
63
63
|
/**
|
|
@@ -81,6 +81,8 @@ export declare class BizAppsOrderHeaderFormComponent extends mjBizAppsOrdersOrde
|
|
|
81
81
|
get ShowConfirm(): boolean;
|
|
82
82
|
get NeedsPaymentReference(): boolean;
|
|
83
83
|
get ConfirmBlockedReason(): string | null;
|
|
84
|
+
/** Void or reopen. A refusal leaves the previous status in place and shows the reason. */
|
|
85
|
+
RunStatusChange(status: OrderHeaderEntity['Status'], fallbackMessage: string): Promise<void>;
|
|
84
86
|
RunConfirm(): Promise<void>;
|
|
85
87
|
SetAccountingView(view: OrderAccountingView): void;
|
|
86
88
|
CardIsBalanced(card: OrderJournalCard): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-header-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/OrderHeader/order-header-form.component.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"order-header-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/OrderHeader/order-header-form.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,17 +5,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { Component, inject } from '@angular/core';
|
|
8
|
-
import { CompositeKey } from '@memberjunction/core';
|
|
8
|
+
import { CompositeKey, Metadata } from '@memberjunction/core';
|
|
9
9
|
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
10
10
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
11
11
|
import { BaseFormComponent } from '@memberjunction/ng-base-forms';
|
|
12
12
|
import { NavigationService } from '@memberjunction/ng-shared';
|
|
13
|
+
import { LoadOrdersEngine } from '@mj-biz-apps/orders-entities';
|
|
13
14
|
import { MJO_ACCOUNTING_ENTITIES, MJO_COMMON_ENTITIES, MJO_ENTITIES } from '../../data/entity-names.js';
|
|
14
15
|
import { BuildOrderJournalEntryRows, BuildOrderJournalRollup, ExcludedEntriesLabel, GetOrderJournalOrigins, GetPaymentTypes, LoadOrderJournalData, LoadRevRecJournalEntries, SubscriptionViewParams, } from '../../data/orders-queries.js';
|
|
15
16
|
import { FormatDate, FormatMoney, HasCents } from '../../panels/money-format.js';
|
|
16
17
|
import { mjBizAppsOrdersOrderHeaderFormComponent } from '../../generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js';
|
|
17
18
|
import { DispatchFormNavigation } from '../form-navigation-helper.js';
|
|
18
|
-
import { ExpandedPartyFromPref, FormatPartyAddress, NextExpandedParty, OrderHeaderExpandedFromPref, } from './order-header-prefs.js';
|
|
19
|
+
import { ExpandedPartyFromPref, FormatPartyAddress, FormatSoldAddress, NextExpandedParty, OrderHeaderExpandedFromPref, } from './order-header-prefs.js';
|
|
19
20
|
import * as i0 from "@angular/core";
|
|
20
21
|
import * as i1 from "@angular/forms";
|
|
21
22
|
import * as i2 from "@memberjunction/ng-base-forms";
|
|
@@ -81,7 +82,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditiona
|
|
|
81
82
|
i0.ɵɵadvance();
|
|
82
83
|
i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
|
|
83
84
|
i0.ɵɵadvance();
|
|
84
|
-
i0.ɵɵproperty("Order", ctx_r1.record)("EditMode", ctx_r1.
|
|
85
|
+
i0.ɵɵproperty("Order", ctx_r1.record)("EditMode", ctx_r1.ComposeMode)("PersonName", ctx_r1.record.ShipToPerson)("OrganizationName", ctx_r1.record.ShipToOrganization);
|
|
85
86
|
} }
|
|
86
87
|
function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
87
88
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
@@ -125,7 +126,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditiona
|
|
|
125
126
|
i0.ɵɵadvance();
|
|
126
127
|
i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
|
|
127
128
|
i0.ɵɵadvance();
|
|
128
|
-
i0.ɵɵproperty("Order", ctx_r1.record)("EditMode", ctx_r1.
|
|
129
|
+
i0.ɵɵproperty("Order", ctx_r1.record)("EditMode", ctx_r1.ComposeMode)("PersonName", ctx_r1.record.BillToPerson)("OrganizationName", ctx_r1.record.BillToOrganization);
|
|
129
130
|
} }
|
|
130
131
|
function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditional_35_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
131
132
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
@@ -172,7 +173,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditiona
|
|
|
172
173
|
} if (rf & 2) {
|
|
173
174
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
174
175
|
i0.ɵɵadvance(3);
|
|
175
|
-
i0.ɵɵtextInterpolate(ctx_r1.
|
|
176
|
+
i0.ɵɵtextInterpolate(ctx_r1.StatusError);
|
|
176
177
|
} }
|
|
177
178
|
function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditional_38_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
178
179
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
@@ -843,7 +844,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Template(r
|
|
|
843
844
|
i0.ɵɵadvance();
|
|
844
845
|
i0.ɵɵconditional(ctx_r1.ConfirmBlockedReason ? 35 : -1);
|
|
845
846
|
i0.ɵɵadvance();
|
|
846
|
-
i0.ɵɵconditional(ctx_r1.
|
|
847
|
+
i0.ɵɵconditional(ctx_r1.StatusError ? 36 : -1);
|
|
847
848
|
i0.ɵɵadvance();
|
|
848
849
|
i0.ɵɵproperty("Tabs", ctx_r1.ContextTabs)("ActiveKey", ctx_r1.ActiveTab ?? "");
|
|
849
850
|
i0.ɵɵadvance();
|
|
@@ -995,7 +996,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
995
996
|
AccountingAsOf = null;
|
|
996
997
|
AccountingBasis = 'effective';
|
|
997
998
|
Confirming = false;
|
|
998
|
-
|
|
999
|
+
StatusError = null;
|
|
999
1000
|
PaymentTypes = [];
|
|
1000
1001
|
get ContextTabs() {
|
|
1001
1002
|
return OrderFormTabs(!!this.record?.IsSaved);
|
|
@@ -1035,6 +1036,8 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1035
1036
|
await this.record.Lines.Load();
|
|
1036
1037
|
}
|
|
1037
1038
|
this.updateLineBadge();
|
|
1039
|
+
// `ConfirmEligibility` reads the catalog to tell which lines need a service period.
|
|
1040
|
+
await LoadOrdersEngine(Metadata.Provider, new Metadata().CurrentUser);
|
|
1038
1041
|
await this.loadPaymentTypes();
|
|
1039
1042
|
await this.refreshAccountingIfNeeded();
|
|
1040
1043
|
this.RegisterToolbarItem({
|
|
@@ -1074,11 +1077,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1074
1077
|
return !ord?.IsBookedOrder && ord?.Status !== 'Voided' && !!ord?.IsSaved;
|
|
1075
1078
|
},
|
|
1076
1079
|
OnClick: async () => {
|
|
1077
|
-
|
|
1078
|
-
return;
|
|
1079
|
-
this.record.Status = 'Voided';
|
|
1080
|
-
await this.record.Save();
|
|
1081
|
-
this.cdr.detectChanges();
|
|
1080
|
+
await this.RunStatusChange('Voided', 'The order could not be voided.');
|
|
1082
1081
|
},
|
|
1083
1082
|
});
|
|
1084
1083
|
this.RegisterToolbarItem({
|
|
@@ -1093,11 +1092,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1093
1092
|
return ord?.Status === 'Voided' && !!ord?.IsSaved;
|
|
1094
1093
|
},
|
|
1095
1094
|
OnClick: async () => {
|
|
1096
|
-
|
|
1097
|
-
return;
|
|
1098
|
-
this.record.Status = 'Draft';
|
|
1099
|
-
await this.record.Save();
|
|
1100
|
-
this.cdr.detectChanges();
|
|
1095
|
+
await this.RunStatusChange('Draft', 'The order could not be reopened as a draft.');
|
|
1101
1096
|
},
|
|
1102
1097
|
});
|
|
1103
1098
|
this.cdr.detectChanges();
|
|
@@ -1139,7 +1134,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1139
1134
|
if (!this.record)
|
|
1140
1135
|
return;
|
|
1141
1136
|
this.record.InitialPaymentReference = value;
|
|
1142
|
-
this.
|
|
1137
|
+
this.StatusError = null;
|
|
1143
1138
|
}
|
|
1144
1139
|
get ShowConfirm() {
|
|
1145
1140
|
return !!this.record && this.record.ConfirmEligibility().Allowed && !this.NeedsPaymentReference;
|
|
@@ -1155,16 +1150,31 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1155
1150
|
const verdict = this.record.ConfirmEligibility();
|
|
1156
1151
|
return verdict.Allowed ? null : (verdict.Reason ?? 'Cannot confirm this order.');
|
|
1157
1152
|
}
|
|
1153
|
+
/** Void or reopen. A refusal leaves the previous status in place and shows the reason. */
|
|
1154
|
+
async RunStatusChange(status, fallbackMessage) {
|
|
1155
|
+
if (!this.record)
|
|
1156
|
+
return;
|
|
1157
|
+
this.StatusError = null;
|
|
1158
|
+
try {
|
|
1159
|
+
await this.record.SaveStatus(status, fallbackMessage);
|
|
1160
|
+
}
|
|
1161
|
+
catch (error) {
|
|
1162
|
+
this.StatusError = error instanceof Error ? error.message : String(error);
|
|
1163
|
+
}
|
|
1164
|
+
finally {
|
|
1165
|
+
this.cdr.detectChanges();
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1158
1168
|
async RunConfirm() {
|
|
1159
1169
|
if (!this.record || this.Confirming || !this.ShowConfirm)
|
|
1160
1170
|
return;
|
|
1161
1171
|
this.Confirming = true;
|
|
1162
|
-
this.
|
|
1172
|
+
this.StatusError = null;
|
|
1163
1173
|
try {
|
|
1164
1174
|
if (this.record.Dirty) {
|
|
1165
1175
|
const saveResult = await this.record.Save();
|
|
1166
1176
|
if (!saveResult) {
|
|
1167
|
-
throw new Error(this.record.LatestResult?.
|
|
1177
|
+
throw new Error(this.record.LatestResult?.CompleteMessage?.trim() || 'Failed to save order changes before confirming.');
|
|
1168
1178
|
}
|
|
1169
1179
|
}
|
|
1170
1180
|
await this.record.Confirm();
|
|
@@ -1174,7 +1184,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1174
1184
|
}
|
|
1175
1185
|
}
|
|
1176
1186
|
catch (error) {
|
|
1177
|
-
this.
|
|
1187
|
+
this.StatusError = error instanceof Error ? error.message : String(error);
|
|
1178
1188
|
}
|
|
1179
1189
|
finally {
|
|
1180
1190
|
this.Confirming = false;
|
|
@@ -1235,7 +1245,9 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1235
1245
|
return this.record?.BillToOrganization || this.record?.BillToPerson || 'Choose who pays';
|
|
1236
1246
|
}
|
|
1237
1247
|
get BillToDetail() {
|
|
1238
|
-
const address =
|
|
1248
|
+
const address = FormatSoldAddress(() => this.record?.BillToAddressAsSold ?? null)
|
|
1249
|
+
|| this.FormatEmbeddedAddress(this.record?.BillToAddressID_Object)
|
|
1250
|
+
|| this.record?.BillToAddress;
|
|
1239
1251
|
const bits = [this.record?.BillToPerson, this.record?.PaymentTermsType, address]
|
|
1240
1252
|
.filter((value) => !!value);
|
|
1241
1253
|
return bits.length ? bits.join(' · ') : 'Person or organization';
|
|
@@ -1246,7 +1258,8 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
|
|
|
1246
1258
|
return this.record.ShipToOrganization || this.record.ShipToPerson || 'Same as bill to';
|
|
1247
1259
|
}
|
|
1248
1260
|
get ShipToDetail() {
|
|
1249
|
-
return
|
|
1261
|
+
return FormatSoldAddress(() => this.record?.ShipToAddressAsSold ?? null)
|
|
1262
|
+
|| this.FormatEmbeddedAddress(this.record?.ShipToAddressID_Object)
|
|
1250
1263
|
|| this.record?.ShipToAddress
|
|
1251
1264
|
|| 'Header default — override when it ships elsewhere';
|
|
1252
1265
|
}
|
|
@@ -1536,9 +1549,9 @@ BizAppsOrderHeaderFormComponent = __decorate([
|
|
|
1536
1549
|
export { BizAppsOrderHeaderFormComponent };
|
|
1537
1550
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BizAppsOrderHeaderFormComponent, [{
|
|
1538
1551
|
type: Component,
|
|
1539
|
-
args: [{ standalone: false, selector: 'bizapps-order-header-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <div class=\"mjo-oh-hero\" [class.is-collapsed]=\"!HeaderExpanded\">\n <div class=\"mjo-oh-hero__top\">\n <div class=\"mjo-oh-who\">\n <div class=\"mjo-oh-avatar\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></div>\n <div>\n <div class=\"mjo-oh-title-row\">\n <h1 class=\"mjo-oh-title\">{{ HeaderTitle }}</h1>\n @if (ShowStatusChip) {\n <span [class]=\"StatusChipClass\">{{ record.Status }}</span>\n }\n </div>\n <div class=\"mjo-oh-sub\">{{ HeaderExpanded ? HeaderSubtitle : HeaderCollapsedMeta }}</div>\n </div>\n </div>\n <div class=\"mjo-oh-hero__aside\">\n <div class=\"mjo-oh-money\">\n <div>\n <span class=\"mjo-oh-kicker\">{{ TotalLabel }}</span>\n <span class=\"mjo-oh-amt\">{{ Money('total') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Paid</span>\n <span class=\"mjo-oh-amt\">{{ Money('paid') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Balance</span>\n <span class=\"mjo-oh-amt\">{{ Money('balance') }}</span>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mjo-oh-hero__toggle\"\n (click)=\"ToggleHeader()\"\n [attr.aria-expanded]=\"HeaderExpanded\"\n [attr.aria-label]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\"\n [title]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"HeaderExpanded\" [class.fa-chevron-down]=\"!HeaderExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (HeaderExpanded) {\n <div class=\"mjo-oh-facts\">\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderType\" Type=\"select\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <bizapps-selling-company-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CompanyID\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></bizapps-selling-company-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderDate\" Type=\"datepicker\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n @if (EditMode && record.MoneyLocked) {\n <div class=\"mjo-oh-hint\"><i class=\"fa-solid fa-lock\" aria-hidden=\"true\"></i> This order is booked, so its type, selling company, order date and bill-to are locked. Corrections go through a reversal order.</div>\n }\n\n <div class=\"mjo-oh-parties\" [class.is-ship]=\"ExpandedParty === 'ship'\" [class.is-bill]=\"ExpandedParty === 'bill'\" [class.is-none]=\"ExpandedParty === null\">\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'ship'\" [class.is-rail]=\"ExpandedParty === 'bill'\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'ship'\"\n (click)=\"SelectParty('ship')\"\n (keydown.enter)=\"SelectParty('ship')\"\n (keydown.space)=\"SelectParty('ship'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-truck-fast\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Ship to</span>\n @if (ShipToIsSame) {\n <span class=\"mjo-oh-bubble__name\">{{ ShipToName }}</span>\n } @else {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenShipTo($event)\">{{ ShipToName }}</button>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ ShipToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'ship'\" [class.fa-chevron-down]=\"ExpandedParty !== 'ship'\"></i>\n </div>\n @if (ExpandedParty === 'ship') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToOrganizationID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToPersonID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('ShipTo')\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"ship\"\n [EditMode]=\"EditMode\"\n [PersonName]=\"record.ShipToPerson\"\n [OrganizationName]=\"record.ShipToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'bill'\" [class.is-rail]=\"ExpandedParty === 'ship'\" [class.is-needed]=\"NeedsBillTo\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'bill'\"\n (click)=\"SelectParty('bill')\"\n (keydown.enter)=\"SelectParty('bill')\"\n (keydown.space)=\"SelectParty('bill'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Bill to</span>\n @if (hasBillTo) {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenBillTo($event)\">{{ BillToName }}</button>\n } @else {\n <span class=\"mjo-oh-bubble__name\">{{ BillToName }}</span>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ BillToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'bill'\" [class.fa-chevron-down]=\"ExpandedParty !== 'bill'\"></i>\n </div>\n @if (ExpandedParty === 'bill') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToOrganizationID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToPersonID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('BillTo')\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PaymentTermsTypeID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"bill\"\n [EditMode]=\"EditMode\"\n [PersonName]=\"record.BillToPerson\"\n [OrganizationName]=\"record.BillToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n </div>\n\n @if (ConfirmBlockedReason) {\n <div class=\"mjo-oh-todo\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>Before this can be confirmed</span>\n @if (NeedsBillTo) {\n <button type=\"button\" (click)=\"JumpToBill()\">Need a bill-to party</button>\n } @else if (NeedsPaymentReference) {\n <button type=\"button\" (click)=\"JumpToPayment()\">Need a check / ACH reference</button>\n } @else {\n <span class=\"mjo-oh-todo__hint\">{{ ConfirmBlockedReason }}</span>\n }\n </div>\n }\n\n @if (ConfirmError) {\n <div class=\"mjo-oh-todo mjo-oh-todo--err\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ConfirmError }}</span>\n </div>\n }\n\n <mj-tab-nav\n class=\"mjo-oh-tabs\"\n [Tabs]=\"ContextTabs\"\n [ActiveKey]=\"ActiveTab ?? ''\"\n (TabChange)=\"SelectTab($event)\">\n </mj-tab-nav>\n\n @if (ActiveTab === 'payment') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentTypeID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentAmount\" Type=\"number\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n @if (PaymentRequiresReference) {\n <label class=\"mjo-oh-ref\">\n <span class=\"mjo-oh-ref__label\">Check / ACH reference</span>\n <input\n class=\"mj-input\"\n [ngModel]=\"PaymentReference\"\n (ngModelChange)=\"SetPaymentReference($event)\"\n [disabled]=\"!ComposeMode\"\n placeholder=\"Check number or confirmation ID\"\n autocomplete=\"off\"\n aria-label=\"Check or ACH reference\">\n </label>\n }\n </div>\n @if (record.IsSaved && PaymentParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"PaymentParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"mjo-oh-hint\">Intent only \u2014 the payment is created when the order is confirmed.</div>\n }\n </div>\n }\n\n @if (ActiveTab === 'details') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"RequestedDeliveryDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"DueDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ExternalDocumentNumber\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"FulfillmentStatus\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SalesRepUserID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Notes\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n }\n\n @if (ActiveTab === 'charges' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (ChargeParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"ChargeParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n @if (record.MoneyLocked) {\n <div class=\"mjo-oh-hint\">Charges were booked with the order and cannot be edited.</div>\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'accounting' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-acct__bar\">\n <div>\n <h2>{{ AccountingView === 'summary' ? 'Order journal' : 'Journal entries' }}</h2>\n <p>\n @if (AccountingView === 'summary') {\n Gross debits and credits per account over this order's whole life \u2014 not a stored row\n } @else {\n Every stored journal this order caused, unnetted \u2014 open a row to drill in\n }\n </p>\n </div>\n <div class=\"mjo-oh-switch\" role=\"group\" aria-label=\"Accounting view\">\n <button type=\"button\" [class.is-on]=\"AccountingView === 'summary'\" (click)=\"SetAccountingView('summary')\">Rolled up</button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'detail'\" (click)=\"SetAccountingView('detail')\">\n By line\n @if (RollupJournalCount) {\n <span class=\"mjo-oh-switch__n\">{{ RollupJournalCount }}</span>\n }\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'waterfall'\" (click)=\"SetAccountingView('waterfall')\">\n <i class=\"fa-solid fa-chart-line\"></i> Rev-Rec Waterfall\n </button>\n </div>\n </div>\n\n <!-- One set of controls for both views, so they can never disagree about what is in. -->\n @if (AccountingView !== 'waterfall') {\n <div class=\"mjo-oh-acct__controls\">\n <label class=\"mjo-oh-asof\">\n <span>As of</span>\n <input\n type=\"date\"\n [value]=\"AccountingAsOf ?? ''\"\n (change)=\"OnAccountingAsOfChanged($any($event.target).value)\"\n aria-label=\"Include entries dated on or before\" />\n </label>\n @if (AccountingAsOf) {\n <button type=\"button\" class=\"mjo-oh-asof__clear\" (click)=\"OnAccountingAsOfChanged('')\">\n Lifetime\n </button>\n }\n <div class=\"mjo-oh-switch mjo-oh-switch--sm\" role=\"group\" aria-label=\"Date basis\">\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'effective'\" (click)=\"SetAccountingBasis('effective')\">\n Effective date\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'posting'\" (click)=\"SetAccountingBasis('posting')\">\n Posting date\n </button>\n </div>\n <span class=\"mjo-oh-acct__basis\">\n @if (AccountingBasis === 'posting') {\n GL date of the batch \u2014 Posted batches only\n } @else {\n Subledger date on the entry itself\n }\n </span>\n </div>\n }\n\n @if (AccountingView === 'waterfall') {\n <div style=\"padding: 12px 0;\">\n <mj-deferred-revenue-waterfall\n [JournalEntries]=\"RevRecJournalEntries\"\n [Title]=\"'Order Rev-Rec & Deferred Revenue Schedule'\"\n (JournalEntrySelected)=\"OnJournalEntrySelected($event)\">\n </mj-deferred-revenue-waterfall>\n </div>\n } @else if (AccountingView === 'summary') {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Rolling up journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (RollupCards.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n @for (card of RollupCards; track card.CompanyID) {\n <article class=\"mjo-oh-jecard\">\n <header class=\"mjo-oh-jecard__head\">\n <div>\n <span class=\"mjo-oh-jecard__co\">{{ card.Company }}</span>\n <span class=\"mjo-oh-jecard__sub\">{{ card.Rows.length }} {{ card.Rows.length === 1 ? 'line' : 'lines' }}</span>\n </div>\n <span class=\"mjo-oh-chip\" [class.mjo-oh-chip--ok]=\"CardIsBalanced(card)\">\n {{ CardIsBalanced(card) ? 'Balanced' : 'Out of balance' }}\n </span>\n </header>\n <table class=\"mjo-oh-je__table\">\n <thead>\n <tr>\n <th>Account</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of card.Rows; track row.Key) {\n <tr>\n <td>\n <div class=\"mjo-oh-acctline\">\n @if (row.AccountCode) {\n <span class=\"mjo-oh-acctline__code\">{{ row.AccountCode }}</span>\n }\n <span class=\"mjo-oh-acctline__name\">{{ row.AccountName }}</span>\n </div>\n <div class=\"mjo-oh-acctline__meta\">\n @for (dim of row.Dimensions; track dim.Name + dim.Value) {\n <span class=\"mjo-oh-dim\">{{ dim.Name }} \u00B7 {{ dim.Value }}</span>\n }\n <span class=\"mjo-oh-je__src\">{{ SourceLineLabel(row.SourceLineCount) }}</span>\n </div>\n </td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n <tfoot>\n <tr>\n <th>Total</th>\n <td class=\"is-num\">{{ RollupAmount(card.TotalDebit) }}</td>\n <td class=\"is-num\">{{ RollupAmount(card.TotalCredit) }}</td>\n </tr>\n </tfoot>\n </table>\n </article>\n }\n @for (note of RollupSharedNotes; track note) {\n <p class=\"mjo-oh-acct__note\">{{ note }}</p>\n }\n }\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">\n {{ RollupExcludedLabel }} \u2014\n <button type=\"button\" class=\"mjo-oh-linkbtn\" (click)=\"SetAccountingView('detail')\">see By line</button>\n </p>\n }\n } @else {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Loading journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (JournalRows.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n <table class=\"mjo-oh-je__table mjo-oh-je__table--detail\">\n <thead>\n <tr>\n <th>Entry</th>\n <th>Effective</th>\n <th>Batch</th>\n <th>Batch status</th>\n <th>Posting date</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of JournalRows; track row.ID) {\n <tr class=\"is-clickable\" (click)=\"OnJournalRowSelected(row.ID)\">\n <td>\n <div class=\"mjo-oh-acctline__name\">{{ row.EntryNumber }}</div>\n <div class=\"mjo-oh-acctline__meta\">\n <span>{{ row.Description }}</span>\n @if (row.SharedWithOtherOrders) {\n <span class=\"mjo-oh-dim\">{{ SharedOrdersLabel(row.SharedWithOtherOrders) }}</span>\n }\n </div>\n </td>\n <td>{{ JournalDate(row.EffectiveDate) }}</td>\n <td>{{ row.BatchNumber || '\u2014' }}</td>\n <td>{{ row.BatchStatus || 'Not batched' }}</td>\n <td>{{ JournalDate(row.BatchPostingDate) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n </table>\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">{{ RollupExcludedLabel }}, not listed above.</p>\n }\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'subs' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (SubscriptionParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"SubscriptionParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n }\n </div>\n }\n }\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <mj-collapsible-panel\n SectionKey=\"mJBizAppsOrdersOrderLines\"\n SectionName=\"Lines\"\n Icon=\"fa fa-list-ol\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"LineBadge\"\n [DefaultExpanded]=\"true\">\n <mjo-order-lines-editor\n [Order]=\"record\"\n [EditMode]=\"ComposeMode\"\n (PricingChanged)=\"OnPricingChanged($event)\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mjo-order-lines-editor>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-everything\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: ["/* mj-form-field uses display:contents + a 200px|1fr internal grid.\n Wrap each field; never place the host as a CSS-grid item. */\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n max-height: none;\n}\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) .mj-forms-panel-content {\n max-height: none;\n overflow: visible;\n}\n\n/* Product search results sit `position: absolute` under the add-product\n input at the bottom of Lines. The panel card and body both use\n overflow:hidden (rounded-corner clip + collapse animation), which\n shears the list off at the section edge. Collapse still forces\n overflow:hidden on the collapsed body. */\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(.mj-typeahead-list.is-open) {\n position: relative;\n z-index: 30;\n}\n\n.mjo-oh-hero {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-4) var(--mj-space-5);\n margin-bottom: var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed {\n padding: var(--mj-space-2) var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-hero__top {\n align-items: center;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-avatar {\n width: 32px;\n height: 32px;\n font-size: 14px;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-title {\n font-size: var(--mj-text-base);\n}\n\n.mjo-oh-hero__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: 0 0 auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mjo-oh-hero__toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-hero__top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-hero__aside {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-confirm {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--mj-space-1);\n min-width: 11rem;\n}\n\n.mjo-oh-confirm__hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n text-align: right;\n max-width: 14rem;\n line-height: 1.35;\n}\n\n.mjo-oh-who {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n min-width: 0;\n}\n\n.mjo-oh-avatar {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-md);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.mjo-oh-title-row {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n}\n\n.mjo-oh-sub {\n margin-top: 2px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-kicker {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-chip--ok {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n border-color: var(--mj-status-success-border);\n}\n\n.mjo-oh-chip--void {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.mjo-oh-money {\n display: flex;\n gap: var(--mj-space-5);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-money > div {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-amt {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-facts {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n margin-top: var(--mj-space-4);\n padding: var(--mj-space-3);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 4px;\n padding: 0;\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field-label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n/* The shared field hover adds negative margin + extra padding, which shoves\n the three header facts down. Keep the tint, drop the layout shift. */\n.mjo-oh-fact ::ng-deep .mj-forms-field--editing:hover {\n margin: 0;\n padding: 0;\n}\n\n.mjo-oh-fields {\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-parties {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: var(--mj-space-3);\n align-items: start;\n margin: var(--mj-space-4) 0 var(--mj-space-3);\n}\n\n.mjo-oh-parties.is-bill {\n grid-template-columns: auto minmax(0, 1fr);\n}\n\n.mjo-oh-parties.is-none {\n grid-template-columns: 1fr 1fr;\n}\n\n.mjo-oh-bubble {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n min-width: 0;\n}\n\n.mjo-oh-bubble.is-open {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble.is-rail {\n width: 3.25rem;\n flex: 0 0 auto;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2);\n min-height: 5.5rem;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n flex: 0 0 auto;\n align-items: center;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.08em;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__name,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__detail,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__chev {\n display: none;\n}\n\n@media (max-width: 720px) {\n .mjo-oh-parties,\n .mjo-oh-parties.is-bill,\n .mjo-oh-parties.is-none {\n grid-template-columns: 1fr;\n }\n\n .mjo-oh-bubble.is-rail {\n width: auto;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: row;\n min-height: 0;\n padding: var(--mj-space-2) var(--mj-space-3);\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n align-items: flex-start;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: horizontal-tb;\n transform: none;\n }\n}\n\n.mjo-oh-bubble.is-needed {\n border-color: color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble__hit {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n width: 100%;\n padding: var(--mj-space-3);\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__name.mjo-oh-link {\n display: inline;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n font-size: inherit;\n font-weight: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__hit:hover { background: var(--mj-bg-surface-hover); }\n\n.mjo-oh-bubble__ic {\n width: var(--mj-space-8);\n height: var(--mj-space-8);\n border-radius: var(--mj-radius-sm);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.mjo-oh-bubble__copy {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-bubble__role {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-bubble__name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-bubble__detail {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mjo-oh-bubble__chev {\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-bubble__edit {\n padding: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-addr {\n margin-top: var(--mj-space-2);\n padding-top: var(--mj-space-2);\n border-top: 1px dashed var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n}\n\n.mjo-oh-addr__bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-addr__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-addr__btn {\n border: 0;\n background: transparent;\n color: var(--mj-text-link);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n padding: 0;\n}\n\n.mjo-oh-addr__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n}\n\n.mjo-oh-addr__row {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.8fr) minmax(0, 0.8fr);\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-link {\n color: var(--mj-text-link);\n text-decoration: none;\n}\n\n.mjo-oh-link:hover { text-decoration: underline; }\n\n.mjo-oh-todo {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n font-size: var(--mj-text-sm);\n color: var(--mj-status-warning-text);\n}\n\n.mjo-oh-todo button,\n.mjo-oh-todo__hint {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n border-radius: var(--mj-radius-full);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-todo button { cursor: pointer; }\n\n.mjo-oh-todo--err {\n color: var(--mj-status-error-text);\n}\n\n.mjo-oh-ref {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-ref__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-ref .mj-input {\n max-width: 22rem;\n}\n\n.mjo-oh-tabs {\n display: block;\n margin-top: var(--mj-space-2);\n}\n\n.mjo-oh-tabpane { margin-top: var(--mj-space-3); }\n\n.mjo-oh-tabpane mj-explorer-entity-data-grid {\n display: block;\n}\n\n.mjo-oh-hint {\n margin-top: var(--mj-space-2);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__bar {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-3);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-acct__bar h2 {\n margin: 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acct__bar p {\n margin: 2px 0 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-switch {\n display: inline-flex;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-switch button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: 5px 12px;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.mjo-oh-switch button.is-on {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n box-shadow: 0 0 0 1px var(--mj-border-subtle);\n}\n\n.mjo-oh-switch__n {\n min-width: 1.25em;\n padding: 0 5px;\n border-radius: var(--mj-radius-full);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n/* As-of + basis controls: one row above whichever of the two views is showing. */\n.mjo-oh-acct__controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-asof {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-asof input {\n font: inherit;\n font-weight: var(--mj-font-normal);\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-asof__clear,\n.mjo-oh-linkbtn {\n appearance: none;\n border: 0;\n background: transparent;\n padding: 0;\n font: inherit;\n font-size: var(--mj-text-xs);\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.mjo-oh-switch--sm button {\n padding: 4px 10px;\n}\n\n.mjo-oh-acct__basis,\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n margin: var(--mj-space-2) 0 0;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable {\n cursor: pointer;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-jecard {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.mjo-oh-jecard + .mjo-oh-jecard {\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-jecard__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-jecard__co {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-jecard__sub {\n margin-left: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--mj-text-sm);\n}\n\n.mjo-oh-je__table th,\n.mjo-oh-je__table td {\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n text-align: left;\n vertical-align: top;\n}\n\n.mjo-oh-je__table thead th {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table tfoot th {\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border-bottom: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-je__table .is-num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.mjo-oh-je__table .is-quiet {\n color: var(--mj-text-disabled);\n}\n\n.mjo-oh-acctline {\n display: flex;\n align-items: baseline;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-acctline__code {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n.mjo-oh-acctline__name {\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acctline__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.mjo-oh-dim {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-je__src {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 760px) {\n .mjo-oh-parties,\n .mjo-oh-facts {\n grid-template-columns: 1fr;\n }\n .mjo-oh-money { margin-left: 0; }\n}\n"] }]
|
|
1552
|
+
args: [{ standalone: false, selector: 'bizapps-order-header-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <div class=\"mjo-oh-hero\" [class.is-collapsed]=\"!HeaderExpanded\">\n <div class=\"mjo-oh-hero__top\">\n <div class=\"mjo-oh-who\">\n <div class=\"mjo-oh-avatar\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></div>\n <div>\n <div class=\"mjo-oh-title-row\">\n <h1 class=\"mjo-oh-title\">{{ HeaderTitle }}</h1>\n @if (ShowStatusChip) {\n <span [class]=\"StatusChipClass\">{{ record.Status }}</span>\n }\n </div>\n <div class=\"mjo-oh-sub\">{{ HeaderExpanded ? HeaderSubtitle : HeaderCollapsedMeta }}</div>\n </div>\n </div>\n <div class=\"mjo-oh-hero__aside\">\n <div class=\"mjo-oh-money\">\n <div>\n <span class=\"mjo-oh-kicker\">{{ TotalLabel }}</span>\n <span class=\"mjo-oh-amt\">{{ Money('total') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Paid</span>\n <span class=\"mjo-oh-amt\">{{ Money('paid') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Balance</span>\n <span class=\"mjo-oh-amt\">{{ Money('balance') }}</span>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mjo-oh-hero__toggle\"\n (click)=\"ToggleHeader()\"\n [attr.aria-expanded]=\"HeaderExpanded\"\n [attr.aria-label]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\"\n [title]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"HeaderExpanded\" [class.fa-chevron-down]=\"!HeaderExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (HeaderExpanded) {\n <div class=\"mjo-oh-facts\">\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderType\" Type=\"select\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <bizapps-selling-company-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CompanyID\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></bizapps-selling-company-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderDate\" Type=\"datepicker\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n @if (EditMode && record.MoneyLocked) {\n <div class=\"mjo-oh-hint\"><i class=\"fa-solid fa-lock\" aria-hidden=\"true\"></i> This order is booked, so its type, selling company, order date and bill-to are locked. Corrections go through a reversal order.</div>\n }\n\n <div class=\"mjo-oh-parties\" [class.is-ship]=\"ExpandedParty === 'ship'\" [class.is-bill]=\"ExpandedParty === 'bill'\" [class.is-none]=\"ExpandedParty === null\">\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'ship'\" [class.is-rail]=\"ExpandedParty === 'bill'\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'ship'\"\n (click)=\"SelectParty('ship')\"\n (keydown.enter)=\"SelectParty('ship')\"\n (keydown.space)=\"SelectParty('ship'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-truck-fast\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Ship to</span>\n @if (ShipToIsSame) {\n <span class=\"mjo-oh-bubble__name\">{{ ShipToName }}</span>\n } @else {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenShipTo($event)\">{{ ShipToName }}</button>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ ShipToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'ship'\" [class.fa-chevron-down]=\"ExpandedParty !== 'ship'\"></i>\n </div>\n @if (ExpandedParty === 'ship') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToOrganizationID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToPersonID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('ShipTo')\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"ship\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.ShipToPerson\"\n [OrganizationName]=\"record.ShipToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'bill'\" [class.is-rail]=\"ExpandedParty === 'ship'\" [class.is-needed]=\"NeedsBillTo\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'bill'\"\n (click)=\"SelectParty('bill')\"\n (keydown.enter)=\"SelectParty('bill')\"\n (keydown.space)=\"SelectParty('bill'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Bill to</span>\n @if (hasBillTo) {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenBillTo($event)\">{{ BillToName }}</button>\n } @else {\n <span class=\"mjo-oh-bubble__name\">{{ BillToName }}</span>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ BillToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'bill'\" [class.fa-chevron-down]=\"ExpandedParty !== 'bill'\"></i>\n </div>\n @if (ExpandedParty === 'bill') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToOrganizationID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToPersonID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('BillTo')\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PaymentTermsTypeID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"bill\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.BillToPerson\"\n [OrganizationName]=\"record.BillToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n </div>\n\n @if (ConfirmBlockedReason) {\n <div class=\"mjo-oh-todo\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>Before this can be confirmed</span>\n @if (NeedsBillTo) {\n <button type=\"button\" (click)=\"JumpToBill()\">Need a bill-to party</button>\n } @else if (NeedsPaymentReference) {\n <button type=\"button\" (click)=\"JumpToPayment()\">Need a check / ACH reference</button>\n } @else {\n <span class=\"mjo-oh-todo__hint\">{{ ConfirmBlockedReason }}</span>\n }\n </div>\n }\n\n @if (StatusError) {\n <div class=\"mjo-oh-todo mjo-oh-todo--err\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ StatusError }}</span>\n </div>\n }\n\n <mj-tab-nav\n class=\"mjo-oh-tabs\"\n [Tabs]=\"ContextTabs\"\n [ActiveKey]=\"ActiveTab ?? ''\"\n (TabChange)=\"SelectTab($event)\">\n </mj-tab-nav>\n\n @if (ActiveTab === 'payment') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentTypeID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentAmount\" Type=\"number\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n @if (PaymentRequiresReference) {\n <label class=\"mjo-oh-ref\">\n <span class=\"mjo-oh-ref__label\">Check / ACH reference</span>\n <input\n class=\"mj-input\"\n [ngModel]=\"PaymentReference\"\n (ngModelChange)=\"SetPaymentReference($event)\"\n [disabled]=\"!ComposeMode\"\n placeholder=\"Check number or confirmation ID\"\n autocomplete=\"off\"\n aria-label=\"Check or ACH reference\">\n </label>\n }\n </div>\n @if (record.IsSaved && PaymentParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"PaymentParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"mjo-oh-hint\">Intent only \u2014 the payment is created when the order is confirmed.</div>\n }\n </div>\n }\n\n @if (ActiveTab === 'details') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"RequestedDeliveryDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"DueDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ExternalDocumentNumber\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"FulfillmentStatus\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SalesRepUserID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Notes\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n }\n\n @if (ActiveTab === 'charges' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (ChargeParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"ChargeParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n @if (record.MoneyLocked) {\n <div class=\"mjo-oh-hint\">Charges were booked with the order and cannot be edited.</div>\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'accounting' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-acct__bar\">\n <div>\n <h2>{{ AccountingView === 'summary' ? 'Order journal' : 'Journal entries' }}</h2>\n <p>\n @if (AccountingView === 'summary') {\n Gross debits and credits per account over this order's whole life \u2014 not a stored row\n } @else {\n Every stored journal this order caused, unnetted \u2014 open a row to drill in\n }\n </p>\n </div>\n <div class=\"mjo-oh-switch\" role=\"group\" aria-label=\"Accounting view\">\n <button type=\"button\" [class.is-on]=\"AccountingView === 'summary'\" (click)=\"SetAccountingView('summary')\">Rolled up</button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'detail'\" (click)=\"SetAccountingView('detail')\">\n By line\n @if (RollupJournalCount) {\n <span class=\"mjo-oh-switch__n\">{{ RollupJournalCount }}</span>\n }\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'waterfall'\" (click)=\"SetAccountingView('waterfall')\">\n <i class=\"fa-solid fa-chart-line\"></i> Rev-Rec Waterfall\n </button>\n </div>\n </div>\n\n <!-- One set of controls for both views, so they can never disagree about what is in. -->\n @if (AccountingView !== 'waterfall') {\n <div class=\"mjo-oh-acct__controls\">\n <label class=\"mjo-oh-asof\">\n <span>As of</span>\n <input\n type=\"date\"\n [value]=\"AccountingAsOf ?? ''\"\n (change)=\"OnAccountingAsOfChanged($any($event.target).value)\"\n aria-label=\"Include entries dated on or before\" />\n </label>\n @if (AccountingAsOf) {\n <button type=\"button\" class=\"mjo-oh-asof__clear\" (click)=\"OnAccountingAsOfChanged('')\">\n Lifetime\n </button>\n }\n <div class=\"mjo-oh-switch mjo-oh-switch--sm\" role=\"group\" aria-label=\"Date basis\">\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'effective'\" (click)=\"SetAccountingBasis('effective')\">\n Effective date\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'posting'\" (click)=\"SetAccountingBasis('posting')\">\n Posting date\n </button>\n </div>\n <span class=\"mjo-oh-acct__basis\">\n @if (AccountingBasis === 'posting') {\n GL date of the batch \u2014 Posted batches only\n } @else {\n Subledger date on the entry itself\n }\n </span>\n </div>\n }\n\n @if (AccountingView === 'waterfall') {\n <div style=\"padding: 12px 0;\">\n <mj-deferred-revenue-waterfall\n [JournalEntries]=\"RevRecJournalEntries\"\n [Title]=\"'Order Rev-Rec & Deferred Revenue Schedule'\"\n (JournalEntrySelected)=\"OnJournalEntrySelected($event)\">\n </mj-deferred-revenue-waterfall>\n </div>\n } @else if (AccountingView === 'summary') {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Rolling up journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (RollupCards.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n @for (card of RollupCards; track card.CompanyID) {\n <article class=\"mjo-oh-jecard\">\n <header class=\"mjo-oh-jecard__head\">\n <div>\n <span class=\"mjo-oh-jecard__co\">{{ card.Company }}</span>\n <span class=\"mjo-oh-jecard__sub\">{{ card.Rows.length }} {{ card.Rows.length === 1 ? 'line' : 'lines' }}</span>\n </div>\n <span class=\"mjo-oh-chip\" [class.mjo-oh-chip--ok]=\"CardIsBalanced(card)\">\n {{ CardIsBalanced(card) ? 'Balanced' : 'Out of balance' }}\n </span>\n </header>\n <table class=\"mjo-oh-je__table\">\n <thead>\n <tr>\n <th>Account</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of card.Rows; track row.Key) {\n <tr>\n <td>\n <div class=\"mjo-oh-acctline\">\n @if (row.AccountCode) {\n <span class=\"mjo-oh-acctline__code\">{{ row.AccountCode }}</span>\n }\n <span class=\"mjo-oh-acctline__name\">{{ row.AccountName }}</span>\n </div>\n <div class=\"mjo-oh-acctline__meta\">\n @for (dim of row.Dimensions; track dim.Name + dim.Value) {\n <span class=\"mjo-oh-dim\">{{ dim.Name }} \u00B7 {{ dim.Value }}</span>\n }\n <span class=\"mjo-oh-je__src\">{{ SourceLineLabel(row.SourceLineCount) }}</span>\n </div>\n </td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n <tfoot>\n <tr>\n <th>Total</th>\n <td class=\"is-num\">{{ RollupAmount(card.TotalDebit) }}</td>\n <td class=\"is-num\">{{ RollupAmount(card.TotalCredit) }}</td>\n </tr>\n </tfoot>\n </table>\n </article>\n }\n @for (note of RollupSharedNotes; track note) {\n <p class=\"mjo-oh-acct__note\">{{ note }}</p>\n }\n }\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">\n {{ RollupExcludedLabel }} \u2014\n <button type=\"button\" class=\"mjo-oh-linkbtn\" (click)=\"SetAccountingView('detail')\">see By line</button>\n </p>\n }\n } @else {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Loading journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (JournalRows.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n <table class=\"mjo-oh-je__table mjo-oh-je__table--detail\">\n <thead>\n <tr>\n <th>Entry</th>\n <th>Effective</th>\n <th>Batch</th>\n <th>Batch status</th>\n <th>Posting date</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of JournalRows; track row.ID) {\n <tr class=\"is-clickable\" (click)=\"OnJournalRowSelected(row.ID)\">\n <td>\n <div class=\"mjo-oh-acctline__name\">{{ row.EntryNumber }}</div>\n <div class=\"mjo-oh-acctline__meta\">\n <span>{{ row.Description }}</span>\n @if (row.SharedWithOtherOrders) {\n <span class=\"mjo-oh-dim\">{{ SharedOrdersLabel(row.SharedWithOtherOrders) }}</span>\n }\n </div>\n </td>\n <td>{{ JournalDate(row.EffectiveDate) }}</td>\n <td>{{ row.BatchNumber || '\u2014' }}</td>\n <td>{{ row.BatchStatus || 'Not batched' }}</td>\n <td>{{ JournalDate(row.BatchPostingDate) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n </table>\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">{{ RollupExcludedLabel }}, not listed above.</p>\n }\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'subs' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (SubscriptionParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"SubscriptionParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n }\n </div>\n }\n }\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <mj-collapsible-panel\n SectionKey=\"mJBizAppsOrdersOrderLines\"\n SectionName=\"Lines\"\n Icon=\"fa fa-list-ol\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"LineBadge\"\n [DefaultExpanded]=\"true\">\n <mjo-order-lines-editor\n [Order]=\"record\"\n [EditMode]=\"ComposeMode\"\n (PricingChanged)=\"OnPricingChanged($event)\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mjo-order-lines-editor>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-everything\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: ["/* mj-form-field uses display:contents + a 200px|1fr internal grid.\n Wrap each field; never place the host as a CSS-grid item. */\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n max-height: none;\n}\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) .mj-forms-panel-content {\n max-height: none;\n overflow: visible;\n}\n\n/* Product search results sit `position: absolute` under the add-product\n input at the bottom of Lines. The panel card and body both use\n overflow:hidden (rounded-corner clip + collapse animation), which\n shears the list off at the section edge. Collapse still forces\n overflow:hidden on the collapsed body. */\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(.mj-typeahead-list.is-open) {\n position: relative;\n z-index: 30;\n}\n\n.mjo-oh-hero {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-4) var(--mj-space-5);\n margin-bottom: var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed {\n padding: var(--mj-space-2) var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-hero__top {\n align-items: center;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-avatar {\n width: 32px;\n height: 32px;\n font-size: 14px;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-title {\n font-size: var(--mj-text-base);\n}\n\n.mjo-oh-hero__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: 0 0 auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mjo-oh-hero__toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-hero__top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-hero__aside {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-confirm {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--mj-space-1);\n min-width: 11rem;\n}\n\n.mjo-oh-confirm__hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n text-align: right;\n max-width: 14rem;\n line-height: 1.35;\n}\n\n.mjo-oh-who {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n min-width: 0;\n}\n\n.mjo-oh-avatar {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-md);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.mjo-oh-title-row {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n}\n\n.mjo-oh-sub {\n margin-top: 2px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-kicker {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-chip--ok {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n border-color: var(--mj-status-success-border);\n}\n\n.mjo-oh-chip--void {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.mjo-oh-money {\n display: flex;\n gap: var(--mj-space-5);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-money > div {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-amt {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-facts {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n margin-top: var(--mj-space-4);\n padding: var(--mj-space-3);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 4px;\n padding: 0;\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field-label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n/* The shared field hover adds negative margin + extra padding, which shoves\n the three header facts down. Keep the tint, drop the layout shift. */\n.mjo-oh-fact ::ng-deep .mj-forms-field--editing:hover {\n margin: 0;\n padding: 0;\n}\n\n.mjo-oh-fields {\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-parties {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: var(--mj-space-3);\n align-items: start;\n margin: var(--mj-space-4) 0 var(--mj-space-3);\n}\n\n.mjo-oh-parties.is-bill {\n grid-template-columns: auto minmax(0, 1fr);\n}\n\n.mjo-oh-parties.is-none {\n grid-template-columns: 1fr 1fr;\n}\n\n.mjo-oh-bubble {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n min-width: 0;\n}\n\n.mjo-oh-bubble.is-open {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble.is-rail {\n width: 3.25rem;\n flex: 0 0 auto;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2);\n min-height: 5.5rem;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n flex: 0 0 auto;\n align-items: center;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.08em;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__name,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__detail,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__chev {\n display: none;\n}\n\n@media (max-width: 720px) {\n .mjo-oh-parties,\n .mjo-oh-parties.is-bill,\n .mjo-oh-parties.is-none {\n grid-template-columns: 1fr;\n }\n\n .mjo-oh-bubble.is-rail {\n width: auto;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: row;\n min-height: 0;\n padding: var(--mj-space-2) var(--mj-space-3);\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n align-items: flex-start;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: horizontal-tb;\n transform: none;\n }\n}\n\n.mjo-oh-bubble.is-needed {\n border-color: color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble__hit {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n width: 100%;\n padding: var(--mj-space-3);\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__name.mjo-oh-link {\n display: inline;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n font-size: inherit;\n font-weight: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__hit:hover { background: var(--mj-bg-surface-hover); }\n\n.mjo-oh-bubble__ic {\n width: var(--mj-space-8);\n height: var(--mj-space-8);\n border-radius: var(--mj-radius-sm);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.mjo-oh-bubble__copy {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-bubble__role {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-bubble__name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-bubble__detail {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mjo-oh-bubble__chev {\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-bubble__edit {\n padding: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-addr {\n margin-top: var(--mj-space-2);\n padding-top: var(--mj-space-2);\n border-top: 1px dashed var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n}\n\n.mjo-oh-addr__bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-addr__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-addr__btn {\n border: 0;\n background: transparent;\n color: var(--mj-text-link);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n padding: 0;\n}\n\n.mjo-oh-addr__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n}\n\n.mjo-oh-addr__row {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.8fr) minmax(0, 0.8fr);\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-link {\n color: var(--mj-text-link);\n text-decoration: none;\n}\n\n.mjo-oh-link:hover { text-decoration: underline; }\n\n.mjo-oh-todo {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n font-size: var(--mj-text-sm);\n color: var(--mj-status-warning-text);\n}\n\n.mjo-oh-todo button,\n.mjo-oh-todo__hint {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n border-radius: var(--mj-radius-full);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-todo button { cursor: pointer; }\n\n.mjo-oh-todo--err {\n color: var(--mj-status-error-text);\n}\n\n.mjo-oh-ref {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-ref__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-ref .mj-input {\n max-width: 22rem;\n}\n\n.mjo-oh-tabs {\n display: block;\n margin-top: var(--mj-space-2);\n}\n\n.mjo-oh-tabpane { margin-top: var(--mj-space-3); }\n\n.mjo-oh-tabpane mj-explorer-entity-data-grid {\n display: block;\n}\n\n.mjo-oh-hint {\n margin-top: var(--mj-space-2);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__bar {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-3);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-acct__bar h2 {\n margin: 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acct__bar p {\n margin: 2px 0 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-switch {\n display: inline-flex;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-switch button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: 5px 12px;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.mjo-oh-switch button.is-on {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n box-shadow: 0 0 0 1px var(--mj-border-subtle);\n}\n\n.mjo-oh-switch__n {\n min-width: 1.25em;\n padding: 0 5px;\n border-radius: var(--mj-radius-full);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n/* As-of + basis controls: one row above whichever of the two views is showing. */\n.mjo-oh-acct__controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-asof {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-asof input {\n font: inherit;\n font-weight: var(--mj-font-normal);\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-asof__clear,\n.mjo-oh-linkbtn {\n appearance: none;\n border: 0;\n background: transparent;\n padding: 0;\n font: inherit;\n font-size: var(--mj-text-xs);\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.mjo-oh-switch--sm button {\n padding: 4px 10px;\n}\n\n.mjo-oh-acct__basis,\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n margin: var(--mj-space-2) 0 0;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable {\n cursor: pointer;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-jecard {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.mjo-oh-jecard + .mjo-oh-jecard {\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-jecard__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-jecard__co {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-jecard__sub {\n margin-left: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--mj-text-sm);\n}\n\n.mjo-oh-je__table th,\n.mjo-oh-je__table td {\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n text-align: left;\n vertical-align: top;\n}\n\n.mjo-oh-je__table thead th {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table tfoot th {\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border-bottom: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-je__table .is-num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.mjo-oh-je__table .is-quiet {\n color: var(--mj-text-disabled);\n}\n\n.mjo-oh-acctline {\n display: flex;\n align-items: baseline;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-acctline__code {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n.mjo-oh-acctline__name {\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acctline__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.mjo-oh-dim {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-je__src {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 760px) {\n .mjo-oh-parties,\n .mjo-oh-facts {\n grid-template-columns: 1fr;\n }\n .mjo-oh-money { margin-left: 0; }\n}\n"] }]
|
|
1540
1553
|
}], null, null); })();
|
|
1541
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BizAppsOrderHeaderFormComponent, { className: "BizAppsOrderHeaderFormComponent", filePath: "lib/custom/OrderHeader/order-header-form.component.ts", lineNumber:
|
|
1554
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BizAppsOrderHeaderFormComponent, { className: "BizAppsOrderHeaderFormComponent", filePath: "lib/custom/OrderHeader/order-header-form.component.ts", lineNumber: 87 }); })();
|
|
1542
1555
|
/** Tree-shaking prevention anchor. */
|
|
1543
1556
|
export function LoadOrderHeaderFormComponent() {
|
|
1544
1557
|
void BizAppsOrderHeaderFormComponent;
|