@zeniai/web-components 4.2.95 → 4.2.96

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 (44) hide show
  1. package/dist/{SessionTimeoutPopup-BvCbpR-3.js → SessionTimeoutPopup-3XUxzhe3.js} +91027 -90138
  2. package/dist/{SessionTimeoutPopup-BJ8jTJaf.cjs → SessionTimeoutPopup-BWmNhtzl.cjs} +16233 -16169
  3. package/dist/appLocale.d.ts +41 -1
  4. package/dist/cockpit.cjs.js +38 -38
  5. package/dist/cockpit.esm.js +1243 -1234
  6. package/dist/common/util.d.ts +1 -0
  7. package/dist/components/aiCfo/components/FieldRowWithAutoFillBadge.d.ts +14 -1
  8. package/dist/components/cards/summaryCard/tasksCard/TasksCard.d.ts +2 -4
  9. package/dist/components/commonSetUp/utils/hasFormFieldValue.d.ts +11 -0
  10. package/dist/components/customerOnboarding/detail/CustomerOnboardingDetailPage.d.ts +11 -0
  11. package/dist/components/customerOnboarding/detail/components/BankVerification.d.ts +5 -2
  12. package/dist/components/customerOnboarding/detail/components/OnboardingStepFrame.d.ts +5 -1
  13. package/dist/components/customerOnboarding/detail/pages/AIAgentsActivatingPage.d.ts +8 -1
  14. package/dist/components/customerOnboarding/detail/pages/VerifyUnlockFinancialStackPage.d.ts +4 -1
  15. package/dist/components/customerOnboarding/drawer/OnboardingSidebar.d.ts +9 -1
  16. package/dist/components/dashboard/Dashboard.d.ts +1 -2
  17. package/dist/components/formElements/labeledGroupedCheckBoxField/LabeledGroupedCheckBoxField.d.ts +1 -0
  18. package/dist/components/invoicing/catalogForm/InvoicingCatalogItemFormPage.d.ts +4 -2
  19. package/dist/components/invoicing/catalogForm/catalogItemForm.shared.d.ts +10 -3
  20. package/dist/components/invoicing/common/InvoicingFormRows.d.ts +4 -1
  21. package/dist/components/invoicing/common/InvoicingOpenEntityValue.d.ts +14 -0
  22. package/dist/components/invoicing/couponForm/couponForm.shared.d.ts +3 -1
  23. package/dist/components/invoicing/customerForm/customerForm.shared.d.ts +2 -2
  24. package/dist/components/invoicing/recordPayment/recordPayment.shared.d.ts +3 -1
  25. package/dist/components/invoicing/settings/InvoicingIntegrationsSection.d.ts +2 -1
  26. package/dist/components/invoicing/settings/InvoicingQBOSettingsPage.d.ts +24 -0
  27. package/dist/components/invoicing/settings/invoicingIntegrationCards.d.ts +2 -1
  28. package/dist/components/invoicing/settings/invoicingSettingsShared.d.ts +1 -1
  29. package/dist/components/invoicing/subscriptionForm/subscriptionForm.shared.d.ts +6 -3
  30. package/dist/components/notifications/components/CommentsNotificationTileMedium.d.ts +0 -6
  31. package/dist/components/notifications/components/NotificationRowText.d.ts +13 -0
  32. package/dist/components/notifications/components/NotificationTagPill.d.ts +12 -0
  33. package/dist/components/notifications/components/NotificationTileMedium.d.ts +1 -7
  34. package/dist/components/notifications/components/notificationRowStyles.d.ts +34 -0
  35. package/dist/components/notifications/table/notificationsListHeader/NotificationsListConfig.d.ts +2 -0
  36. package/dist/components/notifications/utils/commentsNotificationHelpers.d.ts +11 -0
  37. package/dist/components/notifications/utils/commonHelpers.d.ts +2 -1
  38. package/dist/components/settingsPage/Integrations/components/integrationCardTypes.d.ts +1 -0
  39. package/dist/index.cjs.js +1 -1
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.esm.js +378 -373
  42. package/dist/strings/strings.d.ts +41 -1
  43. package/dist/types/liveblocks.config.d.ts +8 -0
  44. package/package.json +5 -5
@@ -85,4 +85,5 @@ export declare const roundAmountIfNeeded: (amount: number) => number;
85
85
  export declare const flowFromUrl: () => string;
86
86
  export declare const isEqualProps: <T extends Record<string, unknown>>(prevProps: T, newProps: T, listOfProps: ReadonlyArray<keyof T>) => boolean;
87
87
  export declare const normalizeString: (str: string | undefined) => string;
88
+ export declare const base64ToBytes: (base64: string) => Uint8Array;
88
89
  export {};
@@ -15,5 +15,18 @@ import { ReactNode } from 'react';
15
15
  export interface FieldRowWithAutoFillBadgeProps {
16
16
  children: ReactNode;
17
17
  isAutoFilled: boolean;
18
+ /**
19
+ * True when the field already holds a value — manually entered or filled by an
20
+ * earlier document. A filled field keeps its value during a new parse instead
21
+ * of being replaced (and unmounted) by a skeleton, so user input is never lost.
22
+ */
23
+ isFilled?: boolean;
24
+ /**
25
+ * While the uploaded document is being parsed for autofill, render a skeleton
26
+ * row in place of the (still-empty) field — it's one of the "expected" values
27
+ * the document may populate. Empty / 0-confidence results are fine; the
28
+ * skeleton just signals the field is loading.
29
+ */
30
+ isParsing?: boolean;
18
31
  }
19
- export declare function FieldRowWithAutoFillBadge({ isAutoFilled, children, }: FieldRowWithAutoFillBadgeProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function FieldRowWithAutoFillBadge({ isAutoFilled, isFilled, isParsing, children, }: FieldRowWithAutoFillBadgeProps): import("react/jsx-runtime").JSX.Element;
@@ -3,20 +3,18 @@ import { ClientAnalytics } from '@zeniai/client-analytics';
3
3
  import { TasksCardReport } from '@zeniai/client-epic-state';
4
4
  import { CardActions, CardData } from '../../cardTypes';
5
5
  import { DragAndDropProps } from '../../common/Card';
6
- declare const TasksCard: ({ card, data, actions, isExpenseAutomationEnabledForUser, analytics, dndProps, }: {
6
+ declare const TasksCard: ({ card, data, actions, analytics, dndProps, }: {
7
7
  actions: CardActions;
8
8
  card: CardData;
9
9
  data: TasksCardReport;
10
- isExpenseAutomationEnabledForUser: boolean;
11
10
  analytics?: ClientAnalytics;
12
11
  dndProps?: DragAndDropProps;
13
12
  }) => import("react/jsx-runtime").JSX.Element;
14
13
  export default TasksCard;
15
- export declare const MemoTasksCard: React.MemoExoticComponent<({ card, data, actions, isExpenseAutomationEnabledForUser, analytics, dndProps, }: {
14
+ export declare const MemoTasksCard: React.MemoExoticComponent<({ card, data, actions, analytics, dndProps, }: {
16
15
  actions: CardActions;
17
16
  card: CardData;
18
17
  data: TasksCardReport;
19
- isExpenseAutomationEnabledForUser: boolean;
20
18
  analytics?: ClientAnalytics;
21
19
  dndProps?: DragAndDropProps;
22
20
  }) => import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * True when a react-hook-form field value is non-empty: a string with
3
+ * non-whitespace content, a non-empty array, an object with at least one
4
+ * non-empty entry (e.g. an address), or any other truthy scalar.
5
+ *
6
+ * Used by the verification sections to decide whether a field already holds a
7
+ * value (manually entered or document-autofilled) and so should keep its value
8
+ * during a new document parse instead of being replaced by a skeleton. Shared by
9
+ * the company + officer detail sections so the emptiness rule lives in one place.
10
+ */
11
+ export declare function hasFormFieldValue(value: unknown): boolean;
@@ -46,6 +46,17 @@ export interface Props {
46
46
  * is rendered enabled but unwired).
47
47
  */
48
48
  integrationsSectionProps?: IntegrationsSectionProps;
49
+ /**
50
+ * True only for pure Tax/CFO/Payroll (product-suite) tenants. Gates the
51
+ * verification→setup_billing redirect so bookkeeping / mixed tenants are
52
+ * never routed to the interim product-suite page (which latches
53
+ * is_interim_email_sent and traps them on /thankyou).
54
+ *
55
+ * Absent/undefined intentionally means "treat as non-product-suite": the
56
+ * redirect stays suppressed, which is the safe default for callers that
57
+ * don't wire tenant product data.
58
+ */
59
+ isProductSuiteTenant?: boolean;
49
60
  handleAddCardPaymentSource: (paymentType: AddCardPaymentSourceType, paymentMethod: string, paymentId: string) => void;
50
61
  handleConfirmCardSetupIntent: (setupIntentData: SetupIntentResult) => void;
51
62
  handleCreateCardSetupIntent: (paymentsMethod: string[]) => void;
@@ -1,11 +1,14 @@
1
1
  import { ID, PaymentAccount } from '@zeniai/client-epic-state';
2
- declare const BankVerification: ({ bankVerificationFlags, onClick, linkSessionId, }: {
2
+ declare const BankVerification: ({ bankVerificationFlags, isVerificationLoading, linkSessionId, showStartVerification, onClick, }: {
3
3
  bankVerificationFlags: {
4
4
  isBankVerificationBox: boolean;
5
5
  paymentAccount: PaymentAccount | undefined;
6
6
  paymentAccountStatus: string | undefined;
7
+ providerVerificationStatusCode?: string;
7
8
  };
9
+ isVerificationLoading?: boolean;
8
10
  linkSessionId?: ID | null;
9
- onClick: () => void;
11
+ showStartVerification?: boolean;
12
+ onClick?: () => void;
10
13
  }) => import("react/jsx-runtime").JSX.Element;
11
14
  export default BankVerification;
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ export type SkipDisabledReason = "qbo" | "pending-verification" | "login-required";
2
3
  export interface OnboardingStepFrameProps {
3
4
  children: ReactNode;
4
5
  title: string;
@@ -8,6 +9,9 @@ export interface OnboardingStepFrameProps {
8
9
  ctaIcon?: JSX.Element;
9
10
  ctaLabel?: string;
10
11
  ctaLoading?: boolean;
12
+ skipDisabled?: boolean;
13
+ /** Chooses the disabled-skip tooltip copy. Defaults to the QBO reason. */
14
+ skipDisabledReason?: SkipDisabledReason;
11
15
  skipLabel?: string;
12
16
  stepNumber?: number;
13
17
  subtitle?: string;
@@ -16,4 +20,4 @@ export interface OnboardingStepFrameProps {
16
20
  onCtaClick?: () => void;
17
21
  onSkipClick?: () => void;
18
22
  }
19
- export declare const OnboardingStepFrame: ({ title, subtitle, stepNumber, totalSteps, ctaLabel, ctaIcon, ctaLoading, ctaDisabled, onCtaClick, backLabel, onBackClick, backDisabled, skipLabel, onSkipClick, children, }: OnboardingStepFrameProps) => import("react/jsx-runtime").JSX.Element;
23
+ export declare const OnboardingStepFrame: ({ title, subtitle, stepNumber, totalSteps, ctaLabel, ctaIcon, ctaLoading, ctaDisabled, onCtaClick, backLabel, onBackClick, backDisabled, skipLabel, skipDisabled, skipDisabledReason, onSkipClick, children, }: OnboardingStepFrameProps) => import("react/jsx-runtime").JSX.Element;
@@ -4,6 +4,13 @@ export interface AIAgentsActivatingPageProps {
4
4
  stepNumber: number;
5
5
  tenantName: string;
6
6
  totalSteps: number;
7
+ /**
8
+ * When true the activation timeline is skipped and every row renders in its
9
+ * settled "building" state with the CTA enabled. Set on repeat visits once
10
+ * isOnboardingAiActivationViewed is true, so the animation doesn't replay
11
+ * each time the page loads.
12
+ */
13
+ alreadyViewed?: boolean;
7
14
  /** Override the background row statuses (used by stories). */
8
15
  backgroundRowStatuses?: ReadonlyArray<AIAgentRowStatus>;
9
16
  /**
@@ -28,4 +35,4 @@ export interface AIAgentsActivatingPageProps {
28
35
  showLedgerReadyInLabel?: boolean;
29
36
  onContinueClick: () => void;
30
37
  }
31
- export declare const AIAgentsActivatingPage: ({ tenantName, stepNumber, totalSteps, ledgerRowStatuses: overrideLedgerRowStatuses, backgroundRowStatuses: overrideBackgroundRowStatuses, showLedgerReadyInLabel: overrideShowLedgerReadyInLabel, showBackgroundReadyInLabel: overrideShowBackgroundReadyInLabel, counts, forceContinueEnabled, rowStartingDurationMs, onContinueClick, }: AIAgentsActivatingPageProps) => import("react/jsx-runtime").JSX.Element;
38
+ export declare const AIAgentsActivatingPage: ({ tenantName, stepNumber, totalSteps, alreadyViewed, ledgerRowStatuses: overrideLedgerRowStatuses, backgroundRowStatuses: overrideBackgroundRowStatuses, showLedgerReadyInLabel: overrideShowLedgerReadyInLabel, showBackgroundReadyInLabel: overrideShowBackgroundReadyInLabel, counts, forceContinueEnabled, rowStartingDurationMs, onContinueClick, }: AIAgentsActivatingPageProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,11 @@
1
+ import { SkipDisabledReason } from '../components/OnboardingStepFrame';
1
2
  import { VerifyUnlockFinancialStackSectionProps } from '../sections/VerifyUnlockFinancialStackSection';
2
3
  export interface VerifyUnlockFinancialStackPageProps extends VerifyUnlockFinancialStackSectionProps {
3
4
  stepNumber: number;
4
5
  totalSteps: number;
6
+ skipDisabled?: boolean;
7
+ skipDisabledReason?: SkipDisabledReason;
5
8
  onStartVerificationClick: () => void;
6
9
  onSkipToDashboardClick?: () => void;
7
10
  }
8
- export declare const VerifyUnlockFinancialStackPage: ({ stepNumber, totalSteps, onStartVerificationClick, onSkipToDashboardClick, ...sectionProps }: VerifyUnlockFinancialStackPageProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const VerifyUnlockFinancialStackPage: ({ stepNumber, totalSteps, skipDisabled, skipDisabledReason, onStartVerificationClick, onSkipToDashboardClick, ...sectionProps }: VerifyUnlockFinancialStackPageProps) => import("react/jsx-runtime").JSX.Element;
@@ -20,10 +20,18 @@ export interface OnboardingSidebarProps {
20
20
  * Exactly one step should be "active".
21
21
  */
22
22
  stepStatuses: Partial<Record<OnboardingStep, OnboardingSidebarStepStatus>>;
23
+ /** Attention/error treatment for a step; takes precedence over `warningStep`. */
24
+ errorStep?: OnboardingStep;
23
25
  footerSlot?: ReactNode;
26
+ /**
27
+ * Step to render in warning colors (badge round + title) regardless of its
28
+ * progress status — signals an action the user must resolve (e.g. a pending
29
+ * bank verification on setup_billing) before onboarding can complete.
30
+ */
31
+ warningStep?: OnboardingStep;
24
32
  onLogoClick?: () => void;
25
33
  onStepClick?: (step: OnboardingStep) => void;
26
34
  }
27
- declare const OnboardingSidebar: ({ steps, stepStatuses, allRequiredStepsCompleted, footerSlot, onLogoClick, onStepClick, }: OnboardingSidebarProps) => import("react/jsx-runtime").JSX.Element;
35
+ declare const OnboardingSidebar: ({ steps, stepStatuses, allRequiredStepsCompleted, footerSlot, warningStep, errorStep, onLogoClick, onStepClick, }: OnboardingSidebarProps) => import("react/jsx-runtime").JSX.Element;
28
36
  export default OnboardingSidebar;
29
37
  export declare const SIDEBAR_WIDTH_PX = 240;
@@ -2,7 +2,7 @@ import { ClientAnalytics } from '@zeniai/client-analytics';
2
2
  import { CardActions, CardType } from '../cards/cardTypes';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../common/autoComplete/autoCompleteProps';
4
4
  import { DashboardCardData } from './dashboardTypes';
5
- declare function Dashboard({ cardDataArray, cardActions, christmasAnimationEnabled, newYearAnimationEnabled, autoCompleteData, autoCompleteActions, analytics, isReimbursementEnabled, isBillPayEnabled, isVisitingFirstTime, isZeniAccountEnabled, isExpenseAutomationEnabledForUser, onDragAndDropCard, isAiCfoAccessEnabled, onAskAiCfoClick, onAiCfoDashboardPromptSubmit, onAiCfoDashboardOpenPanel, onAiCfoDashboardOpenScopePage, onAiCfoDashboardExpandToFullPage, isAiCfoFileUploadEnabled, initialSearchFocus, maxColumns, aiAuditScorePercentageEnabled, aiCfoDashboardShouldClearPromptOnSubmit, aiCfoDashboardSuggestedPromptQuestions, aiCfoDashboardSuggestedPromptQuestionsLoading, }: Readonly<{
5
+ declare function Dashboard({ cardDataArray, cardActions, christmasAnimationEnabled, newYearAnimationEnabled, autoCompleteData, autoCompleteActions, analytics, isReimbursementEnabled, isBillPayEnabled, isVisitingFirstTime, isZeniAccountEnabled, onDragAndDropCard, isAiCfoAccessEnabled, onAskAiCfoClick, onAiCfoDashboardPromptSubmit, onAiCfoDashboardOpenPanel, onAiCfoDashboardOpenScopePage, onAiCfoDashboardExpandToFullPage, isAiCfoFileUploadEnabled, initialSearchFocus, maxColumns, aiAuditScorePercentageEnabled, aiCfoDashboardShouldClearPromptOnSubmit, aiCfoDashboardSuggestedPromptQuestions, aiCfoDashboardSuggestedPromptQuestionsLoading, }: Readonly<{
6
6
  aiAuditScorePercentageEnabled: boolean;
7
7
  analytics: ClientAnalytics;
8
8
  autoCompleteActions: AutoCompleteActions;
@@ -10,7 +10,6 @@ declare function Dashboard({ cardDataArray, cardActions, christmasAnimationEnabl
10
10
  cardActions: CardActions;
11
11
  cardDataArray: DashboardCardData[];
12
12
  isBillPayEnabled: boolean;
13
- isExpenseAutomationEnabledForUser: boolean;
14
13
  isReimbursementEnabled: boolean;
15
14
  isVisitingFirstTime: boolean;
16
15
  isZeniAccountEnabled: boolean;
@@ -9,6 +9,7 @@ export interface CheckBoxCoreDetails {
9
9
  groupLabel: boolean;
10
10
  label: string | React.ReactNode;
11
11
  value: string;
12
+ containerStyle?: React.CSSProperties;
12
13
  exceptionInfo?: string;
13
14
  exceptionMode?: CheckBoxMode;
14
15
  exceptionTooltipStyle?: React.CSSProperties;
@@ -1,4 +1,4 @@
1
- import { InvoicingCatalogItemFormLocalData } from '@zeniai/client-epic-state';
1
+ import { InvoicingCatalogItemFormLocalData, InvoicingQboAccountOption } from '@zeniai/client-epic-state';
2
2
  /**
3
3
  * Catalog item types as shown to the user. All three are parent catalog items;
4
4
  * the type controls the parent and nested sub-family payload fields.
@@ -29,6 +29,8 @@ export interface InvoicingCatalogItemFormPageProps {
29
29
  */
30
30
  defaultType?: CatalogFormType;
31
31
  errorMessage?: string;
32
+ qboClasses?: InvoicingQboAccountOption[];
33
+ qboIncomeAccounts?: InvoicingQboAccountOption[];
32
34
  onCancel: () => void;
33
35
  onChange: (localData: InvoicingCatalogItemFormLocalData) => void;
34
36
  onSubmit: () => void;
@@ -41,5 +43,5 @@ export interface InvoicingCatalogItemFormPageProps {
41
43
  * invoicing forms. The whole form syncs back to the CES draft (`localData`) on
42
44
  * every change; the save payload is derived from the draft in CES.
43
45
  */
44
- export declare function InvoicingCatalogItemFormPage({ applicabilityValues, applicableItemOptions, defaultType, errorMessage, isSubmitting, localData, mode, onBack, onCancel, onChange, onSubmit, periodUnitValues, pricingModelValues, prorationValues, tierTypeValues, trialEndActionValues, trialUnitValues, typeValues, }: Readonly<InvoicingCatalogItemFormPageProps>): import("react/jsx-runtime").JSX.Element;
46
+ export declare function InvoicingCatalogItemFormPage({ applicabilityValues, applicableItemOptions, defaultType, errorMessage, isSubmitting, localData, mode, onBack, onCancel, onChange, onSubmit, periodUnitValues, pricingModelValues, prorationValues, qboClasses, qboIncomeAccounts, tierTypeValues, trialEndActionValues, trialUnitValues, typeValues, }: Readonly<InvoicingCatalogItemFormPageProps>): import("react/jsx-runtime").JSX.Element;
45
47
  export default InvoicingCatalogItemFormPage;
@@ -37,14 +37,19 @@ export interface PickerValue {
37
37
  allOptions: CatalogSelectOption[];
38
38
  selectedOption?: string;
39
39
  }
40
+ /** Unwrap accountingCode/accountingCategory — PickerValue when QBO-connected, string otherwise. */
41
+ export declare const pickerOrText: (value: PickerValue | string) => string;
40
42
  export interface CatalogTierFormValues {
41
43
  endingUnit: string;
42
44
  packageSize: string;
43
- price: string;
45
+ /** Held as a float by `returnValueType: "floatValue"`; `null` when cleared. */
46
+ price: number | null;
44
47
  pricingType: PickerValue;
45
48
  startingUnit: string;
46
49
  }
47
50
  export interface CatalogSubFamilyFormValues {
51
+ accountingCategory: PickerValue | string;
52
+ accountingCode: PickerValue | string;
48
53
  billingCycles: string;
49
54
  description: string;
50
55
  flags: MultiSelectFieldValue;
@@ -55,9 +60,11 @@ export interface CatalogSubFamilyFormValues {
55
60
  period: string;
56
61
  periodUnit: PickerValue;
57
62
  priceCode: string;
58
- priceDollars: string;
63
+ /** Held as a float by `returnValueType: "floatValue"`; `null` when cleared. */
64
+ priceDollars: number | null;
59
65
  pricingModel: PickerValue;
60
66
  prorationType: PickerValue;
67
+ sku: string;
61
68
  tiers: CatalogTierFormValues[];
62
69
  trialEndAction: PickerValue;
63
70
  trialPeriod: string;
@@ -66,7 +73,7 @@ export interface CatalogSubFamilyFormValues {
66
73
  /**
67
74
  * Form-values shape reuses the CES localData field names verbatim — only the
68
75
  * fields whose *shape* differs on the form (pickers, multiselect, sub-families)
69
- * are overridden. Every plain field (name, productCode, sku, externalId, …) flows
76
+ * are overridden. Every plain field (name, productCode, externalId, …) flows
70
77
  * through by identity, so adding a field to the CES type needs no mapper change.
71
78
  */
72
79
  export type CatalogFormValues = Omit<InvoicingCatalogItemFormLocalData, "applicableItems" | "catalogType" | "itemApplicability" | "subFamilies"> & {
@@ -65,6 +65,9 @@ export interface FormToggleRowProps {
65
65
  checked: boolean;
66
66
  description: string;
67
67
  label: string;
68
+ containerStyle?: React.CSSProperties;
69
+ descriptionStyle?: React.CSSProperties;
70
+ labelStyle?: React.CSSProperties;
68
71
  onChange: (checked: boolean) => void;
69
72
  }
70
- export declare function FormToggleRow({ checked, description, label, onChange, }: Readonly<FormToggleRowProps>): import("react/jsx-runtime").JSX.Element;
73
+ export declare function FormToggleRow({ checked, containerStyle, description, descriptionStyle, label, labelStyle, onChange, }: Readonly<FormToggleRowProps>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { ReactElement } from 'react';
2
+ export interface InvoicingOpenEntityValueProps {
3
+ dataTestId: string;
4
+ label: string;
5
+ ariaLabel?: string;
6
+ onOpen: () => void;
7
+ }
8
+ /**
9
+ * Linked-entity value for the invoicing detail pages: the name stays plain text
10
+ * and only a trailing open-in-new-tab icon is a click target, so long names
11
+ * don't read as one large hyperlink. Shared so the invoice and subscription
12
+ * detail pages can't drift apart.
13
+ */
14
+ export declare function InvoicingOpenEntityValue({ ariaLabel, dataTestId, label, onOpen, }: Readonly<InvoicingOpenEntityValueProps>): ReactElement;
@@ -17,8 +17,10 @@ export interface PickerValue {
17
17
  * Every plain field (name, couponCode, couponId, …) flows through by identity,
18
18
  * so adding a field to the CES type needs no mapper change.
19
19
  */
20
- export type CouponFormValues = Omit<InvoicingCouponFormLocalData, "applyOn" | "discountType" | "durationType" | "periodUnit" | "validFrom" | "validTill"> & {
20
+ export type CouponFormValues = Omit<InvoicingCouponFormLocalData, "applyOn" | "discountAmount" | "discountType" | "durationType" | "periodUnit" | "validFrom" | "validTill"> & {
21
21
  applyOn: PickerValue;
22
+ /** Held as a float by `returnValueType: "floatValue"`; `null` when cleared. */
23
+ discountAmount: number | null;
22
24
  discountType: PickerValue;
23
25
  durationType: PickerValue;
24
26
  periodUnit: PickerValue;
@@ -29,8 +29,8 @@ export declare const buildInvoicingCustomerFormOptions: () => InvoicingCustomerF
29
29
  * *shape* differs on the form (the three pickers) are overridden. Every plain
30
30
  * field (firstName, lastName, email, …) flows through by identity, so adding a
31
31
  * field to the CES type needs no mapper change. `preferredCurrencyCode` is
32
- * fixed to USD and shown as a readonly row, so it is dropped from the form
33
- * values and reconstructed on the way back.
32
+ * fixed to USD and not surfaced in the UI, so it is dropped from the form
33
+ * values and reconstructed on the way back for the request body.
34
34
  */
35
35
  export type CustomerFormValues = Omit<InvoicingCustomerFormLocalData, "customerType" | "netTermDays" | "preferredCurrencyCode" | "taxability"> & {
36
36
  customerType: PickerValue;
@@ -22,7 +22,9 @@ export interface PickerValue {
22
22
  * pickers, the date picker) are overridden. Every plain field (amount, comment,
23
23
  * referenceNumber, transactionId) flows through by identity.
24
24
  */
25
- export type RecordPaymentFormValues = Omit<RecordPaymentFormLocalData, "customerId" | "date" | "gateway" | "invoiceToLink" | "paymentMethod"> & {
25
+ export type RecordPaymentFormValues = Omit<RecordPaymentFormLocalData, "amount" | "customerId" | "date" | "gateway" | "invoiceToLink" | "paymentMethod"> & {
26
+ /** Held as a float by `returnValueType: "floatValue"`; `null` when cleared. */
27
+ amount: number | null;
26
28
  customerId: PickerValue;
27
29
  date: Date | undefined;
28
30
  gateway: PickerValue;
@@ -17,8 +17,9 @@ export interface InvoicingIntegrationsSectionProps {
17
17
  onReconnectQBO: () => void;
18
18
  onRefreshQBO: () => void;
19
19
  onSaveChargeBeeCredentials: (apiKey: string, site: string) => void;
20
+ onConfigureQBO?: () => void;
20
21
  onConnectStripe?: (credentials: StripeConnectCredentials) => void;
21
22
  onDisconnectStripe?: () => void;
22
23
  }
23
- export declare function InvoicingIntegrationsSection({ deleteConnectionError, deleteConnectionState, initialStripeDialogOpen, integrationsView, isAdmin, isStripeBusy, onConnectStripe, onDisconnect, onDisconnectStripe, onReconnectQBO, onRefreshQBO, onSaveChargeBeeCredentials, saveChargeBeeError, saveChargeBeeState, settings, stripeError, stripeWebhookUrl, }: Readonly<InvoicingIntegrationsSectionProps>): import("react/jsx-runtime").JSX.Element;
24
+ export declare function InvoicingIntegrationsSection({ deleteConnectionError, deleteConnectionState, initialStripeDialogOpen, integrationsView, isAdmin, isStripeBusy, onConfigureQBO, onConnectStripe, onDisconnect, onDisconnectStripe, onReconnectQBO, onRefreshQBO, onSaveChargeBeeCredentials, saveChargeBeeError, saveChargeBeeState, settings, stripeError, stripeWebhookUrl, }: Readonly<InvoicingIntegrationsSectionProps>): import("react/jsx-runtime").JSX.Element;
24
25
  export default InvoicingIntegrationsSection;
@@ -0,0 +1,24 @@
1
+ import { FetchStateAndError, InvoicingNamedOption, InvoicingQboAccountMappingKindOption, InvoicingQboAccountOption, InvoicingQboConnection, InvoicingQboSettingsPayload, InvoicingQboSyncHealth } from '@zeniai/client-epic-state';
2
+ export interface InvoicingQBOSettingsPageProps {
3
+ accountMappingKindOptions: InvoicingQboAccountMappingKindOption[];
4
+ accountsByAccountTypes: Record<string, InvoicingQboAccountOption[]>;
5
+ customerMatchingOptions: InvoicingNamedOption[];
6
+ isBackfilling: boolean;
7
+ isLoading: boolean;
8
+ isSaving: boolean;
9
+ retryFetchStateByTaskId: Record<string, FetchStateAndError>;
10
+ syncStatusOptions: InvoicingNamedOption[];
11
+ connection?: InvoicingQboConnection;
12
+ qboSettings?: InvoicingQboSettingsPayload;
13
+ saveErrorMessage?: string;
14
+ syncHealth?: InvoicingQboSyncHealth;
15
+ onBackClick: () => void;
16
+ onLoadAccounts: (accountTypes: string) => void;
17
+ onReconnect: () => void;
18
+ onRefresh: () => void;
19
+ onRetryTask: (taskId: string) => void;
20
+ onSave: (qboSettings: InvoicingQboSettingsPayload) => void;
21
+ onStartBackfill: (startDate: string) => void;
22
+ }
23
+ export declare function InvoicingQBOSettingsPage({ accountMappingKindOptions, accountsByAccountTypes, connection, customerMatchingOptions, isBackfilling, isLoading, isSaving, onBackClick, onLoadAccounts, onReconnect, onRefresh, onRetryTask, onSave, onStartBackfill, qboSettings, retryFetchStateByTaskId, saveErrorMessage, syncHealth, syncStatusOptions, }: Readonly<InvoicingQBOSettingsPageProps>): import("react/jsx-runtime").JSX.Element;
24
+ export default InvoicingQBOSettingsPage;
@@ -12,6 +12,7 @@ export interface BuildInvoicingIntegrationCardsParams {
12
12
  onOpenStripeDialog: () => void;
13
13
  onReconnectQBO: () => void;
14
14
  onRefreshQBO: () => void;
15
+ onConfigureQBO?: () => void;
15
16
  onDisconnectStripe?: () => void;
16
17
  }
17
- export declare const buildInvoicingIntegrationCardSpecs: ({ integrationsView, isDarkTheme, isQBORefreshing, isStripeBusy, onDisconnectChargebee, onDisconnectQBO, onDisconnectStripe, onOpenChargebeeDialog, onOpenStripeDialog, onReconnectQBO, onRefreshQBO, settings, }: BuildInvoicingIntegrationCardsParams) => IntegrationCardSpec[];
18
+ export declare const buildInvoicingIntegrationCardSpecs: ({ integrationsView, isDarkTheme, isQBORefreshing, isStripeBusy, onConfigureQBO, onDisconnectChargebee, onDisconnectQBO, onDisconnectStripe, onOpenChargebeeDialog, onOpenStripeDialog, onReconnectQBO, onRefreshQBO, settings, }: BuildInvoicingIntegrationCardsParams) => IntegrationCardSpec[];
@@ -153,7 +153,7 @@ export declare const CardHeaderRow: import('@emotion/styled').StyledComponent<{
153
153
  theme?: import('@emotion/react').Theme;
154
154
  as?: React.ElementType;
155
155
  }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
156
- export declare const CardHeaderText: import('@emotion/styled').StyledComponent<{
156
+ export declare const CardHeaderTitle: import('@emotion/styled').StyledComponent<{
157
157
  theme?: import('@emotion/react').Theme;
158
158
  as?: React.ElementType;
159
159
  }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -27,16 +27,19 @@ export interface InvoicingSubscriptionFormOptions {
27
27
  * Reuses the CES localData field names verbatim — only the fields whose *shape*
28
28
  * differs on the form (pickers, multiselects, the trial-end date) are
29
29
  * overridden. Every plain field (autoCollection, poNumber, setupFee) flows
30
- * through by identity. `preferredCurrencyCode` is a fixed USD readonly display,
31
- * so it lives off react-hook-form and is reconstructed in the reverse mapper.
30
+ * through by identity. `preferredCurrencyCode` is fixed to USD and not surfaced
31
+ * in the UI, so it lives off react-hook-form and is reconstructed in the reverse
32
+ * mapper for the request body.
32
33
  */
33
- export type SubscriptionFormValues = Omit<InvoicingSubscriptionFormLocalData, "addonPriceCodes" | "billingFrequency" | "chargePriceCodes" | "couponId" | "customerId" | "planPriceCode" | "preferredCurrencyCode" | "trialEnd"> & {
34
+ export type SubscriptionFormValues = Omit<InvoicingSubscriptionFormLocalData, "addonPriceCodes" | "billingFrequency" | "chargePriceCodes" | "couponId" | "customerId" | "planPriceCode" | "preferredCurrencyCode" | "setupFee" | "trialEnd"> & {
34
35
  addonPriceCodes: MultiSelectWithCheckBoxFieldValue;
35
36
  billingFrequency: PickerValue;
36
37
  chargePriceCodes: MultiSelectWithCheckBoxFieldValue;
37
38
  couponId: PickerValue;
38
39
  customerId: PickerValue;
39
40
  planPriceCode: PickerValue;
41
+ /** Held as a float by `returnValueType: "floatValue"`; `null` when cleared. */
42
+ setupFee: number | null;
40
43
  trialEnd: Date | undefined;
41
44
  };
42
45
  /** Value→label lookup for a checkbox-less multi-select (add-ons detail edit). */
@@ -1,11 +1,5 @@
1
1
  import { CommentBodyElement, CommentBodyLink, CommentBodyMention, CommentBodyText } from '@liveblocks/client';
2
2
  import { ExternalNotificationData, ID, NotificationStatus, User, ZeniUrl } from '@zeniai/client-epic-state';
3
- import { ResponsiveSized } from '../../../context/windowSizeProvider';
4
- /**
5
- * Dimensions
6
- */
7
- export declare const tileLineClamp: ResponsiveSized;
8
- export declare const notificationTileSectionWidth: ResponsiveSized;
9
3
  /**
10
4
  * Props
11
5
  */
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ import { NotificationStatus } from '@zeniai/client-epic-state';
3
+ /**
4
+ * Component & its Props
5
+ */
6
+ interface NotificationRowTextProps {
7
+ children: ReactNode;
8
+ notificationStatus: NotificationStatus;
9
+ className?: string;
10
+ }
11
+ export declare const NotificationRowText: ({ children, className, notificationStatus, }: Readonly<NotificationRowTextProps>) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const NotificationRowTextSpan: ({ children, className, notificationStatus, }: Readonly<NotificationRowTextProps>) => import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,12 @@
1
+ import { NotificationTagType } from '../utils/commonHelpers';
2
+ /**
3
+ * Component
4
+ */
5
+ export declare const NotificationTagPill: import('@emotion/styled').StyledComponent<{
6
+ theme?: import('@emotion/react').Theme;
7
+ as?: React.ElementType;
8
+ } & import('react').ClassAttributes<HTMLDivElement> & import('react').HTMLAttributes<HTMLDivElement> & {
9
+ theme?: import('@emotion/react').Theme;
10
+ } & import('react').ClassAttributes<HTMLSpanElement> & import('react').HTMLAttributes<HTMLSpanElement> & {
11
+ tagType: NotificationTagType;
12
+ }, {}, {}>;
@@ -1,10 +1,4 @@
1
1
  import { ID, NotificationActivityType, NotificationStatus, NotificationWithAuthors, ZeniDate } from '@zeniai/client-epic-state';
2
- import { ResponsiveSized } from '../../../context/windowSizeProvider';
3
- /**
4
- * Dimensions
5
- */
6
- export declare const tileLineClamp: ResponsiveSized;
7
- export declare const notificationTileSectionWidth: ResponsiveSized;
8
2
  /**
9
3
  * Props
10
4
  */
@@ -32,4 +26,4 @@ export declare const NotificationTileMedium: ({ sectionId, notificationData, isH
32
26
  export declare const NotificationMessageComponent: (notificationData: NotificationWithAuthors) => import("react/jsx-runtime").JSX.Element;
33
27
  export declare const NotificationActionComponents: (notificationData: NotificationWithAuthors) => import("react/jsx-runtime").JSX.Element;
34
28
  export declare const NotificationTimeComponent: (props: NotificationTimeProps) => import("react/jsx-runtime").JSX.Element;
35
- export declare const NotificationTagComponent: (notificationData: NotificationWithAuthors) => import("react/jsx-runtime").JSX.Element;
29
+ export declare const NotificationTagComponent: (notificationData: NotificationWithAuthors) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Dimensions
3
+ */
4
+ export declare const NOTIFICATION_ROW_HEIGHT_PX: number;
5
+ export declare const NOTIFICATION_COLUMN_WIDTHS: {
6
+ action: string;
7
+ message: string;
8
+ tag: string;
9
+ time: string;
10
+ };
11
+ /**
12
+ * Styled Components
13
+ */
14
+ export declare const notificationRowCellStyles: import('@emotion/react').SerializedStyles;
15
+ export declare const NotificationUnreadDot: import('@emotion/styled').StyledComponent<{
16
+ theme?: import('@emotion/react').Theme;
17
+ as?: React.ElementType;
18
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
19
+ export declare const NotificationMessageCell: import('@emotion/styled').StyledComponent<{
20
+ theme?: import('@emotion/react').Theme;
21
+ as?: React.ElementType;
22
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
23
+ export declare const NotificationActionCell: import('@emotion/styled').StyledComponent<{
24
+ theme?: import('@emotion/react').Theme;
25
+ as?: React.ElementType;
26
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
27
+ export declare const NotificationTagCell: import('@emotion/styled').StyledComponent<{
28
+ theme?: import('@emotion/react').Theme;
29
+ as?: React.ElementType;
30
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
31
+ export declare const NotificationTimeCell: import('@emotion/styled').StyledComponent<{
32
+ theme?: import('@emotion/react').Theme;
33
+ as?: React.ElementType;
34
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -4,3 +4,5 @@ export declare const DEFAULT_LIST_GROUP_GAP: number;
4
4
  export declare const DEFAULT_LIST_ITEM_LINE_HEIGHT: number;
5
5
  export declare const OVERSCAN_COUNT = 1;
6
6
  export declare const ARBITRARY_ITEM_COUNT = 1000;
7
+ export declare const NOTIFICATION_GROUP_LABEL_HEIGHT: number;
8
+ export declare const NOTIFICATION_EMPTY_GROUP_ROW_COUNT = 3;
@@ -1,5 +1,16 @@
1
1
  import { ExternalNotificationData } from '@zeniai/client-epic-state';
2
2
  import { CommentNotificationGroupDetails } from './commonHelpers';
3
+ /**
4
+ * Custom inbox notification kinds triggered by the tenant backend for thread
5
+ * resolve / reopen. Declared in `src/types/liveblocks.config.ts`. Consumers
6
+ * filtering `useInboxNotifications()` by kind must allow these through
7
+ * alongside the native "thread" kind.
8
+ */
9
+ export declare const THREAD_RESOLVED_NOTIFICATION_KIND = "$threadResolved";
10
+ export declare const THREAD_UNRESOLVED_NOTIFICATION_KIND = "$threadUnresolved";
11
+ export declare const COMMENT_NOTIFICATION_KINDS: readonly ["thread", "$threadResolved", "$threadUnresolved"];
12
+ export type CommentNotificationKind = (typeof COMMENT_NOTIFICATION_KINDS)[number];
13
+ export declare const isCommentNotificationKind: (kind: string) => kind is CommentNotificationKind;
3
14
  /**
4
15
  * Helpers
5
16
  */
@@ -20,5 +20,6 @@ type NotificationGroupType = ReturnType<typeof toNotificationGroupType>;
20
20
  export declare const getGroupLabelValue: (notificationGroup: CommentNotificationGroupDetails | NotificationGroupDetails) => string;
21
21
  export declare const getGroupLabelText: (notificationGroup: CommentNotificationGroupDetails | NotificationGroupDetails) => string;
22
22
  export declare const getNotificationTimeString: (timestamp: Date) => string;
23
- export declare const getStatusBackgroundColor: (allowedValueWithCode: AllowedValueWithCode) => string;
23
+ export type NotificationTagType = "attention" | "default" | "info" | "success" | "warning";
24
+ export declare const getStatusTagType: (allowedValueWithCode: AllowedValueWithCode) => NotificationTagType;
24
25
  export {};
@@ -12,6 +12,7 @@ export interface IntegrationCardSpec {
12
12
  iconAction?: {
13
13
  isEnabled: boolean;
14
14
  isSpinning: boolean;
15
+ tooltip?: string;
15
16
  onClick: () => void;
16
17
  };
17
18
  primaryAction?: {