@flamingo-stack/openframe-frontend-core 0.0.853 → 0.0.855

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 (214) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{case-study-card-WP5Z234Q.cjs → case-study-card-6VAMNHLU.cjs} +8 -8
  3. package/dist/{chunk-2W22LY3W.cjs → chunk-2JCA7BRK.cjs} +19 -19
  4. package/dist/{chunk-53QPG7SJ.cjs → chunk-2MCPK6AX.cjs} +28 -28
  5. package/dist/{chunk-QOW2GP3V.cjs → chunk-2P72KAG5.cjs} +23 -23
  6. package/dist/{chunk-NMWLXHFH.cjs → chunk-3GJ75OUL.cjs} +183 -183
  7. package/dist/{chunk-P63CRPWI.cjs → chunk-4H3J57AN.cjs} +25 -25
  8. package/dist/{chunk-6GWRPW6B.cjs → chunk-5NK3FUHY.cjs} +4 -4
  9. package/dist/{chunk-DLTPSP5F.cjs → chunk-5TYG5JNB.cjs} +2 -2
  10. package/dist/{chunk-EIACEY2L.cjs → chunk-65NMKAPQ.cjs} +12 -12
  11. package/dist/{chunk-IGVAPIEW.cjs → chunk-6C4OR4MZ.cjs} +2 -2
  12. package/dist/{chunk-GG466XFQ.cjs → chunk-6DMH4GXN.cjs} +30 -5
  13. package/dist/{chunk-EF2FZ7GT.cjs → chunk-6VVQJU76.cjs} +54 -54
  14. package/dist/{chunk-G7GF4PWA.cjs → chunk-77GX573I.cjs} +9 -9
  15. package/dist/{chunk-7RZHSBNX.cjs → chunk-AOOHJLXS.cjs} +90 -90
  16. package/dist/{chunk-O3EKOXFZ.cjs → chunk-AYMY2VNB.cjs} +37 -43
  17. package/dist/{chunk-67CZ2Q5K.cjs → chunk-BSPIGZCC.cjs} +36 -36
  18. package/dist/{chunk-FW7RKWPY.cjs → chunk-D6GEMVHD.cjs} +3 -3
  19. package/dist/{chunk-KEV6F3QN.cjs → chunk-DPNFI5XM.cjs} +100 -100
  20. package/dist/{chunk-6V2M2X3M.cjs → chunk-DTZ6KASI.cjs} +6 -6
  21. package/dist/{chunk-SSKMGH5O.cjs → chunk-DXVGGWLG.cjs} +10 -10
  22. package/dist/{chunk-IO6NN3SL.cjs → chunk-EOUEUYCQ.cjs} +54 -54
  23. package/dist/{chunk-5RMBLOJ5.cjs → chunk-ESGE7CUX.cjs} +14 -14
  24. package/dist/{chunk-ETZFBB7O.cjs → chunk-EXQSIX2I.cjs} +4 -4
  25. package/dist/{chunk-IC4IJJB2.cjs → chunk-F33EAPD2.cjs} +124 -124
  26. package/dist/{chunk-COWMXUHN.cjs → chunk-GK577ZLJ.cjs} +6 -14
  27. package/dist/{chunk-E4MFQKPC.cjs → chunk-GZYRDLJW.cjs} +103 -103
  28. package/dist/{chunk-LFEURIZN.cjs → chunk-HML3JUXF.cjs} +324 -322
  29. package/dist/{chunk-BNHTBLAG.cjs → chunk-J3CFRGZ2.cjs} +17 -17
  30. package/dist/{chunk-USPUZO53.cjs → chunk-KZAQPRTA.cjs} +9 -11
  31. package/dist/{chunk-HTYJUMFB.cjs → chunk-LSLRJJFP.cjs} +2 -2
  32. package/dist/{chunk-TBGQMHCG.cjs → chunk-MINFN3IG.cjs} +8 -8
  33. package/dist/{chunk-KHOB3TES.cjs → chunk-MX52LZ6M.cjs} +6 -6
  34. package/dist/{chunk-OH5TXFRR.cjs → chunk-O4CPT3RK.cjs} +7 -7
  35. package/dist/{chunk-HF3V6WBJ.cjs → chunk-OTHQ2KQW.cjs} +3 -3
  36. package/dist/{chunk-IUDBG3HJ.cjs → chunk-PCQ2HKU3.cjs} +5 -5
  37. package/dist/{chunk-BNG6JOGZ.cjs → chunk-QPHXYE5P.cjs} +27 -27
  38. package/dist/{chunk-UO2EJGRJ.cjs → chunk-QZXCUY36.cjs} +53 -53
  39. package/dist/{chunk-COJG2ATY.cjs → chunk-RIJU4HZ2.cjs} +51 -55
  40. package/dist/{chunk-KKFDRCQF.cjs → chunk-RY7INTYU.cjs} +14 -1
  41. package/dist/{chunk-GI3MMBP3.cjs → chunk-SQ7YHWEP.cjs} +228 -15
  42. package/dist/{chunk-U767P4JU.cjs → chunk-STV6VJ3U.cjs} +21 -21
  43. package/dist/chunk-T54I5ZZY.cjs +62 -0
  44. package/dist/{chunk-UV45EPXN.cjs → chunk-TW5Y4D5I.cjs} +7 -7
  45. package/dist/{chunk-FX35L4Y6.cjs → chunk-XCQ5I27Z.cjs} +3 -3
  46. package/dist/{chunk-AZEO7HBB.cjs → chunk-Y44EF4JW.cjs} +2 -2
  47. package/dist/{chunk-W7OFAROY.cjs → chunk-YSXVRTGT.cjs} +9 -12
  48. package/dist/{chunk-GI6ECCWB.cjs → chunk-ZUGJLCYP.cjs} +1272 -856
  49. package/dist/{chunk-KNN2GCMW.cjs → chunk-ZYAVIRQV.cjs} +25 -25
  50. package/dist/{cloud-tenants-QUL2XPAS.cjs → cloud-tenants-2XFIDDGU.cjs} +28 -29
  51. package/dist/components/case-studies/index.cjs +44 -45
  52. package/dist/components/chat/chat-message-row.d.ts +1 -1
  53. package/dist/components/chat/chat-message-row.d.ts.map +1 -1
  54. package/dist/components/chat/chat-message-row.js +4 -4
  55. package/dist/components/chat/entity-cards/use-cover-image-fallback.d.ts +7 -13
  56. package/dist/components/chat/entity-cards/use-cover-image-fallback.d.ts.map +1 -1
  57. package/dist/components/chat/entity-cards/use-cover-image-fallback.js +2 -8
  58. package/dist/components/chat/hooks/use-chat-attachment-image-gallery.d.ts.map +1 -1
  59. package/dist/components/chat/hooks/use-chat-attachment-image-gallery.js +8 -4
  60. package/dist/components/chat/index.cjs +22 -23
  61. package/dist/components/contact/index.cjs +29 -30
  62. package/dist/components/docs/index.cjs +32 -33
  63. package/dist/components/embeds/index.cjs +29 -30
  64. package/dist/components/faq/index.cjs +30 -31
  65. package/dist/components/features/cloud-tenants/index.d.ts +7 -5
  66. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -1
  67. package/dist/components/features/cloud-tenants/index.js +8 -1
  68. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.d.ts +26 -0
  69. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.d.ts.map +1 -0
  70. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.js +176 -0
  71. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +4 -2
  72. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -1
  73. package/dist/components/features/cloud-tenants/tenant-access-cell.js +3 -2
  74. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +12 -5
  75. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -1
  76. package/dist/components/features/cloud-tenants/tenant-customer-cell.js +38 -7
  77. package/dist/components/features/cloud-tenants/tenant-licenses-cell.d.ts +7 -0
  78. package/dist/components/features/cloud-tenants/tenant-licenses-cell.d.ts.map +1 -0
  79. package/dist/components/features/cloud-tenants/tenant-licenses-cell.js +17 -0
  80. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +19 -0
  81. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -1
  82. package/dist/components/features/cloud-tenants/tenant-presentation.js +24 -3
  83. package/dist/components/features/cloud-tenants/tenant-row.d.ts +35 -8
  84. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -1
  85. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +9 -3
  86. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -1
  87. package/dist/components/features/cloud-tenants/tenants-table-columns.js +5 -3
  88. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +27 -6
  89. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -1
  90. package/dist/components/features/cloud-tenants/tenants-table-view.js +75 -17
  91. package/dist/components/features/devices/device-directory.d.ts +18 -0
  92. package/dist/components/features/devices/device-directory.d.ts.map +1 -0
  93. package/dist/components/features/devices/device-directory.js +35 -0
  94. package/dist/components/features/devices/devices-filter-toolbar.d.ts +3 -1
  95. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -1
  96. package/dist/components/features/devices/devices-filter-toolbar.js +2 -1
  97. package/dist/components/features/devices/devices-panel-view.d.ts +3 -1
  98. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
  99. package/dist/components/features/devices/devices-panel-view.js +11 -2
  100. package/dist/components/features/devices/devices-table-columns.d.ts +17 -3
  101. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
  102. package/dist/components/features/devices/devices-table-columns.js +80 -10
  103. package/dist/components/features/devices/index.d.ts +1 -0
  104. package/dist/components/features/devices/index.d.ts.map +1 -1
  105. package/dist/components/features/devices/index.js +8 -0
  106. package/dist/components/features/devices/types.d.ts +14 -0
  107. package/dist/components/features/devices/types.d.ts.map +1 -1
  108. package/dist/components/features/devices/use-tag-filter-modal.d.ts +1 -0
  109. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -1
  110. package/dist/components/features/devices/use-tag-filter-modal.js +13 -8
  111. package/dist/components/features/index.cjs +42 -29
  112. package/dist/components/help-center-pages/index.cjs +134 -135
  113. package/dist/components/index.cjs +126 -113
  114. package/dist/components/meeting-scheduler/index.cjs +102 -103
  115. package/dist/components/navigation/app-layout.js +2 -2
  116. package/dist/components/navigation/index.cjs +31 -32
  117. package/dist/components/onboarding-guides/index.cjs +31 -32
  118. package/dist/components/product-demo/index.cjs +39 -40
  119. package/dist/components/related-content/index.cjs +16 -17
  120. package/dist/components/tickets/index.cjs +35 -36
  121. package/dist/components/ui/date-picker.d.ts +2 -0
  122. package/dist/components/ui/date-picker.d.ts.map +1 -1
  123. package/dist/components/ui/date-picker.js +19 -6
  124. package/dist/components/ui/entity-image.d.ts +1 -2
  125. package/dist/components/ui/entity-image.d.ts.map +1 -1
  126. package/dist/components/ui/entity-image.js +4 -8
  127. package/dist/components/ui/index.cjs +28 -29
  128. package/dist/components/ui/markdown/base-components.d.ts +0 -13
  129. package/dist/components/ui/markdown/base-components.d.ts.map +1 -1
  130. package/dist/components/ui/markdown/base-components.js +7 -7
  131. package/dist/components/ui/square-avatar.d.ts.map +1 -1
  132. package/dist/components/ui/square-avatar.js +3 -8
  133. package/dist/{devices-LNB4CYPP.cjs → devices-O3DYGIZB.cjs} +29 -30
  134. package/dist/embed-shims/index.cjs +3 -2
  135. package/dist/embed-shims/next-image.cjs +3 -2
  136. package/dist/embed-shims/next-image.d.ts +2 -0
  137. package/dist/embed-shims/next-image.d.ts.map +1 -1
  138. package/dist/embed-shims/next-image.js +14 -4
  139. package/dist/{embeddable-chat-SJEEJI4N.cjs → embeddable-chat-QD7NFD2H.cjs} +100 -101
  140. package/dist/hooks/index.cjs +27 -16
  141. package/dist/hooks/index.d.ts +1 -0
  142. package/dist/hooks/index.d.ts.map +1 -1
  143. package/dist/hooks/index.js +1 -0
  144. package/dist/hooks/ui/use-content-breakpoint.d.ts +8 -0
  145. package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -1
  146. package/dist/hooks/ui/use-content-breakpoint.js +17 -3
  147. package/dist/hooks/ui/use-media-query.d.ts +1 -0
  148. package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
  149. package/dist/hooks/ui/use-media-query.js +3 -1
  150. package/dist/hooks/use-authed-asset-src.d.ts +77 -2
  151. package/dist/hooks/use-authed-asset-src.d.ts.map +1 -1
  152. package/dist/hooks/use-authed-asset-src.js +185 -73
  153. package/dist/hooks/use-authed-image-src.d.ts +11 -4
  154. package/dist/hooks/use-authed-image-src.d.ts.map +1 -1
  155. package/dist/hooks/use-authed-image-src.js +6 -2
  156. package/dist/hooks/use-image-fallback.d.ts +16 -0
  157. package/dist/hooks/use-image-fallback.d.ts.map +1 -0
  158. package/dist/hooks/use-image-fallback.js +14 -0
  159. package/dist/index.cjs +58 -36
  160. package/dist/{knowledge-UTWKB6XG.cjs → knowledge-K7AFNZNO.cjs} +29 -30
  161. package/dist/{logs-PMXIWMBQ.cjs → logs-MZ3BR2FR.cjs} +35 -36
  162. package/dist/{policies-6DCMFDL7.cjs → policies-XVKQ2W7S.cjs} +32 -33
  163. package/dist/{remote-session-SG44CNOK.cjs → remote-session-VOZJXDM4.cjs} +13 -14
  164. package/dist/{scripts-2G7LXW7Z.cjs → scripts-IBPMBS6G.cjs} +35 -36
  165. package/dist/{software-update-MYLKHDHC.cjs → software-update-PXTANMAO.cjs} +32 -33
  166. package/dist/{tickets-board-SQY2Y6QV.cjs → tickets-board-POYZS7BW.cjs} +16 -17
  167. package/dist/utils/app-origins.d.ts +3 -6
  168. package/dist/utils/app-origins.d.ts.map +1 -1
  169. package/dist/utils/app-origins.js +8 -1
  170. package/dist/utils/embed-authed-fetch.d.ts +46 -26
  171. package/dist/utils/embed-authed-fetch.d.ts.map +1 -1
  172. package/dist/utils/embed-authed-fetch.js +24 -8
  173. package/dist/utils/index.cjs +4 -1
  174. package/dist/utils/presentation-for.d.ts +6 -0
  175. package/dist/utils/presentation-for.d.ts.map +1 -0
  176. package/dist/utils/presentation-for.js +7 -0
  177. package/dist/{video-file-player-XMOB234V.cjs → video-file-player-RIOT24NT.cjs} +3 -4
  178. package/package.json +1 -1
  179. package/src/components/chat/chat-message-row.tsx +8 -7
  180. package/src/components/chat/entity-cards/use-cover-image-fallback.ts +8 -28
  181. package/src/components/chat/hooks/use-chat-attachment-image-gallery.tsx +19 -8
  182. package/src/components/features/cloud-tenants/index.ts +8 -3
  183. package/src/components/features/cloud-tenants/single-customer-tenants-table-view.tsx +234 -0
  184. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +12 -5
  185. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +48 -12
  186. package/src/components/features/cloud-tenants/tenant-licenses-cell.tsx +28 -0
  187. package/src/components/features/cloud-tenants/tenant-presentation.ts +46 -4
  188. package/src/components/features/cloud-tenants/tenant-row.ts +38 -8
  189. package/src/components/features/cloud-tenants/tenants-table-columns.ts +8 -5
  190. package/src/components/features/cloud-tenants/tenants-table-view.tsx +123 -28
  191. package/src/components/features/devices/device-directory.ts +55 -0
  192. package/src/components/features/devices/devices-filter-toolbar.tsx +4 -1
  193. package/src/components/features/devices/devices-panel-view.tsx +12 -2
  194. package/src/components/features/devices/devices-table-columns.tsx +123 -8
  195. package/src/components/features/devices/index.ts +7 -0
  196. package/src/components/features/devices/types.ts +14 -0
  197. package/src/components/features/devices/use-tag-filter-modal.ts +32 -14
  198. package/src/components/navigation/app-layout.tsx +4 -4
  199. package/src/components/ui/date-picker.tsx +21 -3
  200. package/src/components/ui/entity-image.tsx +4 -12
  201. package/src/components/ui/markdown/base-components.tsx +15 -20
  202. package/src/components/ui/square-avatar.tsx +5 -8
  203. package/src/embed-shims/next-image.tsx +34 -3
  204. package/src/hooks/index.ts +1 -0
  205. package/src/hooks/ui/use-content-breakpoint.ts +21 -2
  206. package/src/hooks/ui/use-media-query.ts +1 -0
  207. package/src/hooks/use-authed-asset-src.ts +323 -107
  208. package/src/hooks/use-authed-image-src.ts +15 -5
  209. package/src/hooks/use-image-fallback.ts +31 -0
  210. package/src/utils/app-origins.ts +12 -7
  211. package/src/utils/embed-authed-fetch.ts +71 -32
  212. package/src/utils/presentation-for.ts +10 -0
  213. package/dist/chunk-UAI4VMEF.cjs +0 -46
  214. package/dist/chunk-YSDB6HGQ.cjs +0 -102
@@ -1,17 +1,24 @@
1
- /** One connected directory tenant, as the tenants list shows it. */
2
- export interface TenantRow {
1
+ /** A customer a tenant's directory serves. */
2
+ export interface TenantCustomer {
3
+ name: string;
4
+ /** A URL the browser can load as is. */
5
+ imageUrl?: string | null;
6
+ }
7
+ /** A directory's seats over its paid SKUs. */
8
+ export interface TenantLicenseSummary {
9
+ assigned: number;
10
+ /** Absent when the provider does not report purchased seats (Google Workspace). */
11
+ purchased?: number | null;
12
+ /** Purchased minus assigned; negative when the provider counts suspended seats as assigned. */
13
+ unused?: number | null;
14
+ }
15
+ interface TenantRowBase {
3
16
  id: string;
4
17
  /** The tenant's own name in its directory. */
5
18
  name: string;
6
19
  /** The directory provider (`MICROSOFT_365`, `GOOGLE_WORKSPACE`); an unknown value keeps its raw name. */
7
20
  provider: string;
8
21
  domain?: string | null;
9
- /** The customer the tenant belongs to. */
10
- customer: {
11
- name: string;
12
- /** A URL the browser can load as is. */
13
- imageUrl?: string | null;
14
- };
15
22
  /** Users read from the directory; absent before the first read. */
16
23
  userCount?: number | null;
17
24
  /** What the last access probe found (`WRITE_ENABLED`, `DISCONNECTED`, ...). */
@@ -19,4 +26,24 @@ export interface TenantRow {
19
26
  /** When the directory was last read; absent when it never was. */
20
27
  lastReadAt?: string | null;
21
28
  }
29
+ /**
30
+ * A tenant of the single-customer list, `TenantsTableView`'s default variant, which accepts no other row: a
31
+ * multi-customer host that forgets `variant` does not compile. Deleted with that variant.
32
+ */
33
+ export interface TenantRow extends TenantRowBase {
34
+ /** The customer the tenant belongs to. */
35
+ customer: TenantCustomer;
36
+ }
37
+ /** A tenant of the multi-customer list (`variant="multi-customer"`): a directory serving any number of customers. */
38
+ export interface MultiCustomerTenantRow extends TenantRowBase {
39
+ /** The customers the directory serves, in the order the host shows them; empty while it serves none. */
40
+ customers: readonly TenantCustomer[];
41
+ /** Of the users read, the users no customer's rule claims; absent before the first read. */
42
+ unattributedUserCount?: number | null;
43
+ /** A person paused the sync: the row says so instead of when it was last read. */
44
+ syncPaused?: boolean;
45
+ /** Absent until the licence numbers have been read. */
46
+ licenses?: TenantLicenseSummary | null;
47
+ }
48
+ export {};
22
49
  //# sourceMappingURL=tenant-row.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-row.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenant-row.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,wCAAwC;QACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"tenant-row.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenant-row.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,0CAA0C;IAC1C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qHAAqH;AACrH,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,wGAAwG;IACxG,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,4FAA4F;IAC5F,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kFAAkF;IAClF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACxC"}
@@ -8,8 +8,9 @@ export interface TenantsTableColumn {
8
8
  align?: 'right';
9
9
  }
10
10
  /**
11
- * Column layout of the tenants list (Figma 1699-8249: Tenant, Customers,
12
- * Access, open). Data-only on purpose: the live table and the route skeleton
11
+ * Column layout of the tenants list (Figma 3025-3536: Tenant, Customers, Licences, Access, open). A tablet drops the
12
+ * licence cells and keeps the funnel (3032-4579); a phone keeps the tenant, the access tag and open (3033-9343).
13
+ * Data-only on purpose: the live table and the route skeleton
13
14
  * read the SAME widths, so nothing shifts when the rows arrive, and a skeleton
14
15
  * never imports the table's cell renderers.
15
16
  */
@@ -25,6 +26,12 @@ export declare const TENANT_COLUMNS: {
25
26
  width: string;
26
27
  hideAt: "md";
27
28
  };
29
+ licenses: {
30
+ id: string;
31
+ header: string;
32
+ width: string;
33
+ hideAt: "lg";
34
+ };
28
35
  access: {
29
36
  id: string;
30
37
  header: string;
@@ -33,7 +40,6 @@ export declare const TENANT_COLUMNS: {
33
40
  open: {
34
41
  id: string;
35
42
  width: string;
36
- hideAt: "md";
37
43
  align: "right";
38
44
  };
39
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tenants-table-columns.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenants-table-columns.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;CAKmB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAK9D,CAAC"}
1
+ {"version":3,"file":"tenants-table-columns.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenants-table-columns.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMmB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAM9D,CAAC"}
@@ -1,13 +1,15 @@
1
1
  "use client";
2
2
  const TENANT_COLUMNS = {
3
3
  tenant: { id: "tenant", header: "Tenant", width: "flex-1 min-w-0" },
4
- customer: { id: "customer", header: "Customers", width: "w-[220px] content-lg:w-[340px]", hideAt: "md" },
5
- access: { id: "access", header: "Access", width: "w-[200px] content-lg:w-[216px]" },
6
- open: { id: "open", width: "w-12 shrink-0 flex-none", hideAt: "md", align: "right" }
4
+ customer: { id: "customer", header: "Customers", width: "w-[220px] content-lg:w-[280px]", hideAt: "md" },
5
+ licenses: { id: "licenses", header: "Licences", width: "w-[150px]", hideAt: "lg" },
6
+ access: { id: "access", header: "Access", width: "flex-none content-md:w-[200px] content-lg:w-[216px]" },
7
+ open: { id: "open", width: "w-12 shrink-0 flex-none", align: "right" }
7
8
  };
8
9
  const TENANTS_TABLE_COLUMNS = [
9
10
  TENANT_COLUMNS.tenant,
10
11
  TENANT_COLUMNS.customer,
12
+ TENANT_COLUMNS.licenses,
11
13
  TENANT_COLUMNS.access,
12
14
  TENANT_COLUMNS.open
13
15
  ];
@@ -1,14 +1,32 @@
1
- import type { TenantRow } from './tenant-row';
1
+ import { type DataTableFilterOption } from '../../ui/data-table';
2
+ import { type SingleCustomerTenantsTableViewProps } from './single-customer-tenants-table-view';
3
+ import type { MultiCustomerTenantRow } from './tenant-row';
4
+ /** The columns whose header carries a funnel (Figma 3036-4860). */
5
+ export declare const TENANTS_TABLE_FILTER_COLUMNS: readonly ["tenant", "customer", "licenses", "access"];
6
+ export type TenantsTableFilterColumn = (typeof TENANTS_TABLE_FILTER_COLUMNS)[number];
7
+ /** Each column's funnel: what it offers, what is ticked. The host narrows the rows; the view only draws. */
8
+ export interface TenantsTableFilters {
9
+ /** A column the host leaves out has no funnel; one with no options draws its bare label. */
10
+ options: Partial<Record<TenantsTableFilterColumn, DataTableFilterOption[]>>;
11
+ selections: Readonly<Record<TenantsTableFilterColumn, readonly string[]>>;
12
+ onChange: (next: Record<TenantsTableFilterColumn, string[]>) => void;
13
+ /** The options are in flight: the funnels draw, inert. */
14
+ pending?: boolean;
15
+ }
2
16
  /**
3
17
  * Click handler that opens `href` in a new tab. The row is itself the details
4
18
  * link and an `<a>` cannot be nested in an `<a>`, so the button opens it by script.
5
19
  */
6
- export interface TenantsTableViewProps {
7
- rows: TenantRow[];
20
+ interface MultiCustomerTenantsTableViewProps {
21
+ /** A directory per row that serves any number of customers, with its licences and the column funnels. */
22
+ variant: 'multi-customer';
23
+ rows: MultiCustomerTenantRow[];
8
24
  /** Where a row leads: the row is a link to it, and its last cell opens it in a new tab. */
9
- getHref: (row: TenantRow) => string;
25
+ getHref: (row: MultiCustomerTenantRow) => string;
10
26
  /** The search the rows answer; named by the "no match" message. */
11
27
  search?: string;
28
+ /** The funnels of the column headers. Absent: none, as on the product page. */
29
+ filters?: TenantsTableFilters;
12
30
  /** The rows on screen are the previous result of a search still loading: they dim. */
13
31
  isPending?: boolean;
14
32
  /** All matching tenants, loaded or not. Default: the rows given. */
@@ -21,6 +39,9 @@ export interface TenantsTableViewProps {
21
39
  /** The clock "Last read" is relative to. Default: the moment of the render. */
22
40
  now?: Date;
23
41
  }
24
- /** The tenants list: tenant, customer, access state and a way into each tenant's details. */
25
- export declare function TenantsTableView({ rows, getHref, search, isPending, totalCount, stickyHeaderOffset, skeletonRows, hasNextPage, isFetchingNextPage, onLoadMore, now, }: TenantsTableViewProps): import("react").JSX.Element;
42
+ /** The single-customer list unless `variant` is 'multi-customer', the one that takes funnels and needs its own rows. */
43
+ export type TenantsTableViewProps = SingleCustomerTenantsTableViewProps | MultiCustomerTenantsTableViewProps;
44
+ /** The tenants list, in the layout its `variant` names. */
45
+ export declare function TenantsTableView(props: TenantsTableViewProps): import("react").JSX.Element;
46
+ export {};
26
47
  //# sourceMappingURL=tenants-table-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenants-table-view.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenants-table-view.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAmC9C;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,2FAA2F;IAC3F,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,MAAM,CAAC;IACpC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAKD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,MAAW,EACX,SAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,YAA0C,EAC1C,WAAmB,EACnB,kBAA0B,EAC1B,UAAU,EACV,GAAG,GACJ,EAAE,qBAAqB,+BAmFvB"}
1
+ {"version":3,"file":"tenants-table-view.d.ts","sourceRoot":"","sources":["../../../../src/components/features/cloud-tenants/tenants-table-view.tsx"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,qBAAqB,EAI3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,mCAAmC,EACzC,MAAM,sCAAsC,CAAC;AAK9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAmC3D,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,uDAAwD,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAErF,4GAA4G;AAC5G,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAC5E,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IACrE,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,UAAU,kCAAkC;IAC1C,yGAAyG;IACzG,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,2FAA2F;IAC3F,OAAO,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,MAAM,CAAC;IACjD,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,sFAAsF;IACtF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wHAAwH;AACxH,MAAM,MAAM,qBAAqB,GAAG,mCAAmC,GAAG,kCAAkC,CAAC;AAE7G,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAM5D"}
@@ -5,11 +5,19 @@ import { cn } from "../../../utils/cn.js";
5
5
  import { openInNewTab } from "../../../utils/open-in-new-tab.js";
6
6
  import { ArrowRightUpIcon } from "../../icons-v2-generated/arrows/arrow-right-up-icon.js";
7
7
  import { Button } from "../../ui/button/index.js";
8
- import { DataTable, dataTableLoadingRows, useDataTable } from "../../ui/data-table/index.js";
8
+ import {
9
+ DataTable,
10
+ dataTableLoadingRows,
11
+ useDataTable
12
+ } from "../../ui/data-table/index.js";
9
13
  import { useLoadingScope } from "../../ui/loading-scope.js";
14
+ import {
15
+ SingleCustomerTenantsTableView
16
+ } from "./single-customer-tenants-table-view.js";
10
17
  import { TenantAccessCell } from "./tenant-access-cell.js";
11
18
  import { TenantCell } from "./tenant-cell.js";
12
19
  import { TenantCustomerCell } from "./tenant-customer-cell.js";
20
+ import { TenantLicensesCell } from "./tenant-licenses-cell.js";
13
21
  import { TENANT_COLUMNS } from "./tenants-table-columns.js";
14
22
  const getRowId = (row) => row.id;
15
23
  const columnMeta = ({ width, hideAt, align }) => ({ width, hideAt, align });
@@ -17,7 +25,7 @@ const loadingTenant = (id) => ({
17
25
  id,
18
26
  name: "",
19
27
  provider: "",
20
- customer: { name: "" },
28
+ customers: [{ name: "" }],
21
29
  accessState: ""
22
30
  });
23
31
  function OpenTenantButton({ href, name }) {
@@ -38,11 +46,16 @@ function OpenTenantButton({ href, name }) {
38
46
  ) })
39
47
  );
40
48
  }
49
+ const TENANTS_TABLE_FILTER_COLUMNS = ["tenant", "customer", "licenses", "access"];
50
+ function TenantsTableView(props) {
51
+ return props.variant === "multi-customer" ? /* @__PURE__ */ jsx(MultiCustomerTenantsTableView, { ...props }) : /* @__PURE__ */ jsx(SingleCustomerTenantsTableView, { ...props });
52
+ }
41
53
  const TENANTS_TABLE_SKELETON_ROWS = 20;
42
- function TenantsTableView({
54
+ function MultiCustomerTenantsTableView({
43
55
  rows,
44
56
  getHref,
45
57
  search = "",
58
+ filters,
46
59
  isPending = false,
47
60
  totalCount,
48
61
  stickyHeaderOffset,
@@ -52,14 +65,20 @@ function TenantsTableView({
52
65
  onLoadMore,
53
66
  now
54
67
  }) {
55
- const columns = useMemo(
56
- () => [
68
+ const filterOptions = filters?.options;
69
+ const filtersPending = filters?.pending ?? false;
70
+ const columns = useMemo(() => {
71
+ const funnel = (id) => {
72
+ const options = filterOptions?.[id];
73
+ return options ? { filter: { options, pending: filtersPending } } : {};
74
+ };
75
+ return [
57
76
  {
58
77
  id: TENANT_COLUMNS.tenant.id,
59
78
  header: TENANT_COLUMNS.tenant.header,
60
79
  cell: ({ row }) => /* @__PURE__ */ jsx(TenantCell, { provider: row.original.provider, name: row.original.name, domain: row.original.domain }),
61
80
  enableSorting: false,
62
- meta: columnMeta(TENANT_COLUMNS.tenant)
81
+ meta: { ...columnMeta(TENANT_COLUMNS.tenant), ...funnel("tenant") }
63
82
  },
64
83
  {
65
84
  id: TENANT_COLUMNS.customer.id,
@@ -67,20 +86,36 @@ function TenantsTableView({
67
86
  cell: ({ row }) => /* @__PURE__ */ jsx(
68
87
  TenantCustomerCell,
69
88
  {
70
- name: row.original.customer.name,
71
- imageUrl: row.original.customer.imageUrl,
72
- userCount: row.original.userCount
89
+ customers: row.original.customers,
90
+ userCount: row.original.userCount,
91
+ unattributedUserCount: row.original.unattributedUserCount,
92
+ neverRead: row.original.lastReadAt == null && row.original.userCount == null
73
93
  }
74
94
  ),
75
95
  enableSorting: false,
76
- meta: columnMeta(TENANT_COLUMNS.customer)
96
+ meta: { ...columnMeta(TENANT_COLUMNS.customer), ...funnel("customer") }
97
+ },
98
+ {
99
+ id: TENANT_COLUMNS.licenses.id,
100
+ header: TENANT_COLUMNS.licenses.header,
101
+ cell: ({ row }) => /* @__PURE__ */ jsx(TenantLicensesCell, { licenses: row.original.licenses }),
102
+ enableSorting: false,
103
+ meta: { ...columnMeta(TENANT_COLUMNS.licenses), ...funnel("licenses") }
77
104
  },
78
105
  {
79
106
  id: TENANT_COLUMNS.access.id,
80
107
  header: TENANT_COLUMNS.access.header,
81
- cell: ({ row }) => /* @__PURE__ */ jsx(TenantAccessCell, { accessState: row.original.accessState, lastReadAt: row.original.lastReadAt, now }),
108
+ cell: ({ row }) => /* @__PURE__ */ jsx(
109
+ TenantAccessCell,
110
+ {
111
+ accessState: row.original.accessState,
112
+ lastReadAt: row.original.lastReadAt,
113
+ syncPaused: row.original.syncPaused,
114
+ now
115
+ }
116
+ ),
82
117
  enableSorting: false,
83
- meta: columnMeta(TENANT_COLUMNS.access)
118
+ meta: { ...columnMeta(TENANT_COLUMNS.access), ...funnel("access") }
84
119
  },
85
120
  {
86
121
  id: TENANT_COLUMNS.open.id,
@@ -88,15 +123,37 @@ function TenantsTableView({
88
123
  enableSorting: false,
89
124
  meta: columnMeta(TENANT_COLUMNS.open)
90
125
  }
91
- ],
92
- [getHref, now]
93
- );
126
+ ];
127
+ }, [getHref, now, filterOptions, filtersPending]);
94
128
  const loading = useLoadingScope();
95
129
  const loadingRows = useMemo(
96
130
  () => loading ? dataTableLoadingRows(skeletonRows, loadingTenant) : null,
97
131
  [loading, skeletonRows]
98
132
  );
99
- const table = useDataTable({ data: loadingRows ?? rows, columns, getRowId, enableSorting: false });
133
+ const selections = filters?.selections;
134
+ const onFiltersChange = filters?.onChange;
135
+ const columnFilters = useMemo(
136
+ () => TENANTS_TABLE_FILTER_COLUMNS.flatMap(
137
+ (id) => selections && selections[id].length > 0 ? [{ id, value: selections[id] }] : []
138
+ ),
139
+ [selections]
140
+ );
141
+ const table = useDataTable({
142
+ data: loadingRows ?? rows,
143
+ columns,
144
+ getRowId,
145
+ enableSorting: false,
146
+ state: { columnFilters },
147
+ onColumnFiltersChange: (updater) => {
148
+ const next = typeof updater === "function" ? updater(columnFilters) : updater;
149
+ const picked = (id) => {
150
+ const value = next.find((filter) => filter.id === id)?.value;
151
+ return Array.isArray(value) ? value : [];
152
+ };
153
+ const selected = Object.fromEntries(TENANTS_TABLE_FILTER_COLUMNS.map((id) => [id, picked(id)]));
154
+ onFiltersChange?.(selected);
155
+ }
156
+ });
100
157
  return (
101
158
  // Dim, don't unmount, the stale rows while a deferred search refetches.
102
159
  /* @__PURE__ */ jsx("div", { className: cn("transition-opacity duration-200", isPending && "opacity-60"), children: /* @__PURE__ */ jsxs(DataTable, { table, children: [
@@ -115,7 +172,7 @@ function TenantsTableView({
115
172
  skeletonRows,
116
173
  emptyState: {
117
174
  title: "No tenants match",
118
- description: `Nothing matches "${search}". Try a different name, domain or customer.`
175
+ description: search ? `Nothing matches "${search}". Try a different name, domain or customer.` : "Nothing matches the selected filters. Try adjusting them."
119
176
  },
120
177
  rowClassName: "mb-[var(--spacing-system-xxs)]",
121
178
  rowHref: getHref
@@ -133,5 +190,6 @@ function TenantsTableView({
133
190
  );
134
191
  }
135
192
  export {
193
+ TENANTS_TABLE_FILTER_COLUMNS,
136
194
  TenantsTableView
137
195
  };
@@ -0,0 +1,18 @@
1
+ import type { DeviceRow } from './types';
2
+ /** The schema's `DirectoryUserLink`: who a device is tied to in a directory. */
3
+ export type DeviceDirectoryUserLink = 'PRIMARY' | 'SHARED' | 'NONE';
4
+ /** The schema's `DirectorySource`: a directory that knows a device. */
5
+ export type DeviceDirectorySource = 'MICROSOFT_365' | 'GOOGLE_WORKSPACE';
6
+ /** The USER funnel's option (Figma 1136:64807). A value this build does not know keeps its own name. */
7
+ export declare function directoryUserLinkLabel(link: string): string;
8
+ /** The SOURCES tag: which directory knows the device. */
9
+ export declare function directorySourceLabel(source: string): string;
10
+ /**
11
+ * The USER cell's two lines (Figma 865:55733): the primary user over "Primary user", "Shared" over how many, or the
12
+ * empty mark when nobody is tied to the device.
13
+ */
14
+ export declare function directoryUserLines(device: Pick<DeviceRow, 'directoryUserLink' | 'directoryUserName' | 'directoryUserCount'>): {
15
+ name: string;
16
+ detail: string | null;
17
+ };
18
+ //# sourceMappingURL=device-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-directory.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/device-directory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,gFAAgF;AAChF,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpE,uEAAuE;AACvE,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAazE,wGAAwG;AACxG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,oBAAoB,CAAC,GACxF;IACD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CASA"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { presentationFor } from "../../../utils/presentation-for.js";
3
+ const USER_LINK_LABELS = {
4
+ PRIMARY: "Primary user",
5
+ SHARED: "Shared",
6
+ NONE: "No user"
7
+ };
8
+ const SOURCE_LABELS = {
9
+ MICROSOFT_365: "M365",
10
+ GOOGLE_WORKSPACE: "GOOGLE"
11
+ };
12
+ function directoryUserLinkLabel(link) {
13
+ return presentationFor(USER_LINK_LABELS, link) ?? link;
14
+ }
15
+ function directorySourceLabel(source) {
16
+ return presentationFor(SOURCE_LABELS, source) ?? source;
17
+ }
18
+ const EMPTY_USER = "\u2014";
19
+ const PRIMARY_LINK = "PRIMARY";
20
+ const SHARED_LINK = "SHARED";
21
+ function directoryUserLines(device) {
22
+ if (device.directoryUserLink === PRIMARY_LINK) {
23
+ return { name: device.directoryUserName ?? EMPTY_USER, detail: USER_LINK_LABELS.PRIMARY };
24
+ }
25
+ if (device.directoryUserLink === SHARED_LINK) {
26
+ const count = device.directoryUserCount ?? 0;
27
+ return { name: USER_LINK_LABELS.SHARED, detail: `${count} recent ${count === 1 ? "user" : "users"}` };
28
+ }
29
+ return { name: EMPTY_USER, detail: null };
30
+ }
31
+ export {
32
+ directorySourceLabel,
33
+ directoryUserLines,
34
+ directoryUserLinkLabel
35
+ };
@@ -21,6 +21,8 @@ export interface DevicesFilterToolbarProps {
21
21
  selectedTags: FilterModalProps['selectedTags'];
22
22
  onTagsChange: FilterModalProps['onTagsChange'];
23
23
  isLoading?: boolean;
24
+ /** The search field's prompt. Default "Search for Devices". */
25
+ searchPlaceholder?: string;
24
26
  /**
25
27
  * When true (default), pins the toolbar at the top with the same negative-margin
26
28
  * bleed used by `DevicesPanel` (so the search row's background covers the
@@ -40,6 +42,6 @@ export interface DevicesFilterToolbarProps {
40
42
  * all state (search value, modal open/close, filter options) is owned by
41
43
  * the parent. Reused by `DevicesPanel` and (eventually) `DeviceSelector`.
42
44
  */
43
- export declare function DevicesFilterToolbar({ searchValue, onSearchChange, tags, onTagRemove, onClearAll, onOpenFilterModal, isFilterModalOpen, onCloseFilterModal, filterGroups, onFilterChange, currentFilters, tagFilterKeys, selectedTags, onTagsChange, isLoading, sticky, toolbarRef, }: DevicesFilterToolbarProps): import("react").JSX.Element;
45
+ export declare function DevicesFilterToolbar({ searchValue, onSearchChange, tags, onTagRemove, onClearAll, onOpenFilterModal, isFilterModalOpen, onCloseFilterModal, filterGroups, onFilterChange, currentFilters, tagFilterKeys, selectedTags, onTagsChange, isLoading, searchPlaceholder, sticky, toolbarRef, }: DevicesFilterToolbarProps): import("react").JSX.Element;
44
46
  export {};
45
47
  //# sourceMappingURL=devices-filter-toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devices-filter-toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-filter-toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAkB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG7E,KAAK,gBAAgB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC;AAE3D,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mEAAmE;IACnE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAE9B,mDAAmD;IACnD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACpD,aAAa,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACjD,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,cAAc,EACd,IAAI,EACJ,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,MAAa,EACb,UAAU,GACX,EAAE,yBAAyB,+BAuC3B"}
1
+ {"version":3,"file":"devices-filter-toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-filter-toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAkB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG7E,KAAK,gBAAgB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC;AAE3D,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mEAAmE;IACnE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAE9B,mDAAmD;IACnD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACpD,aAAa,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACjD,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,cAAc,EACd,IAAI,EACJ,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,iBAAwC,EACxC,MAAa,EACb,UAAU,GACX,EAAE,yBAAyB,+BAuC3B"}
@@ -19,6 +19,7 @@ function DevicesFilterToolbar({
19
19
  selectedTags,
20
20
  onTagsChange,
21
21
  isLoading,
22
+ searchPlaceholder = "Search for Devices",
22
23
  sticky = true,
23
24
  toolbarRef
24
25
  }) {
@@ -40,7 +41,7 @@ function DevicesFilterToolbar({
40
41
  onSearchChange,
41
42
  onTagRemove,
42
43
  onClearAll,
43
- placeholder: "Search for Devices",
44
+ placeholder: searchPlaceholder,
44
45
  addMorePlaceholder: "Add More..."
45
46
  }
46
47
  ) }),
@@ -59,6 +59,8 @@ export interface DevicesPanelViewProps<T extends DeviceRow = DeviceRow> {
59
59
  hideColumns?: string[];
60
60
  /** Filter keys to drop from the funnels and the grid row; the column itself stays. */
61
61
  hideFilters?: string[];
62
+ /** Adds the USER and SOURCES columns and funnels, for a tenant with directories. Default: neither. */
63
+ directoryColumns?: boolean;
62
64
  /** Message shown when the list is empty. */
63
65
  emptyMessage?: string;
64
66
  /** Drawn instead of the toolbar and the list: the pristine, genuinely empty panel. */
@@ -86,5 +88,5 @@ export interface DevicesPanelViewProps<T extends DeviceRow = DeviceRow> {
86
88
  * state is the same component with `loading`: the chrome is the real one,
87
89
  * locked, so the page does not move when the rows land.
88
90
  */
89
- export declare function DevicesPanelView<T extends DeviceRow = DeviceRow>({ title, backButton, className, headerSlot, viewMode, onViewModeChange, actions, devices, loading: loadingGiven, loadingRegion, isNarrowing, totalCount, deviceFilters, filterColumns, toolbar, columnFilters, onColumnFiltersChange, gridFilters, onGridFiltersChange, actionsColumn, hideColumns, hideFilters, emptyMessage, emptyState, noOrganizations, hasNextPage, isFetchingNextPage, onLoadMore, gridSentinelRef, pageSize, }: DevicesPanelViewProps<T>): import("react").JSX.Element;
91
+ export declare function DevicesPanelView<T extends DeviceRow = DeviceRow>({ title, backButton, className, headerSlot, viewMode, onViewModeChange, actions, devices, loading: loadingGiven, loadingRegion, isNarrowing, totalCount, deviceFilters, filterColumns, toolbar, columnFilters, onColumnFiltersChange, gridFilters, onGridFiltersChange, actionsColumn, hideColumns, hideFilters, directoryColumns, emptyMessage, emptyState, noOrganizations, hasNextPage, isFetchingNextPage, onLoadMore, gridSentinelRef, pageSize, }: DevicesPanelViewProps<T>): import("react").JSX.Element;
90
92
  //# sourceMappingURL=devices-panel-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devices-panel-view.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-panel-view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices-panel-view.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-panel-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGtB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAwB,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAIhG,OAAO,EAAoB,KAAK,kBAAkB,EAA0B,MAAM,yBAAyB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC;AAO/C,+FAA+F;AAC/F,eAAO,MAAM,oBAAoB,EAAE,yBAclC,CAAC;AAEF,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACpE,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACrD,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,qDAAqD;IACrD,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE7B,oFAAoF;IACpF,OAAO,EAAE,CAAC,EAAE,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mFAAmF;IACnF,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,gHAAgH;IAChH,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,kCAAkC;IAClC,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,qBAAqB,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACvD,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAElE,4DAA4D;IAC5D,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EAChE,KAAiB,EACjB,UAAU,EACV,SAAc,EACd,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,OAAO,EACP,OAAO,EAAE,YAAoB,EAC7B,aAAoB,EACpB,WAAmB,EACnB,UAAU,EACV,aAAoB,EACpB,aAAa,EACb,OAA8B,EAC9B,aAAa,EACb,qBAAqB,EACrB,WAAwB,EACxB,mBAA0B,EAC1B,aAAa,EACb,WAAW,EACX,WAAW,EACX,gBAAwB,EACxB,YAAwE,EACxE,UAAU,EACV,eAAuB,EACvB,WAAmB,EACnB,kBAA0B,EAC1B,UAAiB,EACjB,eAAe,EACf,QAAQ,GACT,EAAE,qBAAqB,CAAC,CAAC,CAAC,+BA8H1B"}
@@ -57,6 +57,7 @@ function DevicesPanelView({
57
57
  actionsColumn,
58
58
  hideColumns,
59
59
  hideFilters,
60
+ directoryColumns = false,
60
61
  emptyMessage = "No devices found. Try adjusting your search or filters.",
61
62
  emptyState,
62
63
  noOrganizations = false,
@@ -68,9 +69,16 @@ function DevicesPanelView({
68
69
  }) {
69
70
  const scoped = useLoadingScope();
70
71
  const loading = scoped || loadingGiven;
71
- const gridColumns = filterColumns ?? getDeviceFilterColumns(deviceFilters).filter((column) => !hideFilters?.includes(column.key));
72
+ const gridColumns = filterColumns ?? getDeviceFilterColumns(deviceFilters, { directoryColumns }).filter((column) => !hideFilters?.includes(column.key));
72
73
  const list = /* @__PURE__ */ jsxs(Fragment, { children: [
73
- /* @__PURE__ */ jsx(DevicesFilterToolbar, { ...toolbar, isLoading: loading }),
74
+ /* @__PURE__ */ jsx(
75
+ DevicesFilterToolbar,
76
+ {
77
+ ...toolbar,
78
+ searchPlaceholder: directoryColumns ? "Search for Devices and Users" : void 0,
79
+ isLoading: loading
80
+ }
81
+ ),
74
82
  viewMode === "table" ? /* @__PURE__ */ jsx(
75
83
  DevicesTableBody,
76
84
  {
@@ -86,6 +94,7 @@ function DevicesPanelView({
86
94
  onColumnFiltersChange,
87
95
  actionsColumn,
88
96
  hideColumns,
97
+ directoryColumns,
89
98
  disableColumnFilters: hideFilters,
90
99
  totalCount: loading ? void 0 : totalCount,
91
100
  footerSlot: loading ? void 0 : /* @__PURE__ */ jsx(
@@ -35,6 +35,8 @@ export interface DevicesTableBodyProps<T extends DeviceRow = DeviceRow> {
35
35
  actionsColumn?: ColumnDef<T>;
36
36
  /** Column ids to drop from the base table columns (e.g. ['organization'] when scoped to a single org). */
37
37
  hideColumns?: string[];
38
+ /** Adds the USER and SOURCES columns, for a host whose tenant has directories. Default: neither. */
39
+ directoryColumns?: boolean;
38
40
  /** Column ids whose header filter is dropped while the column stays visible (e.g. ['status'] on the archive page). */
39
41
  disableColumnFilters?: string[];
40
42
  /** The facet query is still in flight, see `getDeviceTableColumns`. */
@@ -53,12 +55,14 @@ export interface DevicesTableBodyProps<T extends DeviceRow = DeviceRow> {
53
55
  */
54
56
  showHeader?: boolean;
55
57
  }
56
- export declare function DevicesTableBody<T extends DeviceRow = DeviceRow>({ devices, isLoading, loadingRegion, emptyState, emptyMessage, skeletonRows, stickyHeaderOffset, footerSlot, deviceFilters, columnFilters, onColumnFiltersChange, actionsColumn, hideColumns, disableColumnFilters, filtersPending, totalCount, showHeader, }: DevicesTableBodyProps<T>): React.JSX.Element;
58
+ export declare function DevicesTableBody<T extends DeviceRow = DeviceRow>({ devices, isLoading, loadingRegion, emptyState, emptyMessage, skeletonRows, stickyHeaderOffset, footerSlot, deviceFilters, columnFilters, onColumnFiltersChange, actionsColumn, hideColumns, directoryColumns, disableColumnFilters, filtersPending, totalCount, showHeader, }: DevicesTableBodyProps<T>): React.JSX.Element;
57
59
  export interface DeviceFilterColumn {
58
60
  key: string;
59
61
  label: string;
60
62
  filterable?: boolean;
61
63
  filterOptions?: DeviceFilterOption[];
64
+ /** Filters in the filter window from `lg` until `xl` too: its column's header has no funnel there. */
65
+ inWindowLgToXl?: boolean;
62
66
  }
63
67
  /** A device filter dropdown entry: `meta.filter.options` plus the facet count. */
64
68
  export interface DeviceFilterOption {
@@ -67,12 +71,22 @@ export interface DeviceFilterOption {
67
71
  value: string;
68
72
  count?: number;
69
73
  }
70
- export declare function getDeviceFilterColumns(deviceFilters?: DeviceFilters | null): DeviceFilterColumn[];
74
+ /** The directory columns of a device list: the table and its filter window take the same ones. */
75
+ interface DeviceDirectoryColumnOptions {
76
+ directoryColumns?: boolean;
77
+ roomyDirectory?: boolean;
78
+ }
79
+ export declare function getDeviceFilterColumns(deviceFilters?: DeviceFilters | null, { directoryColumns, roomyDirectory }?: DeviceDirectoryColumnOptions): DeviceFilterColumn[];
71
80
  /**
72
81
  * @param filtersPending The `deviceFilters` query is in flight, keeps the
73
82
  * funnels drawn (inert) rather than growing them when it answers. Absent means
74
83
  * these are the final options: an empty one then hides its funnel, which is what
75
84
  * a list with no facet source of its own wants.
85
+ * @param options.directoryColumns Adds USER and SOURCES after DEVICE. Off by default: a picker or a tenant with no
86
+ * directories has neither.
87
+ * @param options.roomyDirectory No customer column beside them (one customer's list), so SOURCES shows from `lg`
88
+ * rather than `xl`.
76
89
  */
77
- export declare function getDeviceTableColumns<T extends DeviceRow = DeviceRow>(deviceFilters?: DeviceFilters | null, filtersPending?: boolean): ColumnDef<T>[];
90
+ export declare function getDeviceTableColumns<T extends DeviceRow = DeviceRow>(deviceFilters?: DeviceFilters | null, filtersPending?: boolean, { directoryColumns, roomyDirectory }?: DeviceDirectoryColumnOptions): ColumnDef<T>[];
91
+ export {};
78
92
  //# sourceMappingURL=devices-table-columns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devices-table-columns.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-table-columns.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices-table-columns.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/devices-table-columns.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAmB,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAMjE,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAGvB,KAAK,WAAW,EAChB,KAAK,UAAU,EAMhB,MAAM,UAAU,CAAC;AAUlB,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAiBxD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACpE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,GAChD,SAAS,CAAC,CAAC,CAAC,CAad;AA4BD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAOnF;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACpE,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qHAAqH;IACrH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,qBAAqB,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACvD,iHAAiH;IACjH,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sHAAsH;IACtH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAQD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EAChE,OAAO,EACP,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAkC,EAClC,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,gBAAwB,EACxB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,UAAiB,GAClB,EAAE,qBAAqB,CAAC,CAAC,CAAC,qBAuD1B;AAgED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,sGAAsG;IACtG,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2CD,kGAAkG;AAClG,UAAU,4BAA4B;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAOD,wBAAgB,sBAAsB,CACpC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,EACpC,EAAE,gBAAwB,EAAE,cAAsB,EAAE,GAAE,4BAAiC,GACtF,kBAAkB,EAAE,CAuBtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACnE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,EACpC,cAAc,CAAC,EAAE,OAAO,EACxB,EAAE,gBAAwB,EAAE,cAAsB,EAAE,GAAE,4BAAiC,GACtF,SAAS,CAAC,CAAC,CAAC,EAAE,CA6GhB"}