@nordicsemiconductor/pc-nrfconnect-shared 60.0.0-pre1 → 76.0.0
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/Changelog.md +222 -5
- package/config/colors.js +46 -0
- package/config/tailwind.config.js +25 -0
- package/config/tsconfig.json +2 -1
- package/dist/bootstrap.css +8951 -0
- package/package.json +28 -10
- package/scripts/esbuild-renderer.js +25 -17
- package/scripts/nordic-publish.js +89 -0
- package/src/About/About.tsx +9 -3
- package/src/About/ApplicationCard.tsx +20 -22
- package/src/About/DeviceCard.tsx +28 -26
- package/src/About/DocumentationCard.tsx +12 -9
- package/src/About/Section.tsx +5 -5
- package/src/About/SupportCard.tsx +61 -56
- package/src/App/App.tsx +36 -11
- package/src/App/appLayout.ts +0 -1
- package/src/App/preflight.scss +443 -0
- package/src/App/tailwind.css +12 -0
- package/src/Button/Button.tsx +34 -24
- package/src/Device/DeviceSelector/DeviceSelector.tsx +5 -2
- package/src/Device/DeviceSetup/DeviceSetupView.tsx +6 -3
- package/src/Device/deviceAutoSelectSlice.ts +14 -8
- package/src/Device/deviceLibWrapper.ts +0 -1
- package/src/Device/deviceLister.ts +68 -40
- package/src/Device/deviceSetup.ts +15 -20
- package/src/Device/jprogOperations.ts +5 -5
- package/src/Device/sdfuOperations.ts +43 -37
- package/src/Dialog/dialog.scss +0 -4
- package/src/Dropdown/Dropdown.module.scss +2 -70
- package/src/Dropdown/Dropdown.tsx +20 -14
- package/src/ErrorBoundary/ErrorBoundary.test.tsx +1 -18
- package/src/FlashMessage/FlashMessage.tsx +159 -0
- package/src/FlashMessage/FlashMessageSlice.ts +88 -0
- package/src/FlashMessage/flashMessage.css +32 -0
- package/src/NavBar/NavMenu.tsx +1 -2
- package/src/NavBar/NavMenuItem.tsx +5 -7
- package/src/NavBar/nav-bar.scss +2 -1
- package/src/NavBar/nav-menu-item.scss +0 -5
- package/src/NumberInputWithSlider/NumberInputSliderWithUnit.tsx +74 -0
- package/src/Panes/FeedbackPane.tsx +83 -48
- package/src/SerialPort/ConflictingSettingsDialog.tsx +50 -66
- package/src/StateSelector/StateSelector.tsx +1 -1
- package/src/Stepper/Stepper.tsx +2 -3
- package/src/index.ts +14 -3
- package/src/store.ts +10 -3
- package/src/utils/colors.ts +147 -12
- package/src/utils/usageData.ts +59 -52
- package/src/utils/useFocusedOnVisible.ts +26 -0
- package/src/variables.scss +5 -5
- package/typings/generated/main/index.d.ts +1 -0
- package/typings/generated/main/index.d.ts.map +1 -0
- package/typings/generated/src/About/About.d.ts +6 -2
- package/typings/generated/src/About/About.d.ts.map +1 -0
- package/typings/generated/src/About/AboutButton.d.ts +1 -0
- package/typings/generated/src/About/AboutButton.d.ts.map +1 -0
- package/typings/generated/src/About/ApplicationCard.d.ts +1 -0
- package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -0
- package/typings/generated/src/About/DeviceCard.d.ts +1 -0
- package/typings/generated/src/About/DeviceCard.d.ts.map +1 -0
- package/typings/generated/src/About/DocumentationCard.d.ts +5 -2
- package/typings/generated/src/About/DocumentationCard.d.ts.map +1 -0
- package/typings/generated/src/About/DocumentationSection.d.ts +1 -0
- package/typings/generated/src/About/DocumentationSection.d.ts.map +1 -0
- package/typings/generated/src/About/Section.d.ts +1 -1
- package/typings/generated/src/About/Section.d.ts.map +1 -0
- package/typings/generated/src/About/ShortcutButton.d.ts +1 -0
- package/typings/generated/src/About/ShortcutButton.d.ts.map +1 -0
- package/typings/generated/src/About/SupportCard.d.ts +1 -0
- package/typings/generated/src/About/SupportCard.d.ts.map +1 -0
- package/typings/generated/src/About/shortcutSlice.d.ts +1 -0
- package/typings/generated/src/About/shortcutSlice.d.ts.map +1 -0
- package/typings/generated/src/Alert/Alert.d.ts +1 -0
- package/typings/generated/src/Alert/Alert.d.ts.map +1 -0
- package/typings/generated/src/App/App.d.ts +4 -0
- package/typings/generated/src/App/App.d.ts.map +1 -0
- package/typings/generated/src/App/App.test.d.ts +1 -0
- package/typings/generated/src/App/App.test.d.ts.map +1 -0
- package/typings/generated/src/App/ConnectedToStore.d.ts +1 -0
- package/typings/generated/src/App/ConnectedToStore.d.ts.map +1 -0
- package/typings/generated/src/App/VisibilityBar.d.ts +1 -0
- package/typings/generated/src/App/VisibilityBar.d.ts.map +1 -0
- package/typings/generated/src/App/appLayout.d.ts +1 -1
- package/typings/generated/src/App/appLayout.d.ts.map +1 -0
- package/typings/generated/src/Button/Button.d.ts +2 -1
- package/typings/generated/src/Button/Button.d.ts.map +1 -0
- package/typings/generated/src/Card/Card.d.ts +1 -0
- package/typings/generated/src/Card/Card.d.ts.map +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts.map +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +1 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts.map +1 -0
- package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +3 -1
- package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +1 -0
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
- package/typings/generated/src/Device/deviceLibWrapper.test.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLister.d.ts +4 -2
- package/typings/generated/src/Device/deviceLister.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceLister.test.d.ts +1 -0
- package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSetup.d.ts +8 -7
- package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSetupSlice.d.ts +1 -0
- package/typings/generated/src/Device/deviceSetupSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/deviceSlice.d.ts +1 -0
- package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -0
- package/typings/generated/src/Device/dfu-cc.d.ts +1 -0
- package/typings/generated/src/Device/dfu-cc.d.ts.map +1 -0
- package/typings/generated/src/Device/initPacket.d.ts +1 -0
- package/typings/generated/src/Device/initPacket.d.ts.map +1 -0
- package/typings/generated/src/Device/jprogOperations.d.ts +1 -0
- package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -0
- package/typings/generated/src/Device/sdfuOperations.d.ts +4 -3
- package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -0
- package/typings/generated/src/Dialog/Dialog.d.ts +1 -0
- package/typings/generated/src/Dialog/Dialog.d.ts.map +1 -0
- package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
- package/typings/generated/src/Dialog/Dialog.test.d.ts.map +1 -0
- package/typings/generated/src/Dropdown/Dropdown.d.ts +3 -1
- package/typings/generated/src/Dropdown/Dropdown.d.ts.map +1 -0
- package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
- package/typings/generated/src/Dropdown/Dropdown.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts.map +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts.map +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts.map +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts.map +1 -0
- package/typings/generated/src/FlashMessage/FlashMessage.d.ts +5 -0
- package/typings/generated/src/FlashMessage/FlashMessage.d.ts.map +1 -0
- package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts +20 -0
- package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts.map +1 -0
- package/typings/generated/src/InlineInput/InlineInput.d.ts +1 -0
- package/typings/generated/src/InlineInput/InlineInput.d.ts.map +1 -0
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -0
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -0
- package/typings/generated/src/Log/LogEntry.d.ts +1 -0
- package/typings/generated/src/Log/LogEntry.d.ts.map +1 -0
- package/typings/generated/src/Log/LogViewer.d.ts +1 -0
- package/typings/generated/src/Log/LogViewer.d.ts.map +1 -0
- package/typings/generated/src/Log/logSlice.d.ts +1 -0
- package/typings/generated/src/Log/logSlice.d.ts.map +1 -0
- package/typings/generated/src/Log/syncLogToStore.d.ts +1 -0
- package/typings/generated/src/Log/syncLogToStore.d.ts.map +1 -0
- package/typings/generated/src/Logo/Logo.d.ts +1 -0
- package/typings/generated/src/Logo/Logo.d.ts.map +1 -0
- package/typings/generated/src/Main/Main.d.ts +1 -0
- package/typings/generated/src/Main/Main.d.ts.map +1 -0
- package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +1 -0
- package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavBar.d.ts +1 -0
- package/typings/generated/src/NavBar/NavBar.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenu.d.ts +1 -0
- package/typings/generated/src/NavBar/NavMenu.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
- package/typings/generated/src/NavBar/NavMenu.test.d.ts.map +1 -0
- package/typings/generated/src/NavBar/NavMenuItem.d.ts +1 -1
- package/typings/generated/src/NavBar/NavMenuItem.d.ts.map +1 -0
- package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts +14 -0
- package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts.map +1 -0
- package/typings/generated/src/OpenApp/openApp.d.ts +1 -0
- package/typings/generated/src/OpenApp/openApp.d.ts.map +1 -0
- package/typings/generated/src/Panes/FeedbackPane.d.ts +5 -1
- package/typings/generated/src/Panes/FeedbackPane.d.ts.map +1 -0
- package/typings/generated/src/PseudoButton/PseudoButton.d.ts +1 -0
- package/typings/generated/src/PseudoButton/PseudoButton.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +1 -0
- package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/SerialPort.d.ts +1 -0
- package/typings/generated/src/SerialPort/SerialPort.d.ts.map +1 -0
- package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
- package/typings/generated/src/SerialPort/SerialPort.test.d.ts.map +1 -0
- package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +1 -0
- package/typings/generated/src/Shortcuts/ShortcutItem.d.ts.map +1 -0
- package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +1 -0
- package/typings/generated/src/Shortcuts/ShortcutModal.d.ts.map +1 -0
- package/typings/generated/src/SidePanel/Group.d.ts +1 -0
- package/typings/generated/src/SidePanel/Group.d.ts.map +1 -0
- package/typings/generated/src/SidePanel/SidePanel.d.ts +1 -0
- package/typings/generated/src/SidePanel/SidePanel.d.ts.map +1 -0
- package/typings/generated/src/Slider/Bar.d.ts +1 -0
- package/typings/generated/src/Slider/Bar.d.ts.map +1 -0
- package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
- package/typings/generated/src/Slider/Factor.test.d.ts.map +1 -0
- package/typings/generated/src/Slider/Handle.d.ts +1 -0
- package/typings/generated/src/Slider/Handle.d.ts.map +1 -0
- package/typings/generated/src/Slider/Slider.d.ts +1 -0
- package/typings/generated/src/Slider/Slider.d.ts.map +1 -0
- package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
- package/typings/generated/src/Slider/Slider.test.d.ts.map +1 -0
- package/typings/generated/src/Slider/Ticks.d.ts +1 -0
- package/typings/generated/src/Slider/Ticks.d.ts.map +1 -0
- package/typings/generated/src/Slider/factor.d.ts +1 -0
- package/typings/generated/src/Slider/factor.d.ts.map +1 -0
- package/typings/generated/src/Slider/percentage.d.ts +1 -0
- package/typings/generated/src/Slider/percentage.d.ts.map +1 -0
- package/typings/generated/src/Slider/range.d.ts +1 -0
- package/typings/generated/src/Slider/range.d.ts.map +1 -0
- package/typings/generated/src/StartStopButton/StartStopButton.d.ts +1 -0
- package/typings/generated/src/StartStopButton/StartStopButton.d.ts.map +1 -0
- package/typings/generated/src/StateSelector/StateSelector.d.ts +1 -0
- package/typings/generated/src/StateSelector/StateSelector.d.ts.map +1 -0
- package/typings/generated/src/Stepper/Stepper.d.ts +1 -0
- package/typings/generated/src/Stepper/Stepper.d.ts.map +1 -0
- package/typings/generated/src/Toggle/Toggle.d.ts +1 -0
- package/typings/generated/src/Toggle/Toggle.d.ts.map +1 -0
- package/typings/generated/src/index.d.ts +8 -4
- package/typings/generated/src/index.d.ts.map +1 -0
- package/typings/generated/src/logging/appTransport.d.ts +1 -0
- package/typings/generated/src/logging/appTransport.d.ts.map +1 -0
- package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
- package/typings/generated/src/logging/appTransport.test.d.ts.map +1 -0
- package/typings/generated/src/logging/describeError.d.ts +1 -0
- package/typings/generated/src/logging/describeError.d.ts.map +1 -0
- package/typings/generated/src/logging/describeError.test.d.ts +1 -0
- package/typings/generated/src/logging/describeError.test.d.ts.map +1 -0
- package/typings/generated/src/logging/index.d.ts +1 -0
- package/typings/generated/src/logging/index.d.ts.map +1 -0
- package/typings/generated/src/logging/logBuffer.d.ts +1 -0
- package/typings/generated/src/logging/logBuffer.d.ts.map +1 -0
- package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
- package/typings/generated/src/logging/logBuffer.test.d.ts.map +1 -0
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts +1 -0
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -0
- package/typings/generated/src/store.d.ts +21 -18
- package/typings/generated/src/store.d.ts.map +1 -0
- package/typings/generated/src/utils/AppTypes.d.ts +1 -0
- package/typings/generated/src/utils/AppTypes.d.ts.map +1 -0
- package/typings/generated/src/utils/appDirs.d.ts +1 -0
- package/typings/generated/src/utils/appDirs.d.ts.map +1 -0
- package/typings/generated/src/utils/bleChannels.d.ts +1 -0
- package/typings/generated/src/utils/bleChannels.d.ts.map +1 -0
- package/typings/generated/src/utils/classNames.d.ts +1 -0
- package/typings/generated/src/utils/classNames.d.ts.map +1 -0
- package/typings/generated/src/utils/classNames.test.d.ts +1 -0
- package/typings/generated/src/utils/classNames.test.d.ts.map +1 -0
- package/typings/generated/src/utils/colors.d.ts +126 -3
- package/typings/generated/src/utils/colors.d.ts.map +1 -0
- package/typings/generated/src/utils/describeVersion.d.ts +1 -0
- package/typings/generated/src/utils/describeVersion.d.ts.map +1 -0
- package/typings/generated/src/utils/environment.d.ts +1 -0
- package/typings/generated/src/utils/environment.d.ts.map +1 -0
- package/typings/generated/src/utils/logLibVersions.d.ts +1 -0
- package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -0
- package/typings/generated/src/utils/open.d.ts +1 -0
- package/typings/generated/src/utils/open.d.ts.map +1 -0
- package/typings/generated/src/utils/packageJson.d.ts +1 -0
- package/typings/generated/src/utils/packageJson.d.ts.map +1 -0
- package/typings/generated/src/utils/persistentStore.d.ts +1 -0
- package/typings/generated/src/utils/persistentStore.d.ts.map +1 -0
- package/typings/generated/src/utils/systemReport.d.ts +1 -0
- package/typings/generated/src/utils/systemReport.d.ts.map +1 -0
- package/typings/generated/src/utils/truncateMiddle.d.ts +1 -0
- package/typings/generated/src/utils/truncateMiddle.d.ts.map +1 -0
- package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
- package/typings/generated/src/utils/truncateMiddle.test.d.ts.map +1 -0
- package/typings/generated/src/utils/usageData.d.ts +4 -3
- package/typings/generated/src/utils/usageData.d.ts.map +1 -0
- package/typings/generated/src/utils/useFocusedOnVisible.d.ts +11 -0
- package/typings/generated/src/utils/useFocusedOnVisible.d.ts.map +1 -0
- package/typings/generated/src/utils/useHotKey.d.ts +1 -0
- package/typings/generated/src/utils/useHotKey.d.ts.map +1 -0
- package/typings/generated/src/utils/useStopwatch.d.ts +1 -0
- package/typings/generated/src/utils/useStopwatch.d.ts.map +1 -0
- package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
- package/typings/generated/src/utils/useStopwatch.test.d.ts.map +1 -0
- package/typings/generated/test/dispatchTo.d.ts +1 -0
- package/typings/generated/test/dispatchTo.d.ts.map +1 -0
- package/typings/generated/test/testrenderer.d.ts +1 -0
- package/typings/generated/test/testrenderer.d.ts.map +1 -0
- package/.github/ISSUE_TEMPLATE/custom.md +0 -10
- package/.husky/pre-push +0 -3
- package/.renovaterc.json +0 -10
- package/azure-pipelines.yml +0 -34
- package/jest.config.js +0 -7
- package/src/About/documentationSlice.ts +0 -41
- package/src/About/section.scss +0 -15
- package/src/Button/button.module.scss +0 -154
- package/tsconfig.json +0 -9
- package/typings/generated/src/About/documentationSlice.d.ts +0 -12
|
@@ -11,13 +11,13 @@ import nrfDeviceLib, {
|
|
|
11
11
|
} from '@nordicsemiconductor/nrf-device-lib-js';
|
|
12
12
|
|
|
13
13
|
import logger from '../logging';
|
|
14
|
-
import type {
|
|
14
|
+
import type { AppThunk, RootState } from '../store';
|
|
15
15
|
import {
|
|
16
|
-
clearWaitForDevice,
|
|
17
16
|
clearWaitForDeviceTimeout,
|
|
18
17
|
setArrivedButWrongWhen,
|
|
19
18
|
setDisconnectedTime,
|
|
20
19
|
setLastArrivedDeviceId,
|
|
20
|
+
setOnCancelTimeout,
|
|
21
21
|
setWaitForDeviceTimeout,
|
|
22
22
|
WaitForDevice,
|
|
23
23
|
} from './deviceAutoSelectSlice';
|
|
@@ -72,10 +72,12 @@ const shouldAutoReselect = (
|
|
|
72
72
|
};
|
|
73
73
|
|
|
74
74
|
const initAutoReconnectTimeout =
|
|
75
|
-
(onTimeout: () => void, waitForDevice: WaitForDevice) =>
|
|
76
|
-
|
|
75
|
+
(onTimeout: () => void, waitForDevice: WaitForDevice): AppThunk =>
|
|
76
|
+
dispatch => {
|
|
77
77
|
const timeout = waitForDevice.timeout;
|
|
78
78
|
|
|
79
|
+
dispatch(setOnCancelTimeout(onTimeout));
|
|
80
|
+
|
|
79
81
|
dispatch(
|
|
80
82
|
setWaitForDeviceTimeout(
|
|
81
83
|
setTimeout(() => {
|
|
@@ -86,8 +88,7 @@ const initAutoReconnectTimeout =
|
|
|
86
88
|
timeout / 1000
|
|
87
89
|
} seconds.`
|
|
88
90
|
);
|
|
89
|
-
dispatch(
|
|
90
|
-
onTimeout();
|
|
91
|
+
dispatch(clearWaitForDevice());
|
|
91
92
|
logger.warn(
|
|
92
93
|
`Failed to detect device after reboot. Timed out after ${
|
|
93
94
|
timeout / 1000
|
|
@@ -135,6 +136,33 @@ export const hasValidDeviceTraits = (
|
|
|
135
136
|
rule => requiredTraits[rule as keyof DeviceTraits] === false
|
|
136
137
|
);
|
|
137
138
|
|
|
139
|
+
const removeDeviceFromList =
|
|
140
|
+
(
|
|
141
|
+
removedDevice: Device,
|
|
142
|
+
onDeviceDeselected: () => void,
|
|
143
|
+
onDeviceDisconnected: (device: Device) => void
|
|
144
|
+
): AppThunk =>
|
|
145
|
+
(dispatch, getState) => {
|
|
146
|
+
if (
|
|
147
|
+
removedDevice.serialNumber ===
|
|
148
|
+
getState().device.selectedSerialNumber
|
|
149
|
+
) {
|
|
150
|
+
onDeviceDeselected();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (
|
|
154
|
+
removedDevice.serialNumber ===
|
|
155
|
+
getState().device.selectedSerialNumber &&
|
|
156
|
+
!getState().deviceAutoSelect.waitForDevice
|
|
157
|
+
) {
|
|
158
|
+
dispatch(closeDeviceSetupDialog());
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (!getState().deviceAutoSelect.arrivedButWrongWhen) {
|
|
162
|
+
dispatch(removeDevice(removedDevice));
|
|
163
|
+
onDeviceDisconnected(removedDevice);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
138
166
|
/*
|
|
139
167
|
* Starts watching for devices with the given traits. See the nrf-device-lib
|
|
140
168
|
* library for available traits. Whenever devices are attached/detached, this
|
|
@@ -147,31 +175,9 @@ export const startWatchingDevices =
|
|
|
147
175
|
onDeviceDisconnected: (device: Device) => void,
|
|
148
176
|
onDeviceDeselected: () => void,
|
|
149
177
|
doSelectDevice: (device: Device, autoReselected: boolean) => void
|
|
150
|
-
) =>
|
|
151
|
-
async (dispatch
|
|
178
|
+
): AppThunk<RootState, Promise<void>> =>
|
|
179
|
+
async (dispatch, getState) => {
|
|
152
180
|
const updateDeviceList = (event: HotplugEvent) => {
|
|
153
|
-
const removeDeviceFromList = (remove: Device) => {
|
|
154
|
-
if (
|
|
155
|
-
remove.serialNumber ===
|
|
156
|
-
getState().device.selectedSerialNumber
|
|
157
|
-
) {
|
|
158
|
-
onDeviceDeselected();
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (
|
|
162
|
-
remove.serialNumber ===
|
|
163
|
-
getState().device.selectedSerialNumber &&
|
|
164
|
-
!getState().deviceAutoSelect.waitForDevice
|
|
165
|
-
) {
|
|
166
|
-
dispatch(closeDeviceSetupDialog());
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (!getState().deviceAutoSelect.arrivedButWrongWhen) {
|
|
170
|
-
dispatch(removeDevice(remove));
|
|
171
|
-
onDeviceDisconnected(remove);
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
|
|
175
181
|
switch (event.event_type) {
|
|
176
182
|
case 'NRFDL_DEVICE_EVENT_ARRIVED':
|
|
177
183
|
if (!event.device) {
|
|
@@ -276,11 +282,11 @@ export const startWatchingDevices =
|
|
|
276
282
|
'Wait For Device was successfully'
|
|
277
283
|
);
|
|
278
284
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
285
|
+
dispatch(
|
|
286
|
+
clearWaitForDeviceTimeout(
|
|
287
|
+
waitForDevice.once
|
|
288
|
+
)
|
|
289
|
+
);
|
|
284
290
|
|
|
285
291
|
if (waitForDevice.onSuccess)
|
|
286
292
|
waitForDevice.onSuccess(
|
|
@@ -314,19 +320,35 @@ export const startWatchingDevices =
|
|
|
314
320
|
dispatch(
|
|
315
321
|
initAutoReconnectTimeout(
|
|
316
322
|
() =>
|
|
317
|
-
|
|
318
|
-
|
|
323
|
+
dispatch(
|
|
324
|
+
removeDeviceFromList(
|
|
325
|
+
device,
|
|
326
|
+
onDeviceDeselected,
|
|
327
|
+
onDeviceDisconnected
|
|
328
|
+
)
|
|
319
329
|
),
|
|
320
330
|
waitForDevice
|
|
321
331
|
)
|
|
322
332
|
);
|
|
323
333
|
} else {
|
|
324
|
-
|
|
334
|
+
dispatch(
|
|
335
|
+
removeDeviceFromList(
|
|
336
|
+
device,
|
|
337
|
+
onDeviceDeselected,
|
|
338
|
+
onDeviceDisconnected
|
|
339
|
+
)
|
|
340
|
+
);
|
|
325
341
|
}
|
|
326
342
|
|
|
327
343
|
dispatch(setDisconnectedTime(Date.now()));
|
|
328
344
|
} else {
|
|
329
|
-
|
|
345
|
+
dispatch(
|
|
346
|
+
removeDeviceFromList(
|
|
347
|
+
device,
|
|
348
|
+
onDeviceDeselected,
|
|
349
|
+
onDeviceDisconnected
|
|
350
|
+
)
|
|
351
|
+
);
|
|
330
352
|
}
|
|
331
353
|
}
|
|
332
354
|
});
|
|
@@ -377,6 +399,13 @@ const getAutoSelectDeviceCLISerial = () => {
|
|
|
377
399
|
return serialIndex > -1 ? argv[serialIndex + 1] : undefined;
|
|
378
400
|
};
|
|
379
401
|
|
|
402
|
+
export const clearWaitForDevice = (): AppThunk => (dispatch, getState) => {
|
|
403
|
+
if (getState().deviceAutoSelect.autoReconnectTimeout) {
|
|
404
|
+
getState().deviceAutoSelect.onCancelTimeout?.();
|
|
405
|
+
}
|
|
406
|
+
dispatch(clearWaitForDeviceTimeout(true));
|
|
407
|
+
};
|
|
408
|
+
|
|
380
409
|
/**
|
|
381
410
|
* Stops watching for devices.
|
|
382
411
|
*
|
|
@@ -386,7 +415,6 @@ export const stopWatchingDevices = () => {
|
|
|
386
415
|
// Not sure, if this guard clause is really needed
|
|
387
416
|
if (getDeviceLibContext() && hotplugTaskId !== null) {
|
|
388
417
|
try {
|
|
389
|
-
// @ts-expect-error Type will be updated in device-lib-js
|
|
390
418
|
nrfDeviceLib.stopHotplugEvents(hotplugTaskId);
|
|
391
419
|
hotplugTaskId = null;
|
|
392
420
|
} catch (error) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import logger from '../logging';
|
|
7
7
|
import describeError from '../logging/describeError';
|
|
8
|
-
import {
|
|
8
|
+
import { AppThunk, RootState } from '../store';
|
|
9
9
|
import {
|
|
10
10
|
closeDeviceSetupDialog,
|
|
11
11
|
openDeviceSetupDialog,
|
|
@@ -39,24 +39,18 @@ export interface DeviceSetup {
|
|
|
39
39
|
description?: string;
|
|
40
40
|
programDevice: (
|
|
41
41
|
onProgress: (progress: number, message?: string) => void
|
|
42
|
-
) =>
|
|
43
|
-
dispatch: AppDispatch,
|
|
44
|
-
getState: () => RootState
|
|
45
|
-
) => Promise<Device>;
|
|
42
|
+
) => AppThunk<RootState, Promise<Device>>;
|
|
46
43
|
}[]; // The list of all firmware that can be applied for this device with the program function for that fw item
|
|
47
|
-
isExpectedFirmware: (device: Device) =>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
isExpectedFirmware: (device: Device) => AppThunk<
|
|
45
|
+
RootState,
|
|
46
|
+
Promise<{
|
|
47
|
+
device: Device;
|
|
48
|
+
validFirmware: boolean;
|
|
49
|
+
}>
|
|
50
|
+
>; // returns true if device has one of the expected firmware returned by getFirmwareOptions
|
|
54
51
|
tryToSwitchToApplicationMode: (
|
|
55
52
|
device: Device
|
|
56
|
-
) =>
|
|
57
|
-
dispatch: AppDispatch,
|
|
58
|
-
getState: () => RootState
|
|
59
|
-
) => Promise<Device | null>; // returns the device after switched to app mode. If this is not possible or not relevant return null
|
|
53
|
+
) => AppThunk<RootState, Promise<Device | null>>; // returns the device after switched to app mode. If this is not possible or not relevant return null
|
|
60
54
|
}
|
|
61
55
|
|
|
62
56
|
export interface DeviceSetupConfig {
|
|
@@ -74,8 +68,8 @@ export const prepareDevice =
|
|
|
74
68
|
onFail: (reason?: unknown) => void,
|
|
75
69
|
checkCurrentFirmwareVersion = true,
|
|
76
70
|
requireUserConfirmation = true
|
|
77
|
-
) =>
|
|
78
|
-
async
|
|
71
|
+
): AppThunk<RootState, Promise<void>> =>
|
|
72
|
+
async dispatch => {
|
|
79
73
|
const onSuccessWrapper = (d: Device) => {
|
|
80
74
|
onSuccess(d);
|
|
81
75
|
dispatch(closeDeviceSetupDialog());
|
|
@@ -221,6 +215,7 @@ export const prepareDevice =
|
|
|
221
215
|
message:
|
|
222
216
|
deviceSetupConfig.choiceMessage ??
|
|
223
217
|
'Which firmware do you want to program?',
|
|
218
|
+
choices,
|
|
224
219
|
})
|
|
225
220
|
);
|
|
226
221
|
}
|
|
@@ -232,8 +227,8 @@ export const setupDevice =
|
|
|
232
227
|
deviceSetupConfig: DeviceSetupConfig,
|
|
233
228
|
onDeviceIsReady: (device: Device) => void,
|
|
234
229
|
doDeselectDevice: () => void
|
|
235
|
-
) =>
|
|
236
|
-
(dispatch
|
|
230
|
+
): AppThunk<RootState> =>
|
|
231
|
+
(dispatch, getState) =>
|
|
237
232
|
dispatch(
|
|
238
233
|
prepareDevice(
|
|
239
234
|
device,
|
|
@@ -14,7 +14,7 @@ import nrfDeviceLib, {
|
|
|
14
14
|
} from '@nordicsemiconductor/nrf-device-lib-js';
|
|
15
15
|
|
|
16
16
|
import logger from '../logging';
|
|
17
|
-
import type {
|
|
17
|
+
import type { AppThunk, RootState } from '../store';
|
|
18
18
|
import { getDeviceLibContext } from './deviceLibWrapper';
|
|
19
19
|
import { DeviceSetup, JprogEntry } from './deviceSetup';
|
|
20
20
|
import { Device, setReadbackProtected } from './deviceSlice';
|
|
@@ -100,8 +100,8 @@ const programDeviceWithFw =
|
|
|
100
100
|
device: Device,
|
|
101
101
|
selectedFw: JprogEntry,
|
|
102
102
|
onProgress: (progress: number, message?: string) => void
|
|
103
|
-
) =>
|
|
104
|
-
async (dispatch
|
|
103
|
+
): AppThunk<RootState, Promise<Device>> =>
|
|
104
|
+
async (dispatch, getState) => {
|
|
105
105
|
try {
|
|
106
106
|
if (getState().device.readbackProtection === 'protected') {
|
|
107
107
|
logger.info('Recovering device');
|
|
@@ -163,12 +163,12 @@ export const jprogDeviceSetup = (
|
|
|
163
163
|
firmwareOptions(device, firmware).map(firmwareOption => ({
|
|
164
164
|
key: firmwareOption.key,
|
|
165
165
|
description: firmwareOption.description,
|
|
166
|
-
programDevice: onProgress =>
|
|
166
|
+
programDevice: onProgress => dispatch =>
|
|
167
167
|
dispatch(
|
|
168
168
|
programDeviceWithFw(device, firmwareOption, onProgress)
|
|
169
169
|
),
|
|
170
170
|
})),
|
|
171
|
-
isExpectedFirmware: (device: Device) =>
|
|
171
|
+
isExpectedFirmware: (device: Device) => dispatch => {
|
|
172
172
|
const fwVersions = firmwareOptions(device, firmware);
|
|
173
173
|
if (fwVersions.length === 0) {
|
|
174
174
|
return Promise.resolve({
|
|
@@ -11,7 +11,7 @@ import fs from 'fs';
|
|
|
11
11
|
import MemoryMap from 'nrf-intel-hex';
|
|
12
12
|
|
|
13
13
|
import logger from '../logging';
|
|
14
|
-
import {
|
|
14
|
+
import { AppThunk, RootState } from '../store';
|
|
15
15
|
import { getAppFile } from '../utils/appDirs';
|
|
16
16
|
import { setWaitForDevice } from './deviceAutoSelectSlice';
|
|
17
17
|
import { getDeviceLibContext } from './deviceLibWrapper';
|
|
@@ -87,8 +87,8 @@ const updateBootloader =
|
|
|
87
87
|
onSuccess: (device: Device) => void,
|
|
88
88
|
onFail: (reason?: unknown) => void,
|
|
89
89
|
onProgress: (progress: number, message?: string) => void
|
|
90
|
-
) =>
|
|
91
|
-
async
|
|
90
|
+
): AppThunk =>
|
|
91
|
+
async dispatch => {
|
|
92
92
|
logger.info(`Update Bootloader ${device}`);
|
|
93
93
|
const zip = new AdmZip(getAppFile(LATEST_BOOTLOADER));
|
|
94
94
|
const zipBuffer = zip.toBuffer();
|
|
@@ -153,8 +153,8 @@ const switchToDeviceMode =
|
|
|
153
153
|
mcuState: nrfDeviceLib.MCUState,
|
|
154
154
|
onSuccess: (device: Device) => void,
|
|
155
155
|
onFail: (reason?: unknown) => void
|
|
156
|
-
) =>
|
|
157
|
-
|
|
156
|
+
): AppThunk =>
|
|
157
|
+
dispatch => {
|
|
158
158
|
nrfDeviceLib
|
|
159
159
|
.deviceControlSetMcuState(
|
|
160
160
|
getDeviceLibContext(),
|
|
@@ -183,8 +183,8 @@ export const switchToBootloaderMode =
|
|
|
183
183
|
device: Device,
|
|
184
184
|
onSuccess: (device: Device) => void,
|
|
185
185
|
onFail: (reason?: unknown) => void
|
|
186
|
-
) =>
|
|
187
|
-
|
|
186
|
+
): AppThunk =>
|
|
187
|
+
dispatch => {
|
|
188
188
|
if (!isDeviceInDFUBootloader(device)) {
|
|
189
189
|
dispatch(
|
|
190
190
|
switchToDeviceMode(
|
|
@@ -210,22 +210,28 @@ export const switchToApplicationMode =
|
|
|
210
210
|
device: Device,
|
|
211
211
|
onSuccess: (device: Device) => void,
|
|
212
212
|
onFail: (reason?: unknown) => void
|
|
213
|
-
) =>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
213
|
+
): AppThunk =>
|
|
214
|
+
dispatch => {
|
|
215
|
+
if (isDeviceInDFUBootloader(device)) {
|
|
216
|
+
dispatch(
|
|
217
|
+
switchToDeviceMode(
|
|
218
|
+
device,
|
|
219
|
+
'NRFDL_MCU_STATE_APPLICATION',
|
|
220
|
+
d => {
|
|
221
|
+
if (isDeviceInDFUBootloader(d))
|
|
222
|
+
onFail(
|
|
223
|
+
new Error(
|
|
224
|
+
'Failed to switch to Application Mode'
|
|
225
|
+
)
|
|
226
|
+
);
|
|
227
|
+
else onSuccess(d);
|
|
228
|
+
},
|
|
229
|
+
onFail
|
|
230
|
+
)
|
|
231
|
+
);
|
|
232
|
+
} else {
|
|
233
|
+
onSuccess(device);
|
|
234
|
+
}
|
|
229
235
|
};
|
|
230
236
|
|
|
231
237
|
const isLatestBootloader = async (device: Device) => {
|
|
@@ -253,8 +259,8 @@ const askAndUpdateBootloader =
|
|
|
253
259
|
onSuccess: (device: Device) => void,
|
|
254
260
|
onFail: (reason?: unknown) => void,
|
|
255
261
|
onProgress: (progress: number, message?: string) => void
|
|
256
|
-
) =>
|
|
257
|
-
|
|
262
|
+
): AppThunk =>
|
|
263
|
+
dispatch => {
|
|
258
264
|
dispatch(
|
|
259
265
|
switchToBootloaderMode(
|
|
260
266
|
device,
|
|
@@ -413,8 +419,8 @@ const programInDFUBootloader =
|
|
|
413
419
|
onProgress: (progress: number, message?: string) => void,
|
|
414
420
|
onSuccess: (device: Device) => void,
|
|
415
421
|
onFail: (reason?: unknown) => void
|
|
416
|
-
) =>
|
|
417
|
-
async
|
|
422
|
+
): AppThunk<RootState, Promise<void>> =>
|
|
423
|
+
async dispatch => {
|
|
418
424
|
logger.debug(
|
|
419
425
|
`${device.serialNumber} on ${device.serialport?.comName} is now in DFU-Bootloader...`
|
|
420
426
|
);
|
|
@@ -526,8 +532,8 @@ const programDeviceWithFw =
|
|
|
526
532
|
device: Device,
|
|
527
533
|
selectedFw: DfuEntry,
|
|
528
534
|
onProgress: (progress: number, message?: string) => void
|
|
529
|
-
) =>
|
|
530
|
-
|
|
535
|
+
): AppThunk<RootState, Promise<Device>> =>
|
|
536
|
+
dispatch =>
|
|
531
537
|
new Promise<Device>((resolve, reject) => {
|
|
532
538
|
const action = (d: Device) => {
|
|
533
539
|
dispatch(
|
|
@@ -560,7 +566,7 @@ export const sdfuDeviceSetup = (
|
|
|
560
566
|
dfuFirmware.map(firmwareOption => ({
|
|
561
567
|
key: firmwareOption.key,
|
|
562
568
|
description: firmwareOption.description,
|
|
563
|
-
programDevice: onProgress =>
|
|
569
|
+
programDevice: onProgress => dispatch =>
|
|
564
570
|
dispatch(
|
|
565
571
|
programDeviceWithFw(device, firmwareOption, onProgress)
|
|
566
572
|
),
|
|
@@ -577,12 +583,12 @@ export const sdfuDeviceSetup = (
|
|
|
577
583
|
|
|
578
584
|
const { semVer } = device.dfuTriggerVersion;
|
|
579
585
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
}
|
|
586
|
+
resolve({
|
|
587
|
+
device,
|
|
588
|
+
validFirmware:
|
|
589
|
+
dfuFirmware.filter(fw => fw.semver === semVer).length >
|
|
590
|
+
0,
|
|
591
|
+
});
|
|
586
592
|
} else {
|
|
587
593
|
resolve({
|
|
588
594
|
device,
|
|
@@ -590,7 +596,7 @@ export const sdfuDeviceSetup = (
|
|
|
590
596
|
});
|
|
591
597
|
}
|
|
592
598
|
}),
|
|
593
|
-
tryToSwitchToApplicationMode: device =>
|
|
599
|
+
tryToSwitchToApplicationMode: device => dispatch =>
|
|
594
600
|
new Promise<Device>((resolve, reject) => {
|
|
595
601
|
dispatch(switchToApplicationMode(device, resolve, reject));
|
|
596
602
|
}),
|
package/src/Dialog/dialog.scss
CHANGED
|
@@ -1,83 +1,15 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
3
|
*
|
|
4
4
|
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
@import '../../styles';
|
|
8
8
|
|
|
9
|
-
$dropdown-item-height: 24px; //px unit dependency in dropdown.tsx
|
|
10
|
-
|
|
11
|
-
:export {
|
|
12
|
-
dropdownItemHeight: $dropdown-item-height;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.container {
|
|
16
|
-
position: relative;
|
|
17
|
-
width: 100%;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.label {
|
|
21
|
-
font-size: 12px;
|
|
22
|
-
margin-bottom: 4px !important;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
.btn {
|
|
26
|
-
width: 100%;
|
|
27
|
-
height: 32px;
|
|
28
|
-
padding: 0 8px;
|
|
29
|
-
background: $gray-700;
|
|
30
|
-
color: $white;
|
|
31
|
-
display: flex;
|
|
32
|
-
justify-content: space-between;
|
|
33
|
-
align-items: center;
|
|
34
|
-
border: none;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.mdi {
|
|
38
|
-
font-size: 18px;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.btnActive .mdi {
|
|
42
|
-
transform: rotate(180deg);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
9
|
.content {
|
|
46
|
-
background: $gray-700;
|
|
47
|
-
color: $white;
|
|
48
|
-
position: absolute;
|
|
49
|
-
width: 100%;
|
|
50
|
-
right: 0;
|
|
51
|
-
padding: 0;
|
|
52
|
-
border-top: solid 2px $gray-600;
|
|
53
|
-
z-index: 2;
|
|
54
|
-
|
|
55
10
|
&[data-height='true'] {
|
|
56
|
-
overflow-y: scroll; // Make Scroll Fixed Height
|
|
11
|
+
overflow-y: scroll; // Make Scroll Fixed Height Scrollable
|
|
57
12
|
|
|
58
13
|
@include scrollbars($gray-700);
|
|
59
14
|
}
|
|
60
15
|
}
|
|
61
|
-
|
|
62
|
-
.itemsInactive {
|
|
63
|
-
display: none;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.item {
|
|
67
|
-
color: $white;
|
|
68
|
-
padding: 4px 8px;
|
|
69
|
-
height: $dropdown-item-height;
|
|
70
|
-
background-color: transparent;
|
|
71
|
-
border: 0;
|
|
72
|
-
width: 100%;
|
|
73
|
-
text-align: inherit;
|
|
74
|
-
display: block;
|
|
75
|
-
clear: both;
|
|
76
|
-
font-weight: 400;
|
|
77
|
-
white-space: nowrap;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.item:hover,
|
|
81
|
-
.item:focus {
|
|
82
|
-
background: $gray-600;
|
|
83
|
-
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import React, { useState } from 'react';
|
|
8
8
|
import FormLabel from 'react-bootstrap/FormLabel';
|
|
9
9
|
|
|
10
|
+
import classNames from '../utils/classNames';
|
|
11
|
+
|
|
10
12
|
import styles from './Dropdown.module.scss';
|
|
11
13
|
|
|
12
14
|
export interface DropdownItem {
|
|
@@ -22,6 +24,7 @@ export interface DropdownProps {
|
|
|
22
24
|
disabled?: boolean;
|
|
23
25
|
selectedItem: DropdownItem;
|
|
24
26
|
numItemsBeforeScroll?: number;
|
|
27
|
+
className?: string;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
export default ({
|
|
@@ -32,6 +35,7 @@ export default ({
|
|
|
32
35
|
disabled = false,
|
|
33
36
|
selectedItem,
|
|
34
37
|
numItemsBeforeScroll = 0,
|
|
38
|
+
className = '',
|
|
35
39
|
}: DropdownProps) => {
|
|
36
40
|
const [isActive, setIsActive] = useState(false);
|
|
37
41
|
|
|
@@ -42,20 +46,20 @@ export default ({
|
|
|
42
46
|
|
|
43
47
|
return (
|
|
44
48
|
<div
|
|
45
|
-
className={
|
|
49
|
+
className={`tw-preflight tw-relative tw-w-full ${className}`}
|
|
46
50
|
onBlur={event => {
|
|
47
51
|
if (!event.currentTarget.contains(event.relatedTarget)) {
|
|
48
52
|
setIsActive(false);
|
|
49
53
|
}
|
|
50
54
|
}}
|
|
51
55
|
>
|
|
52
|
-
{label &&
|
|
56
|
+
{label && (
|
|
57
|
+
<FormLabel className="tw-mb-1 tw-text-xs">{label}</FormLabel>
|
|
58
|
+
)}
|
|
53
59
|
<button
|
|
54
60
|
id={id}
|
|
55
61
|
type="button"
|
|
56
|
-
className=
|
|
57
|
-
isActive ? styles.btnActive : styles.btnInactive
|
|
58
|
-
}`}
|
|
62
|
+
className="tw-flex tw-h-8 tw-w-full tw-items-center tw-justify-between tw-border-0 tw-bg-gray-700 tw-px-2 tw-text-white"
|
|
59
63
|
onClick={() => setIsActive(!isActive)}
|
|
60
64
|
disabled={disabled}
|
|
61
65
|
>
|
|
@@ -64,7 +68,11 @@ export default ({
|
|
|
64
68
|
? ''
|
|
65
69
|
: selectedItem.label}
|
|
66
70
|
</span>
|
|
67
|
-
<span
|
|
71
|
+
<span
|
|
72
|
+
className={`mdi mdi-chevron-down tw-text-lg ${classNames(
|
|
73
|
+
isActive && 'tw-rotate-180'
|
|
74
|
+
)}`}
|
|
75
|
+
/>
|
|
68
76
|
</button>
|
|
69
77
|
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- We need an interactive handler as described below */}
|
|
70
78
|
<div
|
|
@@ -75,10 +83,7 @@ export default ({
|
|
|
75
83
|
style={
|
|
76
84
|
numItemsBeforeScroll > 0
|
|
77
85
|
? {
|
|
78
|
-
maxHeight: `${
|
|
79
|
-
numItemsBeforeScroll *
|
|
80
|
-
Number.parseInt(styles.dropdownItemHeight, 10)
|
|
81
|
-
}px`,
|
|
86
|
+
maxHeight: `${numItemsBeforeScroll * 24}px`,
|
|
82
87
|
}
|
|
83
88
|
: {}
|
|
84
89
|
}
|
|
@@ -86,14 +91,15 @@ export default ({
|
|
|
86
91
|
numItemsBeforeScroll > 0 &&
|
|
87
92
|
items.length > numItemsBeforeScroll
|
|
88
93
|
}
|
|
89
|
-
className={
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
className={`tw-text-while tw-absolute tw-right-0 tw-z-10 tw-w-full tw-border-t-2 tw-border-solid tw-border-gray-600 tw-bg-gray-700 tw-p-0 ${classNames(
|
|
95
|
+
styles.content,
|
|
96
|
+
!isActive && 'tw-hidden'
|
|
97
|
+
)}`}
|
|
92
98
|
>
|
|
93
99
|
{items.map(item => (
|
|
94
100
|
<button
|
|
95
101
|
type="button"
|
|
96
|
-
className=
|
|
102
|
+
className="tw-bg-transparent tw-clear-both tw-block tw-h-6 tw-w-full tw-whitespace-nowrap tw-border-0 tw-px-2 tw-py-1 tw-text-left tw-font-normal tw-text-white hover:tw-bg-gray-600 focus:tw-bg-gray-600"
|
|
97
103
|
key={item.value}
|
|
98
104
|
onClick={() => onClickItem(item)}
|
|
99
105
|
>
|
|
@@ -5,23 +5,16 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import React from 'react';
|
|
8
|
-
import
|
|
9
|
-
import { fireEvent, screen, waitFor } from '@testing-library/react';
|
|
8
|
+
import { fireEvent, screen } from '@testing-library/react';
|
|
10
9
|
|
|
11
10
|
import render from '../../test/testrenderer';
|
|
12
11
|
import { getAppSpecificStore as store } from '../utils/persistentStore';
|
|
13
12
|
import { generateSystemReport } from '../utils/systemReport';
|
|
14
13
|
import ErrorBoundary from './ErrorBoundary';
|
|
15
14
|
|
|
16
|
-
const mockReactGA = reactGA;
|
|
17
|
-
|
|
18
15
|
jest.mock('../utils/systemReport');
|
|
19
|
-
jest.mock('react-ga');
|
|
20
16
|
jest.mock('../utils/usageData', () => ({
|
|
21
17
|
...jest.requireActual('../utils/usageData'),
|
|
22
|
-
init: jest.fn(() => {
|
|
23
|
-
mockReactGA.initialize('');
|
|
24
|
-
}),
|
|
25
18
|
sendErrorReport: jest.fn(),
|
|
26
19
|
isEnabled: () => true,
|
|
27
20
|
}));
|
|
@@ -50,16 +43,6 @@ describe('ErrorBoundary', () => {
|
|
|
50
43
|
jest.clearAllMocks();
|
|
51
44
|
});
|
|
52
45
|
|
|
53
|
-
it('should send GA event', async () => {
|
|
54
|
-
render(
|
|
55
|
-
<ErrorBoundary>
|
|
56
|
-
<Child />
|
|
57
|
-
</ErrorBoundary>
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
await waitFor(() => expect(reactGA.initialize).toHaveBeenCalled());
|
|
61
|
-
});
|
|
62
|
-
|
|
63
46
|
it('can take custom reporting functions', () => {
|
|
64
47
|
const sendUsageData = jest.fn();
|
|
65
48
|
|