ModelList.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div class="model-list">
  3. <div class="list-header">
  4. <div class="list-info">
  5. <img class="icon" :src="getIconModel(model_item.img_src)" alt="" />
  6. <div class="info-desc">
  7. <div class="name">{{ model_item.name }}</div>
  8. <div class="desc">{{ model_item.desc }}</div>
  9. </div>
  10. </div>
  11. <div class="list-tools">
  12. <a-space>
  13. <a-button @click="handlerAddModel">
  14. <template #icon>
  15. <icon-plus />
  16. </template>
  17. {{ $t('management.addModelBtn') }}
  18. </a-button>
  19. <a-button @click="showMoreModel(model_item)">
  20. {{ $t('management.showMoreModelBtn') }}
  21. <template v-if="model_item.show_more">
  22. <icon-down />
  23. </template>
  24. <template v-if="!model_item.show_more">
  25. <icon-up />
  26. </template>
  27. </a-button>
  28. <icon-delete class="delete-icon" @click="handlerDeleteModel" />
  29. </a-space>
  30. </div>
  31. </div>
  32. <transition name="expand-collapse" @before-enter="beforeEnter" @enter="enter" @leave="leave">
  33. <div v-if="model_item.show_more" class="list-collapse">
  34. <CollapseItem v-for="item in model_item.models" :key="item.id" :models="item" />
  35. </div>
  36. </transition>
  37. </div>
  38. </template>
  39. <script setup>
  40. import CollapseItem from './CollapseItem.vue';
  41. import { useCollapse } from './use-collapse';
  42. import { getIconModel } from '../common/icon-map';
  43. const props = defineProps({
  44. model_item: {
  45. request: true,
  46. type: Object
  47. }
  48. });
  49. const emit = defineEmits(['showMore']);
  50. const { beforeEnter, enter, leave } = useCollapse(500);
  51. const handlerAddModel = () => {};
  52. const handlerDeleteModel = () => {};
  53. const showMoreModel = (item) => {
  54. emit('showMore', item);
  55. };
  56. </script>
  57. <style scoped lang="css">
  58. .model-list {
  59. padding: 20px 30px;
  60. margin-top: 10px;
  61. background-color: var(--color-bg-2);
  62. }
  63. .list-header {
  64. display: flex;
  65. justify-content: space-between;
  66. align-items: center;
  67. }
  68. .list-info {
  69. display: flex;
  70. flex-direction: row;
  71. align-items: center;
  72. gap: 20px;
  73. .icon {
  74. width: 44px;
  75. }
  76. }
  77. .info-desc {
  78. display: flex;
  79. flex-direction: column;
  80. gap: 10px;
  81. }
  82. .name {
  83. font-size: 16px;
  84. font-weight: bold;
  85. }
  86. .desc {
  87. color: var(--color-text-3);
  88. }
  89. .delete-icon {
  90. font-size: 20px;
  91. color: rgb(var(--orange-5));
  92. cursor: pointer;
  93. }
  94. .list-collapse {
  95. padding: 20px 20px 0 20px;
  96. max-height: 0;
  97. }
  98. </style>