import React, { useState, useEffect, useMemo } from 'react'; import { Table, Popover, Input, Descriptions, Tag, Image } from '@douyinfe/semi-ui'; import { useActions, useSelector } from '../../services/state/store.js'; import { IconClose, IconSearch, IconTick } from '@douyinfe/semi-icons'; import * as timeService from '../../services/time/timeService.js'; import debounce from 'lodash/debounce'; import no_image from '../../assets/no_image.jpg'; import './ListingsTable.less'; import { format } from '../../services/time/timeService.js'; const columns = [ { title: '#', dataIndex: 'is_active', width: 58, sorter: true, render: (value) => { return value ? (
) : (
); }, }, { title: 'Job-Name', sorter: true, dataIndex: 'job_name', width: 170, }, { title: 'Listing date', width: 130, dataIndex: 'created_at', sorter: true, render: (text) => timeService.format(text), }, { title: 'Provider', width: 130, dataIndex: 'provider', sorter: true, render: (text) => text.charAt(0).toUpperCase() + text.slice(1), }, { title: 'Price', width: 100, dataIndex: 'price', sorter: true, render: (text) => text + ' €', }, { title: 'Address', width: 150, dataIndex: 'address', sorter: true, }, { title: 'Title', dataIndex: 'title', sorter: true, render: (text, row) => { return ( {text} ); }, }, ]; export default function ListingsTable() { const tableData = useSelector((state) => state.listingsTable); const actions = useActions(); const [page, setPage] = useState(1); const pageSize = 15; const [sortData, setSortData] = useState({}); const [filter, setFilter] = useState(null); const handlePageChange = (_page) => { setPage(_page); }; useEffect(() => { let sortfield = null; let sortdir = null; if (sortData != null && Object.keys(sortData).length > 0) { sortfield = sortData.field; sortdir = sortData.direction; } actions.listingsTable.getListingsTable({ page, pageSize, sortfield, sortdir, filter }); }, [page, sortData, filter]); const handleFilterChange = useMemo(() => debounce((value) => setFilter(value), 500), []); const expandRowRender = (record) => { return (
{record.image_url == null ? ( ) : ( )}
{record.is_active ? 'Yes' : 'No'} Link to Listing {format(record.created_at)} {record.price} € {record.title}

{record.description == null ? 'No description available' : record.description}

); }; return (
} showClear className="listingsTable__search" placeholder="Search" onChange={handleFilterChange} /> { if (changeSet?.extra?.changeType === 'sorter') { setSortData({ field: changeSet.sorter.dataIndex, direction: changeSet.sorter.sortOrder === 'ascend' ? 'asc' : 'desc', }); } }} pagination={{ currentPage: page, //for now fixed pageSize, total: tableData?.totalNumber || 0, onPageChange: handlePageChange, }} /> ); }