@flamingo-stack/openframe-frontend-core 0.0.711 → 0.0.712
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-3K5ZLZE7.js +292 -0
- package/dist/chunk-3LU4UFPS.cjs +14 -0
- package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
- package/dist/{chunk-6GLQLTJI.js → chunk-3SEEGNRE.js} +35 -27
- package/dist/{chunk-FEMAJES4.cjs → chunk-3UAJLO5U.cjs} +41 -39
- 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-2JTGK64G.js → chunk-4UYKNOZG.js} +12 -10
- package/dist/{chunk-TKZXHVBG.js → chunk-5SDELRH3.js} +5 -5
- package/dist/{chunk-Q6B35Y7O.js → chunk-5Y72YQEK.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-WJUIXU6Y.js → chunk-7HNYYNKE.js} +28 -22
- package/dist/{chunk-P6G3JZNC.cjs → chunk-7NSU5EQD.cjs} +57 -148
- 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-XWEBHS7O.cjs → chunk-BXSRTBLU.cjs} +82 -54
- package/dist/chunk-CMGFZHCN.js +233 -0
- package/dist/chunk-CMZ3QTFQ.js +1207 -0
- package/dist/chunk-CPA2CKRZ.cjs +125 -0
- package/dist/{chunk-G47AP6LX.cjs → chunk-CSCJU6YC.cjs} +35 -33
- 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-K4PTDK34.js → chunk-EFNKS5W4.js} +322 -428
- package/dist/{chunk-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
- package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
- package/dist/chunk-F5BPGWGT.cjs +931 -0
- package/dist/{chunk-5HB7FLCV.js → chunk-FCAVAEHF.js} +8277 -9990
- package/dist/chunk-FFT56TYB.cjs +401 -0
- package/dist/chunk-FYEJTF5Y.js +125 -0
- package/dist/chunk-G3GRYDMS.js +16 -0
- package/dist/{chunk-VWFZRMQR.js → chunk-G3OMVCID.js} +13 -7
- 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-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-ILNN6QRW.js +1612 -0
- package/dist/chunk-IYVFSLWJ.js +931 -0
- package/dist/{chunk-C4HRRB3V.cjs → chunk-JGCFRTND.cjs} +23 -17
- 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-KHXZFLIN.cjs +41 -0
- package/dist/chunk-KT3U3ZRP.cjs +1137 -0
- package/dist/chunk-L2VUINHN.js +35 -0
- package/dist/{chunk-FYOKS5RI.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
- package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
- package/dist/{chunk-VMMHJFHG.js → chunk-N67XG5GY.js} +10 -8
- package/dist/chunk-NPAQSMRY.js +2087 -0
- package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
- package/dist/{chunk-6K7QZDA6.cjs → chunk-OBZJICEA.cjs} +8 -8
- package/dist/{chunk-62KNLDXK.js → chunk-OPYODNV2.js} +3 -3
- package/dist/chunk-P3JMAMHP.js +401 -0
- package/dist/chunk-PPXR22YC.cjs +2087 -0
- package/dist/chunk-PSVSEN4J.cjs +655 -0
- package/dist/{chunk-EQWD4IJE.js → chunk-RBYVFPER.js} +74 -46
- package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
- package/dist/{chunk-K6Y5NX6L.cjs → chunk-T3CLXR43.cjs} +114 -220
- package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
- package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
- package/dist/{chunk-EX6GGCAC.cjs → chunk-UT3ODMBU.cjs} +15 -15
- 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-6AMIRXKM.cjs → chunk-WWJG4GVG.cjs} +93 -87
- 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-CDM7OSFB.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
- package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
- package/dist/cloud-tenants-KZUZGD4A.cjs +117 -0
- package/dist/cloud-tenants-OGLVVQ7X.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/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 +227 -12
- package/dist/components/features/index.d.ts +7 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +266 -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/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 +320 -82
- package/dist/components/index.js +451 -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-LBMG42K6.js +81 -0
- package/dist/devices-YGYJIXQY.cjs +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 +276 -25
- package/dist/index.js +729 -478
- package/dist/knowledge-H5BIWJVI.js +108 -0
- package/dist/knowledge-KTCVJIWN.cjs +108 -0
- package/dist/logs-DB5Z7M5Q.js +216 -0
- package/dist/logs-RVCC2UQW.cjs +216 -0
- package/dist/policies-EWUULFBR.js +121 -0
- package/dist/policies-HV4IQCBV.cjs +121 -0
- package/dist/remote-session-GSGZOFDX.js +196 -0
- package/dist/remote-session-R6VAFESR.cjs +196 -0
- package/dist/software-update-6PXKRKBT.js +179 -0
- package/dist/software-update-D4OVSWSG.cjs +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/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 +9 -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/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,138 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ColumnFiltersState } from '../../../ui';
|
|
3
|
+
import type { DeviceFilters, DeviceRow } from '../types';
|
|
4
|
+
|
|
5
|
+
export type SubTab = 'available' | 'selected';
|
|
6
|
+
|
|
7
|
+
/** The two ways a consumer can target devices, the picker's top-level radio. */
|
|
8
|
+
export type DeviceSelectionMode = 'specific' | 'criteria';
|
|
9
|
+
|
|
10
|
+
/** The narrowing the picker is showing, in the component's own vocabulary. */
|
|
11
|
+
export interface DeviceSelectorNarrowing {
|
|
12
|
+
/** Column funnels (status / customer / os), TanStack-shaped. */
|
|
13
|
+
columnFilters: ColumnFiltersState;
|
|
14
|
+
/** Tag chips in the search bar, `key:value`. */
|
|
15
|
+
tags: string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Hands the picker's state to a parent that answers it from the server.
|
|
20
|
+
*
|
|
21
|
+
* Present ⇒ the component stops deriving anything from the `devices` array:
|
|
22
|
+
* `devices` IS the current tab's page, the Available/Selected split is two
|
|
23
|
+
* server queries rather than one list partitioned by `selectedIds`, and search,
|
|
24
|
+
* filters and the bulk actions are questions for the backend. Absent ⇒ every
|
|
25
|
+
* bit of that stays client-side exactly as before, which is what the other
|
|
26
|
+
* consumers (Run/Test Script, monitoring) rely on.
|
|
27
|
+
*
|
|
28
|
+
* The row action is add-or-remove by tab, not a toggle: with only a page of the
|
|
29
|
+
* assignment in hand, "is this one selected?" is not a question the client can
|
|
30
|
+
* answer. Selected always offers remove; on Available the row flips off
|
|
31
|
+
* `selectedIds`, which the parent fills from the connection's own per-row
|
|
32
|
+
* "already assigned" flag rather than from the page it holds.
|
|
33
|
+
*/
|
|
34
|
+
export interface DeviceSelectorServer<T extends DeviceRow = DeviceRow> {
|
|
35
|
+
activeTab: SubTab;
|
|
36
|
+
onTabChange: (tab: SubTab) => void;
|
|
37
|
+
/** Search box value. The parent debounces it into its query. */
|
|
38
|
+
search: string;
|
|
39
|
+
onSearchChange: (value: string) => void;
|
|
40
|
+
narrowing: DeviceSelectorNarrowing;
|
|
41
|
+
onNarrowingChange: (next: DeviceSelectorNarrowing) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Options for the column funnels. Rows are paged, so options derived from
|
|
44
|
+
* them would only ever offer what page one happens to contain.
|
|
45
|
+
*/
|
|
46
|
+
filterOptions?: DeviceFilters | null;
|
|
47
|
+
/** Size of the whole assignment, the "Selected Devices (N)" label. */
|
|
48
|
+
selectedCount: number;
|
|
49
|
+
/** Server-side count for the list on screen, for the header's row count. */
|
|
50
|
+
totalCount?: number;
|
|
51
|
+
/** Row actions. Committed immediately; there is no Save to batch them into. */
|
|
52
|
+
onAdd: (device: T) => void;
|
|
53
|
+
onRemove: (device: T) => void;
|
|
54
|
+
/** Header bulk actions, resolved server-side over the current narrowing. */
|
|
55
|
+
onAddAll: () => void;
|
|
56
|
+
onRemoveAll: () => void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface DeviceSelectorInfiniteScroll {
|
|
60
|
+
hasNextPage: boolean;
|
|
61
|
+
isFetchingNextPage: boolean;
|
|
62
|
+
onLoadMore: () => void;
|
|
63
|
+
skeletonRows: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface DeviceSelectorProps<T extends DeviceRow = DeviceRow> {
|
|
67
|
+
/** Devices to display. Consumer controls fetching and pre-filtering. */
|
|
68
|
+
devices: T[];
|
|
69
|
+
/** Whether the device list is loading. */
|
|
70
|
+
loading: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Currently selected device keys. Optional so a skeleton can render the real
|
|
73
|
+
* picker with nothing selected, the component falls back to an empty set and
|
|
74
|
+
* a no-op change handler. Every consumer a user can act on passes both.
|
|
75
|
+
*
|
|
76
|
+
* In `server` mode this is not the picker's own state, the parent fills it
|
|
77
|
+
* with the rows the backend reports as already assigned, so the Available tab
|
|
78
|
+
* pre-checks them instead of offering to add what is already in.
|
|
79
|
+
*/
|
|
80
|
+
selectedIds?: Set<string>;
|
|
81
|
+
/** Called when selection changes. Optional for the same reason as `selectedIds`. */
|
|
82
|
+
onSelectionChange?: (ids: Set<string>) => void;
|
|
83
|
+
/** Extract the unique string key for selection from a device. Defaults to `d.machineId ?? d.id`. */
|
|
84
|
+
getDeviceKey?: (device: T) => string | undefined;
|
|
85
|
+
/** Infinite scroll config for the available tab. */
|
|
86
|
+
infiniteScroll?: DeviceSelectorInfiniteScroll;
|
|
87
|
+
/** Disable all interactions (e.g. during save). */
|
|
88
|
+
disabled?: boolean;
|
|
89
|
+
/** Show selection mode radio group. Default: true. */
|
|
90
|
+
showSelectionModeRadio?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Controls the selection-mode radio. Passing it is what ENABLES the "by
|
|
93
|
+
* criteria" option, a consumer that leaves it out gets the uncontrolled
|
|
94
|
+
* radio with criteria disabled and tagged "Coming Soon", which is what the
|
|
95
|
+
* monitoring and run-script pages still want.
|
|
96
|
+
*/
|
|
97
|
+
selectionMode?: DeviceSelectionMode;
|
|
98
|
+
onSelectionModeChange?: (mode: DeviceSelectionMode) => void;
|
|
99
|
+
/**
|
|
100
|
+
* The rule editor, rendered in place of the whole picker card while
|
|
101
|
+
* `selectionMode` is `'criteria'` (design 460:85294 drops the card frame
|
|
102
|
+
* there, fields and table sit straight on the page).
|
|
103
|
+
*
|
|
104
|
+
* The table below it then shows what the rule currently resolves to: no row
|
|
105
|
+
* actions, no search box, no column funnels, the rule IS the narrowing, and a
|
|
106
|
+
* second one layered on top would make the row count answer a different
|
|
107
|
+
* question than the one the user is editing.
|
|
108
|
+
*/
|
|
109
|
+
criteriaContent?: ReactNode;
|
|
110
|
+
/** Extra content rendered above the selection radio / tabs (e.g. ScheduleInfoBar). */
|
|
111
|
+
headerContent?: ReactNode;
|
|
112
|
+
/** Table rowKey. Default: "id". */
|
|
113
|
+
rowKey?: string;
|
|
114
|
+
/** "replace" replaces entire selection on Add All; "merge" adds to existing. Default: "merge". */
|
|
115
|
+
addAllBehavior?: 'replace' | 'merge';
|
|
116
|
+
/** Allow only one device to be selected at a time. Default: false. */
|
|
117
|
+
singleSelect?: boolean;
|
|
118
|
+
/** Return a tooltip string if the device should be disabled, or undefined if enabled. */
|
|
119
|
+
isDeviceDisabled?: (device: T) => string | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* The search and tag filter row over the table. Default true; a host that
|
|
122
|
+
* shows a fixed list (nothing to search) passes false.
|
|
123
|
+
*/
|
|
124
|
+
showToolbar?: boolean;
|
|
125
|
+
/** Column ids to drop from the table (e.g. `['organization', 'status']` to leave only device + os). */
|
|
126
|
+
hideColumns?: string[];
|
|
127
|
+
/**
|
|
128
|
+
* Server-side size of the list on screen, for the header's row count. Only
|
|
129
|
+
* needed when the rows are paged but `server` is not in play (the criteria
|
|
130
|
+
* preview); `server.totalCount` covers the server-driven picker.
|
|
131
|
+
*/
|
|
132
|
+
totalCount?: number;
|
|
133
|
+
/**
|
|
134
|
+
* Switches the picker to server-driven mode, see {@link DeviceSelectorServer}.
|
|
135
|
+
* Omit for the client-side behaviour every other consumer uses.
|
|
136
|
+
*/
|
|
137
|
+
server?: DeviceSelectorServer<T>;
|
|
138
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DeviceFilterInput } from '../types';
|
|
2
|
+
import type { DeviceSelectorNarrowing } from './device-selector.types';
|
|
3
|
+
|
|
4
|
+
export const EMPTY_NARROWING: DeviceSelectorNarrowing = { columnFilters: [], tags: [] };
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Turns the picker's narrowing vocabulary into the backend's.
|
|
8
|
+
*
|
|
9
|
+
* The component speaks in table column filters and `key:value` chips because
|
|
10
|
+
* that is what its controls produce; the owner's device fields take a
|
|
11
|
+
* `DeviceFilterInput`. A plain-text chip (no colon) stays on screen but carries
|
|
12
|
+
* no filter, same as the devices page.
|
|
13
|
+
*/
|
|
14
|
+
export function narrowingToFilter(narrowing: DeviceSelectorNarrowing): DeviceFilterInput {
|
|
15
|
+
const column = (id: string) => narrowing.columnFilters.find(f => f.id === id)?.value as string[] | undefined;
|
|
16
|
+
const tagPairs = narrowing.tags.flatMap(t => {
|
|
17
|
+
const i = t.indexOf(':');
|
|
18
|
+
return i > 0 ? [{ key: t.slice(0, i), value: t.slice(i + 1) }] : [];
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const filter: DeviceFilterInput = {};
|
|
22
|
+
const statuses = column('status');
|
|
23
|
+
const osTypes = column('os');
|
|
24
|
+
const organizationIds = column('organization');
|
|
25
|
+
if (statuses?.length) filter.statuses = statuses;
|
|
26
|
+
if (osTypes?.length) filter.osTypes = osTypes;
|
|
27
|
+
if (organizationIds?.length) filter.organizationIds = organizationIds;
|
|
28
|
+
if (tagPairs.length) {
|
|
29
|
+
filter.tagKeys = tagPairs.map(t => t.key);
|
|
30
|
+
filter.tagValues = tagPairs.map(t => t.value);
|
|
31
|
+
}
|
|
32
|
+
return filter;
|
|
33
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
|
+
import { matchesDeviceName } from '../device-name';
|
|
3
|
+
import type { DeviceRow } from '../types';
|
|
4
|
+
import type { SubTab } from './device-selector.types';
|
|
5
|
+
|
|
6
|
+
interface UseDeviceSelectorParams<T extends DeviceRow> {
|
|
7
|
+
devices: T[];
|
|
8
|
+
selectedIds: Set<string>;
|
|
9
|
+
getDeviceKey: (device: T) => string | undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function useDeviceSelector<T extends DeviceRow>({
|
|
13
|
+
devices,
|
|
14
|
+
selectedIds,
|
|
15
|
+
getDeviceKey,
|
|
16
|
+
}: UseDeviceSelectorParams<T>) {
|
|
17
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
18
|
+
const [activeSubTab, setActiveSubTab] = useState<SubTab>('available');
|
|
19
|
+
|
|
20
|
+
const filteredDevices = useMemo(() => {
|
|
21
|
+
const needle = searchTerm.trim().toLowerCase();
|
|
22
|
+
if (!needle) return devices;
|
|
23
|
+
return devices.filter(
|
|
24
|
+
d => matchesDeviceName(d, needle) || (d.osType || d.operating_system || '').toLowerCase().includes(needle),
|
|
25
|
+
);
|
|
26
|
+
}, [devices, searchTerm]);
|
|
27
|
+
|
|
28
|
+
const displayDevices = useMemo(() => {
|
|
29
|
+
if (activeSubTab === 'selected') {
|
|
30
|
+
return filteredDevices.filter(d => {
|
|
31
|
+
const key = getDeviceKey(d);
|
|
32
|
+
return key !== undefined && selectedIds.has(key);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return filteredDevices;
|
|
36
|
+
}, [filteredDevices, activeSubTab, selectedIds, getDeviceKey]);
|
|
37
|
+
|
|
38
|
+
const handleTabChange = useCallback((tabId: string) => {
|
|
39
|
+
setSearchTerm('');
|
|
40
|
+
setActiveSubTab(tabId as SubTab);
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
searchTerm,
|
|
45
|
+
setSearchTerm,
|
|
46
|
+
activeSubTab,
|
|
47
|
+
handleTabChange,
|
|
48
|
+
filteredDevices,
|
|
49
|
+
displayDevices,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device status configuration utilities
|
|
3
|
+
* Provides consistent status mapping across the application
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { OSPlatformId } from '../../../utils/os-platforms';
|
|
7
|
+
import { getOSPlatformId } from '../../../utils/os-utils';
|
|
8
|
+
|
|
9
|
+
export type DeviceStatusVariant = 'success' | 'error' | 'warning' | 'grey' | 'critical';
|
|
10
|
+
export type DeviceCardStatus = 'active' | 'inactive' | 'offline' | 'warning' | 'error';
|
|
11
|
+
|
|
12
|
+
export interface DeviceStatusConfig {
|
|
13
|
+
label: string;
|
|
14
|
+
variant: DeviceStatusVariant;
|
|
15
|
+
cardStatus: DeviceCardStatus;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get status configuration for display
|
|
20
|
+
* Used by both table and grid views for consistent status representation
|
|
21
|
+
*/
|
|
22
|
+
export function getDeviceStatusConfig(status: string | null | undefined): DeviceStatusConfig {
|
|
23
|
+
// A device may carry no status yet: it reads as the unknown one, never a crash.
|
|
24
|
+
const known = (status ?? '').toUpperCase();
|
|
25
|
+
switch (known) {
|
|
26
|
+
case 'ONLINE':
|
|
27
|
+
return {
|
|
28
|
+
label: 'ONLINE',
|
|
29
|
+
variant: 'success',
|
|
30
|
+
cardStatus: 'active',
|
|
31
|
+
};
|
|
32
|
+
// ACTIVE reads as PENDING because the product app maps it so: this is its
|
|
33
|
+
// mapping, carried into the lib unchanged. What a status reads as is a
|
|
34
|
+
// product decision, not this module's.
|
|
35
|
+
case 'PENDING':
|
|
36
|
+
case 'ACTIVE':
|
|
37
|
+
return {
|
|
38
|
+
label: 'PENDING',
|
|
39
|
+
variant: 'warning',
|
|
40
|
+
cardStatus: 'warning',
|
|
41
|
+
};
|
|
42
|
+
case 'OFFLINE':
|
|
43
|
+
return {
|
|
44
|
+
label: 'OFFLINE',
|
|
45
|
+
variant: 'error',
|
|
46
|
+
cardStatus: 'offline',
|
|
47
|
+
};
|
|
48
|
+
case 'DECOMMISSIONED':
|
|
49
|
+
return {
|
|
50
|
+
label: 'DECOMMISSIONED',
|
|
51
|
+
variant: 'error',
|
|
52
|
+
cardStatus: 'offline',
|
|
53
|
+
};
|
|
54
|
+
case 'IDLE':
|
|
55
|
+
case 'INACTIVE':
|
|
56
|
+
return {
|
|
57
|
+
label: 'INACTIVE',
|
|
58
|
+
variant: 'grey',
|
|
59
|
+
cardStatus: 'inactive',
|
|
60
|
+
};
|
|
61
|
+
case 'MAINTENANCE':
|
|
62
|
+
return {
|
|
63
|
+
label: 'MAINTENANCE',
|
|
64
|
+
variant: 'warning',
|
|
65
|
+
cardStatus: 'warning',
|
|
66
|
+
};
|
|
67
|
+
case 'PENDING_DELETION':
|
|
68
|
+
return {
|
|
69
|
+
label: 'PENDING DELETION',
|
|
70
|
+
variant: 'error',
|
|
71
|
+
cardStatus: 'error',
|
|
72
|
+
};
|
|
73
|
+
case 'ARCHIVED':
|
|
74
|
+
return {
|
|
75
|
+
label: 'ARCHIVED',
|
|
76
|
+
variant: 'grey',
|
|
77
|
+
cardStatus: 'inactive',
|
|
78
|
+
};
|
|
79
|
+
case 'DELETED':
|
|
80
|
+
return {
|
|
81
|
+
label: 'DELETED',
|
|
82
|
+
variant: 'error',
|
|
83
|
+
cardStatus: 'offline',
|
|
84
|
+
};
|
|
85
|
+
default:
|
|
86
|
+
return {
|
|
87
|
+
label: known,
|
|
88
|
+
variant: 'grey',
|
|
89
|
+
cardStatus: 'inactive',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get operating system type for DeviceCard component
|
|
96
|
+
* Uses centralized OS type system from ui-kit
|
|
97
|
+
*/
|
|
98
|
+
export function getDeviceOperatingSystem(osType?: string): OSPlatformId | undefined {
|
|
99
|
+
// Uses centralized getOSPlatformId from ui-kit
|
|
100
|
+
// Returns: 'darwin' | 'windows' | 'linux' | undefined
|
|
101
|
+
return getOSPlatformId(osType);
|
|
102
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { DeviceFilterInput } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default visible device statuses (excludes ARCHIVED and DELETED).
|
|
5
|
+
* Deleted devices live on the dedicated /devices/archive page as read-only
|
|
6
|
+
* records. Use this constant for all device queries that should show "active"
|
|
7
|
+
* devices only.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: If new statuses are added to the backend, they must be added here
|
|
10
|
+
* to appear in default views.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const DEVICE_STATUS = {
|
|
14
|
+
ONLINE: 'ONLINE',
|
|
15
|
+
OFFLINE: 'OFFLINE',
|
|
16
|
+
ACTIVE: 'ACTIVE',
|
|
17
|
+
INACTIVE: 'INACTIVE',
|
|
18
|
+
MAINTENANCE: 'MAINTENANCE',
|
|
19
|
+
DECOMMISSIONED: 'DECOMMISSIONED',
|
|
20
|
+
PENDING: 'PENDING',
|
|
21
|
+
// Filter values are sanitized against the generated `DeviceStatus` enum
|
|
22
|
+
// (`toRelayDeviceFilter`) before hitting GraphQL, so PENDING_DELETION is
|
|
23
|
+
// silently dropped from queries until the backend adds it to the schema and
|
|
24
|
+
// `schema.graphql` / schema-enums are refreshed. Safe to ship ahead of BE.
|
|
25
|
+
PENDING_DELETION: 'PENDING_DELETION',
|
|
26
|
+
// No archive action exists anymore, ARCHIVED survives only as a legacy
|
|
27
|
+
// status on devices archived before the delete/archive rework.
|
|
28
|
+
ARCHIVED: 'ARCHIVED',
|
|
29
|
+
DELETED: 'DELETED',
|
|
30
|
+
} as const;
|
|
31
|
+
|
|
32
|
+
export type DeviceStatus = (typeof DEVICE_STATUS)[keyof typeof DEVICE_STATUS];
|
|
33
|
+
|
|
34
|
+
export const DEFAULT_VISIBLE_STATUSES = [
|
|
35
|
+
DEVICE_STATUS.ONLINE,
|
|
36
|
+
DEVICE_STATUS.OFFLINE,
|
|
37
|
+
DEVICE_STATUS.PENDING,
|
|
38
|
+
DEVICE_STATUS.PENDING_DELETION,
|
|
39
|
+
] as const satisfies string[];
|
|
40
|
+
|
|
41
|
+
// DELETED + legacy ARCHIVED both feed the dashboard's "Archived Devices" card,
|
|
42
|
+
// mirroring what the /devices/archive page lists.
|
|
43
|
+
export const DEFAULT_DASHBOARD_STATUSES = [
|
|
44
|
+
DEVICE_STATUS.ONLINE,
|
|
45
|
+
DEVICE_STATUS.OFFLINE,
|
|
46
|
+
DEVICE_STATUS.PENDING,
|
|
47
|
+
DEVICE_STATUS.PENDING_DELETION,
|
|
48
|
+
DEVICE_STATUS.ARCHIVED,
|
|
49
|
+
DEVICE_STATUS.DELETED,
|
|
50
|
+
] as const satisfies string[];
|
|
51
|
+
|
|
52
|
+
// PENDING is intentionally not part of the default list view, pending
|
|
53
|
+
// (still-enrolling) devices appear only when the user explicitly checks the
|
|
54
|
+
// PENDING status filter. The option itself stays in DEFAULT_VISIBLE_STATUSES.
|
|
55
|
+
// PENDING_DELETION stays in the default view: a device scheduled for uninstall
|
|
56
|
+
// must remain visible until the uninstall actually completes.
|
|
57
|
+
export const DEFAULT_DEVICES_LIST_STATUSES = [
|
|
58
|
+
DEVICE_STATUS.ONLINE,
|
|
59
|
+
DEVICE_STATUS.OFFLINE,
|
|
60
|
+
DEVICE_STATUS.PENDING_DELETION,
|
|
61
|
+
] as const satisfies string[];
|
|
62
|
+
|
|
63
|
+
// Statuses fetched when the device list is used as an enrichment registry
|
|
64
|
+
// (e.g. monitoring query/policy tables mapping fleet hosts → device metadata).
|
|
65
|
+
// Includes DELETED (and legacy ARCHIVED) so archived-but-monitored hosts keep
|
|
66
|
+
// their org/OS/image instead of degrading to bare host rows.
|
|
67
|
+
export const DEVICE_ENRICHMENT_STATUSES = [
|
|
68
|
+
DEVICE_STATUS.ONLINE,
|
|
69
|
+
DEVICE_STATUS.OFFLINE,
|
|
70
|
+
DEVICE_STATUS.ARCHIVED,
|
|
71
|
+
DEVICE_STATUS.DELETED,
|
|
72
|
+
] as const satisfies string[];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The device-registry filter the monitoring tables read: the enrichment statuses
|
|
76
|
+
* as a ready `DeviceFilterInput`. Shared so the policy and query tables ask for
|
|
77
|
+
* the same fleet and therefore share one cached fetch.
|
|
78
|
+
*/
|
|
79
|
+
export const DEVICE_ENRICHMENT_FILTER: DeviceFilterInput = { statuses: [...DEVICE_ENRICHMENT_STATUSES] };
|
|
80
|
+
|
|
81
|
+
export type DefaultVisibleStatus = (typeof DEFAULT_VISIBLE_STATUSES)[number];
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Statuses that are hidden by default (for documentation/reference)
|
|
85
|
+
*/
|
|
86
|
+
export const HIDDEN_DEVICE_STATUSES = [DEVICE_STATUS.ARCHIVED, DEVICE_STATUS.DELETED] as const;
|
|
87
|
+
|
|
88
|
+
export type HiddenDeviceStatus = (typeof HIDDEN_DEVICE_STATUSES)[number];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Filter02Icon } from '../../icons-v2-generated';
|
|
4
|
+
import { Button } from '../../ui';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The "Device Tags" filter trigger: labelled from md, icon-only below it.
|
|
8
|
+
*
|
|
9
|
+
* Breakpoint decided in CSS, and that is the point. Both call sites used to branch
|
|
10
|
+
* on a `useMdUp()` value threaded down as a prop, and that hook answers `undefined`
|
|
11
|
+
* until an effect has run, so `isMdUp ? labelled : iconOnly` took the icon-only
|
|
12
|
+
* arm on the FIRST render at every width, server included. On desktop the button
|
|
13
|
+
* appeared as a bare square and grew its label a frame later, which also nudged the
|
|
14
|
+
* search input beside it.
|
|
15
|
+
*
|
|
16
|
+
* Two buttons rather than one with a hidden label: `size="icon"` is not just "no
|
|
17
|
+
* text", it is a square box (`w-11 content-md:w-12`), uniform padding and a smaller glyph
|
|
18
|
+
* below md. Reproducing that on a `size="default"` button would mean four
|
|
19
|
+
* `max-md:` overrides fighting the lib's cva variants; letting each variant render
|
|
20
|
+
* itself and hiding one in CSS keeps both exactly as the design system defines them.
|
|
21
|
+
* Only one is ever visible, and neither is interactive while hidden (`display: none`
|
|
22
|
+
* removes it from the tab order).
|
|
23
|
+
*/
|
|
24
|
+
export function DeviceTagsFilterButton({ onClick }: { onClick: () => void }) {
|
|
25
|
+
return (
|
|
26
|
+
<>
|
|
27
|
+
<Button
|
|
28
|
+
variant="outline"
|
|
29
|
+
onClick={onClick}
|
|
30
|
+
leftIcon={<Filter02Icon className="text-ods-text-secondary" />}
|
|
31
|
+
className="hidden shrink-0 content-md:inline-flex"
|
|
32
|
+
>
|
|
33
|
+
Device Tags
|
|
34
|
+
</Button>
|
|
35
|
+
<Button
|
|
36
|
+
variant="outline"
|
|
37
|
+
size="icon"
|
|
38
|
+
aria-label="Device Tags"
|
|
39
|
+
onClick={onClick}
|
|
40
|
+
// Primary, not secondary: below md the funnel IS the button, there is no
|
|
41
|
+
// label beside it to carry the meaning, so it reads as the control itself
|
|
42
|
+
// rather than as decoration next to one. Same as every other mobile filter
|
|
43
|
+
// trigger in the app.
|
|
44
|
+
leftIcon={<Filter02Icon className="text-ods-text-primary" />}
|
|
45
|
+
className="shrink-0 content-md:hidden"
|
|
46
|
+
/>
|
|
47
|
+
</>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { HardDrivesIcon, LaptopIcon, MobilePhoneIcon, MonitorIcon, TabletIcon } from '../../icons-v2-generated';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CLASS_NAME = 'w-6 h-6 text-ods-text-secondary';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Returns the icon for a device type (desktop / laptop / server / mobile / tablet),
|
|
8
|
+
* using the current icons-v2 set. Replaces the deprecated `getDeviceTypeIcon` from
|
|
9
|
+
* the core library.
|
|
10
|
+
*
|
|
11
|
+
* Returns `undefined` for unknown / missing types so the caller can skip rendering.
|
|
12
|
+
* A row that names a device draws it through `DeviceTypeTile`.
|
|
13
|
+
*/
|
|
14
|
+
export function renderDeviceTypeIcon(type?: string, className: string = DEFAULT_CLASS_NAME): React.ReactNode {
|
|
15
|
+
switch (type?.toLowerCase()) {
|
|
16
|
+
case 'desktop':
|
|
17
|
+
return <MonitorIcon className={className} />;
|
|
18
|
+
case 'laptop':
|
|
19
|
+
return <LaptopIcon className={className} />;
|
|
20
|
+
case 'server':
|
|
21
|
+
return <HardDrivesIcon className={className} />;
|
|
22
|
+
case 'mobile':
|
|
23
|
+
return <MobilePhoneIcon className={className} />;
|
|
24
|
+
case 'tablet':
|
|
25
|
+
return <TabletIcon className={className} />;
|
|
26
|
+
default:
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MonitorIcon } from '../../icons-v2-generated';
|
|
2
|
+
import { renderDeviceTypeIcon } from './device-type-icon';
|
|
3
|
+
|
|
4
|
+
const ICON_CLASS = 'size-4 text-ods-text-secondary';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A device's type icon in its 32px tile, the leading mark of every row that
|
|
8
|
+
* names a device. Card-filled, so it keeps its edge on any row ground; an
|
|
9
|
+
* unknown type draws the monitor rather than an empty tile.
|
|
10
|
+
*/
|
|
11
|
+
export function DeviceTypeTile({ type }: { type: string | null | undefined }) {
|
|
12
|
+
return (
|
|
13
|
+
<span className="flex size-8 shrink-0 items-center justify-center rounded-[6px] border border-ods-border bg-ods-card">
|
|
14
|
+
{renderDeviceTypeIcon(type ?? undefined, ICON_CLASS) ?? <MonitorIcon className={ICON_CLASS} />}
|
|
15
|
+
</span>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { ComponentProps, Ref } from 'react';
|
|
4
|
+
import { cn } from '../../../utils/cn';
|
|
5
|
+
import { FilterModal, TagSearchInput, type TagSearchOption } from '../../ui';
|
|
6
|
+
import { DeviceTagsFilterButton } from './device-tags-filter-button';
|
|
7
|
+
|
|
8
|
+
type FilterModalProps = ComponentProps<typeof FilterModal>;
|
|
9
|
+
|
|
10
|
+
export interface DevicesFilterToolbarProps {
|
|
11
|
+
/** Search input, current value (debounce/URL sync owned by the parent). */
|
|
12
|
+
searchValue: string;
|
|
13
|
+
onSearchChange: (value: string) => void;
|
|
14
|
+
/** Already-selected tag chips rendered inside the search input. */
|
|
15
|
+
tags: TagSearchOption<string>[];
|
|
16
|
+
onTagRemove: (value: string) => void;
|
|
17
|
+
onClearAll: () => void;
|
|
18
|
+
onSubmit: (value: string) => void;
|
|
19
|
+
|
|
20
|
+
/** Open the Device Tags modal. */
|
|
21
|
+
onOpenFilterModal: () => void;
|
|
22
|
+
|
|
23
|
+
/** FilterModal state, proxied straight through. */
|
|
24
|
+
isFilterModalOpen: boolean;
|
|
25
|
+
onCloseFilterModal: () => void;
|
|
26
|
+
filterGroups: FilterModalProps['filterGroups'];
|
|
27
|
+
onFilterChange: FilterModalProps['onFilterChange'];
|
|
28
|
+
currentFilters?: FilterModalProps['currentFilters'];
|
|
29
|
+
tagFilterKeys: FilterModalProps['tagFilterKeys'];
|
|
30
|
+
selectedTags: FilterModalProps['selectedTags'];
|
|
31
|
+
onTagsChange: FilterModalProps['onTagsChange'];
|
|
32
|
+
isLoading?: boolean;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* When true (default), pins the toolbar at the top with the same negative-margin
|
|
36
|
+
* bleed used by `DevicesPanel` (so the search row's background covers the
|
|
37
|
+
* `PageLayout` padding). Pass `false` when mounting inside a container that
|
|
38
|
+
* shouldn't bleed (e.g. a modal).
|
|
39
|
+
*/
|
|
40
|
+
sticky?: boolean;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Attach to the pinned row so a caller can measure it, its height is what the
|
|
44
|
+
* sticky table header parks below, and it CHANGES as the tag-chip row appears
|
|
45
|
+
* and collapses. See `useStickyToolbar`.
|
|
46
|
+
*/
|
|
47
|
+
toolbarRef?: Ref<HTMLDivElement>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Search bar + "Device Tags" button + FilterModal. Pure presentation ,
|
|
52
|
+
* all state (search value, modal open/close, filter options) is owned by
|
|
53
|
+
* the parent. Reused by `DevicesPanel` and (eventually) `DeviceSelector`.
|
|
54
|
+
*/
|
|
55
|
+
export function DevicesFilterToolbar({
|
|
56
|
+
searchValue,
|
|
57
|
+
onSearchChange,
|
|
58
|
+
tags,
|
|
59
|
+
onTagRemove,
|
|
60
|
+
onClearAll,
|
|
61
|
+
onSubmit,
|
|
62
|
+
onOpenFilterModal,
|
|
63
|
+
isFilterModalOpen,
|
|
64
|
+
onCloseFilterModal,
|
|
65
|
+
filterGroups,
|
|
66
|
+
onFilterChange,
|
|
67
|
+
currentFilters,
|
|
68
|
+
tagFilterKeys,
|
|
69
|
+
selectedTags,
|
|
70
|
+
onTagsChange,
|
|
71
|
+
isLoading,
|
|
72
|
+
sticky = true,
|
|
73
|
+
toolbarRef,
|
|
74
|
+
}: DevicesFilterToolbarProps) {
|
|
75
|
+
return (
|
|
76
|
+
<>
|
|
77
|
+
<div
|
|
78
|
+
ref={toolbarRef}
|
|
79
|
+
className={cn(
|
|
80
|
+
'flex items-center gap-[var(--spacing-system-m)]',
|
|
81
|
+
sticky &&
|
|
82
|
+
'sticky top-0 z-20 -mx-[var(--spacing-system-l)] -mt-[var(--spacing-system-l)] bg-ods-bg p-[var(--spacing-system-l)]',
|
|
83
|
+
)}
|
|
84
|
+
>
|
|
85
|
+
<div className="min-w-0 flex-1">
|
|
86
|
+
<TagSearchInput
|
|
87
|
+
tags={tags}
|
|
88
|
+
searchValue={searchValue}
|
|
89
|
+
onSearchChange={onSearchChange}
|
|
90
|
+
onTagRemove={onTagRemove}
|
|
91
|
+
onClearAll={onClearAll}
|
|
92
|
+
onSubmit={onSubmit}
|
|
93
|
+
placeholder="Search for Devices"
|
|
94
|
+
addMorePlaceholder="Add More..."
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
<DeviceTagsFilterButton onClick={onOpenFilterModal} />
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<FilterModal
|
|
101
|
+
isOpen={isFilterModalOpen}
|
|
102
|
+
onClose={onCloseFilterModal}
|
|
103
|
+
filterGroups={filterGroups}
|
|
104
|
+
onFilterChange={onFilterChange}
|
|
105
|
+
currentFilters={currentFilters}
|
|
106
|
+
tagFilterKeys={tagFilterKeys}
|
|
107
|
+
selectedTags={selectedTags}
|
|
108
|
+
onTagsChange={onTagsChange}
|
|
109
|
+
isLoading={isLoading}
|
|
110
|
+
className="max-w-[600px]"
|
|
111
|
+
/>
|
|
112
|
+
</>
|
|
113
|
+
);
|
|
114
|
+
}
|