import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; 
 | 
import { useNavigate } from 'react-router-dom'; 
 | 
import { 
 | 
    List, 
 | 
    DatagridConfigurable, 
 | 
    SearchInput, 
 | 
    TopToolbar, 
 | 
    SelectColumnsButton, 
 | 
    EditButton, 
 | 
    FilterButton, 
 | 
    CreateButton, 
 | 
    ExportButton, 
 | 
    BulkDeleteButton, 
 | 
    WrapperField, 
 | 
    useRecordContext, 
 | 
    useTranslate, 
 | 
    useListContext, 
 | 
    useCreatePath, 
 | 
    TextField, 
 | 
    NumberField, 
 | 
    DateField, 
 | 
    BooleanField, 
 | 
    ReferenceField, 
 | 
    TextInput, 
 | 
    DateTimeInput, 
 | 
    DateInput, 
 | 
    SelectInput, 
 | 
    NumberInput, 
 | 
    ReferenceInput, 
 | 
    ReferenceArrayInput, 
 | 
    AutocompleteInput, 
 | 
    DeleteButton, 
 | 
    FunctionField, 
 | 
    Count, 
 | 
} from 'react-admin'; 
 | 
import { Box, Typography, Stack, useMediaQuery, Tabs, Tab, Divider } from '@mui/material'; 
 | 
import { styled } from '@mui/material/styles'; 
 | 
import SegmentPanel from "./SegmentPanel"; 
 | 
import EmptyData from "../components/EmptyData"; 
 | 
import MyExportButton from '../components/MyExportButton'; 
 | 
import PageDrawer from "../components/PageDrawer"; 
 | 
import MyField from "../components/MyField"; 
 | 
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; 
 | 
import * as Common from '@/utils/common'; 
 | 
  
 | 
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ 
 | 
    '& .css-1vooibu-MuiSvgIcon-root': { 
 | 
        height: '.9em' 
 | 
    }, 
 | 
    '& .RaDatagrid-row': { 
 | 
        cursor: 'auto' 
 | 
    }, 
 | 
    '& .column-name': { 
 | 
    }, 
 | 
    '& .opt': { 
 | 
        width: 200 
 | 
    }, 
 | 
})); 
 | 
  
 | 
const filters = [ 
 | 
    // <SearchInput source="condition" alwaysOn />, 
 | 
    <TextInput source="groupId" label="table.field.segment.groupId" alwaysOn/>, 
 | 
    <ReferenceInput source="agvId" label="table.field.segment.agvId" reference="agv" alwaysOn> 
 | 
        <AutocompleteInput label="table.field.segment.agvId" optionText="uuid" filterToQuery={(val) => ({ uuid: val })} /> 
 | 
    </ReferenceInput>, 
 | 
    <ReferenceInput source="taskId" label="table.field.segment.taskId" reference="task" alwaysOn> 
 | 
        <AutocompleteInput label="table.field.segment.taskId" optionText="seqNum" filterToQuery={(val) => ({ seqNum: val })} /> 
 | 
    </ReferenceInput>, 
 | 
    <TextInput source="posType" label="table.field.segment.posType" alwaysOn resettable />, 
 | 
    <DateInput label='common.time.after' source="timeStart" alwaysOn />, 
 | 
    <DateInput label='common.time.before' source="timeEnd" alwaysOn />, 
 | 
  
 | 
    <TextInput source="uuid" label="table.field.segment.uuid" />, 
 | 
    <NumberInput source="travelId" label="table.field.segment.travelId" />, 
 | 
    <ReferenceInput source="endNode" label="table.field.segment.endNode" reference="code"> 
 | 
        <AutocompleteInput label="table.field.segment.endNode" optionText="data" filterToQuery={(val) => ({ data: val })} /> 
 | 
    </ReferenceInput>, 
 | 
  
 | 
    <NumberInput source="backpack" label="table.field.segment.backpack" />, 
 | 
  
 | 
    <TextInput label="common.field.memo" source="memo" />, 
 | 
    <SelectInput 
 | 
        label="common.field.status" 
 | 
        source="status" 
 | 
        choices={[ 
 | 
            { id: '1', name: 'common.enums.statusTrue' }, 
 | 
            { id: '0', name: 'common.enums.statusFalse' }, 
 | 
        ]} 
 | 
    />, 
 | 
] 
 | 
  
 | 
const SegmentList = () => { 
 | 
    const translate = useTranslate(); 
 | 
  
 | 
    const [drawerVal, setDrawerVal] = useState(false); 
 | 
  
 | 
    return ( 
 | 
        <Box display="flex"> 
 | 
            <List 
 | 
                sx={{ 
 | 
                    flexGrow: 1, 
 | 
                    transition: (theme) => 
 | 
                        theme.transitions.create(['all'], { 
 | 
                            duration: theme.transitions.duration.enteringScreen, 
 | 
                        }), 
 | 
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, 
 | 
                }} 
 | 
                title={"menu.segment"} 
 | 
                empty={<EmptyData />} 
 | 
                filters={filters} 
 | 
                sort={{ field: "update_time", order: "desc" }} 
 | 
                actions={( 
 | 
                    <TopToolbar> 
 | 
                        <FilterButton /> 
 | 
                        <SelectColumnsButton preferenceKey='segment' /> 
 | 
                        <MyExportButton /> 
 | 
                    </TopToolbar> 
 | 
                )} 
 | 
                perPage={DEFAULT_PAGE_SIZE} 
 | 
                filterDefaultValues={{ state: 'RUNNING' }} 
 | 
            > 
 | 
                <TabbedDatagrid /> 
 | 
            </List> 
 | 
            <PageDrawer 
 | 
                title='Segment Detail' 
 | 
                drawerVal={drawerVal} 
 | 
                setDrawerVal={setDrawerVal} 
 | 
            > 
 | 
            </PageDrawer> 
 | 
        </Box> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const tabs = [ 
 | 
    { id: 'INIT', name: 'page.segment.enums.state.init' }, 
 | 
    { id: 'WAITING', name: 'page.segment.enums.state.waiting' }, 
 | 
    { id: 'RUNNING', name: 'page.segment.enums.state.running' }, 
 | 
    { id: 'FINISH', name: 'page.segment.enums.state.finish' }, 
 | 
]; 
 | 
  
 | 
const TabbedDatagrid = () => { 
 | 
    const translate = useTranslate(); 
 | 
    const { filterValues, setFilters, displayedFilters } = useListContext(); 
 | 
    const isXSmall = useMediaQuery(theme => 
 | 
        theme.breakpoints.down('sm') 
 | 
    ); 
 | 
  
 | 
    const handleChange = useCallback((event, value) => { 
 | 
        setFilters && setFilters( 
 | 
            { ...filterValues, state: value }, 
 | 
            displayedFilters 
 | 
        ); 
 | 
    }, [filterValues, setFilters, displayedFilters]); 
 | 
  
 | 
  
 | 
    return ( 
 | 
        <> 
 | 
            <Tabs 
 | 
                variant="fullWidth" 
 | 
                centered 
 | 
                value={filterValues.state} 
 | 
                indicatorColor="primary" 
 | 
                onChange={handleChange} 
 | 
            > 
 | 
                {tabs.map(item => { 
 | 
                    return <Tab 
 | 
                        key={item.id} 
 | 
                        value={item.id} 
 | 
                        label={ 
 | 
                            <span style={{ fontWeight: 'bold' }}> 
 | 
                                <span > 
 | 
                                    {translate(item.name)} 
 | 
                                </span> 
 | 
                                  
 | 
                                ( 
 | 
                                <Count 
 | 
                                    filter={{ 
 | 
                                        ...filterValues, 
 | 
                                        state: item.id, 
 | 
                                    }} 
 | 
                                    sx={{ lineHeight: 'inherit' }} 
 | 
                                /> 
 | 
                                ) 
 | 
                            </span> 
 | 
                        } 
 | 
                    /> 
 | 
                })} 
 | 
            </Tabs> 
 | 
            <Divider /> 
 | 
            {(isXSmall || true) && ( 
 | 
                <> 
 | 
                    {( 
 | 
                        filterValues.state === 'INIT' 
 | 
                        || filterValues.state === 'WAITING' 
 | 
                        || filterValues.state === 'RUNNING' 
 | 
                        || filterValues.state === 'FINISH' 
 | 
                    ) 
 | 
                        && ( 
 | 
                            <> 
 | 
                                <StyledDatagrid 
 | 
                                    preferenceKey='segment' 
 | 
                                    bulkActionButtons={false} 
 | 
                                    rowClick={(id, resource, record) => false} 
 | 
                                    expand={() => <SegmentPanel />} 
 | 
                                    expandSingle={true} 
 | 
                                    omit={['id', 'uuid', 'startNode', 'statusBool', 'updateBy', 'createTime', 'createBy', 'memo']} 
 | 
                                > 
 | 
                                    <NumberField source="id" /> 
 | 
                                    {/* <TextField source="segDesc" label="table.field.segment.segDesc" /> */} 
 | 
                                    <TextField source="uuid" label="table.field.segment.uuid" /> 
 | 
                                    <TextField source="groupId" label="table.field.segment.groupId" /> 
 | 
                                    <ReferenceField source="travelId" label="table.field.segment.travelId" reference="travel" link={false} sortable={false}> 
 | 
                                        <TextField source="uuid" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <ReferenceField source="agvId" label="table.field.segment.agvId" reference="agv" link={false} sortable={false}> 
 | 
                                        <TextField source="uuid" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <ReferenceField source="taskId" label="table.field.segment.taskId" reference="task" link={false} sortable={false}> 
 | 
                                        <TextField source="seqNum" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <TextField source="posType" label="table.field.segment.posType" sortable={false} /> 
 | 
                                    <NumberField source="backpack" label="table.field.segment.backpack" sortable={false} /> 
 | 
                                    <NumberField source="algoTime" label="table.field.segment.algoTime" sortable={false} /> 
 | 
                                    <ReferenceField source="endNode" label="table.field.segment.endNode" reference="code" link={false} sortable={false}> 
 | 
                                        <TextField source="data" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <FunctionField label="table.field.segment.state" cellClassName="state" render={record => ( 
 | 
                                        <> 
 | 
                                            {translate(tabs.find(item => item.id === record.state)?.name)} 
 | 
                                        </> 
 | 
                                    )} /> 
 | 
                                    <NumberField source="serial" label="table.field.segment.serial" sortable={false} /> 
 | 
                                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> 
 | 
                                        <TextField source="nickname" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <DateField source="updateTime" label="common.field.updateTime" showTime /> 
 | 
                                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> 
 | 
                                        <TextField source="nickname" /> 
 | 
                                    </ReferenceField> 
 | 
                                    <DateField source="createTime" label="common.field.createTime" showTime /> 
 | 
                                    <BooleanField source="statusBool" label="common.field.status" sortable={false} /> 
 | 
                                    <TextField source="memo" label="common.field.memo" sortable={false} /> 
 | 
                                    {/* <FunctionField label="common.field.opt" cellClassName="opt" render={record => ( 
 | 
                                    <> 
 | 
                                    </> 
 | 
                                )} /> */} 
 | 
                                </StyledDatagrid> 
 | 
                            </> 
 | 
                        )} 
 | 
                </> 
 | 
            )} 
 | 
        </> 
 | 
    ) 
 | 
} 
 | 
  
 | 
export default SegmentList; 
 |