From e051752b68cf6d62d07a1ece70bf566e079d0070 Mon Sep 17 00:00:00 2001 From: Loup Theron Date: Wed, 14 Aug 2024 10:28:03 +0200 Subject: [PATCH] Add is at port flag on vessel positions --- .../domain/entities/position/Position.kt | 1 + .../api/outputs/PositionDataOutput.kt | 2 ++ .../database/entities/PositionEntity.kt | 3 +++ .../interfaces/DBPositionRepository.kt | 9 +++++--- .../V666.1__Insert_dummy_positions.sql | 3 +++ .../vessel_sidebar/control_buttons.spec.ts | 2 ++ .../cypress/e2e/vessels/vessels_list.spec.ts | 2 +- .../track/__tests__/__mocks__/vesselTrack.ts | 23 +++++++++++++++++++ .../vesselTrackWithDuplicatePositions.ts | 14 +++++++++++ .../vessel/track/__tests__/index.test.ts | 1 + frontend/src/domain/entities/vessel/types.ts | 1 + .../actions/TrackRequest/ExportTrack.tsx | 6 ++++- .../TrackRequest/HighlightPositionCell.tsx | 15 ++++++++++-- .../actions/TrackRequest/constants.tsx | 9 ++++++-- 14 files changed, 82 insertions(+), 9 deletions(-) diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/position/Position.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/position/Position.kt index 1aefc22503..284c3368aa 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/position/Position.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/position/Position.kt @@ -21,6 +21,7 @@ data class Position( val positionType: PositionType, val isManual: Boolean? = null, val isFishing: Boolean? = null, + val isAtPort: Boolean? = null, val latitude: Double, val longitude: Double, diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/api/outputs/PositionDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/api/outputs/PositionDataOutput.kt index 2140a3c16a..b5af90a0cc 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/api/outputs/PositionDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/api/outputs/PositionDataOutput.kt @@ -23,6 +23,7 @@ data class PositionDataOutput( val positionType: PositionType, val isManual: Boolean? = null, val isFishing: Boolean? = null, + val isAtPort: Boolean? = null, ) { companion object { fun fromPosition(position: Position): PositionDataOutput { @@ -44,6 +45,7 @@ data class PositionDataOutput( positionType = position.positionType, isManual = position.isManual, isFishing = position.isFishing, + isAtPort = position.isAtPort, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/entities/PositionEntity.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/entities/PositionEntity.kt index 34b11f1ecd..a931e72572 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/entities/PositionEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/entities/PositionEntity.kt @@ -42,6 +42,8 @@ data class PositionEntity( val isManual: Boolean? = false, @Column(name = "is_fishing") val isFishing: Boolean? = false, + @Column(name = "is_at_port") + val isAtPort: Boolean? = null, // Mandatory fields @Enumerated(EnumType.STRING) @@ -78,6 +80,7 @@ data class PositionEntity( positionType = positionType, isManual = isManual, isFishing = isFishing, + isAtPort = isAtPort, ) companion object { diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/repositories/interfaces/DBPositionRepository.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/repositories/interfaces/DBPositionRepository.kt index 49748dfcfa..e92b005086 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/repositories/interfaces/DBPositionRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/infrastructure/database/repositories/interfaces/DBPositionRepository.kt @@ -28,7 +28,8 @@ interface DBPositionRepository : CrudRepository { "p.course, " + "p.position_type, " + "p.is_manual, " + - "p.is_fishing " + + "p.is_fishing, " + + "p.is_at_port " + "from positions p " + "where p.internal_reference_number = :internalReferenceNumber " + "and p.date_time >= :from " + @@ -61,7 +62,8 @@ interface DBPositionRepository : CrudRepository { "p.course, " + "p.position_type, " + "p.is_manual, " + - "p.is_fishing " + + "p.is_fishing, " + + "p.is_at_port " + "from positions p " + "where p.external_reference_number = :externalReferenceNumber " + "and p.date_time >= :from " + @@ -94,7 +96,8 @@ interface DBPositionRepository : CrudRepository { "p.course, " + "p.position_type, " + "p.is_manual, " + - "p.is_fishing " + + "p.is_fishing, " + + "p.is_at_port " + "from positions p " + "where p.ircs = :ircs " + "and p.date_time >= :from " + diff --git a/backend/src/main/resources/db/testdata/V666.1__Insert_dummy_positions.sql b/backend/src/main/resources/db/testdata/V666.1__Insert_dummy_positions.sql index 8c2e3668c2..89648c9214 100644 --- a/backend/src/main/resources/db/testdata/V666.1__Insert_dummy_positions.sql +++ b/backend/src/main/resources/db/testdata/V666.1__Insert_dummy_positions.sql @@ -69278,3 +69278,6 @@ INSERT INTO POSITIONS (INTERNAL_REFERENCE_NUMBER, EXTERNAL_REFERENCE_NUMBER, MMS ('U_W0NTFINDME','ABC123456',null,'TALK2ME','MALOTRU','FR','FR','DE',null,57.348,-21.219,7.5,11,(now() AT TIME ZONE 'UTC')::TIMESTAMP - interval '20 days 9 hours','VMS'), ('U_W0NTFINDME','ABC123456',null,'TALK2ME','MALOTRU','FR','FR','DE',null,57.64,-21.117,8.6,17,(now() AT TIME ZONE 'UTC')::TIMESTAMP - interval '20 days 3 hours','VMS'); +update positions +set is_at_port = true +where INTERNAL_REFERENCE_NUMBER = 'FAK000999999' and date_time < (now() AT TIME ZONE 'UTC')::TIMESTAMP - interval '22 hours'; diff --git a/frontend/cypress/e2e/vessel_sidebar/control_buttons.spec.ts b/frontend/cypress/e2e/vessel_sidebar/control_buttons.spec.ts index c07dd1e3bb..82e9e83f68 100644 --- a/frontend/cypress/e2e/vessel_sidebar/control_buttons.spec.ts +++ b/frontend/cypress/e2e/vessel_sidebar/control_buttons.spec.ts @@ -43,6 +43,8 @@ context('Vessel sidebar controls buttons', () => { // The table should be sorted in ascending datetime order cy.get('.Table-SimpleTable').contains('GDH').click() cy.get('[data-id="0"] > td').eq(2).contains('8.7 nds') + cy.get('[data-id="0"] > td').eq(1).find('[title="Position au port"]').should('exist') + cy.get('[data-id="0"] > td').eq(1).find('[title="Position manuelle (4h-report)"]').should('exist') }) it('Vessel track dates Should be changed When walking in fishing trips', () => { diff --git a/frontend/cypress/e2e/vessels/vessels_list.spec.ts b/frontend/cypress/e2e/vessels/vessels_list.spec.ts index a5f0c5d123..ac1752a52e 100644 --- a/frontend/cypress/e2e/vessels/vessels_list.spec.ts +++ b/frontend/cypress/e2e/vessels/vessels_list.spec.ts @@ -93,7 +93,7 @@ context('Vessels list', () => { return cy .readFile(`cypress/downloads/${downloadedCSVFilename}`) - .should('contains', 'Quartier,CFR,C/S,Nom,GDH (UTC),MMSI,Latitude,Longitude,Cap,Vitesse') + .should('contains', 'Quartier,CFR,C/S,Nom,GDH (UTC),MMSI,Latitude,Longitude,Cap,Vitesse,Au port') .should('contains', '"Duval","ABC000021309","","GENS SAISON PARMI"') .should('contains', '"","48°43′41″N","002°44′53″W"') }) diff --git a/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrack.ts b/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrack.ts index cbb333c2cb..8b07d9b844 100644 --- a/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrack.ts +++ b/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrack.ts @@ -8,6 +8,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: true, isManual: null, latitude: 46.386, @@ -27,6 +28,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: true, isManual: null, latitude: 46.43, @@ -46,6 +48,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: null, isManual: null, latitude: 46.458, @@ -65,6 +68,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: null, isManual: null, latitude: 46.486, @@ -84,6 +88,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: null, isManual: null, latitude: 46.471, @@ -103,6 +108,7 @@ export const DUMMY_VESSEL_TRACK = [ from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: false, isFishing: null, isManual: null, latitude: 46.45, @@ -125,6 +131,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -144,6 +151,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -163,6 +171,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -182,6 +191,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -201,6 +211,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -220,6 +231,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -239,6 +251,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -258,6 +271,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -277,6 +291,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -296,6 +311,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -315,6 +331,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -334,6 +351,7 @@ export const VESSEL_TRACK_ALL_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -356,6 +374,7 @@ export const VESSEL_TRACK_FEW_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2948, @@ -375,6 +394,7 @@ export const VESSEL_TRACK_FEW_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -394,6 +414,7 @@ export const VESSEL_TRACK_FEW_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -413,6 +434,7 @@ export const VESSEL_TRACK_FEW_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2942, @@ -432,6 +454,7 @@ export const VESSEL_TRACK_FEW_SAME_COORDINATES = [ from: 'FR', internalReferenceNumber: 'FRA000915733', ircs: 'FW7667', + isAtPort: false, isFishing: false, isManual: false, latitude: 43.2953, diff --git a/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrackWithDuplicatePositions.ts b/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrackWithDuplicatePositions.ts index 423d02e4c8..0f623f3af2 100644 --- a/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrackWithDuplicatePositions.ts +++ b/frontend/src/domain/entities/vessel/track/__tests__/__mocks__/vesselTrackWithDuplicatePositions.ts @@ -8,6 +8,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -27,6 +28,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -46,6 +48,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7941, @@ -65,6 +68,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -84,6 +88,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -103,6 +108,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -122,6 +128,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -141,6 +148,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -160,6 +168,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -179,6 +188,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7936, @@ -198,6 +208,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7481, @@ -217,6 +228,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: false, isManual: false, latitude: 47.7048, @@ -236,6 +248,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: true, isManual: false, latitude: 47.6723, @@ -255,6 +268,7 @@ export const DUMMY_VESSEL_TRACK_WITH_DUPLICATE_POSITIONS = [ from: 'FR', internalReferenceNumber: 'FRA000703653', ircs: 'FLIM', + isAtPort: false, isFishing: true, isManual: false, latitude: 47.6432, diff --git a/frontend/src/domain/entities/vessel/track/__tests__/index.test.ts b/frontend/src/domain/entities/vessel/track/__tests__/index.test.ts index 62c6213823..142885e2f0 100644 --- a/frontend/src/domain/entities/vessel/track/__tests__/index.test.ts +++ b/frontend/src/domain/entities/vessel/track/__tests__/index.test.ts @@ -44,6 +44,7 @@ describe('vessel/track', () => { from: 'FR', internalReferenceNumber: 'ABC000898396', ircs: 'ZBRI', + isAtPort: null, isFishing: null, isManual: null, latitude: 46.386, diff --git a/frontend/src/domain/entities/vessel/types.ts b/frontend/src/domain/entities/vessel/types.ts index ec99b10f9c..077450e0dd 100644 --- a/frontend/src/domain/entities/vessel/types.ts +++ b/frontend/src/domain/entities/vessel/types.ts @@ -129,6 +129,7 @@ export type VesselPosition = { from: string internalReferenceNumber: string | null ircs: string | null + isAtPort: boolean | null isFishing: boolean | null isManual: boolean | null latitude: number diff --git a/frontend/src/features/VesselSidebar/actions/TrackRequest/ExportTrack.tsx b/frontend/src/features/VesselSidebar/actions/TrackRequest/ExportTrack.tsx index 1925de148e..c16df61dad 100644 --- a/frontend/src/features/VesselSidebar/actions/TrackRequest/ExportTrack.tsx +++ b/frontend/src/features/VesselSidebar/actions/TrackRequest/ExportTrack.tsx @@ -75,7 +75,11 @@ export function ExportTrack() { latitude: 'Latitude', longitude: 'Longitude', course: 'Cap', - speed: 'Vitesse' + speed: 'Vitesse', + isAtPort: { + label: 'Au port', + transform: position => (position.isAtPort ? 'Oui' : 'Non') + } } /* eslint-enable sort-keys-fix/sort-keys-fix */ diff --git a/frontend/src/features/VesselSidebar/actions/TrackRequest/HighlightPositionCell.tsx b/frontend/src/features/VesselSidebar/actions/TrackRequest/HighlightPositionCell.tsx index 7cb68a2cbe..3e469c78bf 100644 --- a/frontend/src/features/VesselSidebar/actions/TrackRequest/HighlightPositionCell.tsx +++ b/frontend/src/features/VesselSidebar/actions/TrackRequest/HighlightPositionCell.tsx @@ -1,5 +1,6 @@ import { useMainAppDispatch } from '@hooks/useMainAppDispatch' import { useMainAppSelector } from '@hooks/useMainAppSelector' +import { Icon } from '@mtes-mct/monitor-ui' import { transform } from 'ol/proj' import styled from 'styled-components' @@ -12,11 +13,17 @@ import ManualPositionSVG from '../../../icons/Pastille_position_manuelle.svg?rea import type { VesselPosition } from '../../../../domain/entities/vessel/types' type HighlightPositionCellProps = { + isAtPortPositionMarkerShowed?: boolean isManualPositionMarkerShowed?: boolean row: VesselPosition value: unknown } -export function HighlightPositionCell({ isManualPositionMarkerShowed, row, value }: HighlightPositionCellProps) { +export function HighlightPositionCell({ + isAtPortPositionMarkerShowed, + isManualPositionMarkerShowed, + row, + value +}: HighlightPositionCellProps) { const dispatch = useMainAppDispatch() const coordinatesFormat = useMainAppSelector(state => state.map.coordinatesFormat) @@ -35,11 +42,15 @@ export function HighlightPositionCell({ isManualPositionMarkerShowed, row, value > {(value ?? '') as string} {isManualPositionMarkerShowed && row.isManual ? : ''} + {isAtPortPositionMarkerShowed && row.isAtPort ? : ''} ) } +const StyledAnchor = styled(Icon.Anchor)` + margin-left: 3px; +` + const ManualPosition = styled(ManualPositionSVG)` margin-left: 3px; - vertical-align: sub; ` diff --git a/frontend/src/features/VesselSidebar/actions/TrackRequest/constants.tsx b/frontend/src/features/VesselSidebar/actions/TrackRequest/constants.tsx index c6f8b54f2c..59d7fb7a02 100644 --- a/frontend/src/features/VesselSidebar/actions/TrackRequest/constants.tsx +++ b/frontend/src/features/VesselSidebar/actions/TrackRequest/constants.tsx @@ -19,12 +19,17 @@ export const POSITION_TABLE_COLUMNS: Array getLocalizedDayjs(row.dateTime).format('YYYY-MM-DD[T]HH:mm:ss[Z]'), cell: info => ( - + ), enableSorting: true, header: 'GDH', id: 'dateTime', - size: 160 + size: 170 }, { accessorFn: row => (isNumeric(row.speed) ? `${row.speed} nds` : '-'),