@zeniai/web-components 4.3.76-beta12MM → 4.3.76-beta13MM

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{SessionTimeoutPopup-DO46U3vX.js → SessionTimeoutPopup-Bb_GLNw2.js} +989 -804
  2. package/dist/SessionTimeoutPopup-Bb_GLNw2.js.map +4 -0
  3. package/dist/{SessionTimeoutPopup-BP3VhaHV.cjs → SessionTimeoutPopup-ZOLbgX1q.cjs} +433 -289
  4. package/dist/SessionTimeoutPopup-ZOLbgX1q.cjs.map +4 -0
  5. package/dist/appLocale.d.ts +46 -21
  6. package/dist/cockpit.cjs.js +152 -152
  7. package/dist/cockpit.cjs.js.map +1 -1
  8. package/dist/cockpit.esm.js +2096 -2096
  9. package/dist/cockpit.esm.js.map +1 -1
  10. package/dist/components/aiCfo/components/AiCfoRoutinesBrowser.d.ts +1 -1
  11. package/dist/components/aiCfo/components/helpers/aiCfoRoutines.d.ts +2 -0
  12. package/dist/components/commentsAndNotes/utils/CollaborationHelpers.d.ts +15 -0
  13. package/dist/components/common/popUps/RecommendationFeedbackPopup.d.ts +3 -1
  14. package/dist/components/dashboard/Dashboard.d.ts +7 -1
  15. package/dist/components/expenseAutomation/ExpenseAutomationPage.d.ts +6 -0
  16. package/dist/components/expenseAutomation/components/navbarHeaderData.d.ts +4 -3
  17. package/dist/components/expenseAutomation/sections/actualMatching/ActualMatchingMatchNewButton.d.ts +5 -0
  18. package/dist/components/expenseAutomation/sections/jeSchedules/common/JEGroupSectionHeader.d.ts +1 -1
  19. package/dist/components/expenseAutomation/sections/jeSchedules/list/jeScheduleConfig.d.ts +1 -1
  20. package/dist/components/expenseAutomation/sections/jeSchedules/list/jeScheduleListItems.d.ts +9 -3
  21. package/dist/components/expenseAutomation/sections/jeSchedules/list/jeScheduleListRow.helpers.d.ts +30 -1
  22. package/dist/components/expenseAutomation/stories/actualMatchingPageStoryActions.d.ts +2 -0
  23. package/dist/components/invoicing/catalogDetail/InvoicingCatalogItemDetailPage.d.ts +11 -4
  24. package/dist/components/invoicing/catalogForm/InvoicingCatalogItemFormPage.d.ts +18 -10
  25. package/dist/components/invoicing/catalogForm/catalogItemForm.shared.d.ts +11 -7
  26. package/dist/components/invoicing/common/InvoicingFormControls.d.ts +8 -1
  27. package/dist/components/invoicing/common/InvoicingFormRows.d.ts +7 -0
  28. package/dist/components/invoicing/common/InvoicingSkeletons.d.ts +20 -4
  29. package/dist/components/invoicing/common/invoicingAccountPickerOptions.d.ts +15 -0
  30. package/dist/components/invoicing/couponForm/InvoicingCouponFormPage.d.ts +27 -2
  31. package/dist/components/invoicing/couponForm/couponForm.shared.d.ts +17 -1
  32. package/dist/components/invoicing/customerDetail/InvoicingCustomerDetailPage.d.ts +12 -1
  33. package/dist/components/invoicing/customerForm/InvoicingCustomerFormPage.d.ts +9 -1
  34. package/dist/components/invoicing/discountDetail/InvoicingDiscountDetailPage.d.ts +7 -0
  35. package/dist/components/invoicing/subscriptionDetail/InvoicingSubscriptionDetailPage.d.ts +13 -0
  36. package/dist/components/invoicing/subscriptionForm/InvoicingSubscriptionFormPage.d.ts +9 -1
  37. package/dist/components/invoicing/subscriptionForm/SubscriptionItemQuantityRows.d.ts +10 -7
  38. package/dist/components/invoicing/subscriptionForm/subscriptionForm.shared.d.ts +69 -28
  39. package/dist/components/notifications/components/CommentsNotificationTileMedium.d.ts +15 -4
  40. package/dist/components/reportTree/treeNode/accountReconReport/row/v2/statusHelper.d.ts +1 -1
  41. package/dist/components/reports/PdfColumnLimitPopup.d.ts +12 -0
  42. package/dist/context/featureProvider/DynamicConfigNameConstants.d.ts +3 -1
  43. package/dist/context/featureProvider/isActualMatchingEnabledInAgentJeConfig.d.ts +18 -0
  44. package/dist/context/featureProvider/isActualMatchingEnabledInAgentJeConfig.test.d.ts +1 -0
  45. package/dist/context/featureProvider/useActualMatchingEnabled.d.ts +6 -0
  46. package/dist/{index-1_7aslI4.js → index-3FvLYm2f.js} +2 -2
  47. package/dist/{index-1_7aslI4.js.map → index-3FvLYm2f.js.map} +1 -1
  48. package/dist/{index-CWHnH5Fh.cjs → index-B7A5wq5o.cjs} +2 -2
  49. package/dist/{index-CWHnH5Fh.cjs.map → index-B7A5wq5o.cjs.map} +1 -1
  50. package/dist/index.cjs.js +1 -1
  51. package/dist/index.d.ts +4 -1
  52. package/dist/index.esm.js +1 -1
  53. package/dist/strings/strings.d.ts +46 -21
  54. package/package.json +13 -13
  55. package/dist/SessionTimeoutPopup-BP3VhaHV.cjs.map +0 -4
  56. package/dist/SessionTimeoutPopup-DO46U3vX.js.map +0 -4
@@ -12,6 +12,14 @@ export interface InvoicingSubscriptionFormPageProps {
12
12
  customers?: InvoicingSubscriptionFormOption[];
13
13
  errorMessage?: string;
14
14
  fieldHelp?: FieldHelpByCode;
15
+ /**
16
+ * True while the subscription being edited is still loading. The form holds
17
+ * its skeleton until the record lands: `useForm` seeds its default values
18
+ * once, at first render, so mounting the fields against the blank draft
19
+ * leaves them empty, and the first change writes that blankness back over the
20
+ * subscription. Always false when creating — there is nothing to load.
21
+ */
22
+ isLoading?: boolean;
15
23
  plans?: InvoicingSubscriptionFormOption[];
16
24
  shippingAddressLabel?: string;
17
25
  onCancel: () => void;
@@ -26,5 +34,5 @@ export interface InvoicingSubscriptionFormPageProps {
26
34
  * primitives. The draft flows from CES (`localData`) and is synced back on every
27
35
  * change; the shipping address is captured via the shared Address screen.
28
36
  */
29
- export declare function InvoicingSubscriptionFormPage({ fieldHelp, addons, charges, coupons, customers, errorMessage, isSubmitting, localData, mode, onBack, onCancel, onChange, onOpenAddress, onSubmit, plans, shippingAddressLabel, }: Readonly<InvoicingSubscriptionFormPageProps>): import("react/jsx-runtime").JSX.Element;
37
+ export declare function InvoicingSubscriptionFormPage({ fieldHelp, addons, charges, coupons, customers, errorMessage, isLoading, isSubmitting, localData, mode, onBack, onCancel, onChange, onOpenAddress, onSubmit, plans, shippingAddressLabel, }: Readonly<InvoicingSubscriptionFormPageProps>): import("react/jsx-runtime").JSX.Element;
30
38
  export default InvoicingSubscriptionFormPage;
@@ -1,17 +1,20 @@
1
1
  export interface SubscriptionItemQuantityRowsProps {
2
- namePrefix: string;
3
- quantities: Record<string, number>;
2
+ /** Field-array path holding this section's `{priceCode, quantity}` entries. */
3
+ name: string;
4
4
  selectedPriceCodes: string[];
5
+ labelWidth?: number;
6
+ rowStyle?: React.CSSProperties;
5
7
  getOptionLabel: (priceCode: string) => string;
6
- onChange: (quantities: Record<string, number>) => void;
7
8
  }
8
9
  /**
9
10
  * One quantity row per selected add-on / one-time charge. Every pricing model
10
11
  * except `flat_fee` bills on quantity, so each selected item carries its own
11
12
  * (minimum 1) rather than the single hardcoded 1 the payload used to send.
12
13
  *
13
- * The whole map is one react-hook-form field, so price codes never have to be
14
- * escaped into field paths — a code containing a `.` or `[` would otherwise be
15
- * read as a nested path.
14
+ * Rendered as a react-hook-form field array so each row is a real registered
15
+ * field and can use the shared `Labeled*` row the rest of the form is built
16
+ * from. Keying the rows by array index (not by price code) is what makes that
17
+ * safe: a price code containing a `.` or a `[` would otherwise be read as a
18
+ * nested field path.
16
19
  */
17
- export declare function SubscriptionItemQuantityRows({ getOptionLabel, namePrefix, onChange, quantities, selectedPriceCodes, }: Readonly<SubscriptionItemQuantityRowsProps>): import("react/jsx-runtime").JSX.Element;
20
+ export declare function SubscriptionItemQuantityRows({ getOptionLabel, labelWidth, name, rowStyle, selectedPriceCodes, }: Readonly<SubscriptionItemQuantityRowsProps>): import("react/jsx-runtime").JSX.Element;
@@ -1,29 +1,11 @@
1
- import { InvoicingSubscriptionFormLocalData } from '@zeniai/client-epic-state';
1
+ import { InvoicingSubscriptionFormLocalData, InvoicingSubscriptionOption } from '@zeniai/client-epic-state';
2
2
  import { MultiSelectFieldValue } from '../../formElements/multiSelectField/MultiSelectField';
3
- export interface InvoicingSubscriptionFormOption {
4
- label: string;
5
- value: string;
6
- /**
7
- * Plan options only: the plan's own paid-cycle limit, used to prefill the
8
- * form's Billing Cycles field when the plan is selected. Absent means the
9
- * plan renews forever.
10
- */
11
- billingCycles?: number;
12
- /**
13
- * Plan options only: the price point's own billing cadence. Shown read-only,
14
- * because cadence is a property of the price point and the backend rejects a
15
- * subscription that claims a different one.
16
- */
17
- billingPeriod?: number;
18
- billingPeriodUnit?: string;
19
- subtitle?: string;
20
- /**
21
- * Plan options only: the plan's own trial length, used to prefill the form's
22
- * Trial End field from the start date. Absent means the plan has no trial.
23
- */
24
- trialPeriod?: number;
25
- trialPeriodUnit?: string;
26
- }
3
+ /**
4
+ * Aliased rather than redeclared: CES builds every picker list this form
5
+ * renders, so a second definition here would be a copy free to drift from the
6
+ * one the options are actually built against.
7
+ */
8
+ export type InvoicingSubscriptionFormOption = InvoicingSubscriptionOption;
27
9
  export interface PickerValue {
28
10
  allOptions: {
29
11
  label: string;
@@ -48,9 +30,11 @@ export interface InvoicingSubscriptionFormOptions {
48
30
  * in the UI, so it lives off react-hook-form and is reconstructed in the reverse
49
31
  * mapper for the request body.
50
32
  */
51
- export type SubscriptionFormValues = Omit<InvoicingSubscriptionFormLocalData, "addonPriceCodes" | "chargePriceCodes" | "couponId" | "customerId" | "planPriceCode" | "preferredCurrencyCode" | "setupFee" | "startedAt" | "trialEnd"> & {
33
+ export type SubscriptionFormValues = Omit<InvoicingSubscriptionFormLocalData, "addonPriceCodes" | "addonQuantities" | "chargePriceCodes" | "chargeQuantities" | "couponId" | "customerId" | "planPriceCode" | "preferredCurrencyCode" | "setupFee" | "startedAt" | "trialEnd"> & {
52
34
  addonPriceCodes: MultiSelectFieldValue;
35
+ addonQuantities: SubscriptionItemQuantityEntry[];
53
36
  chargePriceCodes: MultiSelectFieldValue;
37
+ chargeQuantities: SubscriptionItemQuantityEntry[];
54
38
  couponId: PickerValue;
55
39
  customerId: PickerValue;
56
40
  planPriceCode: PickerValue;
@@ -68,6 +52,59 @@ export declare const buildSubscriptionOptionLabelGetter: (options: InvoicingSubs
68
52
  * subscription that claims a different one.
69
53
  */
70
54
  export declare const subscriptionBillingCadenceLabel: (plan: InvoicingSubscriptionFormOption | undefined) => string;
55
+ /**
56
+ * One selected add-on / one-time charge's quantity, as the form holds it.
57
+ *
58
+ * An ordered list rather than a `Record` keyed by price code because the rows
59
+ * register with react-hook-form as a field array: a list gives each row the
60
+ * index-based path (`addonQuantities.0.quantity`) that `register` needs, where
61
+ * a price-code key would be read as a nested path the moment a code contained
62
+ * a `.` or a `[`.
63
+ *
64
+ * `quantity` stays the raw field text — clamped to a valid quantity only at the
65
+ * CES boundary — so a half-finished edit (an emptied field, a lone minus) is
66
+ * not snapped out from under the user mid-keystroke.
67
+ */
68
+ export interface SubscriptionItemQuantityEntry {
69
+ priceCode: string;
70
+ quantity: string;
71
+ }
72
+ /**
73
+ * Both readers take their list straight from react-hook-form, which owns the
74
+ * array and can leave a hole in it across a reset or an unregister. The element
75
+ * type says otherwise, so the gap is stated here rather than trusted away.
76
+ */
77
+ type MaybeSubscriptionItemQuantityEntries = readonly (SubscriptionItemQuantityEntry | undefined)[] | undefined;
78
+ /**
79
+ * Quantity entries covering exactly the currently selected price codes: every
80
+ * selection gets a value the row can render (1 when the draft has none), and a
81
+ * code left behind by a deselect is dropped rather than carried in the draft.
82
+ */
83
+ export declare const subscriptionQuantityEntries: (selectedPriceCodes: string[], quantities: Record<string, number> | undefined) => SubscriptionItemQuantityEntry[];
84
+ /**
85
+ * The same reconcile against an existing entry list, keeping each surviving
86
+ * row's in-progress text rather than re-clamping it.
87
+ */
88
+ export declare const reconcileSubscriptionQuantityEntries: (selectedPriceCodes: string[], entries: MaybeSubscriptionItemQuantityEntries) => SubscriptionItemQuantityEntry[];
89
+ /**
90
+ * An add-on / one-time-charge picker's value narrowed to the options currently
91
+ * on offer: `allOptions` becomes the incoming list, and any selection that list
92
+ * no longer holds is dropped.
93
+ *
94
+ * Both halves are needed. A restricted plan narrows the option lists upstream,
95
+ * but the picker renders from the `allOptions` carried inside its own form
96
+ * value, so a narrowed list only reaches the screen by being written back —
97
+ * and a selection the new plan disallows has to go with it.
98
+ *
99
+ * Selections are pruned, never cleared: switching between two plans that both
100
+ * allow an add-on keeps it, and the quantity typed against it.
101
+ *
102
+ * Returns `current` unchanged when nothing moved, so the caller can skip the
103
+ * write — and the dirty flag it would raise — on the common no-op.
104
+ */
105
+ export declare const reconcileSubscriptionMultiSelect: (current: MultiSelectFieldValue, options: InvoicingSubscriptionFormOption[]) => MultiSelectFieldValue;
106
+ /** Entries back to the quantity map CES stores, clamped to what the API accepts. */
107
+ export declare const subscriptionQuantitiesFromEntries: (selectedPriceCodes: string[], entries: MaybeSubscriptionItemQuantityEntries) => Record<string, number>;
71
108
  /**
72
109
  * Trial end implied by the selected plan: the start date walked forward by the
73
110
  * plan's own trial length. `undefined` when the start date is unset or the plan
@@ -82,13 +119,17 @@ export declare const subscriptionFormValuesToLocalData: (values: SubscriptionFor
82
119
  /** Values used by the inline edit on the subscription detail page. */
83
120
  export interface SubscriptionEditValues {
84
121
  addon_price_codes: MultiSelectFieldValue;
122
+ addon_quantities: SubscriptionItemQuantityEntry[];
85
123
  auto_collection: boolean;
124
+ charge_price_codes: MultiSelectFieldValue;
125
+ charge_quantities: SubscriptionItemQuantityEntry[];
86
126
  coupon_id: PickerValue;
87
127
  plan_price_code: PickerValue;
88
128
  plan_quantity: string;
89
129
  po_number: string;
90
130
  }
91
- export declare const localDataToSubscriptionEditValues: (localData: InvoicingSubscriptionFormLocalData, options: Pick<InvoicingSubscriptionFormOptions, "addons" | "coupons" | "plans">) => SubscriptionEditValues;
131
+ export declare const localDataToSubscriptionEditValues: (localData: InvoicingSubscriptionFormLocalData, options: Pick<InvoicingSubscriptionFormOptions, "addons" | "charges" | "coupons" | "plans">) => SubscriptionEditValues;
92
132
  export declare const subscriptionEditValuesToLocalData: (values: SubscriptionEditValues, base: InvoicingSubscriptionFormLocalData) => InvoicingSubscriptionFormLocalData;
93
133
  /** Seed the detail-page inline edit form from the current CES draft. */
94
- export declare const buildSubscriptionEditDefaults: (localData: InvoicingSubscriptionFormLocalData, options: Pick<InvoicingSubscriptionFormOptions, "addons" | "coupons" | "plans">) => SubscriptionEditValues;
134
+ export declare const buildSubscriptionEditDefaults: (localData: InvoicingSubscriptionFormLocalData, options: Pick<InvoicingSubscriptionFormOptions, "addons" | "charges" | "coupons" | "plans">) => SubscriptionEditValues;
135
+ export {};
@@ -1,4 +1,4 @@
1
- import { CommentBodyElement, CommentBodyLink, CommentBodyMention, CommentBodyText } from '@liveblocks/client';
1
+ import { CommentBodyLink, CommentBodyMention, CommentBodyText } from '@liveblocks/client';
2
2
  import { ExternalNotificationData, ID, NotificationStatus, User, ZeniUrl } from '@zeniai/client-epic-state';
3
3
  /**
4
4
  * Props
@@ -34,6 +34,17 @@ export declare const NotificationActionComponents: ({ notificationData, users, }
34
34
  users: User[];
35
35
  }) => import("react/jsx-runtime").JSX.Element;
36
36
  export declare const NotificationTimeComponent: (props: NotificationTimeProps) => import("react/jsx-runtime").JSX.Element;
37
- export declare function isCommentBodyText(element: CommentBodyElement): element is CommentBodyText;
38
- export declare function isCommentBodyMention(element: CommentBodyElement): element is CommentBodyMention;
39
- export declare function isCommentBodyLink(element: CommentBodyElement): element is CommentBodyLink;
37
+ type CommentInline = {
38
+ type?: string;
39
+ id?: string;
40
+ url?: string;
41
+ text?: string;
42
+ bold?: boolean;
43
+ italic?: boolean;
44
+ strikethrough?: boolean;
45
+ code?: boolean;
46
+ };
47
+ export declare function isCommentBodyText(element: CommentInline): element is CommentBodyText;
48
+ export declare function isCommentBodyMention(element: CommentInline): element is CommentBodyMention;
49
+ export declare function isCommentBodyLink(element: CommentInline): element is CommentBodyLink;
50
+ export {};
@@ -6,7 +6,7 @@ type StatusProps = {
6
6
  /** V2 list row — Review lives in AccountReconDetailsDrawerPageV2, not the AI Progress column. */
7
7
  export declare function ShowStatusForBankConnectionV2({ accountRecon, isLoading, }: Readonly<StatusProps>): import("react/jsx-runtime").JSX.Element;
8
8
  export declare function ShowStatusForStatementConnectionV2({ accountRecon, isLoading, }: Readonly<StatusProps>): import("react/jsx-runtime").JSX.Element;
9
- /** When true, AI Progress shows the V1 status (Reconciled / Books closed / etc.) instead of the bar. */
9
+ /** When true, AI Progress shows the V1 status (Reconciled tag / etc.) instead of the bar. */
10
10
  export declare function shouldShowReconciledTagInMatchProgress(reconciliationStatusCode?: ReconciliationStatusCodeType): boolean;
11
11
  export declare function shouldShowMatchProgressBar(matchTotal: number, reconciliationStatusCode?: ReconciliationStatusCodeType): boolean;
12
12
  export {};
@@ -0,0 +1,12 @@
1
+ import { AllowedTimeframe } from '../common/downloadReport/types/downloadReportOptions';
2
+ export interface PdfColumnLimitPopupProps {
3
+ additionalColumnsCount: number;
4
+ maxColumns: number;
5
+ numberOfPeriods: number;
6
+ /** Absent when the report is on a timeframe that has no period wording. */
7
+ timeframe?: AllowedTimeframe;
8
+ onCancel: () => void;
9
+ onDownloadExcel: () => void;
10
+ }
11
+ declare const PdfColumnLimitPopup: ({ additionalColumnsCount, maxColumns, numberOfPeriods, timeframe, onCancel, onDownloadExcel, }: Readonly<PdfColumnLimitPopupProps>) => import("react/jsx-runtime").JSX.Element;
12
+ export default PdfColumnLimitPopup;
@@ -27,7 +27,8 @@ export declare enum DynamicConfigNamesWebApp {
27
27
  approvalRuleV3Config = "approval_rule_v3_config",
28
28
  transactionCategorizationConfig = "transaction_categorization_config",
29
29
  zeniCardsVisibilityConfig = "zeni_cards_visibility_config",
30
- updateTransactionTypeConfig = "update_transaction_type_config"
30
+ updateTransactionTypeConfig = "update_transaction_type_config",
31
+ agentJeConfig = "agent_je_config"
31
32
  }
32
33
  /** Shared configs used by both web-app-ui and cockpit-ui */
33
34
  export declare enum DynamicConfigNamesShared {
@@ -54,6 +55,7 @@ export declare const DynamicConfigNames: {
54
55
  transactionCategorizationConfig: DynamicConfigNamesWebApp.transactionCategorizationConfig;
55
56
  zeniCardsVisibilityConfig: DynamicConfigNamesWebApp.zeniCardsVisibilityConfig;
56
57
  updateTransactionTypeConfig: DynamicConfigNamesWebApp.updateTransactionTypeConfig;
58
+ agentJeConfig: DynamicConfigNamesWebApp.agentJeConfig;
57
59
  cardsTabCockpitUser: DynamicConfigNamesCockpit.cardsTabCockpitUser;
58
60
  monthEndInsightsEnablement: DynamicConfigNamesCockpit.monthEndInsightsEnablement;
59
61
  expenseAutomationEnablement: DynamicConfigNamesCockpit.expenseAutomationEnablement;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * UI gate for Actual Matching. Reads Statsig dynamic config `agent_je_config`
3
+ * (same object agent-je uses). Fail-closed: missing slice / missing key /
4
+ * any value other than explicit `true` hides the tab.
5
+ *
6
+ * Expected shape:
7
+ * ```
8
+ * {
9
+ * "global": {
10
+ * "accrual_config": {
11
+ * "ACTUAL_MATCHING_ENABLED": true
12
+ * }
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ export declare const ACTUAL_MATCHING_ENABLED_KEY = "ACTUAL_MATCHING_ENABLED";
18
+ export declare function isActualMatchingEnabledInAgentJeConfig(configValue: Record<string, unknown> | null | undefined): boolean;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Actual Matching JE subtab / match-detail UI gate from Statsig
3
+ * `agent_je_config`. Fail-closed while Statsig is loading or the key is
4
+ * missing — master can ship the code with the tab hidden.
5
+ */
6
+ export declare function useActualMatchingEnabled(): boolean;