@flamingo-stack/openframe-frontend-core 0.0.711 → 0.0.713
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.
- package/dist/chunk-2NASBO7O.js +1137 -0
- package/dist/{chunk-RQRX4YC3.cjs → chunk-2RKFMUNW.cjs} +46 -46
- package/dist/chunk-2Y7QZAB2.cjs +158 -0
- package/dist/chunk-34I6XI3N.js +136 -0
- package/dist/{chunk-VWFZRMQR.js → chunk-3BB3IEJI.js} +13 -7
- package/dist/chunk-3K5ZLZE7.js +292 -0
- package/dist/chunk-3LU4UFPS.cjs +14 -0
- package/dist/{chunk-G47AP6LX.cjs → chunk-3QGUDPIH.cjs} +35 -33
- package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
- package/dist/chunk-4HJRHEXD.cjs +1612 -0
- package/dist/{chunk-JPG7OHEG.js → chunk-4QFWGLZO.js} +1 -1
- package/dist/chunk-4R2L3DSA.js +14 -0
- package/dist/{chunk-VMMHJFHG.js → chunk-6F4QOCGB.js} +10 -8
- package/dist/{chunk-Q6B35Y7O.js → chunk-6MNAIQNR.js} +22 -113
- package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
- package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
- package/dist/chunk-AAYNCJMW.cjs +48 -0
- package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
- package/dist/chunk-AECTRMGQ.cjs +334 -0
- package/dist/chunk-AGVXKD4K.js +334 -0
- package/dist/chunk-AL2GUHAJ.cjs +18 -0
- package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
- package/dist/chunk-AUMKE74M.cjs +16 -0
- package/dist/chunk-B4NCVYEQ.cjs +292 -0
- package/dist/{chunk-WJUIXU6Y.js → chunk-CGHOH3GN.js} +28 -22
- package/dist/chunk-CMGFZHCN.js +233 -0
- package/dist/chunk-CMZ3QTFQ.js +1207 -0
- package/dist/chunk-CPA2CKRZ.cjs +125 -0
- package/dist/chunk-CYUUHFXL.js +41 -0
- package/dist/chunk-DC4RTYWK.cjs +1122 -0
- package/dist/{chunk-NF7GNGYG.js → chunk-DDWFCWOE.js} +5 -7
- package/dist/{chunk-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
- package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
- package/dist/{chunk-6AMIRXKM.cjs → chunk-F2EACDOR.cjs} +93 -87
- package/dist/chunk-F5BPGWGT.cjs +931 -0
- package/dist/chunk-FFT56TYB.cjs +401 -0
- package/dist/chunk-FYEJTF5Y.js +125 -0
- package/dist/chunk-G3GRYDMS.js +16 -0
- package/dist/chunk-G6OHIX5C.cjs +100 -0
- package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
- package/dist/chunk-GQ7JJUIT.cjs +1207 -0
- package/dist/chunk-H3PKYE4N.js +18 -0
- package/dist/{chunk-EQWD4IJE.js → chunk-H4J72PRA.js} +74 -46
- package/dist/{chunk-AGDVEUVL.js → chunk-H5R7U2D2.js} +206 -5
- package/dist/{chunk-7AM6C6XH.cjs → chunk-HETQETPV.cjs} +9641 -9678
- package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
- package/dist/chunk-II4QMH26.cjs +35 -0
- package/dist/{chunk-XWEBHS7O.cjs → chunk-IJKMILMG.cjs} +82 -54
- package/dist/chunk-ILNN6QRW.js +1612 -0
- package/dist/{chunk-6GLQLTJI.js → chunk-IU4IO3CG.js} +35 -27
- package/dist/chunk-IYVFSLWJ.js +931 -0
- package/dist/{chunk-EX6GGCAC.cjs → chunk-J7YIQJPS.cjs} +15 -15
- package/dist/chunk-JHQ334WS.js +655 -0
- package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
- package/dist/{chunk-PRX7HVLE.cjs → chunk-JVCAK4W3.cjs} +210 -9
- package/dist/chunk-KBJJQFYU.js +1122 -0
- package/dist/chunk-KEKCQENI.js +48 -0
- package/dist/{chunk-P6G3JZNC.cjs → chunk-KGAFUXGZ.cjs} +57 -148
- package/dist/chunk-KHXZFLIN.cjs +41 -0
- package/dist/{chunk-C4HRRB3V.cjs → chunk-KMB7JHGG.cjs} +23 -17
- package/dist/{chunk-K4PTDK34.js → chunk-KPUHSVJU.js} +322 -428
- package/dist/chunk-KT3U3ZRP.cjs +1137 -0
- package/dist/chunk-L2VUINHN.js +35 -0
- package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
- package/dist/chunk-NPAQSMRY.js +2087 -0
- package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
- package/dist/{chunk-FYOKS5RI.cjs → chunk-OQKRXLTZ.cjs} +4719 -6351
- package/dist/chunk-P3JMAMHP.js +401 -0
- package/dist/{chunk-62KNLDXK.js → chunk-P6QCJXLD.js} +3 -3
- package/dist/chunk-PPXR22YC.cjs +2087 -0
- package/dist/chunk-PSVSEN4J.cjs +655 -0
- package/dist/{chunk-CDM7OSFB.cjs → chunk-QQQ46DFT.cjs} +125 -117
- package/dist/{chunk-FEMAJES4.cjs → chunk-QU4AHNRL.cjs} +41 -39
- package/dist/{chunk-2JTGK64G.js → chunk-RBVUIOIM.js} +12 -10
- package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
- package/dist/{chunk-TKZXHVBG.js → chunk-RRYNHAEL.js} +5 -5
- package/dist/{chunk-5HB7FLCV.js → chunk-STPC2AQU.js} +8338 -9970
- package/dist/{chunk-6K7QZDA6.cjs → chunk-TC4W7QDC.cjs} +8 -8
- package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
- package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
- package/dist/chunk-WANCBTUE.js +71 -0
- package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
- package/dist/chunk-WFPCCBOM.cjs +71 -0
- package/dist/chunk-WI6FHKD7.js +158 -0
- package/dist/chunk-WMNCVLES.js +100 -0
- package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
- package/dist/chunk-WVOTC7HW.cjs +136 -0
- package/dist/chunk-XXBLN4BP.cjs +233 -0
- package/dist/{chunk-4IBPRIQH.js → chunk-YBQQNDC7.js} +1 -1
- package/dist/{chunk-QGZPZ3RL.js → chunk-YBS5QGON.js} +70 -128
- package/dist/{chunk-K6Y5NX6L.cjs → chunk-YIUSW4DB.cjs} +114 -220
- package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
- package/dist/cloud-tenants-HRJYNUJM.cjs +117 -0
- package/dist/cloud-tenants-SM7WLEGG.js +117 -0
- package/dist/components/case-studies/index.cjs +45 -29
- package/dist/components/case-studies/index.js +32 -16
- package/dist/components/chat/ask-prompts.d.ts +64 -0
- package/dist/components/chat/ask-prompts.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/case-study-card.d.ts +6 -3
- package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +27 -8
- package/dist/components/chat/index.d.ts +1 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +57 -38
- package/dist/components/chat/quick-action-chip.d.ts +7 -3
- package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +29 -13
- package/dist/components/contact/index.js +28 -12
- package/dist/components/docs/index.cjs +33 -16
- package/dist/components/docs/index.js +33 -16
- package/dist/components/docs/use-scroll-spy.d.ts +23 -1
- package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
- package/dist/components/embeds/index.cjs +29 -13
- package/dist/components/embeds/index.js +28 -12
- package/dist/components/faq/faq-section.d.ts +8 -1
- package/dist/components/faq/faq-section.d.ts.map +1 -1
- package/dist/components/faq/index.cjs +30 -14
- package/dist/components/faq/index.js +29 -13
- package/dist/components/features/approval-level.d.ts +49 -0
- package/dist/components/features/approval-level.d.ts.map +1 -0
- package/dist/components/features/array-entry-manager.d.ts +5 -1
- package/dist/components/features/array-entry-manager.d.ts.map +1 -1
- package/dist/components/features/board/board.d.ts +2 -0
- package/dist/components/features/board/board.d.ts.map +1 -1
- package/dist/components/features/board/ticket-card.d.ts.map +1 -1
- package/dist/components/features/board/touch-board.d.ts +1 -1
- package/dist/components/features/board/touch-board.d.ts.map +1 -1
- package/dist/components/features/board/types.d.ts +3 -0
- package/dist/components/features/board/types.d.ts.map +1 -1
- package/dist/components/features/board/use-board-collapse.d.ts +6 -1
- package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
- package/dist/components/features/capability-explorer.d.ts +94 -0
- package/dist/components/features/capability-explorer.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/index.d.ts +14 -0
- package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
- package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
- package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
- package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
- package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
- package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
- package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
- package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
- package/dist/components/features/devices/device-last-online.d.ts +3 -0
- package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
- package/dist/components/features/devices/device-name.d.ts +42 -0
- package/dist/components/features/devices/device-name.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
- package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
- package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
- package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
- package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
- package/dist/components/features/devices/device-status.d.ts +23 -0
- package/dist/components/features/devices/device-status.d.ts.map +1 -0
- package/dist/components/features/devices/device-statuses.d.ts +40 -0
- package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
- package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
- package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
- package/dist/components/features/devices/device-type-icon.d.ts +11 -0
- package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
- package/dist/components/features/devices/device-type-tile.d.ts +9 -0
- package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
- package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
- package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
- package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
- package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
- package/dist/components/features/devices/devices-grid.d.ts +12 -0
- package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
- package/dist/components/features/devices/devices-list.d.ts +131 -0
- package/dist/components/features/devices/devices-list.d.ts.map +1 -0
- package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
- package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
- package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
- package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
- package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
- package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
- package/dist/components/features/devices/devices-view-config.d.ts +25 -0
- package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
- package/dist/components/features/devices/index.d.ts +24 -0
- package/dist/components/features/devices/index.d.ts.map +1 -0
- package/dist/components/features/devices/types.d.ts +68 -0
- package/dist/components/features/devices/types.d.ts.map +1 -0
- package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
- package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
- package/dist/components/features/index.cjs +235 -12
- package/dist/components/features/index.d.ts +8 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +274 -51
- package/dist/components/features/knowledge-base/index.d.ts +7 -0
- package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
- package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
- package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
- package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
- package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
- package/dist/components/features/logs/index.d.ts +12 -0
- package/dist/components/features/logs/index.d.ts.map +1 -0
- package/dist/components/features/logs/log-drawer.d.ts +29 -0
- package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
- package/dist/components/features/logs/log-source-labels.d.ts +11 -0
- package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
- package/dist/components/features/logs/logs-page-view.d.ts +32 -0
- package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
- package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
- package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
- package/dist/components/features/logs/logs-table-view.d.ts +64 -0
- package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
- package/dist/components/features/logs/types.d.ts +52 -0
- package/dist/components/features/logs/types.d.ts.map +1 -0
- package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
- package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
- package/dist/components/features/policies/index.d.ts +8 -0
- package/dist/components/features/policies/index.d.ts.map +1 -0
- package/dist/components/features/policies/policies-table.d.ts +34 -0
- package/dist/components/features/policies/policies-table.d.ts.map +1 -0
- package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
- package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
- package/dist/components/features/policies/policy-table-row.d.ts +37 -0
- package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
- package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
- package/dist/components/features/remote-session/index.d.ts +8 -0
- package/dist/components/features/remote-session/index.d.ts.map +1 -1
- package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
- package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
- package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
- package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
- package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
- package/dist/components/features/software/index.d.ts +8 -0
- package/dist/components/features/software/index.d.ts.map +1 -0
- package/dist/components/features/software/package-managers.d.ts +30 -0
- package/dist/components/features/software/package-managers.d.ts.map +1 -0
- package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
- package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
- package/dist/components/features/software/schedule-fields.d.ts +34 -0
- package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
- package/dist/components/features/software/software-action-copy.d.ts +25 -0
- package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
- package/dist/components/features/software/software-action-form.d.ts +71 -0
- package/dist/components/features/software/software-action-form.d.ts.map +1 -0
- package/dist/components/features/software/software-row-fields.d.ts +23 -0
- package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
- package/dist/components/features/software/software-row.d.ts +18 -0
- package/dist/components/features/software/software-row.d.ts.map +1 -0
- package/dist/components/features/sortable-list/index.d.ts +1 -0
- package/dist/components/features/sortable-list/index.d.ts.map +1 -1
- package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
- package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.cjs +133 -114
- package/dist/components/help-center-pages/index.js +58 -39
- package/dist/components/index.cjs +328 -82
- package/dist/components/index.js +459 -213
- package/dist/components/layout/page-heading.d.ts +12 -3
- package/dist/components/layout/page-heading.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +120 -98
- package/dist/components/meeting-scheduler/index.js +50 -28
- package/dist/components/navigation/index.cjs +36 -17
- package/dist/components/navigation/index.d.ts +3 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +36 -17
- package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
- package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
- package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
- package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +32 -16
- package/dist/components/onboarding-guides/index.js +31 -15
- package/dist/components/product-demo/cast.d.ts +58 -0
- package/dist/components/product-demo/cast.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
- package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
- package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
- package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
- package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
- package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
- package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
- package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
- package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
- package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
- package/dist/components/product-demo/index.cjs +112 -0
- package/dist/components/product-demo/index.d.ts +6 -0
- package/dist/components/product-demo/index.d.ts.map +1 -0
- package/dist/components/product-demo/index.js +112 -0
- package/dist/components/product-demo/product-screen.d.ts +22 -0
- package/dist/components/product-demo/product-screen.d.ts.map +1 -0
- package/dist/components/product-demo/registry.d.ts +13 -0
- package/dist/components/product-demo/registry.d.ts.map +1 -0
- package/dist/components/product-demo/screen-keys.cjs +25 -0
- package/dist/components/product-demo/screen-keys.d.ts +27 -0
- package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
- package/dist/components/product-demo/screen-keys.js +20 -0
- package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
- package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
- package/dist/components/product-demo/screens/devices.d.ts +10 -0
- package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
- package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
- package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
- package/dist/components/product-demo/screens/logs.d.ts +4 -0
- package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
- package/dist/components/product-demo/screens/policies.d.ts +8 -0
- package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
- package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
- package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
- package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
- package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
- package/dist/components/product-demo/screens/software-update.d.ts +12 -0
- package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
- package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
- package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
- package/dist/components/product-demo/types.d.ts +9 -0
- package/dist/components/product-demo/types.d.ts.map +1 -0
- package/dist/components/related-content/index.cjs +14 -8
- package/dist/components/related-content/index.js +13 -7
- package/dist/components/tickets/index.cjs +36 -20
- package/dist/components/tickets/index.js +35 -19
- package/dist/components/ui/file-manager/index.cjs +38 -34
- package/dist/components/ui/file-manager/index.js +8 -4
- package/dist/components/ui/index.cjs +57 -17
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +141 -101
- package/dist/components/ui/product-screen-frame.d.ts +45 -0
- package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -1
- package/dist/components/ui/snap-carousel.d.ts +11 -1
- package/dist/components/ui/snap-carousel.d.ts.map +1 -1
- package/dist/components/ui/tag.d.ts +1 -1
- package/dist/components/ui/tag.d.ts.map +1 -1
- package/dist/devices-6XKQTQM5.cjs +81 -0
- package/dist/devices-LXSFGGEZ.js +81 -0
- package/dist/hooks/index.cjs +17 -8
- package/dist/hooks/index.js +32 -23
- package/dist/hooks/ui/index.d.ts +1 -0
- package/dist/hooks/ui/index.d.ts.map +1 -1
- package/dist/hooks/ui/use-header-height.d.ts +12 -0
- package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
- package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
- package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
- package/dist/hooks/use-location-hash.d.ts +2 -2
- package/dist/hooks/use-location-hash.d.ts.map +1 -1
- package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
- package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
- package/dist/index.cjs +284 -25
- package/dist/index.js +737 -478
- package/dist/knowledge-7PDZLXPO.cjs +108 -0
- package/dist/knowledge-Q4SPFOTN.js +108 -0
- package/dist/logs-SZ4VB4FE.js +216 -0
- package/dist/logs-TO3NELGJ.cjs +216 -0
- package/dist/policies-533GQVFM.cjs +121 -0
- package/dist/policies-LB7VW2UB.js +121 -0
- package/dist/remote-session-GSGZOFDX.js +196 -0
- package/dist/remote-session-R6VAFESR.cjs +196 -0
- package/dist/software-update-DT2XSG7M.cjs +179 -0
- package/dist/software-update-ENZNVGKP.js +179 -0
- package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
- package/dist/tickets-board-PYDNELSK.js +137 -0
- package/dist/types/case-study.d.ts +15 -1
- package/dist/types/case-study.d.ts.map +1 -1
- package/dist/utils/date-utils.d.ts +5 -0
- package/dist/utils/date-utils.d.ts.map +1 -1
- package/dist/utils/index.cjs +45 -2
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +41 -3
- package/dist/utils/open-in-new-tab.d.ts +7 -0
- package/dist/utils/open-in-new-tab.d.ts.map +1 -0
- package/dist/utils/same-page-hash-nav.d.ts +31 -0
- package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
- package/dist/utils/scroll-into-view.d.ts +14 -1
- package/dist/utils/scroll-into-view.d.ts.map +1 -1
- package/package.json +13 -1
- package/src/components/chat/ask-prompts.tsx +226 -0
- package/src/components/chat/embeddable-chat.tsx +36 -2
- package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
- package/src/components/chat/index.ts +1 -0
- package/src/components/chat/quick-action-chip.tsx +33 -9
- package/src/components/docs/use-scroll-spy.ts +93 -18
- package/src/components/faq/faq-section.tsx +82 -43
- package/src/components/features/approval-level.tsx +149 -0
- package/src/components/features/array-entry-manager.tsx +10 -1
- package/src/components/features/board/board.tsx +4 -1
- package/src/components/features/board/ticket-card.tsx +11 -1
- package/src/components/features/board/touch-board.tsx +2 -1
- package/src/components/features/board/types.ts +3 -0
- package/src/components/features/board/use-board-collapse.ts +7 -2
- package/src/components/features/capability-explorer.tsx +412 -0
- package/src/components/features/cloud-tenants/index.ts +28 -0
- package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
- package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
- package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
- package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
- package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
- package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
- package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
- package/src/components/features/devices/device-last-online.ts +6 -0
- package/src/components/features/devices/device-name.ts +51 -0
- package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
- package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
- package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
- package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
- package/src/components/features/devices/device-selector/narrowing.ts +33 -0
- package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
- package/src/components/features/devices/device-status.ts +102 -0
- package/src/components/features/devices/device-statuses.ts +88 -0
- package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
- package/src/components/features/devices/device-type-icon.tsx +29 -0
- package/src/components/features/devices/device-type-tile.tsx +17 -0
- package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
- package/src/components/features/devices/devices-grid-filters.tsx +99 -0
- package/src/components/features/devices/devices-grid.tsx +86 -0
- package/src/components/features/devices/devices-list.tsx +357 -0
- package/src/components/features/devices/devices-panel-header.tsx +97 -0
- package/src/components/features/devices/devices-panel-view.tsx +261 -0
- package/src/components/features/devices/devices-table-columns.tsx +356 -0
- package/src/components/features/devices/devices-view-config.tsx +38 -0
- package/src/components/features/devices/index.ts +89 -0
- package/src/components/features/devices/types.ts +74 -0
- package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
- package/src/components/features/index.ts +10 -0
- package/src/components/features/knowledge-base/index.ts +19 -0
- package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
- package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
- package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
- package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
- package/src/components/features/logs/index.ts +20 -0
- package/src/components/features/logs/log-drawer.tsx +138 -0
- package/src/components/features/logs/log-source-labels.ts +25 -0
- package/src/components/features/logs/logs-page-view.tsx +100 -0
- package/src/components/features/logs/logs-table-columns.ts +16 -0
- package/src/components/features/logs/logs-table-view.tsx +509 -0
- package/src/components/features/logs/types.ts +71 -0
- package/src/components/features/policies/compute-policy-summary.ts +115 -0
- package/src/components/features/policies/index.ts +14 -0
- package/src/components/features/policies/policies-table.tsx +235 -0
- package/src/components/features/policies/policy-summary-cards.tsx +69 -0
- package/src/components/features/policies/policy-table-row.ts +37 -0
- package/src/components/features/policy-configuration-panel.tsx +3 -12
- package/src/components/features/remote-session/index.ts +8 -0
- package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
- package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
- package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
- package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
- package/src/components/features/software/index.ts +39 -0
- package/src/components/features/software/package-managers.ts +54 -0
- package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
- package/src/components/features/software/schedule-fields.tsx +105 -0
- package/src/components/features/software/software-action-copy.ts +70 -0
- package/src/components/features/software/software-action-form.tsx +199 -0
- package/src/components/features/software/software-row-fields.tsx +105 -0
- package/src/components/features/software/software-row.ts +22 -0
- package/src/components/features/sortable-list/index.ts +1 -0
- package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
- package/src/components/layout/page-heading.tsx +23 -6
- package/src/components/navigation/index.ts +5 -0
- package/src/components/navigation/mingo-ai-button.tsx +37 -13
- package/src/components/navigation/sticky-section-nav.tsx +99 -1
- package/src/components/product-demo/cast.tsx +78 -0
- package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
- package/src/components/product-demo/fixtures/devices.ts +87 -0
- package/src/components/product-demo/fixtures/knowledge.ts +48 -0
- package/src/components/product-demo/fixtures/logs.ts +103 -0
- package/src/components/product-demo/fixtures/policies.ts +77 -0
- package/src/components/product-demo/fixtures/remote-session.ts +65 -0
- package/src/components/product-demo/fixtures/shared.ts +53 -0
- package/src/components/product-demo/fixtures/software-update.ts +63 -0
- package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
- package/src/components/product-demo/index.ts +7 -0
- package/src/components/product-demo/product-screen.tsx +94 -0
- package/src/components/product-demo/registry.ts +20 -0
- package/src/components/product-demo/screen-keys.ts +31 -0
- package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
- package/src/components/product-demo/screens/devices.tsx +41 -0
- package/src/components/product-demo/screens/knowledge.tsx +27 -0
- package/src/components/product-demo/screens/logs.tsx +113 -0
- package/src/components/product-demo/screens/policies.tsx +29 -0
- package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
- package/src/components/product-demo/screens/remote-session.tsx +46 -0
- package/src/components/product-demo/screens/software-update.tsx +97 -0
- package/src/components/product-demo/screens/tickets-board.tsx +28 -0
- package/src/components/product-demo/types.ts +10 -0
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/product-screen-frame.tsx +136 -0
- package/src/components/ui/radio-group.tsx +16 -4
- package/src/components/ui/snap-carousel.tsx +26 -1
- package/src/components/ui/tag.tsx +5 -0
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/use-header-height.ts +51 -2
- package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
- package/src/hooks/use-location-hash.ts +9 -5
- package/src/hooks/use-scroll-to-hash.ts +9 -1
- package/src/types/case-study.ts +21 -1
- package/src/utils/date-utils.ts +8 -1
- package/src/utils/index.ts +5 -0
- package/src/utils/open-in-new-tab.ts +12 -0
- package/src/utils/same-page-hash-nav.ts +57 -0
- package/src/utils/scroll-into-view.ts +21 -5
- package/dist/chunk-BM5MVGH3.cjs +0 -499
- package/dist/chunk-CUME3VTQ.js +0 -144
- package/dist/chunk-CZ7Y7UG4.js +0 -732
- package/dist/chunk-FLKJYMVB.js +0 -499
- package/dist/chunk-OF6GEI5A.cjs +0 -144
- package/dist/chunk-UVTD52MD.cjs +0 -732
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Layout of one column of the tenants list: what the live table and a skeleton of it both read. */
|
|
2
|
+
export interface TenantsTableColumn {
|
|
3
|
+
id: string;
|
|
4
|
+
header?: string;
|
|
5
|
+
/** The column's `meta.width` class. */
|
|
6
|
+
width: string;
|
|
7
|
+
hideAt?: 'md' | 'lg' | 'xl' | '2xl';
|
|
8
|
+
align?: 'right';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Column layout of the tenants list (Figma 1699-8249: Tenant, Customers,
|
|
13
|
+
* Access, open). Data-only on purpose: the live table and the route skeleton
|
|
14
|
+
* read the SAME widths, so nothing shifts when the rows arrive, and a skeleton
|
|
15
|
+
* never imports the table's cell renderers.
|
|
16
|
+
*/
|
|
17
|
+
export const TENANT_COLUMNS = {
|
|
18
|
+
tenant: { id: 'tenant', header: 'Tenant', width: 'flex-1 min-w-0' },
|
|
19
|
+
customer: { id: 'customer', header: 'Customers', width: 'w-[220px] content-lg:w-[340px]', hideAt: 'md' },
|
|
20
|
+
access: { id: 'access', header: 'Access', width: 'w-[200px] content-lg:w-[216px]' },
|
|
21
|
+
open: { id: 'open', width: 'w-12 shrink-0 flex-none', hideAt: 'md', align: 'right' },
|
|
22
|
+
} satisfies Record<string, TenantsTableColumn>;
|
|
23
|
+
|
|
24
|
+
/** Render order of the standalone list. */
|
|
25
|
+
export const TENANTS_TABLE_COLUMNS: readonly TenantsTableColumn[] = [
|
|
26
|
+
TENANT_COLUMNS.tenant,
|
|
27
|
+
TENANT_COLUMNS.customer,
|
|
28
|
+
TENANT_COLUMNS.access,
|
|
29
|
+
TENANT_COLUMNS.open,
|
|
30
|
+
];
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { cn } from '../../../utils/cn';
|
|
5
|
+
import { openInNewTab } from '../../../utils/open-in-new-tab';
|
|
6
|
+
import { ArrowRightUpIcon } from '../../icons-v2-generated/arrows/arrow-right-up-icon';
|
|
7
|
+
import { Button } from '../../ui/button';
|
|
8
|
+
import { type ColumnDef, DataTable, type Row, useDataTable } from '../../ui/data-table';
|
|
9
|
+
import { TenantAccessCell } from './tenant-access-cell';
|
|
10
|
+
import { TenantCell } from './tenant-cell';
|
|
11
|
+
import { TenantCustomerCell } from './tenant-customer-cell';
|
|
12
|
+
import type { TenantRow } from './tenant-row';
|
|
13
|
+
import { TENANT_COLUMNS, type TenantsTableColumn } from './tenants-table-columns';
|
|
14
|
+
|
|
15
|
+
const getRowId = (row: TenantRow) => row.id;
|
|
16
|
+
|
|
17
|
+
const columnMeta = ({ width, hideAt, align }: TenantsTableColumn) => ({ width, hideAt, align });
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Click handler that opens `href` in a new tab. The row is itself the details
|
|
21
|
+
* link and an `<a>` cannot be nested in an `<a>`, so the button opens it by script.
|
|
22
|
+
*/
|
|
23
|
+
export interface TenantsTableViewProps {
|
|
24
|
+
rows: TenantRow[];
|
|
25
|
+
/** Where a row leads: the row is a link to it, and its last cell opens it in a new tab. */
|
|
26
|
+
getHref: (row: TenantRow) => string;
|
|
27
|
+
/** The search the rows answer; named by the "no match" message. */
|
|
28
|
+
search?: string;
|
|
29
|
+
/** The rows on screen are the previous result of a search still loading: they dim. */
|
|
30
|
+
isPending?: boolean;
|
|
31
|
+
/** All matching tenants, loaded or not. Default: the rows given. */
|
|
32
|
+
totalCount?: number;
|
|
33
|
+
stickyHeaderOffset?: string;
|
|
34
|
+
skeletonRows?: number;
|
|
35
|
+
hasNextPage?: boolean;
|
|
36
|
+
isFetchingNextPage?: boolean;
|
|
37
|
+
onLoadMore?: () => void;
|
|
38
|
+
/** The clock "Last read" is relative to. Default: the moment of the render. */
|
|
39
|
+
now?: Date;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The tenants list: tenant, customer, access state and a way into each tenant's details. */
|
|
43
|
+
export function TenantsTableView({
|
|
44
|
+
rows,
|
|
45
|
+
getHref,
|
|
46
|
+
search = '',
|
|
47
|
+
isPending = false,
|
|
48
|
+
totalCount,
|
|
49
|
+
stickyHeaderOffset,
|
|
50
|
+
skeletonRows = 20,
|
|
51
|
+
hasNextPage = false,
|
|
52
|
+
isFetchingNextPage = false,
|
|
53
|
+
onLoadMore,
|
|
54
|
+
now,
|
|
55
|
+
}: TenantsTableViewProps) {
|
|
56
|
+
const columns = useMemo<ColumnDef<TenantRow>[]>(
|
|
57
|
+
() => [
|
|
58
|
+
{
|
|
59
|
+
id: TENANT_COLUMNS.tenant.id,
|
|
60
|
+
header: TENANT_COLUMNS.tenant.header,
|
|
61
|
+
cell: ({ row }: { row: Row<TenantRow> }) => (
|
|
62
|
+
<TenantCell provider={row.original.provider} name={row.original.name} domain={row.original.domain} />
|
|
63
|
+
),
|
|
64
|
+
enableSorting: false,
|
|
65
|
+
meta: columnMeta(TENANT_COLUMNS.tenant),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: TENANT_COLUMNS.customer.id,
|
|
69
|
+
header: TENANT_COLUMNS.customer.header,
|
|
70
|
+
cell: ({ row }: { row: Row<TenantRow> }) => (
|
|
71
|
+
<TenantCustomerCell
|
|
72
|
+
name={row.original.customer.name}
|
|
73
|
+
imageUrl={row.original.customer.imageUrl}
|
|
74
|
+
userCount={row.original.userCount}
|
|
75
|
+
/>
|
|
76
|
+
),
|
|
77
|
+
enableSorting: false,
|
|
78
|
+
meta: columnMeta(TENANT_COLUMNS.customer),
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: TENANT_COLUMNS.access.id,
|
|
82
|
+
header: TENANT_COLUMNS.access.header,
|
|
83
|
+
cell: ({ row }: { row: Row<TenantRow> }) => (
|
|
84
|
+
<TenantAccessCell accessState={row.original.accessState} lastReadAt={row.original.lastReadAt} now={now} />
|
|
85
|
+
),
|
|
86
|
+
enableSorting: false,
|
|
87
|
+
meta: columnMeta(TENANT_COLUMNS.access),
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: TENANT_COLUMNS.open.id,
|
|
91
|
+
cell: ({ row }: { row: Row<TenantRow> }) => (
|
|
92
|
+
// The row itself is the details link; a nested `<a>` is invalid, so this opens the same href.
|
|
93
|
+
<div data-no-row-click className="pointer-events-auto flex items-center justify-end">
|
|
94
|
+
<Button
|
|
95
|
+
onClick={openInNewTab(getHref(row.original))}
|
|
96
|
+
variant="outline"
|
|
97
|
+
size="icon"
|
|
98
|
+
leftIcon={<ArrowRightUpIcon className="h-5 w-5" />}
|
|
99
|
+
aria-label={`Open ${row.original.name} in new tab`}
|
|
100
|
+
className="bg-ods-card"
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
103
|
+
),
|
|
104
|
+
enableSorting: false,
|
|
105
|
+
meta: columnMeta(TENANT_COLUMNS.open),
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
[getHref, now],
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const table = useDataTable<TenantRow>({ data: rows, columns, getRowId, enableSorting: false });
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
// Dim, don't unmount, the stale rows while a deferred search refetches.
|
|
115
|
+
<div className={cn('transition-opacity duration-200', isPending && 'opacity-60')}>
|
|
116
|
+
<DataTable table={table}>
|
|
117
|
+
<DataTable.Header
|
|
118
|
+
stickyHeader={stickyHeaderOffset !== undefined}
|
|
119
|
+
stickyHeaderOffset={stickyHeaderOffset}
|
|
120
|
+
rightSlot={<DataTable.RowCount itemName="result" totalCount={totalCount ?? rows.length} />}
|
|
121
|
+
/>
|
|
122
|
+
<DataTable.Body
|
|
123
|
+
skeletonRows={skeletonRows}
|
|
124
|
+
emptyState={{
|
|
125
|
+
title: 'No tenants match',
|
|
126
|
+
description: `Nothing matches "${search}". Try a different name, domain or customer.`,
|
|
127
|
+
}}
|
|
128
|
+
rowClassName="mb-[var(--spacing-system-xxs)]"
|
|
129
|
+
rowHref={getHref}
|
|
130
|
+
/>
|
|
131
|
+
{rows.length > 0 && onLoadMore && (
|
|
132
|
+
<DataTable.InfiniteFooter
|
|
133
|
+
hasNextPage={hasNextPage}
|
|
134
|
+
isFetchingNextPage={isFetchingNextPage}
|
|
135
|
+
onLoadMore={onLoadMore}
|
|
136
|
+
skeletonRows={2}
|
|
137
|
+
/>
|
|
138
|
+
)}
|
|
139
|
+
</DataTable>
|
|
140
|
+
</div>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { formatRelativeTime } from '../../../utils/date-utils';
|
|
2
|
+
|
|
3
|
+
/** "Last Online: 5m ago": the line under a device's name wherever a row names a device; "Last Online: , " when never seen. */
|
|
4
|
+
export function formatLastOnline(lastSeen: string | Date | null | undefined): string {
|
|
5
|
+
return `Last Online: ${lastSeen ? formatRelativeTime(lastSeen) : '—'}`;
|
|
6
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The name fields a device source hands to `getDeviceName`.
|
|
3
|
+
*
|
|
4
|
+
* `nickname` is a required key on purpose. The two agent-reported names were
|
|
5
|
+
* selected by every device operation long before the user-defined one existed,
|
|
6
|
+
* so the field an operation forgets is `nickname`, and with an optional key
|
|
7
|
+
* that operation would compile and quietly render the hostname. That is the
|
|
8
|
+
* silent-fallback trap the fragment ladder in `src/graphql/devices/` was built
|
|
9
|
+
* to close, so the sink closes it too: a source may say its nickname is null or
|
|
10
|
+
* undefined, but it has to say so.
|
|
11
|
+
*/
|
|
12
|
+
export interface DeviceNameSource {
|
|
13
|
+
nickname: string | null | undefined;
|
|
14
|
+
displayName?: string | null;
|
|
15
|
+
hostname?: string | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Single source of truth for a device's display name.
|
|
20
|
+
*
|
|
21
|
+
* The name comes from GraphQL only: the user-defined `nickname` when set,
|
|
22
|
+
* then `displayName`, then `hostname`. Nothing else stands in for a registry
|
|
23
|
+
* device's name (description, machineId, deviceId, Fleet display_name, …) ,
|
|
24
|
+
* those diverge across screens. A caller that renders something which is not
|
|
25
|
+
* a registry device (a Fleet host with no device record, a log row whose device
|
|
26
|
+
* is gone) appends its own identifier after the empty string it gets back.
|
|
27
|
+
*/
|
|
28
|
+
export function getDeviceName(device?: DeviceNameSource | null): string {
|
|
29
|
+
return device?.nickname || device?.displayName || device?.hostname || '';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Whether a client-side device list finds `device` by `search`: through the
|
|
34
|
+
* name it renders under, or through its hostname.
|
|
35
|
+
*
|
|
36
|
+
* Hostname stays a match even when a nickname is set, on purpose. The server's
|
|
37
|
+
* `devices(search:)` matches hostname regardless of nickname (alongside ip,
|
|
38
|
+
* serial, manufacturer, model), and a list that filters what it already
|
|
39
|
+
* loaded must not be stricter than the page it stands in for, a device an
|
|
40
|
+
* admin knows by hostname from Fleet or MeshCentral stays findable after
|
|
41
|
+
* someone gives it a nickname.
|
|
42
|
+
*
|
|
43
|
+
* Case-insensitive substring, like the server. Blank search matches everything.
|
|
44
|
+
*/
|
|
45
|
+
export function matchesDeviceName(device?: DeviceNameSource | null, search = ''): boolean {
|
|
46
|
+
const needle = search.trim().toLowerCase();
|
|
47
|
+
if (!needle) return true;
|
|
48
|
+
return (
|
|
49
|
+
getDeviceName(device).toLowerCase().includes(needle) || (device?.hostname ?? '').toLowerCase().includes(needle)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { RadioGroupBlock, type RadioGroupBlockOption, Tag } from '../../../ui';
|
|
4
|
+
import { useDevicesViewConfig } from '../devices-view-config';
|
|
5
|
+
import type { DeviceSelectionMode } from './device-selector.types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The two assignment modes (design 460:71430).
|
|
9
|
+
*
|
|
10
|
+
* The copy stays generic ("this selection") rather than the design's "this
|
|
11
|
+
* script schedule": this block also renders on the monitoring query and policy
|
|
12
|
+
* pages, where naming a schedule would simply be wrong.
|
|
13
|
+
*/
|
|
14
|
+
const SPECIFIC_MODE_OPTION: RadioGroupBlockOption = {
|
|
15
|
+
value: 'specific',
|
|
16
|
+
label: 'Select Specific Devices',
|
|
17
|
+
description: 'Choose individual devices to include in this selection',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const CRITERIA_MODE_DESCRIPTION =
|
|
21
|
+
'Automatically include all devices (current and future) that match your defined criteria';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* "By criteria" is only offered where a consumer can actually store a rule ,
|
|
25
|
+
* i.e. where `value` / `onChange` are wired up. Everywhere else it keeps the
|
|
26
|
+
* design's "Coming Soon" treatment: a tag rather than a dimmed row is how the
|
|
27
|
+
* design says so, and `disabled` is what keeps it unselectable and out of the
|
|
28
|
+
* tab order. In the mobile shell that row is dropped entirely, which leaves
|
|
29
|
+
* this list with a single option and the block renders nothing at all.
|
|
30
|
+
*/
|
|
31
|
+
const SELECTION_MODE_OPTIONS: RadioGroupBlockOption[] = [
|
|
32
|
+
SPECIFIC_MODE_OPTION,
|
|
33
|
+
{
|
|
34
|
+
value: 'criteria',
|
|
35
|
+
label: 'Select Devices by Criteria',
|
|
36
|
+
description: CRITERIA_MODE_DESCRIPTION,
|
|
37
|
+
disabled: true,
|
|
38
|
+
trailing: <Tag label="Coming Soon" variant="grey" />,
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
const SELECTION_MODE_OPTIONS_ENABLED: RadioGroupBlockOption[] = [
|
|
43
|
+
SPECIFIC_MODE_OPTION,
|
|
44
|
+
{
|
|
45
|
+
value: 'criteria',
|
|
46
|
+
label: 'Select Devices by Criteria',
|
|
47
|
+
description: CRITERIA_MODE_DESCRIPTION,
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
export interface DeviceSelectionModeRadioProps {
|
|
52
|
+
/**
|
|
53
|
+
* The chosen mode. `''` is a real value here: the block with NOTHING marked,
|
|
54
|
+
* for a page whose stored mode has not arrived yet, marking one would be a
|
|
55
|
+
* guess at the answer being loaded. Omit the prop entirely for the
|
|
56
|
+
* uncontrolled, criteria-disabled block.
|
|
57
|
+
*/
|
|
58
|
+
value?: DeviceSelectionMode | '';
|
|
59
|
+
onChange?: (mode: DeviceSelectionMode) => void;
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The mode block above a device picker.
|
|
65
|
+
*
|
|
66
|
+
* Its own component, and not just markup inside `DeviceSelector`, because a
|
|
67
|
+
* page whose two modes are separate data islands has to keep it OUTSIDE the
|
|
68
|
+
* subtree that swaps: mounted inside, the radio unmounts and remounts with the
|
|
69
|
+
* content, restarting its own transitions, the switch you just clicked blinks.
|
|
70
|
+
* Such a page renders this directly and passes `showSelectionModeRadio={false}`.
|
|
71
|
+
*
|
|
72
|
+
* Renders nothing when fewer than two modes survive, which is the mobile
|
|
73
|
+
* shell's uncontrolled case, where the only other mode is "Coming Soon".
|
|
74
|
+
*/
|
|
75
|
+
export function DeviceSelectionModeRadio({ value, onChange, disabled }: DeviceSelectionModeRadioProps) {
|
|
76
|
+
// Controlled whenever the consumer PASSES a value, including `''`, which is a
|
|
77
|
+
// consumer that owns the answer but is still waiting for it. Only an omitted
|
|
78
|
+
// prop means "decorative", which is what keeps the old criteria-disabled
|
|
79
|
+
// block for the pages that cannot store a rule.
|
|
80
|
+
const isControlled = value !== undefined;
|
|
81
|
+
const { isMobileShell: isMobile = false } = useDevicesViewConfig();
|
|
82
|
+
|
|
83
|
+
const allOptions = isControlled ? SELECTION_MODE_OPTIONS_ENABLED : SELECTION_MODE_OPTIONS;
|
|
84
|
+
// A disabled option is one nobody can pick, on a phone it is a row of screen
|
|
85
|
+
// spent announcing a feature. Dropping it costs nothing there, and it leaves
|
|
86
|
+
// the controlled block (where criteria IS selectable) untouched.
|
|
87
|
+
const options = isMobile ? allOptions.filter(option => !option.disabled) : allOptions;
|
|
88
|
+
|
|
89
|
+
// One option is not a choice. The mode that survived is what the picker below
|
|
90
|
+
// already does, so the group would only be asking a question with a single
|
|
91
|
+
// answer.
|
|
92
|
+
if (options.length < 2) return null;
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<RadioGroupBlock
|
|
96
|
+
name="selectionMode"
|
|
97
|
+
variant="grouped"
|
|
98
|
+
{...(isControlled ? { value, onValueChange: onChange } : { defaultValue: 'specific' })}
|
|
99
|
+
disabled={disabled}
|
|
100
|
+
options={options}
|
|
101
|
+
// Design 460:71430 rows are 68px, a 24px title over a 20px description
|
|
102
|
+
// with 12px above and below. The grouped variant pads `py-xs` (8px on
|
|
103
|
+
// desktop) by default, which would come out 8px short.
|
|
104
|
+
itemClassName="py-[var(--spacing-system-sf)]"
|
|
105
|
+
/>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { DeviceSelector } from './device-selector';
|
|
4
|
+
import type { DeviceSelectorProps } from './device-selector.types';
|
|
5
|
+
|
|
6
|
+
const NO_DEVICES: never[] = [];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The props that decide the picker's SHAPE. They are forwarded, not hardcoded:
|
|
10
|
+
* whichever the caller hands its real `DeviceSelector` it must hand this one too,
|
|
11
|
+
* or the two disagree on how tall the block is.
|
|
12
|
+
*/
|
|
13
|
+
type DeviceSelectorSkeletonProps = Pick<DeviceSelectorProps, 'showSelectionModeRadio' | 'singleSelect' | 'hideColumns'>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Suspense fallback for a `DeviceSelector` whose devices come from a suspending
|
|
17
|
+
* Relay query.
|
|
18
|
+
*
|
|
19
|
+
* Renders the REAL selector in `loading` mode rather than an approximation, so
|
|
20
|
+
* the column set, row height and empty frame come from the actual component and
|
|
21
|
+
* can't drift from what replaces it. Same approach as `DevicesPanelSkeleton`.
|
|
22
|
+
*
|
|
23
|
+
* Locked with `disabled`, the same rule `SchedulePickerSkeleton` states, and for
|
|
24
|
+
* the same reason: `disabled` blocks every interaction and leaves the picker's
|
|
25
|
+
* SHAPE alone. A lock that also hid the selection-mode radio and the Available /
|
|
26
|
+
* Selected tab strip left this fallback two blocks shorter than the picker it
|
|
27
|
+
* stands in for, and everything below it jumped down the moment the devices
|
|
28
|
+
* landed.
|
|
29
|
+
*/
|
|
30
|
+
export function DeviceSelectorSkeleton(props: DeviceSelectorSkeletonProps) {
|
|
31
|
+
return <DeviceSelector {...props} devices={NO_DEVICES} loading disabled />;
|
|
32
|
+
}
|