@zeniai/web-components 4.1.40 → 4.1.41-betaAN01

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 (35) hide show
  1. package/dist/{SessionTimeoutPopup-CnaGjerj.js → SessionTimeoutPopup-APLlf35P.js} +71263 -69981
  2. package/dist/{SessionTimeoutPopup-CkH-hPbZ.cjs → SessionTimeoutPopup-ObCiYIrx.cjs} +14228 -14029
  3. package/dist/appLocale.d.ts +48 -0
  4. package/dist/assets/illustrative/no-search-result.svg +24 -0
  5. package/dist/cockpit.cjs.js +1 -1
  6. package/dist/cockpit.esm.js +2 -2
  7. package/dist/components/aiCfo/components/AiCfoArtifact.d.ts +26 -14
  8. package/dist/components/cockpit/common/cockpitFilters/commonTypes.d.ts +1 -1
  9. package/dist/components/{cockpit/common/cockpitFilters/components → common/filters}/FiltersPopover.d.ts +1 -1
  10. package/dist/components/common/filters/GenericFilters.d.ts +75 -0
  11. package/dist/components/common/filters/components/GenericFiltersSelection.d.ts +58 -0
  12. package/dist/components/common/filters/genericFilterTypes.d.ts +62 -0
  13. package/dist/components/common/listPageSearchInputBox/ListPageSearchInputBox.d.ts +3 -1
  14. package/dist/components/common/listPageSearchSection/ListPageSearchSection.d.ts +13 -0
  15. package/dist/components/expenseAutomation/ExpenseAutomationPage.d.ts +19 -1
  16. package/dist/components/expenseAutomation/components/EmptyTableSection.d.ts +6 -0
  17. package/dist/components/expenseAutomation/components/ExpenseAutomationSubTabSwitcher.d.ts +17 -0
  18. package/dist/components/expenseAutomation/components/NavBarWithHeader.d.ts +21 -1
  19. package/dist/components/expenseAutomation/components/TableSection.d.ts +2 -1
  20. package/dist/components/expenseAutomation/components/filters/AmountFilterValueField.d.ts +8 -0
  21. package/dist/components/expenseAutomation/components/filters/AmountMatchingOperatorDropdown.d.ts +8 -0
  22. package/dist/components/expenseAutomation/components/filters/TransactionFiltersComponent.d.ts +17 -0
  23. package/dist/components/expenseAutomation/components/filters/amountFilterConstants.d.ts +19 -0
  24. package/dist/components/expenseAutomation/components/filters/transactionFiltersHelpers.d.ts +24 -0
  25. package/dist/components/expenseAutomation/components/navbarHeaderData.d.ts +2 -2
  26. package/dist/components/expenseAutomation/sections/missingReceipts/MissingReceiptsPage.d.ts +6 -0
  27. package/dist/components/expenseAutomation/sections/transactionCategorization/transactionCategorizationCompletedSubTabs.d.ts +7 -0
  28. package/dist/components/formElements/filterValuesDropdownField/FilterValuesDropdownField.d.ts +5 -14
  29. package/dist/components/spendManagement/common/filters/spendManagementFiltersHelpers.d.ts +1 -1
  30. package/dist/components/transactionDetail/items/TransactionLineWithAccountAndClass.d.ts +3 -2
  31. package/dist/context/featureProvider/FeatureGateNameConstants.d.ts +2 -0
  32. package/dist/index.cjs.js +1 -1
  33. package/dist/index.esm.js +1 -1
  34. package/dist/strings/strings.d.ts +48 -0
  35. package/package.json +11 -8
@@ -87,10 +87,13 @@ declare class AppLocale {
87
87
  unreview: string;
88
88
  download: string;
89
89
  search: string;
90
+ searchShortcutCmd: string;
91
+ searchShortcutCtrl: string;
90
92
  delete: string;
91
93
  reload: string;
92
94
  goHome: string;
93
95
  refresh: string;
96
+ filter: string;
94
97
  name: string;
95
98
  select: string;
96
99
  goBack: string;
@@ -8499,6 +8502,11 @@ declare class AppLocale {
8499
8502
  completed: string;
8500
8503
  autoCategorized: string;
8501
8504
  };
8505
+ completedSubTabs: {
8506
+ all: string;
8507
+ aiAccountant: string;
8508
+ manual: string;
8509
+ };
8502
8510
  subTitles: {
8503
8511
  review: {
8504
8512
  item1: {
@@ -8533,6 +8541,46 @@ declare class AppLocale {
8533
8541
  title: string;
8534
8542
  subTitle: string;
8535
8543
  };
8544
+ emptyStates: {
8545
+ noSearchResults: {
8546
+ title: string;
8547
+ subTitle: string;
8548
+ };
8549
+ };
8550
+ filters: {
8551
+ categoryLabels: {
8552
+ paymentAccountName: string;
8553
+ paymentAccountType: string;
8554
+ payee: string;
8555
+ category: string;
8556
+ class: string;
8557
+ amount: string;
8558
+ };
8559
+ amountOperators: {
8560
+ lessThan: string;
8561
+ greaterThan: string;
8562
+ isEqual: string;
8563
+ inBetween: string;
8564
+ placeholder: string;
8565
+ };
8566
+ amountInputPlaceholders: {
8567
+ enterAmount: string;
8568
+ from: string;
8569
+ to: string;
8570
+ };
8571
+ filterOptions: {
8572
+ transactionAmountOptions: {
8573
+ label: string;
8574
+ value: string;
8575
+ }[];
8576
+ transactionTypeOptions: {
8577
+ label: string;
8578
+ value: string;
8579
+ }[];
8580
+ };
8581
+ selectPaymentAccountNamePlaceholder: string;
8582
+ searchForPayeePlaceholder: string;
8583
+ };
8536
8584
  addCategory: string;
8537
8585
  addClass: string;
8538
8586
  addProject: string;
@@ -0,0 +1,24 @@
1
+ <svg width="87" height="69" viewBox="0 0 87 69" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g opacity="0.2">
3
+ <rect x="5.07362" y="5.97328" width="71.6165" height="16.0084" rx="0.421274" fill="#97C3B9"/>
4
+ <rect x="5.07362" y="5.97328" width="71.6165" height="16.0084" rx="0.421274" stroke="#97C3B9" stroke-width="0.842547"/>
5
+ <rect x="5.07411" y="48.5582" width="71.6165" height="16.0084" rx="0.421274" fill="#97C3B9"/>
6
+ <rect x="5.07411" y="48.5582" width="71.6165" height="16.0084" rx="0.421274" stroke="#97C3B9" stroke-width="0.842547"/>
7
+ <rect x="5.07411" y="27.2658" width="71.6165" height="16.0084" rx="0.421274" fill="#97C3B9"/>
8
+ <rect x="5.07411" y="27.2658" width="71.6165" height="16.0084" rx="0.421274" stroke="#97C3B9" stroke-width="0.842547"/>
9
+ <path d="M32.1074 33.6116C32.1074 38.8302 34.1805 43.835 37.8706 47.5251C41.5607 51.2152 46.5656 53.2883 51.7842 53.2883C57.0028 53.2883 62.0076 51.2152 65.6978 47.5251C69.3879 43.835 71.4609 38.8302 71.4609 33.6116C71.4609 28.393 69.3879 23.3881 65.6978 19.698C62.0076 16.0079 57.0028 13.9348 51.7842 13.9348C46.5656 13.9348 41.5607 16.0079 37.8706 19.698C34.1805 23.3881 32.1074 28.393 32.1074 33.6116Z" fill="#97C3B9"/>
10
+ </g>
11
+ <rect x="8.69056" y="8.82703" width="56.8595" height="0.277597" rx="0.138799" stroke="#97C3B9" stroke-width="0.277597"/>
12
+ <path d="M35.078 17.3912H1.60915C1.14382 17.3912 0.766602 17.014 0.766602 16.5487V1.38283C0.766602 0.917506 1.14382 0.540283 1.60915 0.540283H72.4708C72.9374 0.540283 73.3152 0.919552 73.3133 1.38619L73.2532 16.4851C73.2513 16.9491 72.8747 17.3243 72.4106 17.3243H67.0575" stroke="#97C3B9" stroke-width="0.666234" stroke-linecap="round"/>
13
+ <path d="M70.126 22.3201H72.471C72.9376 22.3201 73.3154 22.6993 73.3135 23.166L73.253 38.3766C73.2514 38.7789 72.9248 39.1041 72.5226 39.1041" stroke="#97C3B9" stroke-width="0.666234" stroke-linecap="round"/>
14
+ <rect x="8.69056" y="30.6068" width="19.2475" height="0.277597" rx="0.138799" stroke="#97C3B9" stroke-width="0.277597"/>
15
+ <path d="M30.8562 22.3201H1.17556C0.710229 22.3201 0.333008 22.6973 0.333008 23.1626V38.3285C0.333008 38.7938 0.710229 39.171 1.17556 39.171H29.7519" stroke="#97C3B9" stroke-width="0.666234" stroke-linecap="round"/>
16
+ <rect x="8.69056" y="52.6395" width="26.7253" height="0.277597" rx="0.138799" fill="#97C3B9" stroke="#97C3B9" stroke-width="0.277597"/>
17
+ <path d="M73.2257 58.1678V60.3613C73.2257 60.8266 72.8485 61.2039 72.3831 61.2039H1.60915C1.14382 61.2039 0.766602 60.8266 0.766602 60.3613V45.1955C0.766602 44.7301 1.14382 44.3529 1.60915 44.3529H30.6776" stroke="#97C3B9" stroke-width="0.666234" stroke-linecap="round"/>
18
+ <path d="M70.126 43.9727H72.4743C72.9397 43.9727 73.3169 44.3499 73.3169 44.8152V53.3979" stroke="#97C3B9" stroke-width="0.842547" stroke-linecap="round"/>
19
+ <path d="M31.7017 33.9263C31.7017 39.1449 33.7747 44.1497 37.4648 47.8398C41.155 51.5299 46.1598 53.603 51.3784 53.603C56.597 53.603 61.6019 51.5299 65.292 47.8398C68.9821 44.1497 71.0552 39.1449 71.0552 33.9263C71.0552 28.7077 68.9821 23.7028 65.292 20.0127C61.6019 16.3226 56.597 14.2495 51.3784 14.2495C46.1598 14.2495 41.155 16.3226 37.4648 20.0127C33.7747 23.7028 31.7017 28.7077 31.7017 33.9263Z" stroke="#EEBA7D" stroke-linecap="round" stroke-linejoin="round"/>
20
+ <path d="M84.3854 67.1342L65.6099 48.3586" stroke="#EEBA7D" stroke-linecap="round" stroke-linejoin="round"/>
21
+ <path d="M58.0977 26.9509L45.0031 40.0455" stroke="#EEBA7D" stroke-linecap="round"/>
22
+ <path d="M58.0977 40.0457L45.0031 26.9511" stroke="#EEBA7D" stroke-linecap="round"/>
23
+ <path opacity="0.2" d="M84.4455 68.4403L65.6699 49.6648" stroke="#97C3B9" stroke-width="1.11039" stroke-linecap="round" stroke-linejoin="round"/>
24
+ </svg>
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./SessionTimeoutPopup-CkH-hPbZ.cjs"),o=require("./vendor-.pnpm-Dd2Fl0gB.cjs"),u=require("react"),s=require("@emotion/styled"),Xe=require("@liveblocks/react"),J=require("@zeniai/client-epic-state"),Es=require("@liveblocks/react-ui"),we=require("@emotion/react"),Lo=require("react-dom"),St=require("@liveblocks/react-ui/primitives"),xi=require("@liveblocks/react/suspense");function Ea(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:()=>e[r]})}}return n.default=e,Object.freeze(n)}const le=Ea(u),wa=({inboxNotification:e,onNotificationClick:n})=>{const r=Xe.useInboxNotificationThread(e.id),i=r.metadata.entityType.split("."),a=r.metadata.isGlobalComment&&i.length===2;return o.jsxRuntimeExports.jsx(va,{isClickable:a,isUnRead:e.readAt==null,onClick:()=>{n(r.metadata,r.id)},children:o.jsxRuntimeExports.jsx(Es.InboxNotification,{inboxNotification:e,kinds:{thread:d=>o.jsxRuntimeExports.jsx(Es.InboxNotification.Thread,{...d,showRoomName:!0})}})})},va=s.div`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./SessionTimeoutPopup-ObCiYIrx.cjs"),o=require("./vendor-.pnpm-Dd2Fl0gB.cjs"),u=require("react"),s=require("@emotion/styled"),Xe=require("@liveblocks/react"),J=require("@zeniai/client-epic-state"),Es=require("@liveblocks/react-ui"),we=require("@emotion/react"),Lo=require("react-dom"),St=require("@liveblocks/react-ui/primitives"),xi=require("@liveblocks/react/suspense");function Ea(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:()=>e[r]})}}return n.default=e,Object.freeze(n)}const le=Ea(u),wa=({inboxNotification:e,onNotificationClick:n})=>{const r=Xe.useInboxNotificationThread(e.id),i=r.metadata.entityType.split("."),a=r.metadata.isGlobalComment&&i.length===2;return o.jsxRuntimeExports.jsx(va,{isClickable:a,isUnRead:e.readAt==null,onClick:()=>{n(r.metadata,r.id)},children:o.jsxRuntimeExports.jsx(Es.InboxNotification,{inboxNotification:e,kinds:{thread:d=>o.jsxRuntimeExports.jsx(Es.InboxNotification.Thread,{...d,showRoomName:!0})}})})},va=s.div`
2
2
  display: flex;
3
3
  width: 100%;
4
4
  cursor: ${e=>e.isClickable?"pointer":"initial"};
@@ -1,5 +1,5 @@
1
- import { bR as o, dm as Ne, h as $t, cO as O, dO as It, dP as Qr, dQ as We, dR as Qd, dS as Jd, dT as Xd, a8 as I, dU as U, dV as qd, dK as ge, dW as lo, dX as lt, a9 as Ft, b2 as Bs, dY as wo, dZ as ps, d_ as So, d$ as us, bh as ep, e0 as Jt, e1 as De, e2 as Fl, e3 as Co, e4 as Fs, e5 as Be, e6 as tp, e7 as op, e8 as Wt, e9 as np, ea as Wl, eb as rp, ec as hs, ed as ms, ee as ip, ef as sp, eg as ap, eh as lp, ei as cp, ej as xt, ek as _l, el as dp, em as Jr, en as gs, dk as M, eo as pp, ep as up, eq as be, er as hp, bE as z, es as Fe, et as pt, eu as xs, aM as Nr, ev as mp, ew as ys, ex as Xr, d9 as Pe, ey as qr, ez as Vl, eA as Ul, eB as Xn, cT as zt, eC as dt, eD as gn, eE as gp, eF as Kl, eG as Hl, eH as Pt, cM as qe, eI as Mr, eJ as xp, eK as xn, eL as yn, eM as fn, eN as Fo, eO as ei, eP as fs, eQ as yp, eR as Gl, eS as co, eT as Wo, eU as Qt, eV as Ws, eW as fp, eX as bp, eY as $p, eZ as Cp, e_ as wp, e$ as qn, f0 as Sp, f1 as bs, c$ as vp, f2 as Yl, f3 as Zl, f4 as Ql, f5 as Jl, f6 as jp, f7 as _s, f8 as $s, f9 as kp, fa as Tp, fb as er, fc as bn, fd as Cs, fe as Lp, ff as ti, fg as bt, fh as Xl, fi as zr, fj as Pp, fk as ws, fl as Ip, fm as pn, fn as Ap, fo as Op, fp as Dp, fq as oi, fr as Vs, fs as ql, dB as Br, bc as ec, ft as tc, fu as Ss, fv as Ep, af as un, fw as Zn, fx as Qn, dL as oc, aH as Rp, dy as Np, fy as Yt, fz as Lt, fA as vs, fB as nc, fC as Mp, fD as rc, fE as zp, fF as Bp, fG as Ut, fH as sr, aI as Fp, fI as Kt, fJ as ic, fK as cn, fL as sc, fM as Fr, fN as ac, fO as Wp, fP as _p, fQ as Vp, fR as Wr, fS as Xi, fT as Us, fU as Up, fV as Kp, fW as li, fX as ci, fY as Hp, fZ as Ks, f_ as Gp, f$ as Yp, g0 as Hs, g1 as Zp, g2 as Qp, g3 as Jp, g4 as Xp, g5 as tr, g6 as lc, g7 as cc, g8 as Zt, g9 as ni, ga as hn, gb as dc, gc as pc, gd as qp, ge as eu, gf as uc, gg as tu, gh as ou, gi as _r, gj as hc, gk as nu, gl as ru, gm as iu, gn as js, go as mc, gp as gc, gq as xc, gr as yc, gs as fc, gt as su, gu as bc, gv as $c, gw as au, gx as lu, dw as cu, gy as du, gz as pu, gA as uu, gB as hu, gC as Gs, gD as mu, gE as Cc, gF as Ys, gG as gu, gH as xu, gI as yu, gJ as fu, gK as bu, gL as $u, gM as Zs, gN as Cu, gO as wc, gP as wu, gQ as Sc, gR as Su, gS as vu, gT as ju, gU as ku, gV as vc, gW as Tu, gX as Lu, gY as Pu, gZ as Iu, g_ as jc, g$ as Au, h0 as Ou, h1 as Du } from "./SessionTimeoutPopup-CnaGjerj.js";
2
- import { A as ck, a as dk, b as pk, c as uk, d as hk, e as mk, f as gk, g as xk, i as yk, j as fk, k as bk, l as $k, m as Ck, n as wk, o as Sk, p as vk, q as jk, r as kk, s as Tk, t as Lk, u as Pk, v as Ik, w as Ak, x as Ok, y as Dk, z as Ek, B as Rk, C as Nk, D as Mk, E as zk, F as Bk, G as Fk, H as Wk, I as _k, J as Vk, K as Uk, S as Kk, L as Hk, M as Gk, N as Yk, O as Zk, P as Qk, Q as Jk, R as Xk, T as qk, U as eT, V as tT, W as oT, X as nT, Y as rT, Z as iT, _ as sT, $ as aT, S as lT, a0 as cT, a1 as dT, a2 as pT, a3 as uT, a4 as hT, a5 as mT, a6 as gT, a7 as xT, aa as yT, ab as fT, ac as bT, ad as $T, ae as CT, ag as wT, ah as ST, ai as vT, aj as jT, ak as kT, al as TT, am as LT, an as PT, ao as IT, ap as AT, aq as OT, ar as DT, as as ET, at as RT, au as NT, av as MT, aw as zT, ax as BT, ay as FT, az as WT, aA as _T, aB as VT, aC as UT, aD as KT, aE as HT, aF as GT, aG as YT, aJ as ZT, aK as QT, aL as JT, aN as XT, aO as qT, aP as eL, aQ as tL, aR as oL, aS as nL, aT as rL, aU as iL, aV as sL, aW as aL, aX as lL, aY as cL, aZ as dL, a_ as pL, a$ as uL, b0 as hL, b1 as mL, b3 as gL, b4 as xL, b5 as yL, b6 as fL, b7 as bL, b8 as $L, b9 as CL, ba as wL, bb as SL, bd as vL, be as jL, bf as kL, bg as TL, bi as LL, bj as PL, bk as IL, bl as AL, bm as OL, bn as DL, bo as EL, bp as RL, bq as NL, br as ML, bs as zL, bt as BL, bu as FL, bv as WL, bw as _L, bx as VL, by as UL, bz as KL, bA as HL, S as GL, bB as YL, bC as ZL, bD as QL, bF as JL, bG as XL, bH as qL, bI as eP, bJ as tP, bK as oP, bL as nP, bM as rP, bN as iP, bO as sP, bP as aP, bQ as lP, bS as cP, bT as dP, bU as pP, bV as uP, bW as hP, bX as mP, bY as gP, bZ as xP, b_ as yP, b$ as fP, c0 as bP, c1 as $P, c2 as CP, c3 as wP, c4 as SP, c5 as vP, c6 as jP, c7 as kP, c8 as TP, c9 as LP, ca as PP, cb as IP, cc as AP, cd as OP, ce as DP, cf as EP, cg as RP, ch as NP, ci as MP, cj as zP, ck as BP, cl as FP, cm as WP, cn as _P, co as VP, cp as UP, cq as KP, cr as HP, cs as GP, ct as YP, cu as ZP, cv as QP, cw as JP, cx as XP, cy as qP, cz as eI, cA as tI, cB as oI, cC as nI, cD as rI, cE as iI, cF as sI, cG as aI, cH as lI, cI, cJ as dI, cK as pI, cL as uI, cN as hI, cP as mI, cQ as gI, cR as xI, cS as yI, cU as fI, cV as bI, cW as $I, cX as CI, cY as wI, cZ as SI, c_ as vI, d0 as jI, d1 as kI, d2 as TI, d3 as LI, d4 as PI, d5 as II, d6 as AI, d7 as OI, d8 as DI, da as EI, db as RI, dc as NI, dd as MI, de as zI, df as BI, dg as FI, dh as WI, di as _I, dj as VI, dl as UI, dn as KI, dp as HI, dq as GI, dr as YI, ds as ZI, dt as QI, du as JI, dv as XI, dx as qI, dz as eA, dA as tA, dC as oA, dD as nA, dE as rA, dF as iA, dG as sA, dH as aA, dI as lA, dJ as cA, dM as dA, dN as pA } from "./SessionTimeoutPopup-CnaGjerj.js";
1
+ import { bR as o, dm as Ne, h as $t, cO as O, dO as It, dP as Qr, dQ as We, dR as Qd, dS as Jd, dT as Xd, a8 as I, dU as U, dV as qd, dK as ge, dW as lo, dX as lt, a9 as Ft, b2 as Bs, dY as wo, dZ as ps, d_ as So, d$ as us, bh as ep, e0 as Jt, e1 as De, e2 as Fl, e3 as Co, e4 as Fs, e5 as Be, e6 as tp, e7 as op, e8 as Wt, e9 as np, ea as Wl, eb as rp, ec as hs, ed as ms, ee as ip, ef as sp, eg as ap, eh as lp, ei as cp, ej as xt, ek as _l, el as dp, em as Jr, en as gs, dk as M, eo as pp, ep as up, eq as be, er as hp, bE as z, es as Fe, et as pt, eu as xs, aM as Nr, ev as mp, ew as ys, ex as Xr, d9 as Pe, ey as qr, ez as Vl, eA as Ul, eB as Xn, cT as zt, eC as dt, eD as gn, eE as gp, eF as Kl, eG as Hl, eH as Pt, cM as qe, eI as Mr, eJ as xp, eK as xn, eL as yn, eM as fn, eN as Fo, eO as ei, eP as fs, eQ as yp, eR as Gl, eS as co, eT as Wo, eU as Qt, eV as Ws, eW as fp, eX as bp, eY as $p, eZ as Cp, e_ as wp, e$ as qn, f0 as Sp, f1 as bs, c$ as vp, f2 as Yl, f3 as Zl, f4 as Ql, f5 as Jl, f6 as jp, f7 as _s, f8 as $s, f9 as kp, fa as Tp, fb as er, fc as bn, fd as Cs, fe as Lp, ff as ti, fg as bt, fh as Xl, fi as zr, fj as Pp, fk as ws, fl as Ip, fm as pn, fn as Ap, fo as Op, fp as Dp, fq as oi, fr as Vs, fs as ql, dB as Br, bc as ec, ft as tc, fu as Ss, fv as Ep, af as un, fw as Zn, fx as Qn, dL as oc, aH as Rp, dy as Np, fy as Yt, fz as Lt, fA as vs, fB as nc, fC as Mp, fD as rc, fE as zp, fF as Bp, fG as Ut, fH as sr, aI as Fp, fI as Kt, fJ as ic, fK as cn, fL as sc, fM as Fr, fN as ac, fO as Wp, fP as _p, fQ as Vp, fR as Wr, fS as Xi, fT as Us, fU as Up, fV as Kp, fW as li, fX as ci, fY as Hp, fZ as Ks, f_ as Gp, f$ as Yp, g0 as Hs, g1 as Zp, g2 as Qp, g3 as Jp, g4 as Xp, g5 as tr, g6 as lc, g7 as cc, g8 as Zt, g9 as ni, ga as hn, gb as dc, gc as pc, gd as qp, ge as eu, gf as uc, gg as tu, gh as ou, gi as _r, gj as hc, gk as nu, gl as ru, gm as iu, gn as js, go as mc, gp as gc, gq as xc, gr as yc, gs as fc, gt as su, gu as bc, gv as $c, gw as au, gx as lu, dw as cu, gy as du, gz as pu, gA as uu, gB as hu, gC as Gs, gD as mu, gE as Cc, gF as Ys, gG as gu, gH as xu, gI as yu, gJ as fu, gK as bu, gL as $u, gM as Zs, gN as Cu, gO as wc, gP as wu, gQ as Sc, gR as Su, gS as vu, gT as ju, gU as ku, gV as vc, gW as Tu, gX as Lu, gY as Pu, gZ as Iu, g_ as jc, g$ as Au, h0 as Ou, h1 as Du } from "./SessionTimeoutPopup-APLlf35P.js";
2
+ import { A as ck, a as dk, b as pk, c as uk, d as hk, e as mk, f as gk, g as xk, i as yk, j as fk, k as bk, l as $k, m as Ck, n as wk, o as Sk, p as vk, q as jk, r as kk, s as Tk, t as Lk, u as Pk, v as Ik, w as Ak, x as Ok, y as Dk, z as Ek, B as Rk, C as Nk, D as Mk, E as zk, F as Bk, G as Fk, H as Wk, I as _k, J as Vk, K as Uk, S as Kk, L as Hk, M as Gk, N as Yk, O as Zk, P as Qk, Q as Jk, R as Xk, T as qk, U as eT, V as tT, W as oT, X as nT, Y as rT, Z as iT, _ as sT, $ as aT, S as lT, a0 as cT, a1 as dT, a2 as pT, a3 as uT, a4 as hT, a5 as mT, a6 as gT, a7 as xT, aa as yT, ab as fT, ac as bT, ad as $T, ae as CT, ag as wT, ah as ST, ai as vT, aj as jT, ak as kT, al as TT, am as LT, an as PT, ao as IT, ap as AT, aq as OT, ar as DT, as as ET, at as RT, au as NT, av as MT, aw as zT, ax as BT, ay as FT, az as WT, aA as _T, aB as VT, aC as UT, aD as KT, aE as HT, aF as GT, aG as YT, aJ as ZT, aK as QT, aL as JT, aN as XT, aO as qT, aP as eL, aQ as tL, aR as oL, aS as nL, aT as rL, aU as iL, aV as sL, aW as aL, aX as lL, aY as cL, aZ as dL, a_ as pL, a$ as uL, b0 as hL, b1 as mL, b3 as gL, b4 as xL, b5 as yL, b6 as fL, b7 as bL, b8 as $L, b9 as CL, ba as wL, bb as SL, bd as vL, be as jL, bf as kL, bg as TL, bi as LL, bj as PL, bk as IL, bl as AL, bm as OL, bn as DL, bo as EL, bp as RL, bq as NL, br as ML, bs as zL, bt as BL, bu as FL, bv as WL, bw as _L, bx as VL, by as UL, bz as KL, bA as HL, S as GL, bB as YL, bC as ZL, bD as QL, bF as JL, bG as XL, bH as qL, bI as eP, bJ as tP, bK as oP, bL as nP, bM as rP, bN as iP, bO as sP, bP as aP, bQ as lP, bS as cP, bT as dP, bU as pP, bV as uP, bW as hP, bX as mP, bY as gP, bZ as xP, b_ as yP, b$ as fP, c0 as bP, c1 as $P, c2 as CP, c3 as wP, c4 as SP, c5 as vP, c6 as jP, c7 as kP, c8 as TP, c9 as LP, ca as PP, cb as IP, cc as AP, cd as OP, ce as DP, cf as EP, cg as RP, ch as NP, ci as MP, cj as zP, ck as BP, cl as FP, cm as WP, cn as _P, co as VP, cp as UP, cq as KP, cr as HP, cs as GP, ct as YP, cu as ZP, cv as QP, cw as JP, cx as XP, cy as qP, cz as eI, cA as tI, cB as oI, cC as nI, cD as rI, cE as iI, cF as sI, cG as aI, cH as lI, cI, cJ as dI, cK as pI, cL as uI, cN as hI, cP as mI, cQ as gI, cR as xI, cS as yI, cU as fI, cV as bI, cW as $I, cX as CI, cY as wI, cZ as SI, c_ as vI, d0 as jI, d1 as kI, d2 as TI, d3 as LI, d4 as PI, d5 as II, d6 as AI, d7 as OI, d8 as DI, da as EI, db as RI, dc as NI, dd as MI, de as zI, df as BI, dg as FI, dh as WI, di as _I, dj as VI, dl as UI, dn as KI, dp as HI, dq as GI, dr as YI, ds as ZI, dt as QI, du as JI, dv as XI, dx as qI, dz as eA, dA as tA, dC as oA, dD as nA, dE as rA, dF as iA, dG as sA, dH as aA, dI as lA, dJ as cA, dM as dA, dN as pA } from "./SessionTimeoutPopup-APLlf35P.js";
3
3
  import { j as t, D as Eu, f as Ru, u as Ve, S as $n, c as rt, L as Nu, T as Mu, a as zu, P as ri, C as Xt, b as ye, d as po, e as Cn, g as uo, h as _o, F as ho, i as Vo, A as qt, V as Uo, k as nt, I as kc, l as Bu, n as Mt, m as Bo, o as Fu, p as ks, q as Tc, M as Wu, r as _u, t as Ts, v as Ls, w as Qs } from "./vendor-.pnpm-DtQs9f4A.js";
4
4
  import { s as hA } from "./vendor-.pnpm-DtQs9f4A.js";
5
5
  import * as me from "react";
@@ -2,30 +2,42 @@ import { default as React } from 'react';
2
2
  interface AiCfoArtifactProps {
3
3
  /** Complete HTML string to render inside the sandboxed iframe. */
4
4
  html: string;
5
+ /**
6
+ * URL of the host.html receiver to load. Stamped by the backend at write
7
+ * time so old persisted artifacts keep using their original receiver
8
+ * version. Defaults to the v1.0 prod receiver for messages that pre-date
9
+ * versioning (no stamp on the message).
10
+ */
11
+ hostUrl?: string;
5
12
  /** Human-readable title for the artifact. */
6
13
  title?: string;
7
14
  /** Callback when the artifact fails to render. */
8
15
  onError?: (error: Error) => void;
9
16
  }
10
17
  /**
11
- * Renders a Chart.js visualization artifact inside a securely sandboxed iframe.
18
+ * Renders a Chart.js visualization artifact inside a sandboxed iframe pointing
19
+ * at a separate registrable domain (zenicontent.ai).
12
20
  *
13
21
  * Security model:
22
+ * - Iframe loads a static receiver page on a *cross-registrable-domain* origin.
23
+ * Cross-eTLD+1 isolation gives us site-isolation, storage-partition, and
24
+ * third-party-cookie boundaries that a subdomain wouldn't.
14
25
  * - sandbox="allow-scripts" only — no allow-same-origin / allow-forms /
15
- * allow-popups / allow-top-navigation. The iframe gets an opaque origin per
16
- * the HTML spec, which keeps the parent app's CSP from being inherited and
17
- * blocking the agent's inline scripts.
18
- * - HTML injected via srcdoc.
19
- * - CSP meta tag injected by backend (default-src 'none', script-src allows
20
- * inline + whitelisted CDNs, connect-src 'none', img-src data:, etc.).
21
- * - No parent-side postMessage listeners that could be abused; we only listen
22
- * for the well-known `artifact-height` message from our own iframe.
26
+ * allow-popups / allow-top-navigation.
27
+ * - HTTP-header CSP on the artifact origin (set by Cloud CDN) restricts
28
+ * script-src to 'self' + 'unsafe-inline', forbids all network connect-src,
29
+ * and enforces frame-ancestors so only app.zeni.ai (and qa/dev) can embed.
30
+ * - postMessage handshake:
31
+ * Parent iframe : artifact HTML string, targetOrigin = receiver origin.
32
+ * iframe parent : {type: 'artifact-height', h: <px>} after render.
33
+ * Both directions check `event.origin === <receiver origin>` and
34
+ * `event.source === iframe.contentWindow` — origin alone is insufficient
35
+ * when multiple iframes share the page.
23
36
  *
24
- * Auto-resize: because the iframe is opaque-origin we can't read
25
- * iframe.contentDocument from the parent. Instead the backend injects a small
26
- * script into the artifact HTML that posts `{type:"artifact-height", h}` back
27
- * to the parent on body resize / load. We listen for those messages and grow
28
- * the iframe to match.
37
+ * Versioning:
38
+ * - `hostUrl` is the per-message receiver URL stamped by the backend at write
39
+ * time (e.g. https://zenicontent.ai/1.0/host.html). Old persisted artifacts
40
+ * continue to render against the receiver they were authored against.
29
41
  */
30
42
  export declare const AiCfoArtifact: React.FC<AiCfoArtifactProps>;
31
43
  export default AiCfoArtifact;
@@ -24,7 +24,7 @@ export interface HealthMonitorFilterCategoryDropdownOption extends CategoryDropd
24
24
  export interface AiAccountantFilterCategoryDropdownOption extends CategoryDropdownOption {
25
25
  value: AiAccountantFilterCategoryField;
26
26
  }
27
- export type MatchingOperatorDropdownValue = "equal" | "not-equal";
27
+ export type MatchingOperatorDropdownValue = "equal" | "not_equal";
28
28
  export type ValuesCombinationOperatorDropdownValue = "ANY" | "ALL";
29
29
  export interface MatchingOperatorDropdownOption {
30
30
  label: "is" | "is not";
@@ -1,4 +1,4 @@
1
- import { ReactChild } from '../../../../../types/common';
1
+ import { ReactChild } from '../../../types/common';
2
2
  interface Props {
3
3
  anchorEl: HTMLElement | null;
4
4
  children: ReactChild | ReactChild[];
@@ -0,0 +1,75 @@
1
+ import { MatchingOperatorDropdownOption, SpendManagementFilterEntityType, TransactionFilterEntityType, UserRoleType } from '@zeniai/client-epic-state';
2
+ import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
3
+ import { GenericFilterCategory, GenericFilterCategoryDropdownOption, GenericFiltersType, ValuesDropdownOption } from './genericFilterTypes';
4
+ export type SupportedFilterEntityType = TransactionFilterEntityType | SpendManagementFilterEntityType;
5
+ export interface GroupByFiltersComponentProps {
6
+ component: React.ReactElement;
7
+ height: number;
8
+ }
9
+ export interface GenericFiltersProps<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>> {
10
+ entity: TEntity;
11
+ filters: TFiltersType;
12
+ filterStrings: {
13
+ addFilterBtnText: string;
14
+ categoryPlaceholder: string;
15
+ clearAllBtnText: string;
16
+ empty: string;
17
+ filterByLabel: string;
18
+ searchPlaceholder: string;
19
+ select: string;
20
+ /** Optional: return custom placeholder for the value dropdown by category field */
21
+ getValuePlaceholder?: (categoryField: string, categoryLabel: string) => string | undefined;
22
+ };
23
+ helpers: {
24
+ getAppliedFiltersCount: (filters: TFiltersType) => number;
25
+ getDefaultEmptyFilters: () => TFiltersType;
26
+ getFilterCategories: (entity: TEntity, userRole?: UserRoleType[]) => TCategoryDropdownOption[];
27
+ getFilterCategoryLabel: (entity: TEntity, key: string) => string;
28
+ getUpdatedFiltersOnCategoryChange: (props: {
29
+ currentFilters: TFiltersType;
30
+ selectedOption: TCategoryDropdownOption;
31
+ categoryIndex?: number;
32
+ }) => TFiltersType;
33
+ getUpdatedFiltersOnMatchingOperatorChange: (props: {
34
+ currentFilters: TFiltersType;
35
+ selectedOption: MatchingOperatorDropdownOption;
36
+ categoryIndex?: number;
37
+ }) => TFiltersType;
38
+ getUpdatedFiltersOnValueChange: (props: {
39
+ categoryIndex: number;
40
+ currentFilters: TFiltersType;
41
+ selectedOptions: ValuesDropdownOption[];
42
+ }) => TFiltersType;
43
+ };
44
+ /**
45
+ * Memoized dropdown options keyed by category field. The cache inside
46
+ * GenericFilters mirrors this value, so when source data lands after
47
+ * first render the dropdowns refresh automatically. Callers MUST
48
+ * memoize this (e.g. with `useMemo`) — passing a new object reference
49
+ * on every parent render will churn the internal cache state.
50
+ */
51
+ categoryWiseOptions?: Record<string, ValuesDropdownOption[]>;
52
+ createdByUserListLoaded?: boolean;
53
+ disableFilters?: boolean;
54
+ groupByFiltersComponent?: GroupByFiltersComponentProps;
55
+ transactionsLoaded?: boolean;
56
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
57
+ vendorSearchAutoCompleteData?: AutoCompleteData;
58
+ onFiltersChange: (filters: TFiltersType) => void;
59
+ onFilterClick?: (entity: TEntity) => void;
60
+ /** When provided and returns non-null for a field, renders custom operator + value UI (e.g. transaction amount filter with From/To inputs). */
61
+ renderCustomCategoryValueSection?: (field: string, props: {
62
+ categoryIndex: number;
63
+ filter: GenericFilterCategory<TField>;
64
+ onMatchingOperatorChange: (option: {
65
+ label: string;
66
+ value: string;
67
+ }, categoryIndex?: number) => void;
68
+ onValueChange: (value: ValuesDropdownOption[], categoryIndex: number) => void;
69
+ }) => {
70
+ operatorDropdown: React.ReactNode;
71
+ valueField: React.ReactNode;
72
+ } | null;
73
+ }
74
+ declare function GenericFilters<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>>({ entity: selectedEntity, filters, filterStrings, helpers, onFiltersChange, createdByUserListLoaded, disableFilters, groupByFiltersComponent, transactionsLoaded, vendorSearchAutoCompleteActions, vendorSearchAutoCompleteData, categoryWiseOptions, onFilterClick, renderCustomCategoryValueSection, }: GenericFiltersProps<TEntity, TField, TCategoryDropdownOption, TFiltersType>): import("react/jsx-runtime").JSX.Element;
75
+ export default GenericFilters;
@@ -0,0 +1,58 @@
1
+ import { MatchingOperatorDropdownOption, UserRoleType } from '@zeniai/client-epic-state';
2
+ import { AutoCompleteActions, AutoCompleteData } from '../../../common/autoComplete/autoCompleteProps';
3
+ import { SupportedFilterEntityType } from '../GenericFilters';
4
+ import { GenericFilterCategory, GenericFilterCategoryDropdownOption, GenericFiltersType, ValuesDropdownOption } from '../genericFilterTypes';
5
+ export interface GenericFiltersSelectionProps<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>> {
6
+ filters: TFiltersType;
7
+ filterStrings: {
8
+ addFilterBtnText: string;
9
+ categoryPlaceholder: string;
10
+ clearAllBtnText: string;
11
+ filterByLabel: string;
12
+ searchPlaceholder: string;
13
+ select: string;
14
+ getValuePlaceholder?: (categoryField: string, categoryLabel: string) => string | undefined;
15
+ };
16
+ filterValues: Record<string, ValuesDropdownOption[]>;
17
+ helpers: {
18
+ getAppliedFiltersCount: (filters: TFiltersType) => number;
19
+ getDefaultEmptyFilters: () => TFiltersType;
20
+ getFilterCategories: (entity: TEntity, userRole?: UserRoleType[]) => TCategoryDropdownOption[];
21
+ getFilterCategoryLabel: (entity: TEntity, key: string) => string;
22
+ getUpdatedFiltersOnCategoryChange: (props: {
23
+ currentFilters: TFiltersType;
24
+ selectedOption: TCategoryDropdownOption;
25
+ categoryIndex?: number;
26
+ }) => TFiltersType;
27
+ getUpdatedFiltersOnMatchingOperatorChange: (props: {
28
+ currentFilters: TFiltersType;
29
+ selectedOption: MatchingOperatorDropdownOption;
30
+ categoryIndex?: number;
31
+ }) => TFiltersType;
32
+ getUpdatedFiltersOnValueChange: (props: {
33
+ categoryIndex: number;
34
+ currentFilters: TFiltersType;
35
+ selectedOptions: ValuesDropdownOption[];
36
+ }) => TFiltersType;
37
+ };
38
+ selectedEntity: TEntity;
39
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
40
+ vendorSearchAutoCompleteData?: AutoCompleteData;
41
+ onFiltersChange: (filters: TFiltersType) => void;
42
+ renderCustomCategoryValueSection?: (field: string, props: {
43
+ categoryIndex: number;
44
+ filter: GenericFilterCategory<TField>;
45
+ onMatchingOperatorChange: (option: {
46
+ label: string;
47
+ value: string;
48
+ }, categoryIndex?: number) => void;
49
+ onValueChange: (value: ValuesDropdownOption[], categoryIndex: number) => void;
50
+ }) => {
51
+ operatorDropdown: React.ReactNode;
52
+ valueField: React.ReactNode;
53
+ } | null;
54
+ }
55
+ declare const _default: <TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>>(props: GenericFiltersSelectionProps<TEntity, TField, TCategoryDropdownOption, TFiltersType> & {
56
+ ref?: React.ForwardedRef<HTMLDivElement>;
57
+ }) => React.ReactElement;
58
+ export default _default;
@@ -0,0 +1,62 @@
1
+ import { CategoryCombinationOperator, ZeniDate, ZeniUrl } from '@zeniai/client-epic-state';
2
+ type DropdownOptionTypeBase = {
3
+ [key: string]: any;
4
+ };
5
+ export type ValuesDropdownOption = DropdownOptionTypeBase & {
6
+ label: string;
7
+ value: string | number | ZeniDate;
8
+ email?: string;
9
+ iconColor?: string;
10
+ iconType?: string;
11
+ photo?: ZeniUrl;
12
+ };
13
+ /**
14
+ * How a category's selected values combine when matching:
15
+ * - `"ANY"` — match a row if any value in `values[]` matches (OR semantics).
16
+ * - `"ALL"` — match a row only if every value in `values[]` matches (AND).
17
+ *
18
+ * Exposed as a named type so callsites that store or narrow this field
19
+ * (e.g. TC's `TransactionFilterCategory`, which pins it to literal `"ANY"`)
20
+ * reference one source of truth rather than redeclaring the union.
21
+ */
22
+ export type ValuesCombinationOperator = "ANY" | "ALL";
23
+ export type GenericFilterCategory<TField extends string = string> = {
24
+ values: Array<string | number | ZeniDate>;
25
+ field?: TField;
26
+ matchingOperator?: string;
27
+ valuesCombinationOperator?: ValuesCombinationOperator;
28
+ };
29
+ export type GenericFiltersType<TField extends string = string> = {
30
+ categories: GenericFilterCategory<TField>[];
31
+ categoryCombinationOperator: CategoryCombinationOperator;
32
+ };
33
+ /**
34
+ * Type shape for `NEW_CATEGORY_BODY` below. Carries three deliberate
35
+ * narrowing choices:
36
+ *
37
+ * - `valuesCombinationOperator: "ANY"` — the literal type, not the wider
38
+ * `ValuesCombinationOperator` union, because TC's
39
+ * `TransactionFilterCategory` narrows the field further to exactly
40
+ * `"ANY"`. Without the literal here, the `...NEW_CATEGORY_BODY` spread
41
+ * would produce `string` and fail the downstream assignment.
42
+ * - `values: never[]` — narrowest possible array type, so the spread is
43
+ * assignable to any concrete `values` (e.g. TC's `(string | number)[]`,
44
+ * SM's `Array<string | number | ZeniDate>`).
45
+ * - `matchingOperator: string` — widely usable placeholder; every caller
46
+ * overrides this field after the spread.
47
+ *
48
+ * Using an explicit type annotation rather than `as const` keeps the
49
+ * narrowing without scattering `as const` through callsites.
50
+ */
51
+ type NewCategoryBody = {
52
+ matchingOperator: string;
53
+ values: never[];
54
+ valuesCombinationOperator: "ANY";
55
+ };
56
+ export declare const NEW_CATEGORY_BODY: NewCategoryBody;
57
+ export type GenericFilterCategoryDropdownOption<TField extends string = string> = {
58
+ value: TField;
59
+ multiple?: boolean;
60
+ type?: string;
61
+ };
62
+ export {};
@@ -1,5 +1,6 @@
1
1
  export interface Props {
2
2
  disabled?: boolean;
3
+ enableSearchHotkey?: boolean;
3
4
  inputWrapperStyle?: React.CSSProperties;
4
5
  keepSearchBoxOpen?: boolean;
5
6
  placeholder?: string;
@@ -8,9 +9,10 @@ export interface Props {
8
9
  searchIconMarginRight?: string;
9
10
  searchText?: string;
10
11
  style?: React.CSSProperties;
12
+ styledSearchCancelIconWrapperStyle?: React.CSSProperties;
11
13
  styledSearchIconContainerStyle?: React.CSSProperties;
12
14
  styledSearchIconWrapperStyle?: React.CSSProperties;
13
15
  onSearchOpen?: (isOpen: boolean) => void;
14
16
  onSearchTextChanged?: (text: string) => void;
15
17
  }
16
- export declare function ListPageSearchInputBox({ disabled, inputWrapperStyle, keepSearchBoxOpen, placeholder, searchBarDataTestId, searchIconMarginRight, searchText, style, styledSearchIconContainerStyle, styledSearchIconWrapperStyle, onSearchOpen, onSearchTextChanged, }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
18
+ export declare function ListPageSearchInputBox({ enableSearchHotkey, disabled, inputWrapperStyle, keepSearchBoxOpen, placeholder, searchBarDataTestId, searchIconMarginRight, searchText, style, styledSearchCancelIconWrapperStyle, styledSearchIconContainerStyle, styledSearchIconWrapperStyle, onSearchOpen, onSearchTextChanged, }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
@@ -2,13 +2,26 @@ export interface ListPageSearchSectionProps {
2
2
  isSearchOpen: boolean;
3
3
  searchPlaceHolder: string;
4
4
  searchText: string;
5
+ /** Tab-within-feature scope — see `selectedEntity` above. */
6
+ currentTab?: string;
5
7
  downloadPresent?: boolean;
8
+ enableSearchHotkey?: boolean;
6
9
  hideSearchBtn?: boolean;
7
10
  inputWrapperStyle?: React.CSSProperties;
8
11
  /** When set, applied to each search bar container (icon + input). */
9
12
  searchBarDataTestId?: string;
10
13
  searchIconMarginRight?: string;
11
14
  searchTextBoxStyle?: React.CSSProperties;
15
+ /**
16
+ * Optional page/feature scope — paired with `currentTab` to derive a
17
+ * specific `data-testid` on the outer container (e.g.
18
+ * `search-transaction_categorization-review`). Both must be supplied for
19
+ * the attribute to render; either missing falls back to no `data-testid`
20
+ * so consumers without this context (vendor pages, aging reports, etc.)
21
+ * stay un-tagged and continue to rely on their own scoping mechanisms.
22
+ */
23
+ selectedEntity?: string;
24
+ styledSearchCancelIconWrapperStyle?: React.CSSProperties;
12
25
  styledSearchIconContainerStyle?: React.CSSProperties;
13
26
  styledSearchIconWrapperStyle?: React.CSSProperties;
14
27
  onSearchTextChanged?: (searchText: string) => void;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { AccountBase, AuthParams, BulkUploadResultsTab, BulkUploadSelectorData, BulkUploadSortKey, COTTransactionTrackingByTransactionId, ClassBase, CompletedSubTab, CustomerBase, Entity, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationReconciliationViewTab, ExpenseAutomationStepDetails, ExpenseAutomationTransactionsTab, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationViewSelector, ExpenseAutomationViewType, FetchState, FluxAnalysisActionType, FluxAnalysisSectionType, FluxAnalysisViewUIState, ID, JEScheduleTransactionKey, LoggedInUser, MissingReceiptsTab, MonthYearPeriod, PageToken, PlaidLinkTokenType, RecommendationWithCOT, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, SaveExpenseAutomationReconciliationActionType, ScheduleTypes, SortOrder, SupportedTransactionPayload, SupportedTransactionWithCOT, TransactionEntityType, TransactionID, TransactionType, Vendor, VendorBase, ZeniAPIStatus } from '@zeniai/client-epic-state';
2
+ import { AccountBase, AccountFilterOption, AuthParams, BulkUploadResultsTab, BulkUploadSelectorData, BulkUploadSortKey, COTTransactionTrackingByTransactionId, ClassBase, ClassFilterOption, CompletedSubTab, CustomerBase, Entity, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationReconciliationViewTab, ExpenseAutomationStepDetails, ExpenseAutomationTransactionsTab, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationViewSelector, ExpenseAutomationViewType, FetchState, FluxAnalysisActionType, FluxAnalysisSectionType, FluxAnalysisViewUIState, ID, JEScheduleTransactionKey, LoggedInUser, MissingReceiptsTab, MonthYearPeriod, PageToken, PlaidLinkTokenType, RecommendationWithCOT, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, SaveExpenseAutomationReconciliationActionType, ScheduleTypes, SortOrder, SupportedTransactionPayload, SupportedTransactionWithCOT, TransactionEntityType, TransactionFilters, TransactionID, TransactionType, Vendor, VendorBase, ZeniAPIStatus } from '@zeniai/client-epic-state';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../common/autoComplete/autoCompleteProps';
4
4
  import { ReportTreeScrollPosition } from '../reportTree/ReportTree';
5
5
  import { ExpenseAutomationThreadClickTarget } from './components/ExpenseAutomationCommentingShell';
@@ -22,6 +22,8 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
22
22
  receiptUploadEndpoint: string;
23
23
  vendorSearchAutoCompleteActions: AutoCompleteActions;
24
24
  vendorSearchAutoCompleteData: AutoCompleteData;
25
+ /** Accounts from getAllAccounts(accountState) for Payment Account Name/Type filter dropdowns */
26
+ accountsForFilters?: AccountFilterOption[];
25
27
  /**
26
28
  * Transaction categorization only: inline activity next to the TC list
27
29
  * (e.g. `TransactionActivityLogPanel`).
@@ -34,6 +36,19 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
34
36
  activityLogTransactionId?: ID;
35
37
  bulkUploadEndpoint?: string;
36
38
  bulkUploadSelector?: BulkUploadSelectorData;
39
+ /** Options for the Category filter dropdown (converted to { label: accountName, value: accountId }) */
40
+ categoryOptions?: Array<{
41
+ accountId?: string;
42
+ accountName?: string;
43
+ }>;
44
+ /**
45
+ * Class options for the Class filter dropdown. Uses the narrow
46
+ * `ClassFilterOption` ({classId, className}) — only the identity and the
47
+ * display label are needed here. Passing the full `ClassBase` would be a
48
+ * loose contract that lets consumers accidentally rely on fields that the
49
+ * upstream selector strips out.
50
+ */
51
+ classesForFilters?: ClassFilterOption[];
37
52
  /** Initial receipts sub-tab (e.g. Storybook: show Unmatched without clicking tabs). */
38
53
  initialMissingReceiptsTab?: MissingReceiptsTab;
39
54
  isAiCfoAccessEnabled?: boolean;
@@ -72,6 +87,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
72
87
  }, isBulkFetch: boolean, selectedTab: ExpenseAutomationTransactionsTab, entity?: Entity, updatedCustomer?: CustomerBase) => void;
73
88
  onFetchReimbursementView: (selectedPeriod: MonthYearPeriod, pageToken: PageToken, keepExistingListItems: boolean) => void;
74
89
  onFetchTransactionCategorizationList: (selectedTab: ExpenseAutomationTransactionsTab, searchString?: string, keepExistingListItems?: boolean, pageToken?: PageToken, refreshInBackground?: boolean, resetListItems?: boolean) => void;
90
+ onFiltersChange: (filters: TransactionFilters) => void;
75
91
  onIncludeAccountIntoReconciliation: (accountId: ID) => void;
76
92
  onJeAccountSettingsChange: (formData: JEScheduleAccountSettingsFormData) => void;
77
93
  onJESchedulesFormDataChange: (scheduleJournalEntryID: ID, localData: JEScheduleResolveComponentFormData) => void;
@@ -101,6 +117,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
101
117
  onUpdateSelectedCheckboxTransactionIds: (selectedTab: ExpenseAutomationTransactionsTab, transactionIds: ID[]) => void;
102
118
  onUpdateStep: (step: ExpenseAutomationViewType) => void;
103
119
  onUpdateTab: (tab: ExpenseAutomationTransactionsTab) => void;
120
+ onUpdateTransactionCategorizationCompletedSubTab: (subTab: CompletedSubTab) => void;
104
121
  onUpdateTransactionCategorizationUIState: (selectedTab: ExpenseAutomationTransactionsTab, uiState: Partial<ExpenseAutomationTransactionsViewUIState>) => void;
105
122
  onUploadReceiptAttachment: (transaction: SupportedTransactionPayload) => void;
106
123
  onUploadReceiptComplete: (transactionPayload: SupportedTransactionPayload, selectedPeriod: MonthYearPeriod) => void;
@@ -138,6 +155,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
138
155
  /** Sync Redux `uploadedFileCount` when using direct HTTP bulk upload (no `onBulkUploadFiles`). */
139
156
  onBulkUploadUploadedFileCount?: (count: number) => void;
140
157
  onClearBulkUpload?: () => void;
158
+ onClearBulkUploadBatchDetailsForScopeChange?: () => void;
141
159
  /** Clears one-shot Redux flag after switching Missing Receipts sub-tab (e.g. Unmatched on batch complete). */
142
160
  onClearMissingReceiptsTabNavigation?: () => void;
143
161
  onConfirmBulkUploadMatch?: (batchId: ID, attachmentId: ID, transactionId: ID, transactionType: string, fileName: string) => void;
@@ -6,6 +6,12 @@ interface EmptyTableSectionProps {
6
6
  subTitle: string;
7
7
  tab: ExpenseAutomationViewType;
8
8
  title: string;
9
+ /**
10
+ * When true, render the "no search results" illustration instead of the
11
+ * tab-specific all-done illustration. Used by the Transaction Categorization
12
+ * list when an active search/filter yields no matches.
13
+ */
14
+ useNoSearchResultIcon?: boolean;
9
15
  }
10
16
  export default function EmptyTableSection(props: EmptyTableSectionProps): import("react/jsx-runtime").JSX.Element;
11
17
  export {};
@@ -0,0 +1,17 @@
1
+ import { CSSProperties } from 'react';
2
+ import { TabSwitcherOption } from '../../common/allNavBars/statusSwitcher/switcherTypes';
3
+ export interface ExpenseAutomationSubTabSwitcherProps<TId extends string = string> {
4
+ activeSubTab: TId;
5
+ allTabs: TabSwitcherOption[];
6
+ containerStyle?: CSSProperties;
7
+ onSubTabChange: (id: TId) => void;
8
+ }
9
+ /**
10
+ * Generic sub-tab strip for any tab inside the Expense Automation surface.
11
+ *
12
+ * Wraps the shared {@link SubTabSwitcher} with the standard column chrome and
13
+ * padding used across Expense Automation so visual parity is automatic. The
14
+ * `id` type is generic so callers can plug in any union (e.g. `CompletedSubTab`)
15
+ * without casting at the call site.
16
+ */
17
+ export declare function ExpenseAutomationSubTabSwitcher<TId extends string = string>({ activeSubTab, allTabs, onSubTabChange, containerStyle, }: ExpenseAutomationSubTabSwitcherProps<TId>): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
- import { CompletionStatusType, ExpenseAutomationReconciliationViewTab, ExpenseAutomationTransactionsTab, ExpenseAutomationViewType, FetchState, ID, MissingReceiptsTab } from '@zeniai/client-epic-state';
2
+ import { CompletionStatusType, ExpenseAutomationReconciliationViewTab, ExpenseAutomationTransactionsTab, ExpenseAutomationViewType, FetchState, ID, MissingReceiptsTab, TransactionFilterEntityType, TransactionFilters } from '@zeniai/client-epic-state';
3
3
  import { TabSwitcherOption } from '../../common/allNavBars/statusSwitcher/switcherTypes';
4
+ import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
5
+ import { ValuesDropdownOption } from '../../common/filters/genericFilterTypes';
4
6
  import { JEScheduleMainTab } from '../sections/jeSchedules/jeScheduleConfig';
5
7
  import { ExpenseAutomationNavbarHeaderData } from './navbarHeaderData';
6
8
  interface NavBarWithHeaderProps {
@@ -12,15 +14,30 @@ interface NavBarWithHeaderProps {
12
14
  isZeniUser: boolean;
13
15
  refreshStatus: FetchState;
14
16
  searchText: string;
17
+ selectedEntity: TransactionFilterEntityType;
15
18
  /** Renders below the tab strip (e.g. Missing Receipts bulk upload email + policy). */
16
19
  belowTabsSlot?: ReactNode;
17
20
  completionPercentage?: number;
18
21
  /** Raw progress (0–100) for color bands; falls back to `completionPercentage` when omitted. */
19
22
  completionProgressRaw?: number;
23
+ createdByUserListLoaded?: boolean;
20
24
  currentJeTab?: JEScheduleMainTab;
21
25
  currentMissingReceiptsTab?: MissingReceiptsTab;
22
26
  currentRecontab?: ExpenseAutomationReconciliationViewTab;
23
27
  currentTab?: ExpenseAutomationTransactionsTab;
28
+ filterComponent?: React.ComponentType<{
29
+ entity: TransactionFilterEntityType;
30
+ filters: TransactionFilters;
31
+ /** Memoized dropdown options keyed by category field. Update this when source data populates so dropdowns refresh. */
32
+ categoryWiseOptions?: Record<string, ValuesDropdownOption[]>;
33
+ createdByUserListLoaded?: boolean;
34
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
35
+ vendorSearchAutoCompleteData?: AutoCompleteData;
36
+ onFiltersChange: (filters: TransactionFilters) => void;
37
+ }>;
38
+ /** Memoized dropdown options keyed by category field. Update this when source data populates so dropdowns refresh. */
39
+ filterOptions?: Record<string, ValuesDropdownOption[]>;
40
+ filters?: TransactionFilters;
24
41
  hideTabSwitcher?: boolean;
25
42
  isAiCfoAccessEnabled?: boolean;
26
43
  isCompletionLoading?: boolean;
@@ -29,6 +46,8 @@ interface NavBarWithHeaderProps {
29
46
  selectedGenericTab?: ID;
30
47
  selectedReconAccountId?: ID;
31
48
  titleStyle?: React.CSSProperties;
49
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
50
+ vendorSearchAutoCompleteData?: AutoCompleteData;
32
51
  getTabCountAndFetchState: (currentTab: ExpenseAutomationTransactionsTab | ExpenseAutomationReconciliationViewTab | MissingReceiptsTab | JEScheduleMainTab) => {
33
52
  count: number;
34
53
  isFetching: boolean;
@@ -43,6 +62,7 @@ interface NavBarWithHeaderProps {
43
62
  onUpdateTab: (tab: ExpenseAutomationTransactionsTab) => void;
44
63
  onAskAiCfoClick?: () => void;
45
64
  onCommentDrawerClick?: () => void;
65
+ onFiltersChange?: (filters: TransactionFilters) => void;
46
66
  onGenericTabChange?: (tab: TabSwitcherOption) => void;
47
67
  onJeTabUpdate?: (tab: JEScheduleMainTab) => void;
48
68
  onMissingReceiptsTabUpdate?: (tab: MissingReceiptsTab) => void;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { AttachmentFilePayload, AuthParams, ExpenseAutomationViewSelector, ID, LoggedInUser, SaveExpenseAutomationReconciliationActionType } from '@zeniai/client-epic-state';
2
+ import { AttachmentFilePayload, AuthParams, ExpenseAutomationViewSelector, ID, LoggedInUser, SaveExpenseAutomationReconciliationActionType, TransactionFilters } from '@zeniai/client-epic-state';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
4
4
  import { FooterFormIdType } from '../common';
5
5
  import { AccountReconciliationParentPageActionProps } from '../sections/accountRecon/AccountReconciliationPage';
@@ -32,6 +32,7 @@ export interface MonthEndReportPageProps {
32
32
  interface TableSectionProps extends MissingReceiptsListTableActionProps, TransactionCategorizationActionProps, JESchedulePageProps, FluxAnalysisTableProps, AccountReconciliationParentPageActionProps, MonthEndReportPageProps {
33
33
  authParams: AuthParams;
34
34
  expenseAutomationViewSelector: ExpenseAutomationViewSelector;
35
+ filters: TransactionFilters;
35
36
  isAccountingClassesEnabled: boolean;
36
37
  isCOTEnabled: boolean;
37
38
  isProjectsTransactionsEnabled: boolean;