@flamingo-stack/openframe-frontend-core 0.0.852 → 0.0.854

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 (163) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-G7GF4PWA.cjs → chunk-2IJMHBOK.cjs} +3 -3
  3. package/dist/{chunk-IC4IJJB2.cjs → chunk-3WXHPD6N.cjs} +55 -55
  4. package/dist/{chunk-UV45EPXN.cjs → chunk-4LTLEUY5.cjs} +5 -5
  5. package/dist/{chunk-BNHTBLAG.cjs → chunk-4O5N5CGK.cjs} +17 -17
  6. package/dist/{chunk-COWMXUHN.cjs → chunk-4SSJ3T3N.cjs} +3 -1
  7. package/dist/{chunk-IUDBG3HJ.cjs → chunk-5HMENXSR.cjs} +3 -3
  8. package/dist/{chunk-COJG2ATY.cjs → chunk-5OENPMRU.cjs} +43 -43
  9. package/dist/{chunk-IO6NN3SL.cjs → chunk-5TXE7BXT.cjs} +46 -46
  10. package/dist/{chunk-EIACEY2L.cjs → chunk-63ZV3UGG.cjs} +10 -10
  11. package/dist/{chunk-HTYJUMFB.cjs → chunk-6DCUGIGU.cjs} +2 -2
  12. package/dist/{chunk-GEZ3UXCA.cjs → chunk-6XU3RCK3.cjs} +18 -18
  13. package/dist/{chunk-3ZQESOPJ.cjs → chunk-7J5NSWJG.cjs} +87 -87
  14. package/dist/{chunk-MXY2OGEV.cjs → chunk-7MOBD44H.cjs} +28 -28
  15. package/dist/{chunk-U767P4JU.cjs → chunk-ACPOJE32.cjs} +9 -9
  16. package/dist/{chunk-CHGIACIP.cjs → chunk-BAA3YCLT.cjs} +72 -72
  17. package/dist/{chunk-VUHHLRAY.cjs → chunk-D2XGRWPW.cjs} +73 -73
  18. package/dist/{chunk-5RMBLOJ5.cjs → chunk-EIHMPQRQ.cjs} +9 -9
  19. package/dist/{chunk-3SJVF3HW.cjs → chunk-ETQNMR2K.cjs} +5 -5
  20. package/dist/{chunk-2W22LY3W.cjs → chunk-FBANHIAG.cjs} +9 -9
  21. package/dist/{chunk-P63CRPWI.cjs → chunk-FJXSKMQJ.cjs} +20 -20
  22. package/dist/{chunk-QOW2GP3V.cjs → chunk-GVHCQRUE.cjs} +21 -21
  23. package/dist/{chunk-KNN2GCMW.cjs → chunk-H3GBPYPS.cjs} +18 -18
  24. package/dist/{chunk-FW7RKWPY.cjs → chunk-JKBNK5U6.cjs} +3 -3
  25. package/dist/{chunk-W7OFAROY.cjs → chunk-KA3L6D5N.cjs} +3 -3
  26. package/dist/{chunk-USPUZO53.cjs → chunk-LQDAB5V5.cjs} +4 -4
  27. package/dist/{chunk-KHOB3TES.cjs → chunk-ONYANAMA.cjs} +4 -4
  28. package/dist/{chunk-D3H6AI7O.cjs → chunk-PRJZMZ3X.cjs} +1182 -746
  29. package/dist/chunk-QD727QFI.cjs +62 -0
  30. package/dist/{chunk-X3WIOMEE.cjs → chunk-RMI6O3AE.cjs} +32 -32
  31. package/dist/{chunk-MFDRCTM3.cjs → chunk-S5P6CF5R.cjs} +47 -47
  32. package/dist/{chunk-477P6AQH.cjs → chunk-TMPLHUUU.cjs} +6 -6
  33. package/dist/{chunk-UO2EJGRJ.cjs → chunk-UPQ4MAR7.cjs} +14 -14
  34. package/dist/{chunk-LFEURIZN.cjs → chunk-VMAOZA2V.cjs} +215 -215
  35. package/dist/{chunk-NMWLXHFH.cjs → chunk-YY3WP2YQ.cjs} +30 -30
  36. package/dist/{chunk-WFAZMASF.cjs → chunk-ZDPPNHA2.cjs} +3 -3
  37. package/dist/{cloud-tenants-O33HCUYB.cjs → cloud-tenants-5RNK4ZAT.cjs} +19 -19
  38. package/dist/components/case-studies/index.cjs +33 -33
  39. package/dist/components/chat/index.cjs +13 -13
  40. package/dist/components/contact/index.cjs +20 -20
  41. package/dist/components/docs/index.cjs +23 -23
  42. package/dist/components/embeds/index.cjs +20 -20
  43. package/dist/components/faq/index.cjs +21 -21
  44. package/dist/components/features/cloud-tenants/index.d.ts +7 -5
  45. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -1
  46. package/dist/components/features/cloud-tenants/index.js +8 -1
  47. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.d.ts +26 -0
  48. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.d.ts.map +1 -0
  49. package/dist/components/features/cloud-tenants/single-customer-tenants-table-view.js +176 -0
  50. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +4 -2
  51. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -1
  52. package/dist/components/features/cloud-tenants/tenant-access-cell.js +3 -2
  53. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +12 -5
  54. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -1
  55. package/dist/components/features/cloud-tenants/tenant-customer-cell.js +38 -7
  56. package/dist/components/features/cloud-tenants/tenant-licenses-cell.d.ts +7 -0
  57. package/dist/components/features/cloud-tenants/tenant-licenses-cell.d.ts.map +1 -0
  58. package/dist/components/features/cloud-tenants/tenant-licenses-cell.js +17 -0
  59. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +19 -0
  60. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -1
  61. package/dist/components/features/cloud-tenants/tenant-presentation.js +24 -3
  62. package/dist/components/features/cloud-tenants/tenant-row.d.ts +35 -8
  63. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -1
  64. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +9 -3
  65. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -1
  66. package/dist/components/features/cloud-tenants/tenants-table-columns.js +5 -3
  67. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +27 -6
  68. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -1
  69. package/dist/components/features/cloud-tenants/tenants-table-view.js +75 -17
  70. package/dist/components/features/devices/device-directory.d.ts +18 -0
  71. package/dist/components/features/devices/device-directory.d.ts.map +1 -0
  72. package/dist/components/features/devices/device-directory.js +35 -0
  73. package/dist/components/features/devices/devices-filter-toolbar.d.ts +3 -1
  74. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -1
  75. package/dist/components/features/devices/devices-filter-toolbar.js +2 -1
  76. package/dist/components/features/devices/devices-panel-view.d.ts +3 -1
  77. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
  78. package/dist/components/features/devices/devices-panel-view.js +11 -2
  79. package/dist/components/features/devices/devices-table-columns.d.ts +17 -3
  80. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
  81. package/dist/components/features/devices/devices-table-columns.js +80 -10
  82. package/dist/components/features/devices/index.d.ts +1 -0
  83. package/dist/components/features/devices/index.d.ts.map +1 -1
  84. package/dist/components/features/devices/index.js +8 -0
  85. package/dist/components/features/devices/types.d.ts +14 -0
  86. package/dist/components/features/devices/types.d.ts.map +1 -1
  87. package/dist/components/features/devices/use-tag-filter-modal.d.ts +1 -0
  88. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -1
  89. package/dist/components/features/devices/use-tag-filter-modal.js +13 -8
  90. package/dist/components/features/index.cjs +33 -19
  91. package/dist/components/help-center-pages/index.cjs +120 -120
  92. package/dist/components/help-center-pages/trust-center-page.d.ts +1 -1
  93. package/dist/components/index.cjs +96 -76
  94. package/dist/components/meeting-scheduler/index.cjs +82 -82
  95. package/dist/components/navigation/app-layout.js +2 -2
  96. package/dist/components/navigation/index.cjs +22 -22
  97. package/dist/components/onboarding-guides/index.cjs +22 -22
  98. package/dist/components/platform/tool-badge-mark.d.ts +1 -1
  99. package/dist/components/product-demo/index.cjs +30 -30
  100. package/dist/components/related-content/index.cjs +8 -8
  101. package/dist/components/tickets/index.cjs +24 -24
  102. package/dist/components/ui/data-attribution.d.ts +8 -3
  103. package/dist/components/ui/data-attribution.d.ts.map +1 -1
  104. package/dist/components/ui/data-attribution.js +17 -6
  105. package/dist/components/ui/date-picker.d.ts +2 -0
  106. package/dist/components/ui/date-picker.d.ts.map +1 -1
  107. package/dist/components/ui/date-picker.js +19 -6
  108. package/dist/components/ui/index.cjs +25 -19
  109. package/dist/components/ui/index.d.ts +1 -0
  110. package/dist/components/ui/index.d.ts.map +1 -1
  111. package/dist/components/ui/index.js +1 -0
  112. package/dist/{devices-2RGGMC2B.cjs → devices-44O5PZOW.cjs} +20 -20
  113. package/dist/{embeddable-chat-SJEEJI4N.cjs → embeddable-chat-W3CLMGC3.cjs} +90 -90
  114. package/dist/hooks/index.cjs +11 -7
  115. package/dist/hooks/ui/use-content-breakpoint.d.ts +8 -0
  116. package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -1
  117. package/dist/hooks/ui/use-content-breakpoint.js +17 -3
  118. package/dist/hooks/ui/use-media-query.d.ts +1 -0
  119. package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
  120. package/dist/hooks/ui/use-media-query.js +3 -1
  121. package/dist/index.cjs +44 -24
  122. package/dist/{knowledge-5TJIXVMD.cjs → knowledge-UUU3WVO3.cjs} +20 -20
  123. package/dist/{logs-HGQOTRKZ.cjs → logs-DFHNSODA.cjs} +26 -26
  124. package/dist/{policies-GWFSLVSM.cjs → policies-RGFUGDBP.cjs} +23 -23
  125. package/dist/{remote-session-SG44CNOK.cjs → remote-session-U3H77HKR.cjs} +10 -10
  126. package/dist/{scripts-PGJNAZF4.cjs → scripts-KOVO5DHW.cjs} +26 -26
  127. package/dist/{software-update-KKLSYHDI.cjs → software-update-4EKHVV5W.cjs} +23 -23
  128. package/dist/{tickets-board-SQY2Y6QV.cjs → tickets-board-YIFOVMDX.cjs} +10 -10
  129. package/dist/types/data-sync.d.ts +4 -1
  130. package/dist/types/data-sync.d.ts.map +1 -1
  131. package/dist/types/data-sync.js +4 -1
  132. package/dist/types/index.cjs +4 -1
  133. package/dist/utils/presentation-for.d.ts +6 -0
  134. package/dist/utils/presentation-for.d.ts.map +1 -0
  135. package/dist/utils/presentation-for.js +7 -0
  136. package/package.json +1 -1
  137. package/src/components/features/cloud-tenants/index.ts +8 -3
  138. package/src/components/features/cloud-tenants/single-customer-tenants-table-view.tsx +234 -0
  139. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +12 -5
  140. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +48 -12
  141. package/src/components/features/cloud-tenants/tenant-licenses-cell.tsx +28 -0
  142. package/src/components/features/cloud-tenants/tenant-presentation.ts +46 -4
  143. package/src/components/features/cloud-tenants/tenant-row.ts +38 -8
  144. package/src/components/features/cloud-tenants/tenants-table-columns.ts +8 -5
  145. package/src/components/features/cloud-tenants/tenants-table-view.tsx +123 -28
  146. package/src/components/features/devices/device-directory.ts +55 -0
  147. package/src/components/features/devices/devices-filter-toolbar.tsx +4 -1
  148. package/src/components/features/devices/devices-panel-view.tsx +12 -2
  149. package/src/components/features/devices/devices-table-columns.tsx +123 -8
  150. package/src/components/features/devices/index.ts +7 -0
  151. package/src/components/features/devices/types.ts +14 -0
  152. package/src/components/features/devices/use-tag-filter-modal.ts +32 -14
  153. package/src/components/help-center-pages/trust-center-page.tsx +1 -1
  154. package/src/components/navigation/app-layout.tsx +4 -4
  155. package/src/components/platform/tool-badge-mark.ts +1 -1
  156. package/src/components/ui/data-attribution.tsx +20 -8
  157. package/src/components/ui/date-picker.tsx +21 -3
  158. package/src/components/ui/index.ts +2 -0
  159. package/src/hooks/ui/use-content-breakpoint.ts +21 -2
  160. package/src/hooks/ui/use-media-query.ts +1 -0
  161. package/src/types/data-sync.ts +4 -1
  162. package/src/utils/presentation-for.ts +10 -0
  163. package/dist/chunk-UAI4VMEF.cjs +0 -46
@@ -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":"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"}
@@ -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":"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"}
@@ -17,6 +17,7 @@ import {
17
17
  } from "../../ui/index.js";
18
18
  import { DATA_TABLE_SKELETON_ROWS } from "../../ui/data-table/utils.js";
19
19
  import { OSTypeBadge } from "../os-type-badge.js";
20
+ import { directorySourceLabel, directoryUserLines, directoryUserLinkLabel } from "./device-directory.js";
20
21
  import { getDeviceName } from "./device-name.js";
21
22
  import { getDeviceStatusConfig } from "./device-status.js";
22
23
  import { DEFAULT_VISIBLE_STATUSES } from "./device-statuses.js";
@@ -89,6 +90,7 @@ function DevicesTableBody({
89
90
  onColumnFiltersChange,
90
91
  actionsColumn,
91
92
  hideColumns,
93
+ directoryColumns = false,
92
94
  disableColumnFilters,
93
95
  filtersPending,
94
96
  totalCount,
@@ -98,10 +100,14 @@ function DevicesTableBody({
98
100
  const columns = useMemo(() => {
99
101
  const hidden = new Set(hideColumns ?? []);
100
102
  const unfiltered = new Set(disableColumnFilters ?? []);
101
- const base = getDeviceTableColumns(deviceFilters ?? null, filtersPending).filter((c) => !c.id || !hidden.has(c.id)).map((c) => c.id && unfiltered.has(c.id) ? { ...c, meta: { ...c.meta, filter: void 0 } } : c);
103
+ const base = getDeviceTableColumns(deviceFilters ?? null, filtersPending, {
104
+ directoryColumns,
105
+ // Without the customer column there is room for the sources from where the customer's column would have started.
106
+ roomyDirectory: hidden.has("organization")
107
+ }).filter((c) => !c.id || !hidden.has(c.id)).map((c) => c.id && unfiltered.has(c.id) ? { ...c, meta: { ...c.meta, filter: void 0 } } : c);
102
108
  const open = getDeviceOpenColumn();
103
109
  return actionsColumn ? [...base, actionsColumn, open] : [...base, open];
104
- }, [deviceFilters, filtersPending, actionsColumn, hideColumns, disableColumnFilters]);
110
+ }, [deviceFilters, filtersPending, actionsColumn, hideColumns, directoryColumns, disableColumnFilters]);
105
111
  const loadingRows = useMemo(
106
112
  () => isLoading ? deviceLoadingRows(skeletonRows ?? DATA_TABLE_SKELETON_ROWS) : null,
107
113
  [isLoading, skeletonRows]
@@ -155,6 +161,20 @@ function DeviceLastSeen({ lastSeen }) {
155
161
  if (useLoadingScope() && !lastSeen) return /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h6", className: "hidden w-24 content-md:block" });
156
162
  return /* @__PURE__ */ jsx("span", { className: "hidden text-ods-text-secondary text-h6 content-md:flex", children: lastSeen ? formatDateTime(lastSeen) : "Never" });
157
163
  }
164
+ function DirectoryUserCell({ device }) {
165
+ const loading = useLoadingScope();
166
+ if (loading && !device.directoryUserLink) {
167
+ return /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h4", className: "w-3/4" });
168
+ }
169
+ const { name, detail } = directoryUserLines(device);
170
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col justify-center", children: [
171
+ /* @__PURE__ */ jsx(TruncateText, { children: name }),
172
+ detail && /* @__PURE__ */ jsx(TruncateText, { variant: "h6", tone: "secondary", children: detail })
173
+ ] });
174
+ }
175
+ function DirectorySourcesCell({ sources }) {
176
+ return /* @__PURE__ */ jsx("div", { "data-loading-optional": true, className: "flex min-w-0 flex-wrap gap-[var(--spacing-system-xxs)]", children: (sources ?? []).map((source) => /* @__PURE__ */ jsx(Tag, { label: directorySourceLabel(source), variant: "grey" }, source)) });
177
+ }
158
178
  function buildDeviceFilterOptions(deviceFilters) {
159
179
  const status = (deviceFilters?.statuses ?? []).filter((s) => DEFAULT_VISIBLE_STATUSES.includes(s.value)).map((s) => ({ id: s.value, label: getDeviceStatusConfig(s.value).label, value: s.value, count: s.count }));
160
180
  const os = (deviceFilters?.osTypes ?? []).map((o) => ({ id: o.value, label: o.value, value: o.value, count: o.count }));
@@ -166,26 +186,74 @@ function buildDeviceFilterOptions(deviceFilters) {
166
186
  count: org.count
167
187
  }))
168
188
  );
169
- return { status, os, organization };
189
+ const user = (deviceFilters?.userLinks ?? []).map((link) => ({
190
+ id: link.value,
191
+ label: directoryUserLinkLabel(link.value),
192
+ value: link.value,
193
+ count: link.count
194
+ }));
195
+ const sources = (deviceFilters?.directorySources ?? []).map((source) => ({
196
+ id: source.value,
197
+ label: directorySourceLabel(source.value),
198
+ value: source.value,
199
+ count: source.count
200
+ }));
201
+ return { status, os, organization, user, sources };
170
202
  }
171
- function getDeviceFilterColumns(deviceFilters) {
203
+ function getDeviceFilterColumns(deviceFilters, { directoryColumns = false, roomyDirectory = false } = {}) {
172
204
  const options = buildDeviceFilterOptions(deviceFilters);
173
205
  return [
174
206
  {
175
207
  key: "device",
176
208
  label: "DEVICE"
177
209
  },
210
+ ...directoryColumns ? [
211
+ { key: "user", label: "USER", filterable: true, filterOptions: options.user },
212
+ {
213
+ key: "sources",
214
+ label: "SOURCES",
215
+ filterable: true,
216
+ filterOptions: options.sources,
217
+ inWindowLgToXl: !roomyDirectory
218
+ }
219
+ ] : [],
178
220
  { key: "status", label: "STATUS", filterable: true, filterOptions: options.status },
179
221
  { key: "os", label: "OS", filterable: true, filterOptions: options.os },
180
222
  { key: "organization", label: "CUSTOMER", filterable: true, filterOptions: options.organization }
181
223
  ];
182
224
  }
183
- function getDeviceTableColumns(deviceFilters, filtersPending) {
225
+ function getDeviceTableColumns(deviceFilters, filtersPending, { directoryColumns = false, roomyDirectory = false } = {}) {
184
226
  const {
185
227
  status: statusFilterOptions,
186
228
  os: osFilterOptions,
187
- organization: orgFilterOptions
229
+ organization: orgFilterOptions,
230
+ user: userFilterOptions,
231
+ sources: sourcesFilterOptions
188
232
  } = buildDeviceFilterOptions(deviceFilters);
233
+ const directory = directoryColumns ? [
234
+ {
235
+ id: "user",
236
+ header: "USER",
237
+ cell: ({ row }) => /* @__PURE__ */ jsx(DirectoryUserCell, { device: row.original }),
238
+ enableSorting: false,
239
+ meta: {
240
+ width: "min-w-0 content-lg:w-[15%]",
241
+ hideAt: "lg",
242
+ filter: { options: userFilterOptions, pending: filtersPending }
243
+ }
244
+ },
245
+ {
246
+ id: "sources",
247
+ header: "SOURCES",
248
+ cell: ({ row }) => /* @__PURE__ */ jsx(DirectorySourcesCell, { sources: row.original.directorySources }),
249
+ enableSorting: false,
250
+ meta: {
251
+ width: "min-w-0 content-lg:w-[11%]",
252
+ hideAt: roomyDirectory ? "lg" : "xl",
253
+ filter: { options: sourcesFilterOptions, pending: filtersPending }
254
+ }
255
+ }
256
+ ] : [];
189
257
  return [
190
258
  {
191
259
  accessorKey: "device",
@@ -199,8 +267,10 @@ function getDeviceTableColumns(deviceFilters, filtersPending) {
199
267
  /* @__PURE__ */ jsx(DeviceUnreadIndicator, { device })
200
268
  ] });
201
269
  },
202
- meta: { width: "flex-1 content-md:w-1/4" }
270
+ // The name takes what the other columns leave: with two more of them, their shares below shrink to leave some.
271
+ meta: { width: directoryColumns ? "flex-1 min-w-0" : "flex-1 content-md:w-1/4" }
203
272
  },
273
+ ...directory,
204
274
  {
205
275
  accessorKey: "status",
206
276
  id: "status",
@@ -214,7 +284,7 @@ function getDeviceTableColumns(deviceFilters, filtersPending) {
214
284
  ] });
215
285
  },
216
286
  meta: {
217
- width: "w-auto shrink-0 content-md:w-1/5",
287
+ width: directoryColumns ? "w-auto shrink-0 content-md:w-[14%]" : "w-auto shrink-0 content-md:w-1/5",
218
288
  // Declared unconditionally, empty options and all. `meta.filter` is what
219
289
  // keeps a header cell visible below `lg`, so dropping it until the
220
290
  // options query resolves made every header on a tablet disappear on
@@ -229,7 +299,7 @@ function getDeviceTableColumns(deviceFilters, filtersPending) {
229
299
  header: "OS",
230
300
  cell: ({ row }) => /* @__PURE__ */ jsx(OSTypeBadge, { osType: row.original.osType, iconSize: "w-4 h-4 content-md:w-6 content-md:h-6" }),
231
301
  meta: {
232
- width: "w-[200px] content-md:w-1/6",
302
+ width: directoryColumns ? "w-[200px] content-md:w-[10%]" : "w-[200px] content-md:w-1/6",
233
303
  hideAt: "md",
234
304
  filter: { options: osFilterOptions, pending: filtersPending }
235
305
  }
@@ -240,7 +310,7 @@ function getDeviceTableColumns(deviceFilters, filtersPending) {
240
310
  header: "CUSTOMER",
241
311
  cell: ({ row }) => /* @__PURE__ */ jsx(OrganizationCell, { device: row.original }),
242
312
  meta: {
243
- width: "w-1/6",
313
+ width: directoryColumns ? "w-[14%]" : "w-1/6",
244
314
  hideAt: "lg",
245
315
  filter: { options: orgFilterOptions, placement: "bottom-end", pending: filtersPending }
246
316
  }
@@ -1,3 +1,4 @@
1
+ export { type DeviceDirectorySource, type DeviceDirectoryUserLink, directorySourceLabel, directoryUserLines, directoryUserLinkLabel, } from './device-directory';
1
2
  export { formatLastOnline } from './device-last-online';
2
3
  export { type DeviceNameSource, getDeviceName, matchesDeviceName } from './device-name';
3
4
  export { DeviceSelectionModeRadio, type DeviceSelectionModeRadioProps, } from './device-selector/device-selection-mode-radio';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,GACnC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,GACP,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,KAAK,YAAY,EACjB,sBAAsB,EACtB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/features/devices/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,GACnC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,GACP,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,KAAK,YAAY,EACjB,sBAAsB,EACtB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,3 +1,8 @@
1
+ import {
2
+ directorySourceLabel,
3
+ directoryUserLines,
4
+ directoryUserLinkLabel
5
+ } from "./device-directory.js";
1
6
  import { formatLastOnline } from "./device-last-online.js";
2
7
  import { getDeviceName, matchesDeviceName } from "./device-name.js";
3
8
  import {
@@ -77,6 +82,9 @@ export {
77
82
  HIDDEN_DEVICE_STATUSES,
78
83
  IDLE_DEVICES_TOOLBAR,
79
84
  buildDevicePanelActions,
85
+ directorySourceLabel,
86
+ directoryUserLines,
87
+ directoryUserLinkLabel,
80
88
  formatLastOnline,
81
89
  getDeviceActionsColumn,
82
90
  getDeviceFilterColumns,