device.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import React, { useState } from 'react';
  2. import type { DeviceInstance } from '@/pages/device/Instance/typings';
  3. import { StatusColorEnum } from '@/components/BadgeStatus';
  4. import { TableCard, Ellipsis } from '@/components';
  5. import '@/style/common.less';
  6. import '../index.less';
  7. import { CheckOutlined } from '@ant-design/icons';
  8. export interface DeviceCardProps extends Partial<DeviceInstance> {
  9. detail?: React.ReactNode;
  10. actions?: React.ReactNode[];
  11. avatarSize?: number;
  12. className?: string;
  13. content?: React.ReactNode[];
  14. onClick?: () => void;
  15. grantedPermissions?: string[];
  16. onUnBind?: (e: any) => void;
  17. showBindBtn?: boolean;
  18. cardType?: 'bind' | 'unbind';
  19. showTool?: boolean;
  20. }
  21. const defaultImage = require('/public/images/device-type-3-big.png');
  22. export const PermissionsMap = {
  23. read: '查看',
  24. save: '编辑',
  25. delete: '删除',
  26. };
  27. export const handlePermissionsMap = (permissions?: string[]) => {
  28. return permissions && permissions.length
  29. ? permissions.map((item) => PermissionsMap[item]).toString()
  30. : '';
  31. };
  32. export const ExtraDeviceCard = (props: DeviceCardProps) => {
  33. const [imgUrl, setImgUrl] = useState<string>(props.photoUrl || defaultImage);
  34. return (
  35. <TableCard
  36. showTool={props.showTool}
  37. showMask={false}
  38. status={props.state?.value}
  39. actions={props.actions}
  40. statusText={props.state?.text}
  41. statusNames={{
  42. online: StatusColorEnum.processing,
  43. offline: StatusColorEnum.error,
  44. notActive: StatusColorEnum.warning,
  45. }}
  46. onClick={props.onClick}
  47. className={props.className}
  48. >
  49. <div className={'pro-table-card-item'}>
  50. <div className={'card-item-avatar'}>
  51. <img
  52. width={88}
  53. height={88}
  54. src={imgUrl}
  55. alt={''}
  56. onError={() => {
  57. setImgUrl(defaultImage);
  58. }}
  59. />
  60. </div>
  61. <div className={'card-item-body'}>
  62. <div className={'card-item-header'}>
  63. <Ellipsis title={props.name} titleClassName={'card-item-header-name'} />
  64. </div>
  65. <div className={'card-item-content-flex'}>
  66. <div className={'flex-auto'}>
  67. <label>ID</label>
  68. <Ellipsis title={props.id || ''} />
  69. {/*<div className={'ellipsis'}>*/}
  70. {/* <Tooltip title={props.id}>{props.id || ''}</Tooltip>*/}
  71. {/*</div>*/}
  72. </div>
  73. {props.cardType === 'bind' ? (
  74. <div className={'flex-auto'}>
  75. <label>说明</label>
  76. <Ellipsis title={props.describe || ''} />
  77. {/*<Tooltip title={props.describe}>*/}
  78. {/* <div className={'ellipsis'}>{props.describe}</div>*/}
  79. {/*</Tooltip>*/}
  80. </div>
  81. ) : (
  82. <div className={'flex-auto'}>
  83. <label>资产权限</label>
  84. <Ellipsis title={handlePermissionsMap(props.grantedPermissions)} />
  85. {/*<div className={'ellipsis'}>*/}
  86. {/* <Tooltip title={handlePermissionsMap(props.grantedPermissions)}>*/}
  87. {/* {handlePermissionsMap(props.grantedPermissions)}*/}
  88. {/* </Tooltip>*/}
  89. {/*</div>*/}
  90. </div>
  91. )}
  92. </div>
  93. </div>
  94. </div>
  95. <div className={'checked-icon'}>
  96. <div>
  97. <CheckOutlined />
  98. </div>
  99. </div>
  100. </TableCard>
  101. );
  102. };
  103. export default (props: DeviceCardProps) => {
  104. return (
  105. <TableCard
  106. detail={props.detail}
  107. actions={props.actions}
  108. status={props.state?.value}
  109. statusText={props.state?.text}
  110. statusNames={{
  111. online: StatusColorEnum.processing,
  112. offline: StatusColorEnum.error,
  113. notActive: StatusColorEnum.warning,
  114. }}
  115. >
  116. <div className={'pro-table-card-item'}>
  117. <div className={'card-item-avatar'}>
  118. <img width={88} height={88} src={props.photoUrl || defaultImage} alt={''} />
  119. </div>
  120. <div className={'card-item-body'}>
  121. <div className={'card-item-header'}>
  122. <Ellipsis title={props.name} titleClassName={'card-item-header-name'} />
  123. </div>
  124. <div className={'card-item-content'}>
  125. <div>
  126. <label>设备类型</label>
  127. <Ellipsis title={props.deviceType ? props.deviceType.text : ''} />
  128. {/*<div className={'ellipsis'}>{props.deviceType ? props.deviceType.text : ''}</div>*/}
  129. </div>
  130. <div>
  131. <label>产品名称</label>
  132. <Ellipsis title={props.productName} />
  133. {/*<div className={'ellipsis'}>{props.productName || ''}</div>*/}
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. </TableCard>
  139. );
  140. };