From 76b4a393c0cb93a8575123a6a9d8d04828c47f33 Mon Sep 17 00:00:00 2001 From: Darya Plotnytska Date: Wed, 27 Aug 2025 17:39:53 +0200 Subject: [PATCH 01/17] console: Add mac settings profiles list and create form --- .../components/mac-settings-section/index.js | 135 ++-- .../wifi-profiles/overview.js | 1 - .../form-validation.js | 330 +++++++++ .../mac-settings-profile-form/index.js | 636 ++++++++++++++++++ .../mac-settings-profiles-table/index.js | 116 ++++ .../sidebar/navigation/app-side-navigation.js | 6 + .../store/actions/mac-settings-profiles.js | 47 ++ .../console/store/middleware/logics/index.js | 2 + .../logics/mac-settings-profiles.js | 48 ++ pkg/webui/console/store/reducers/index.js | 7 + .../store/reducers/mac-settings-profiles.js | 51 ++ .../store/selectors/mac-settings-profiles.js | 30 + .../index.js | 55 ++ .../index.js | 64 ++ .../index.js | 62 ++ pkg/webui/console/views/application/index.js | 2 + pkg/webui/lib/selectors/id.js | 3 + pkg/webui/lib/shared-messages.js | 44 ++ pkg/webui/locales/en.json | 89 +-- pkg/webui/locales/ja.json | 87 +-- sdk/js/src/index.js | 2 + .../network-server-mac-settings-profiles.js | 50 ++ 22 files changed, 1693 insertions(+), 174 deletions(-) create mode 100644 pkg/webui/console/containers/mac-settings-profile-form/form-validation.js create mode 100644 pkg/webui/console/containers/mac-settings-profile-form/index.js create mode 100644 pkg/webui/console/containers/mac-settings-profiles-table/index.js create mode 100644 pkg/webui/console/store/actions/mac-settings-profiles.js create mode 100644 pkg/webui/console/store/middleware/logics/mac-settings-profiles.js create mode 100644 pkg/webui/console/store/reducers/mac-settings-profiles.js create mode 100644 pkg/webui/console/store/selectors/mac-settings-profiles.js create mode 100644 pkg/webui/console/views/application-mac-settings-profile-add/index.js create mode 100644 pkg/webui/console/views/application-mac-settings-profiles-list/index.js create mode 100644 pkg/webui/console/views/application-mac-settings-profiles/index.js create mode 100644 sdk/js/src/service/network-server-mac-settings-profiles.js diff --git a/pkg/webui/console/components/mac-settings-section/index.js b/pkg/webui/console/components/mac-settings-section/index.js index 979a2f865e..c14b283eb4 100644 --- a/pkg/webui/console/components/mac-settings-section/index.js +++ b/pkg/webui/console/components/mac-settings-section/index.js @@ -13,7 +13,6 @@ // limitations under the License. import React, { useCallback } from 'react' -import { defineMessages } from 'react-intl' import { createSelector } from 'reselect' import { useSelector } from 'react-redux' import { get, set } from 'lodash' @@ -45,50 +44,6 @@ import getDataRate from '@console/lib/data-rate-utils' import { selectDataRates } from '@console/store/selectors/configuration' -const m = defineMessages({ - delayValue: '{count, plural, one {{count} second} other {{count} seconds}}', - factoryPresetFreqDescription: 'List of factory-preset frequencies. Note: order is respected.', - advancedMacSettings: 'Advanced MAC settings', - desiredPingSlotFrequencyTitle: 'Desired ping slot frequency', - pingSlotPeriodicityDescription: 'Periodicity of the class B ping slot', - pingSlotDataRateTitle: 'Ping slot data rate index', - desiredPingSlotDataRateTitle: 'Desired ping slot data rate', - resetWarning: 'Resetting is insecure and makes your device susceptible for replay attacks', - desiredRx1DataRateOffsetTitle: 'Desired Rx1 data rate offset', - desiredRx1DelayTitle: 'Desired Rx1 delay', - rx2DataRateIndexTitle: 'Rx2 data rate index', - desiredRx2DataRateIndexTitle: 'Desired Rx2 data rate index', - desiredRx2FrequencyTitle: 'Desired Rx2 frequency', - updateSuccess: 'The MAC settings updated', - desiredBeaconFrequency: 'Desired beacon frequency', - maxDutyCycle: 'Maximum duty cycle', - desiredMaxDutyCycle: 'Desired maximum duty cycle', - adrMargin: 'ADR margin', - adrUplinks: 'ADR number of transmissions', - adrAdaptiveDataRate: 'Adaptive data rate (ADR)', - adrDataRate: 'ADR data rate index', - adrTransPower: 'ADR transmission power index', - adrDynamic: 'Dynamic mode', - adrStatic: 'Static mode', - desiredAdrAckLimit: 'Desired ADR ack limit', - desiredAdrAckDelay: 'Desired ADR ack delay', - adrAckValue: '{count, plural, one {every message} other {every {count} messages}}', - statusCountPeriodicity: 'Status count periodicity', - statusTimePeriodicity: 'Status time periodicity', - dataRate: 'Data Rate {n}', - dataRatePlaceholder: 'Data Rate', - minNbTrans: 'Min. NbTrans', - maxNbTrans: 'Max. NbTrans', - useDefaultNbTrans: 'Use default settings for number of retransmissions', - adrNbTrans: 'ADR number of retransmissions (NbTrans)', - overrideNbTrans: 'Override server defaults for NbTrans (all data rates)', - defaultForAllRates: '(Default for all data rates)', - defaultNbTransMessage: - 'Overriding the default is not required for using data rate overrides (below)', - specificOverrides: 'Data rate specific overrides', - addSpecificOverride: 'Add data rate specific override', -}) - // 0...7 const pingSlotPeriodicityOptions = Array.from({ length: 8 }, (_, index) => { const value = Math.pow(2, index) @@ -104,7 +59,7 @@ const adrAckLimitOptions = Array.from({ length: 16 }, (_, index) => { return { value: `ADR_ACK_LIMIT_${value}`, - label: , + label: , } }) // 0...15 @@ -113,7 +68,7 @@ const adrAckDelayOptions = Array.from({ length: 16 }, (_, index) => { return { value: `ADR_ACK_DELAY_${value}`, - label: , + label: , } }) const maxDutyCycleOptions = [ @@ -162,8 +117,8 @@ const MacSettingsSection = props => { const isABP = activationMode === ACTIVATION_MODES.ABP const isMulticast = activationMode === ACTIVATION_MODES.MULTICAST const isOTAA = activationMode === ACTIVATION_MODES.OTAA - const isDynamicAdr = mac_settings.adr && 'dynamic' in mac_settings.adr - const isStaticAdr = mac_settings.adr && 'static' in mac_settings.adr + const isDynamicAdr = mac_settings?.adr && 'dynamic' in mac_settings?.adr + const isStaticAdr = mac_settings?.adr && 'static' in mac_settings?.adr const [resetsFCnt, setResetsFCnt] = React.useState(isABP && initialFCnt) const handleResetsFCntChange = React.useCallback(evt => { const { checked } = evt.target @@ -190,9 +145,9 @@ const MacSettingsSection = props => { } }, [handleIsCollapsedChange, isABP, isClassB, isCollapsed, isMulticast, pingPeriodicityRequired]) - const adrOverrides = mac_settings.adr.dynamic?.overrides - const showEditNbTrans = !values.mac_settings.adr.dynamic?._use_default_nb_trans - const defaultNbTransDisabled = !values.mac_settings.adr.dynamic?._override_nb_trans_defaults + const adrOverrides = mac_settings?.adr.dynamic?.overrides + const showEditNbTrans = !values.mac_settings?.adr.dynamic?._use_default_nb_trans + const defaultNbTransDisabled = !values.mac_settings?.adr.dynamic?._override_nb_trans_defaults const addOverride = React.useCallback(() => { const newOverride = { _data_rate_index: '', min_nb_trans: '', max_nb_trans: '' } setFieldValue( @@ -252,7 +207,7 @@ const MacSettingsSection = props => { return ( { )} {!isMulticast && ( } @@ -317,7 +272,7 @@ const MacSettingsSection = props => { )} {!isMulticast && ( { { {!isOTAA && ( { )} {!isMulticast && ( { type="number" min={100000} step={100} - title={m.desiredRx2FrequencyTitle} + title={sharedMessages.desiredRx2FrequencyTitle} name="mac_settings.desired_rx2_frequency" component={UnitInput.Hertz} tooltipId={tooltipIds.RX2_FREQUENCY} @@ -398,7 +353,7 @@ const MacSettingsSection = props => { {!isOTAA && ( { )} {!isMulticast && ( { name="mac_settings.factory_preset_frequencies" component={KeyValueMap} title={sharedMessages.factoryPresetFrequencies} - description={m.factoryPresetFreqDescription} + description={sharedMessages.factoryPresetFreqDescription} addMessage={sharedMessages.freqAdd} valuePlaceholder={sharedMessages.frequencyPlaceholder} tooltipId={tooltipIds.FACTORY_PRESET_FREQUENCIES} @@ -451,7 +406,7 @@ const MacSettingsSection = props => { /> { { type="number" min={100000} step={100} - title={m.desiredPingSlotFrequencyTitle} + title={sharedMessages.desiredPingSlotFrequencyTitle} placeholder={sharedMessages.frequencyPlaceholder} name="mac_settings.desired_ping_slot_frequency" tooltipId={tooltipIds.PING_SLOT_FREQUENCY} @@ -516,7 +471,7 @@ const MacSettingsSection = props => { {!isOTAA && ( { )} {!isMulticast && ( { )} } @@ -555,7 +510,7 @@ const MacSettingsSection = props => { tooltipId={tooltipIds.STATUS_COUNT_PERIODICITY} /> { - - + + {isDynamicAdr && ( <> { append="dB" /> { {showEditNbTrans && ( <> { className="d-flex direction-column" /> { inputWidth="xs" className="d-flex direction-column" /> - + {!defaultNbTransDisabled && (
- +
)} @@ -643,7 +598,7 @@ const MacSettingsSection = props => { Object.keys(adrOverrides).map(index => ( { className="d-flex direction-column" /> { max={3} /> { ))}