import React, { useEffect, useState } from 'react'; import * as DataTable from 'app/shared/modules/tables/dataTable/dataTable'; import dataTableHelper, { columnWidth } from 'app/shared/modules/tables/dataTable/dataTable.helper'; import { useSelector, useDispatch } from 'react-redux'; import * as Text from 'app/shared/components/text/text'; import { CellDataType, CellValueType } from 'app/shared/modules/tables/dataTable/dataTable.types'; import { VesselEarnings } from '../store/earnings.types'; import { selectActivePoolId, selectEarnings, selectFilteredAverage, selectPoolAverage } from '../store/earnings.selectors'; import { ROUTER, VesselDetailsEarningsRoute } from 'app/common/routes'; import { history } from 'app/common/store'; import { Sticky } from 'app/shared/components/sticky/sticky'; import { COLUMN_NAMES } from '../configs/earningsTable.config'; import { UI } from 'app/shared/store/ui/ui.constants'; import { persistEarningsPageScroll } from '../store/earnings.actions'; const FIXED_HEADERS_HEIGHT = 206; const headers = [ { text: 'SPECS', width: 40.5 }, { text: 'EARNINGS ($/DAY)', width: 56 }, ]; const EarningsTable = () => { const vesselsEarnings = useSelector(selectEarnings); const poolAverage = useSelector(selectPoolAverage); const filteredAverage = useSelector(selectFilteredAverage); const pool = useSelector(selectActivePoolId); const navigateToVesselDetails = (vesselCode: string, partnerAxCode: string) => { history.push(ROUTER.generate(VesselDetailsEarningsRoute, { pool, vesselCode, partnerAxCode })); }; const [ orderedData, setData ] = useState(vesselsEarnings); const [ orderMetadata, setOrderMetadata ] = useState({ columnName: 'Name', valueExtractor: (item: VesselEarnings): CellValueType => item.name, dataType: 'text' as CellDataType, isOrderAscending: true, }); useEffect(() => { const sortedData = dataTableHelper .reorderData( vesselsEarnings, orderMetadata.valueExtractor, orderMetadata.dataType, orderMetadata.isOrderAscending); setData([ ...sortedData ]); }, [ vesselsEarnings?.length, orderMetadata ]); const nameColumnWidth = 12; const defaultColumnWidth = (100 - nameColumnWidth) / 9; const getHeaderProps = (columnName: string, alignment: 'left' | 'right', width?: number, description?: string) => ({ text: columnName, align: alignment, description: description, defaultColumnWidth: defaultColumnWidth, width: width, }); const getSortingProps = ( columnName: string, dataType: CellDataType, valueExtractor: (item: VesselEarnings) => CellValueType) => ({ isColumnSorted: orderMetadata.columnName === columnName, isAscendingOrder: orderMetadata.isOrderAscending, onClick: () => { setOrderMetadata({ columnName, valueExtractor, dataType, isOrderAscending: !orderMetadata.isOrderAscending }); }, }); const getCellProps = (propsData: { value: T, alignment: 'left' | 'right', width?: number, invertValueMarking?: boolean }) => { const { value, alignment, width, invertValueMarking } = propsData; return { defaultColumnWidth, invertValueMarking, width: width, value: value, align: alignment, }; }; const dispatch = useDispatch(); return ( item.name)} /> item.hasScrubber)} /> item.poolPoints)} /> item.bunkerAdjustmentPerDay)} subtext="MT/DAY" /> item.earnings)} /> item.bunkerAdjustment)} /> item.scrubberBonus)} /> item.wafDta)} /> item.specialCompensations)} /> item.tce)} /> { poolAverage &&
{poolAverage.names?.map((poolName, index) => ( ))} AVERAGE
} { filteredAverage &&
{filteredAverage.names?.map((poolName, index) => ( ))} AVERAGE
}
{ orderedData?.map((item) => ( { dispatch(persistEarningsPageScroll(window.scrollY)); navigateToVesselDetails(item.vesselCode, item.partner.abbr); }} clickable>
{item.partner.abbr}
)) }
); }; export { EarningsTable };