device.tsx 5.0 KB

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