index.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import { observer } from '@formily/react';
  2. import { Space, Tabs, Tooltip } from 'antd';
  3. import BaseMetadata from './Base';
  4. import { useIntl } from '@@/plugin-locale/localeExports';
  5. import Import from './Import';
  6. import type { ReactNode } from 'react';
  7. import { useState } from 'react';
  8. import Cat from './Cat';
  9. import Service from '@/pages/device/components/Metadata/service';
  10. import { InfoCircleOutlined } from '@ant-design/icons';
  11. import styles from './index.less';
  12. import { InstanceModel, service as instanceService } from '@/pages/device/Instance';
  13. import { PermissionButton } from '@/components';
  14. import { Store } from 'jetlinks-store';
  15. import SystemConst from '@/utils/const';
  16. import { useParams } from 'umi';
  17. import { onlyMessage } from '@/utils/util';
  18. interface Props {
  19. tabAction?: ReactNode;
  20. type: 'product' | 'device';
  21. independentMetadata?: boolean;
  22. }
  23. export const service = new Service();
  24. const Metadata = observer((props: Props) => {
  25. const intl = useIntl();
  26. const [visible, setVisible] = useState<boolean>(false);
  27. const [cat, setCat] = useState<boolean>(false);
  28. const { permission } = PermissionButton.usePermission(
  29. props.type === 'device' ? 'device/Instance' : 'device/Product',
  30. );
  31. const params = useParams<{ id: string }>();
  32. const resetMetadata = async () => {
  33. const resp = await instanceService.deleteMetadata(params.id);
  34. if (resp.status === 200) {
  35. const res = await instanceService.detail(params.id);
  36. if (res.status === 200) {
  37. InstanceModel.detail = res?.result || [];
  38. }
  39. onlyMessage('操作成功');
  40. Store.set(SystemConst.REFRESH_DEVICE, true);
  41. setTimeout(() => {
  42. Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
  43. }, 400);
  44. }
  45. };
  46. return (
  47. <div className={'device-detail-metadata'} style={{ position: 'relative' }}>
  48. <div className={styles.tips} style={{ width: '40%' }}>
  49. <Tooltip
  50. title={
  51. InstanceModel.detail?.independentMetadata && props.type === 'device'
  52. ? '该设备已脱离产品物模型,修改产品物模型对该设备无影响'
  53. : '设备会默认继承产品的物模型,修改设备物模型后将脱离产品物模型'
  54. }
  55. >
  56. <div className={'ellipsis'}>
  57. <InfoCircleOutlined style={{ marginRight: '3px' }} />
  58. {InstanceModel.detail?.independentMetadata && props.type === 'device'
  59. ? '该设备已脱离产品物模型,修改产品物模型对该设备无影响'
  60. : '设备会默认继承产品的物模型,修改设备物模型后将脱离产品物模型'}
  61. </div>
  62. </Tooltip>
  63. </div>
  64. <Tabs
  65. className={styles.metadataNav}
  66. tabBarExtraContent={
  67. <Space>
  68. {InstanceModel.detail?.independentMetadata && props.type === 'device' && (
  69. <PermissionButton
  70. isPermission={permission.update}
  71. popConfirm={{
  72. title: '确认重置?',
  73. onConfirm: resetMetadata,
  74. }}
  75. tooltip={{
  76. title: '重置后将使用产品的物模型配置',
  77. }}
  78. key={'reload'}
  79. >
  80. 重置操作
  81. </PermissionButton>
  82. )}
  83. <PermissionButton isPermission={permission.update} onClick={() => setVisible(true)}>
  84. {intl.formatMessage({
  85. id: 'pages.device.productDetail.metadata.quickImport',
  86. defaultMessage: '快速导入',
  87. })}
  88. </PermissionButton>
  89. <PermissionButton isPermission={true} onClick={() => setCat(true)}>
  90. {intl.formatMessage({
  91. id: 'pages.device.productDetail.metadata',
  92. defaultMessage: '物模型TSL',
  93. })}
  94. TSL
  95. </PermissionButton>
  96. </Space>
  97. }
  98. destroyInactiveTabPane
  99. >
  100. <Tabs.TabPane
  101. tab={intl.formatMessage({
  102. id: 'pages.device.productDetail.metadata.propertyDefinition',
  103. defaultMessage: '属性定义',
  104. })}
  105. key="properties"
  106. >
  107. <BaseMetadata target={props.type} type={'properties'} permission={permission} />
  108. </Tabs.TabPane>
  109. <Tabs.TabPane
  110. tab={intl.formatMessage({
  111. id: 'pages.device.productDetail.metadata.functionDefinition',
  112. defaultMessage: '功能定义',
  113. })}
  114. key="functions"
  115. >
  116. <BaseMetadata target={props.type} type={'functions'} permission={permission} />
  117. </Tabs.TabPane>
  118. <Tabs.TabPane
  119. tab={intl.formatMessage({
  120. id: 'pages.device.productDetail.metadata.eventDefinition',
  121. defaultMessage: '事件定义',
  122. })}
  123. key="events"
  124. >
  125. <BaseMetadata target={props.type} type={'events'} permission={permission} />
  126. </Tabs.TabPane>
  127. <Tabs.TabPane
  128. tab={intl.formatMessage({
  129. id: 'pages.device.productDetail.metadata.tagDefinition',
  130. defaultMessage: '标签定义',
  131. })}
  132. key="tags"
  133. >
  134. <BaseMetadata target={props.type} type={'tags'} permission={permission} />
  135. </Tabs.TabPane>
  136. </Tabs>
  137. <Import visible={visible} type={props.type} close={() => setVisible(false)} />
  138. <Cat visible={cat} close={() => setCat(false)} type={props.type} />
  139. </div>
  140. );
  141. });
  142. export default Metadata;