index.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { ExampleHeader } from './header'
  2. import { exampleTitleColumn, exampleTimeColumn } from './columns'
  3. import { Table, ActionsButton } from 'components'
  4. import { useThunkPaging } from 'hook'
  5. import { Dropdown, Menu, Button } from 'antd'
  6. import { DownOutlined } from '@ant-design/icons'
  7. import { useSelector, examplesSelector, fetchExamples } from 'store'
  8. import { EditExampleTitle, InsertExample } from './edit'
  9. import { setExample, repExampleScenes, deleteExample, getToken, getExampleScenes } from 'api'
  10. import { ExampleScenes } from './scene/list'
  11. import { useState } from 'react'
  12. import { alert, confirm, getHref, onlyOpenWindow } from 'utils'
  13. import { SceneType, SceneTypeDomain, SceneTypePaths } from 'constant'
  14. import { RoutePath, fillRoutePath } from 'router'
  15. import type { ColumnAction } from 'components'
  16. import type { MenuProps } from 'antd'
  17. import type { Example } from 'api'
  18. import type { ExampleColumn } from './columns'
  19. export type ExampleActionProps = {
  20. example: Example,
  21. deleteExample: () => void
  22. query: () => void,
  23. sceneManage?: (example: Example) => void
  24. fuse?: (example: Example) => void
  25. getView?: (example: Example) => void
  26. record?: (example: Example) => void
  27. file?: (example: Example) => void
  28. }
  29. export const ExampleAction = ({ example, query, deleteExample, ...actionCallback }: ExampleActionProps) => {
  30. const actions: ColumnAction[] = [
  31. { text: '查看', action: query },
  32. { text: '删除', action: deleteExample , bind: { danger: true } }
  33. ]
  34. const menus = [
  35. { key: 'sceneManage', label: '场景管理' },
  36. { key: 'fuse', label: '多元融合' },
  37. { key: 'getView', label: '视图提取' },
  38. { key: 'record', label: '屏幕录制' },
  39. { key: 'file', label: '卷宗管理' },
  40. ]
  41. const handleMenuClick: MenuProps['onClick'] = (menu) => {
  42. (actionCallback as any)[menu.key]();
  43. }
  44. for (let i = 0; i < menus.length; i++) {
  45. if (!(menus[i].key in actionCallback)) {
  46. menus.splice(i--, 1)
  47. }
  48. }
  49. const renderMenus = menus.length
  50. ? (<Dropdown overlay={<Menu items={menus} onClick={handleMenuClick} />}>
  51. <Button type="link" >
  52. 编辑<DownOutlined />
  53. </Button>
  54. </Dropdown>)
  55. : null
  56. return (
  57. <>
  58. {renderMenus}
  59. <ActionsButton actions={actions} />
  60. </>
  61. )
  62. }
  63. export const ExamplePage = () => {
  64. const examples = useSelector(examplesSelector)
  65. const states = useThunkPaging({ caseTitle: '' }, fetchExamples)
  66. const [[paging, setPaging], [params, setParams], refresh] = states
  67. const [scenesCaseId, setScenesCaseId] = useState<Example['caseId'] | null>(null)
  68. const [inInsert, setInInsert] = useState(false)
  69. const getFuseCodeLink = (caseId: Example['caseId'], query?: boolean) => {
  70. const params: { token?: string, caseId: string } = {
  71. token: getToken() || undefined,
  72. caseId: caseId.toString()
  73. }
  74. if (query) {
  75. delete params.token
  76. }
  77. return getHref(SceneTypeDomain[SceneType.SWMX]!, SceneTypePaths[SceneType.SWMX][0], params)
  78. }
  79. const checkScenesOpen = async (caseId: Example['caseId'], url: URL | string) => {
  80. const scenes = await getExampleScenes({ caseId })
  81. console.log(url)
  82. if (!scenes.length) {
  83. alert('当前案件下无场景,请先添加场景。')
  84. } else {
  85. onlyOpenWindow(url)
  86. }
  87. }
  88. const columns: ExampleColumn[] = [
  89. {
  90. ...exampleTitleColumn,
  91. render: (_, record) => (
  92. <EditExampleTitle
  93. example={record}
  94. onChangeTitle={async (caseTitle) => {
  95. await setExample({ caseTitle, caseId: record.caseId })
  96. await refresh()
  97. }}
  98. />
  99. )
  100. },
  101. exampleTimeColumn,
  102. {
  103. title: '操作',
  104. key: 'action',
  105. render: (_, record) => (
  106. <ExampleAction
  107. deleteExample={async () => {
  108. if (await confirm('确定要删除此数据?')) {
  109. await deleteExample({ caseId: record.caseId })
  110. await refresh()
  111. }
  112. }}
  113. example={record}
  114. sceneManage={() => setScenesCaseId(record.caseId)}
  115. file={() => {
  116. const url = new URL(location.href);
  117. url.hash = fillRoutePath(RoutePath.files, { id: record.caseId.toString() })
  118. window.open(url)
  119. // navigate()
  120. }}
  121. query={() => checkScenesOpen(record.caseId, `${getFuseCodeLink(record.caseId, true)}&share=1#show/summary`)}
  122. fuse={() => checkScenesOpen(record.caseId, `${getFuseCodeLink(record.caseId)}#fuseEdit/merge`)}
  123. getView={() => checkScenesOpen(record.caseId, `${getFuseCodeLink(record.caseId)}#sceneEdit/view`)}
  124. record={() => checkScenesOpen(record.caseId, `${getFuseCodeLink(record.caseId)}#sceneEdit/record`)}
  125. />
  126. )
  127. }
  128. ]
  129. const renderAddExample = inInsert
  130. && <InsertExample
  131. onClose={() => setInInsert(false)}
  132. onChangeTitle={async (caseTitle) => {
  133. await setExample({ caseTitle })
  134. await refresh()
  135. setInInsert(false)
  136. }}
  137. />
  138. const renderEditScene = scenesCaseId
  139. && <ExampleScenes
  140. caseId={scenesCaseId}
  141. onClose={() => setScenesCaseId(null)}
  142. onChangeScenes={(idents) => repExampleScenes({ sceneNumParam: idents, caseId: scenesCaseId })}
  143. />
  144. return (
  145. <div className='content-layout'>
  146. { renderAddExample }
  147. { renderEditScene }
  148. <ExampleHeader
  149. onBeforeCreate={() => setInInsert(true)}
  150. onSearch={setParams}
  151. />
  152. <Table
  153. unDataMsg={params.caseTitle ? '未搜索到结果' : '暂无数据'}
  154. rowKey={'caseId'}
  155. columns={columns}
  156. data={examples}
  157. paging={paging}
  158. onChangePaging={setPaging}
  159. />
  160. </div>
  161. )
  162. }
  163. export default ExamplePage