index.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <List key="id" :data="list" class="scene-list">
  3. <template #action>
  4. <slot name="action" />
  5. </template>
  6. <template #atom="{ item }">
  7. <div v-if="item.raw === fuseModel"
  8. @click="updateCurrent(item.raw)"
  9. >
  10. <ModelList
  11. class="scene-model-list"
  12. :class="{active: current === fuseModel}"
  13. :title="getModelTypeDesc(fuseModel as any)"
  14. :show-content="showModelList"
  15. >
  16. <template #action>
  17. <ui-icon
  18. :type="`pull-${showModelList ? 'up' : 'down'}`"
  19. @click="showModelList = !showModelList"
  20. ctrl
  21. />
  22. </template>
  23. </ModelList>
  24. </div>
  25. <div
  26. class="scene"
  27. :class="{disabled: item.raw.status !== SceneStatus.SUCCESS}"
  28. @click="updateCurrent(item.raw)"
  29. v-else
  30. >
  31. <p>{{ item.raw.name }}</p>
  32. <p>{{ SceneTypeDesc[item.raw.type as SceneType] }}</p>
  33. </div>
  34. </template>
  35. </List>
  36. </template>
  37. <script lang="ts" setup>
  38. import { computed, nextTick, ref, watch } from 'vue'
  39. import { scenes, SceneType, SceneTypeDesc, fuseModels, SceneStatus } from '@/store'
  40. import List from '@/components/list/index.vue'
  41. import ModelList from '../model-list/index.vue'
  42. import { fuseModel, getModelTypeDesc } from '@/model'
  43. import type { ModelType, FuseModelType } from '@/model'
  44. import type { Scene } from '@/store'
  45. const emit = defineEmits<{ (e: 'update:current', data: ModelType): void }>()
  46. const props = defineProps<{ current: ModelType }>()
  47. const showModelList = ref(true)
  48. const list = computed(() => {
  49. const sceneList = scenes.value.map(scene => ({
  50. raw: scene,
  51. select: props.current !== fuseModel
  52. && (props.current.num === scene.num )
  53. && props.current.type === scene.type
  54. }))
  55. if (fuseModels.value.length) {
  56. return [{ raw: fuseModel }, ...sceneList]
  57. } else {
  58. return sceneList
  59. }
  60. })
  61. const updateCurrent = (scene: FuseModelType | Scene) => {
  62. if (scene === fuseModel) {
  63. emit('update:current', scene)
  64. } else {
  65. emit('update:current', { type: scene.type, num: scene.num })
  66. }
  67. }
  68. const stopWatch = watch(list, () => {
  69. if (!list.value.some(model => model.raw === fuseModel)) {
  70. updateCurrent(list.value[0].raw as any)
  71. nextTick(() => stopWatch())
  72. }
  73. }, { immediate: true })
  74. </script>
  75. <style lang="scss">
  76. .scene-list > .content > li {
  77. padding: 0 !important;
  78. }
  79. .scene {
  80. padding: 0 20px;
  81. p {
  82. height: 1.5em;
  83. overflow: hidden;
  84. text-overflow: ellipsis
  85. }
  86. }
  87. .scene-model-list.list {
  88. margin-bottom: -20px;
  89. margin-top: -20px;
  90. .header {
  91. padding: 30px 20px 20px;
  92. h3 {
  93. font-size: 20px;
  94. font-weight: bold;
  95. color: #FFFFFF;
  96. }
  97. }
  98. &.active .header {
  99. background-color: rgba(0, 200, 175, 0.16);
  100. }
  101. .content li:last-child .atom-content {
  102. border: none;
  103. }
  104. }
  105. </style>