scene-select.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <Modal
  3. width="800px"
  4. title="添加场景"
  5. :visible="visible"
  6. @ok="okHandler"
  7. @cancel="visible = false"
  8. okText="确定"
  9. cancelText="取消"
  10. >
  11. <div>
  12. <div className='model-header'>
  13. <Search
  14. className='content-header-search'
  15. placeholder="输入名称搜索"
  16. style="width: 264px"
  17. @search="val => keyword = val"
  18. />
  19. </div>
  20. <Table
  21. :row-key="record => record.modelId"
  22. :columns="cloumns"
  23. :rowSelection="rowSelection"
  24. :data-source="filterScenes"
  25. :pagination="false"
  26. />
  27. </div>
  28. </Modal>
  29. <div @click="visible = true">
  30. <slot></slot>
  31. </div>
  32. </template>
  33. <script lang="ts" setup>
  34. import { Modal, Input, Table } from 'ant-design-vue'
  35. import { computed, nextTick, ref, watchEffect } from 'vue';
  36. import { scenes, save } from '@/store'
  37. import { createLoadPack } from '@/utils'
  38. import { fuseModels, createFuseModels, addFuseModel, fuseModelsLoaded } from '@/store'
  39. import type { Scene } from '@/api'
  40. type Key = Scene['modelId']
  41. const Search = Input.Search
  42. const selectIds = computed(() => fuseModels.value.map(item => item.modelId))
  43. const visible = ref(false)
  44. const keyword = ref('')
  45. const filterScenes = computed(
  46. () => scenes.value.filter(item => item.name && item.modelId && item.name.includes(keyword.value))
  47. )
  48. const selects = ref<Key[]>(selectIds.value)
  49. const rowSelection: any = ref({
  50. selectedRowKeys: selects,
  51. onChange: (ids: number[]) => {
  52. selects.value = Array.from(new Set(ids.concat(selectIds.value)))
  53. }
  54. })
  55. const cloumns = [
  56. {
  57. title: '名称',
  58. dataIndex: 'name',
  59. key: 'name',
  60. },
  61. {
  62. title: '拍摄时间',
  63. dataIndex: 'createTime',
  64. key: 'createTime',
  65. }
  66. ]
  67. const okHandler = createLoadPack(async () => {
  68. const addPromises = selects.value
  69. .filter(modelId => !fuseModels.value.some(model => model.modelId === modelId))
  70. .map(modelId => createFuseModels({ modelId }))
  71. .map(addFuseModel)
  72. await Promise.all(addPromises)
  73. await new Promise<void>((resolve) => {
  74. nextTick(() => {
  75. const stop = watchEffect(() => {
  76. if (fuseModelsLoaded.value) {
  77. nextTick(() => stop())
  78. resolve()
  79. }
  80. })
  81. })
  82. })
  83. await save()
  84. visible.value = false
  85. })
  86. </script>
  87. <style lang="scss" scoped>
  88. .model-header {
  89. display: flex;
  90. justify-content: flex-end;
  91. padding-bottom: 24px;
  92. }
  93. </style>