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.

116 lines
3.8 KiB

  1. import icon_check_s from '../assets/icon_check_s_s.svg';
  2. import icon_check_u from '../assets/icon_check_s_u.svg';
  3. import icon_arr from '../assets/icon_arr_p_r.svg';
  4. import icon_pending from '../assets/icon_upload_0.svg';
  5. import icon_uploading from '../assets/icon_upload_1.svg';
  6. import icon_uploaded from '../assets/icon_upload_2.svg';
  7. /*
  8. name: '测量名称1',
  9. time: '03-02 10:20',
  10. line: '京沪线',
  11. segment: 'A段',
  12. direction: '上行',
  13. railType: '60轨',
  14. */
  15. export type UpdateState = 'idle' | 'pending' | 'uploading' | 'uploaded';
  16. export default function MeasureItem(props: {
  17. name: string;
  18. time: string;
  19. line: string;
  20. segment: string;
  21. direction: string;
  22. railType: string;
  23. uploadState: UpdateState;
  24. onDetail?: () => void;
  25. }) {
  26. return (
  27. <div className="flex mx-2 gap-3">
  28. <main className="flex-1">
  29. <header className="flex items-center gap-2">
  30. {props.uploadState === 'uploaded' && <img src={icon_uploaded} alt="icon" />}
  31. <h1 className="text-[15px] font-medium ">{props.name}</h1>
  32. </header>
  33. <main className="flex my-2">
  34. <p className="flex-1 text-sm ">{`${props.line}`}</p>
  35. <p className="flex-1 text-sm ">{`${props.segment}`}</p>
  36. <p className="flex-1 text-sm ">{`${props.direction}方向`}</p>
  37. </main>
  38. <footer>
  39. <span className="text-sm text-[#b7b7b7]">{props.time}</span>
  40. </footer>
  41. </main>
  42. <aside className="flex items-center" onClick={props.onDetail}>
  43. <span className="mr-2 text-sm text-primary font-medium"></span>
  44. <img src={icon_arr} alt="arr" className="h-[10px]" />
  45. </aside>
  46. </div>
  47. );
  48. }
  49. export function MeasureItemEx(props: {
  50. name: string;
  51. time: string;
  52. line: string;
  53. segment: string;
  54. direction: string;
  55. railType: string;
  56. selected: boolean;
  57. uploadState: UpdateState;
  58. onSelected?: () => void;
  59. onDetail?: () => void;
  60. }) {
  61. const stateImg = () => {
  62. if (props.uploadState === 'idle') {
  63. if (props.selected) {
  64. return <img src={icon_check_s} alt="icon" />;
  65. } else {
  66. return <img src={icon_check_u} alt="icon" />;
  67. }
  68. } else if (props.uploadState === 'pending') {
  69. return <img src={icon_pending} alt="icon" />;
  70. } else if (props.uploadState === 'uploading') {
  71. return <img src={icon_uploading} alt="icon" />;
  72. } else if (props.uploadState === 'uploaded') {
  73. return <img src={icon_uploaded} alt="icon" />;
  74. }
  75. return null;
  76. };
  77. const stateText = () => {
  78. if (props.uploadState === 'pending') {
  79. return <span className="text-[#A3ACC0] text-xs"></span>;
  80. } else if (props.uploadState === 'uploading') {
  81. return <span className="text-primary text-xs"></span>;
  82. } else if (props.uploadState === 'uploaded') {
  83. return <span className="text-[#04CA17] text-xs"></span>;
  84. }
  85. return null;
  86. };
  87. return (
  88. <div
  89. className="relative flex mx-2 gap-3"
  90. onClick={props.uploadState === 'idle' ? props.onSelected : undefined}>
  91. <main className="flex-1">
  92. <header className="flex items-center gap-2">
  93. {stateImg()}
  94. <h1 className="text-[15px] font-medium ">{props.name}</h1>
  95. </header>
  96. <main className="flex my-2">
  97. <p className="flex-1 text-sm ">{`${props.line}`}</p>
  98. <p className="flex-1 text-sm ">{`${props.segment}`}</p>
  99. <p className="flex-1 text-sm ">{`${props.direction}方向`}</p>
  100. </main>
  101. <footer>
  102. <span className="text-sm text-[#b7b7b7]">{props.time}</span>
  103. </footer>
  104. </main>
  105. <aside className="flex items-center" onClick={props.onDetail}>
  106. <span className="mr-2 text-sm text-primary font-medium"></span>
  107. <img src={icon_arr} alt="arr" className="h-[10px]" />
  108. </aside>
  109. <div className="absolute right-0 bottom-0">{stateText()}</div>
  110. </div>
  111. );
  112. }