You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

115 lines
4.1 KiB

import icon_check_s from '../assets/icon_check_s_s.svg';
import icon_check_u from '../assets/icon_check_s_u.svg';
import icon_arr from '../assets/icon_arr_p_r.svg';
import icon_pending from '../assets/icon_upload_0.svg';
import icon_uploading from '../assets/icon_upload_1.svg';
import icon_uploaded from '../assets/icon_upload_2.svg';
import { Measurement } from '../services/apiTypes';
import { XB_CODES } from '../utils/constant';
export type UpdateState = 'idle' | 'pending' | 'uploading' | 'uploaded';
export default function MeasureItem({
item,
onDetail,
}: {
item: Measurement;
onDetail?: () => void;
}) {
const stateText = () => {
if (item.syncStatus === 'wait') {
return <span className="text-[#A3ACC0] text-xs"></span>;
} else if (item.syncStatus === 'fail') {
return <span className="text-[red] text-xs"></span>;
} else if (item.syncStatus === 'finish') {
return <span className="text-[#04CA17] text-xs"></span>;
}
return null;
};
const direct = XB_CODES.find((dire) => dire.value === item.direction);
return (
<div className="flex mx-2 gap-3">
<main className="flex-1">
<header className="flex items-center gap-2">
<h1 className="text-[15px] font-medium ">{item.name}</h1>
{stateText()}
</header>
<main className="flex my-2">
<p className="flex-1 text-sm ">{`${item.lineName}`}</p>
<p className="flex-1 text-sm ">{`${item.location}`}</p>
<p className="flex-1 text-sm ">{`${direct?.label}方向`}</p>
</main>
<footer>
<span className="text-sm text-[#b7b7b7]">{item.createTime}</span>
</footer>
</main>
<aside className="flex items-center" onClick={onDetail}>
<span className="mr-2 text-sm text-primary font-medium"></span>
<img src={icon_arr} alt="arr" className="h-[10px]" />
</aside>
</div>
);
}
export function MeasureItemEx(props: {
item: Measurement;
selected: boolean;
uploadState: UpdateState;
onSelected?: () => void;
onDetail?: () => void;
}) {
const stateImg = () => {
if (props.uploadState === 'idle') {
if (props.selected) {
return <img src={icon_check_s} alt="icon" />;
} else {
return <img src={icon_check_u} alt="icon" />;
}
} else if (props.uploadState === 'pending') {
return <img src={icon_pending} alt="icon" />;
} else if (props.uploadState === 'uploading') {
return <img src={icon_uploading} alt="icon" />;
} else if (props.uploadState === 'uploaded') {
return <img src={icon_uploaded} alt="icon" />;
}
return null;
};
const stateText = () => {
if (props.uploadState === 'pending') {
return <span className="text-[#A3ACC0] text-xs"></span>;
} else if (props.uploadState === 'uploading') {
return <span className="text-primary text-xs"></span>;
} else if (props.uploadState === 'uploaded') {
return <span className="text-[#04CA17] text-xs"></span>;
}
return null;
};
return (
<div
className="relative flex mx-2 gap-3"
onClick={props.uploadState === 'idle' ? props.onSelected : undefined}
>
<main className="flex-1">
<header className="flex items-center gap-2">
{stateImg()}
<h1 className="text-[15px] font-medium ">{props.item.name}</h1>
</header>
<main className="flex my-2">
<p className="flex-1 text-sm ">{`${props.item.lineName}`}</p>
<p className="flex-1 text-sm ">{`${props.item.location}`}</p>
<p className="flex-1 text-sm ">{`${props.item.direction}方向`}</p>
</main>
<footer>
<span className="text-sm text-[#b7b7b7]">{props.item.createTime}</span>
</footer>
</main>
<aside className="flex items-center" onClick={props.onDetail}>
<span className="mr-2 text-sm text-primary font-medium"></span>
<img src={icon_arr} alt="arr" className="h-[10px]" />
</aside>
<div className="absolute right-0 bottom-0">{stateText()}</div>
</div>
);
}