TableCard.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useState } from 'react';
  2. import classNames from 'classnames';
  3. import { BadgeStatus } from '@/components';
  4. import { StatusColorEnum } from '@/components/BadgeStatus';
  5. import type { StatusColorType } from '@/components/BadgeStatus';
  6. import './index.less';
  7. export interface TableCardProps {
  8. className?: string;
  9. showStatus?: boolean;
  10. showTool?: boolean;
  11. showMask?: boolean;
  12. detail?: React.ReactNode;
  13. status?: string | number;
  14. statusText?: React.ReactNode;
  15. statusNames?: Record<string | number, StatusColorType>;
  16. children?: React.ReactNode;
  17. actions?: React.ReactNode[];
  18. contentClassName?: string;
  19. }
  20. function getAction(actions: React.ReactNode[]) {
  21. return actions
  22. .filter((item) => item)
  23. .map((item: any) => {
  24. return (
  25. <div
  26. className={classNames('card-button', {
  27. delete: item.key === 'delete',
  28. disabled: item.disabled,
  29. })}
  30. key={item.key}
  31. >
  32. {item}
  33. </div>
  34. );
  35. });
  36. }
  37. export default (props: TableCardProps) => {
  38. const [maskShow, setMaskShow] = useState(false);
  39. const handleStatusColor = (data: TableCardProps): StatusColorType | undefined => {
  40. if ('statusNames' in data && data.status !== undefined) {
  41. return data.statusNames![data.status];
  42. }
  43. return StatusColorEnum.default;
  44. };
  45. const statusNode =
  46. props.showStatus === false ? null : (
  47. <div className={classNames('card-state', handleStatusColor(props))}>
  48. <div className={'card-state-content'}>
  49. <BadgeStatus
  50. status={props.status !== undefined ? props.status : ''}
  51. text={props.statusText}
  52. statusNames={props.statusNames}
  53. />
  54. </div>
  55. </div>
  56. );
  57. const maskClassName = classNames('card-mask', { show: maskShow });
  58. const maskNode =
  59. props.showMask === false ? null : <div className={maskClassName}>{props.detail}</div>;
  60. const toolNode =
  61. props.showTool === false ? null : (
  62. <div className={'card-tools'}>
  63. {props.actions && props.actions.length ? getAction(props.actions) : null}
  64. </div>
  65. );
  66. return (
  67. <div className={classNames('iot-card', { hover: maskShow }, props.className)}>
  68. <div className={'card-warp'}>
  69. <div
  70. className={classNames('card-content', props.contentClassName)}
  71. onMouseEnter={() => {
  72. setMaskShow(true);
  73. }}
  74. onMouseLeave={() => {
  75. setMaskShow(false);
  76. }}
  77. >
  78. {props.children}
  79. {statusNode}
  80. {maskNode}
  81. </div>
  82. </div>
  83. {toolNode}
  84. </div>
  85. );
  86. };