device.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 } 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. }
  20. const defaultImage = require('/public/images/device-type-3-big.png');
  21. export const PermissionsMap = {
  22. read: '查看',
  23. save: '编辑',
  24. delete: '删除',
  25. };
  26. export const handlePermissionsMap = (permissions?: string[]) => {
  27. return permissions && permissions.length
  28. ? permissions.map((item) => PermissionsMap[item]).toString()
  29. : '--';
  30. };
  31. export const ExtraDeviceCard = (props: DeviceCardProps) => {
  32. const intl = useIntl();
  33. const [imgUrl, setImgUrl] = useState<string>(props.photoUrl || defaultImage);
  34. return (
  35. <TableCard
  36. showTool={false}
  37. showMask={false}
  38. status={props.state?.value}
  39. statusText={props.state?.text}
  40. statusNames={{
  41. online: StatusColorEnum.processing,
  42. offline: StatusColorEnum.error,
  43. notActive: StatusColorEnum.warning,
  44. }}
  45. onClick={props.onClick}
  46. className={props.className}
  47. >
  48. <div className={'pro-table-card-item'}>
  49. <div className={'card-item-avatar'}>
  50. <img
  51. width={88}
  52. height={88}
  53. src={imgUrl}
  54. alt={''}
  55. onError={() => {
  56. setImgUrl(defaultImage);
  57. }}
  58. />
  59. </div>
  60. <div className={'card-item-body'}>
  61. <div className={'card-item-header'}>
  62. <span className={'card-item-header-name ellipsis'}>{props.name}</span>
  63. </div>
  64. <div className={'card-item-content-flex'}>
  65. <div className={'flex-auto'}>
  66. <label>ID</label>
  67. <div className={'ellipsis'}>{props.id || '--'}</div>
  68. </div>
  69. <div className={'flex-auto'}>
  70. <label>资产权限</label>
  71. <div className={'ellipsis'}>{handlePermissionsMap(props.grantedPermissions)}</div>
  72. </div>
  73. <Popconfirm
  74. title={intl.formatMessage({
  75. id: 'pages.system.role.option.unBindUser',
  76. defaultMessage: '是否解除绑定',
  77. })}
  78. key="unBind"
  79. onConfirm={(e) => {
  80. e?.stopPropagation();
  81. if (props.onUnBind) {
  82. props.onUnBind(e);
  83. }
  84. }}
  85. >
  86. <div className={'flex-button'}>
  87. <DisconnectOutlined />
  88. </div>
  89. </Popconfirm>
  90. </div>
  91. </div>
  92. </div>
  93. </TableCard>
  94. );
  95. };
  96. export default (props: DeviceCardProps) => {
  97. return (
  98. <TableCard
  99. detail={props.detail}
  100. actions={props.actions}
  101. status={props.state?.value}
  102. statusText={props.state?.text}
  103. statusNames={{
  104. online: StatusColorEnum.processing,
  105. offline: StatusColorEnum.error,
  106. notActive: StatusColorEnum.warning,
  107. }}
  108. >
  109. <div className={'pro-table-card-item'}>
  110. <div className={'card-item-avatar'}>
  111. <img width={88} height={88} src={props.photoUrl || defaultImage} alt={''} />
  112. </div>
  113. <div className={'card-item-body'}>
  114. <div className={'card-item-header'}>
  115. <span className={'card-item-header-name ellipsis'}>{props.name}</span>
  116. </div>
  117. <div className={'card-item-content'}>
  118. <div>
  119. <label>设备类型</label>
  120. <div className={'ellipsis'}>{props.deviceType ? props.deviceType.text : '--'}</div>
  121. </div>
  122. <div>
  123. <label>产品名称</label>
  124. <div className={'ellipsis'}>{props.productName || '--'}</div>
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. </TableCard>
  130. );
  131. };