scene-select.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <Modal
  3. width="800px"
  4. title="添加场景"
  5. :visible="visible"
  6. @ok="okHandler"
  7. @cancel="visible = false"
  8. okText="确定"
  9. cancelText="取消"
  10. class="model-table"
  11. >
  12. <div>
  13. <div className='model-header'>
  14. <Search
  15. className='content-header-search'
  16. placeholder="输入名称搜索"
  17. style="width: 264px"
  18. @search="val => keyword = val"
  19. />
  20. </div>
  21. <Table
  22. :row-key="record => record.modelId"
  23. :columns="cloumns"
  24. :rowSelection="rowSelection"
  25. :data-source="filterScenes"
  26. :pagination="false"
  27. />
  28. </div>
  29. </Modal>
  30. <div @click="visible = true">
  31. <slot></slot>
  32. </div>
  33. </template>
  34. <script lang="ts" setup>
  35. import { Modal, Input, Table } from 'ant-design-vue'
  36. import { computed, nextTick, ref, watch, watchEffect } from 'vue';
  37. import { scenes, save, SceneTypeDesc } from '@/store'
  38. import { createLoadPack } from '@/utils'
  39. import { fuseModels, createFuseModels, addFuseModel, fuseModelsLoaded, initialScenes } from '@/store'
  40. import type { Scene } from '@/api'
  41. import { useViewStack } from '@/hook';
  42. type Key = Scene['modelId']
  43. const Search = Input.Search
  44. const selectIds = computed(() => fuseModels.value.map(item => item.modelId))
  45. const visible = ref(false)
  46. const keyword = ref('')
  47. const filterScenes = computed(
  48. () => scenes.value
  49. .filter(item => item.name && item.modelId && item.name.includes(keyword.value))
  50. .map(scene => ({
  51. ...scene,
  52. type: SceneTypeDesc[scene.type]
  53. }))
  54. )
  55. const selects = ref<Key[]>(selectIds.value)
  56. const rowSelection: any = ref({
  57. selectedRowKeys: selects,
  58. onChange: (ids: number[]) => {
  59. selects.value = Array.from(new Set(ids.concat(selectIds.value)))
  60. },
  61. getCheckboxProps: (record: Scene) => ({
  62. disabled: selectIds.value.includes(record.modelId)
  63. })
  64. })
  65. const cloumns = [
  66. {
  67. title: '名称',
  68. dataIndex: 'name',
  69. key: 'name',
  70. },
  71. {
  72. title: '类型',
  73. dataIndex: 'type',
  74. key: 'type',
  75. },
  76. {
  77. title: '拍摄/创建时间',
  78. dataIndex: 'createTime',
  79. key: 'createTime',
  80. }
  81. ]
  82. const okHandler = createLoadPack(async () => {
  83. const addPromises = selects.value
  84. .filter(modelId => !fuseModels.value.some(model => model.modelId === modelId))
  85. .map(modelId => createFuseModels({ modelId }))
  86. .map(addFuseModel)
  87. await Promise.all(addPromises)
  88. await new Promise<void>((resolve) => {
  89. nextTick(() => {
  90. const stop = watchEffect(() => {
  91. if (fuseModelsLoaded.value) {
  92. nextTick(() => stop())
  93. resolve()
  94. }
  95. })
  96. })
  97. })
  98. await save()
  99. visible.value = false
  100. })
  101. watch(visible, (visible, oldvisible) => {
  102. if (visible !== oldvisible) {
  103. keyword.value = ''
  104. selects.value = selectIds.value
  105. console.log(selects.value)
  106. }
  107. })
  108. useViewStack(() => {
  109. initialScenes()
  110. })
  111. </script>
  112. <style lang="less" scoped>
  113. .model-header {
  114. display: flex;
  115. justify-content: flex-end;
  116. padding-bottom: 24px;
  117. }
  118. </style>
  119. <style lang="less">
  120. .ant-modal-root {
  121. @import 'ant-design-vue/dist/antd.less'; // 引入官方提供的 less 样式入口文件
  122. @primary-color: #26559B;
  123. @menu-item-active-bg: #E6F7FF;
  124. @table-selected-row-bg: #E6F7FF;
  125. // .ant-table-tbody > tr.ant-table-row-selected > td {
  126. // background: none;
  127. // }
  128. }
  129. </style>