1
0

addScenes.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <VRModelList :params="params">
  3. <template v-slot:header>
  4. <el-form-item label="名称:" style="grid-area: 1 / 1 / 2 / 4">
  5. <el-input v-model="params.pagging.state.query.name" placeholder="请输入" />
  6. </el-form-item>
  7. <el-form-item label="分组:" style="grid-area: 1 / 1 / 2 / 4">
  8. <el-select
  9. v-model="params.pagging.state.query.dictId"
  10. placeholder="请选择"
  11. style="width: 200px"
  12. clearable
  13. >
  14. <el-option
  15. v-for="item in options"
  16. :key="item.id"
  17. :label="item.dictName"
  18. :value="item.id"
  19. />
  20. </el-select>
  21. <!-- <el-input placeholder="请输入" /> -->
  22. </el-form-item>
  23. </template>
  24. <template v-slot:content>
  25. <el-table
  26. :data="params.pagging.state.table.rows"
  27. tooltip-effect="dark"
  28. ref="tableRef"
  29. style="width: 100%"
  30. size="large"
  31. @selection-change="changeSelection"
  32. >
  33. <el-table-column type="selection" width="50" :selectable="selectable"/>
  34. <el-table-column width="400" label="名称" v-slot:default="{ row }">
  35. <span class="truncate" :title="row.name || row.title">{{ row.name || row.title }}</span>
  36. </el-table-column>
  37. <el-table-column label="格式" prop="fileFormat"></el-table-column>
  38. <el-table-column width="140" label="大小" prop="fileSize" v-slot:default="{ row }">
  39. {{ formatSizeUnits(row.fileSize) }}
  40. </el-table-column>
  41. <el-table-column class="truncate" width="120" label="分组" prop="dictName" v-slot:default="{ row }">
  42. <span :title="row.dictName" class="truncate">{{ row.dictName }}</span>
  43. </el-table-column>
  44. <el-table-column
  45. label="操作"
  46. v-slot:default="{ row }"
  47. >
  48. <span
  49. class="oper-span"
  50. v-if="row.useType != 'animation'"
  51. @click="del(row)"
  52. style="color: var(--primaryColor)"
  53. >
  54. 删除
  55. </span>
  56. </el-table-column>
  57. </el-table>
  58. </template>
  59. </VRModelList>
  60. </template>
  61. <script setup lang="ts">
  62. import VRModelList from "./list.vue";
  63. import { Scene } from "@/store/scene";
  64. import { CaseScenes, getDictFileLists, delDictFileLists, addByMediaLiBrary, uploadNewFile } from "@/store/case";
  65. import { useScenePaggingParams } from "./pagging";
  66. import { ElMessage, ElMessageBox } from "element-plus";
  67. import { onMounted, ref, watch, watchEffect } from "vue";
  68. import {
  69. getCaseSceneList,
  70. getCaseScenes,
  71. getSceneKey,
  72. replaceCaseScenes,
  73. } from "@/store/case";
  74. import { QuiskExpose } from "@/helper/mount";
  75. import { ElTable } from "element-plus";
  76. const options = ref([]);
  77. const props = defineProps<{ caseId: number, filesTypeId: number, formats: Array<string> ,fileTypes: Array<string>, }>();
  78. const params = useScenePaggingParams(false);
  79. console.log("formats", params);
  80. const caseScenes = ref([]);
  81. const tableRef = ref<InstanceType<typeof ElTable>>();
  82. // const
  83. watch(
  84. () => params.pagging.state.query,
  85. () => {
  86. params.pagging.state.query.status = 2;
  87. params.pagging.state.query.fileTypes = props.fileTypes;
  88. params.pagging.state.query.caseId = props.caseId;
  89. if (props.fileTypes) params.pagging.state.query.fileTypes = props.fileTypes;
  90. },
  91. { immediate: true, deep: true }
  92. );
  93. // 复选框同步
  94. watchEffect(() => {
  95. if (!tableRef.value) return;
  96. const selectKeys = caseScenes.value.map((item) => item.id);
  97. console.log('caseScenes.value', caseScenes.value);
  98. // caseScenes.value.find(
  99. // (item) => item.type === params.pagging.state.query.type
  100. // )!.numList;
  101. params.pagging.state.table.rows.forEach((scene) => {
  102. tableRef.value!.toggleRowSelection(scene, selectKeys.includes(scene.id));
  103. });
  104. });
  105. const selectable = (row) => {
  106. let url = row.listCover || row.fileUrl;
  107. if(!url) return
  108. console.log("row", row, url, props.formats);
  109. const fileType = url.substring(url.lastIndexOf(".")).toLowerCase();
  110. return props.formats && props.formats.includes(fileType);
  111. }
  112. const del = async (row) => {
  113. ElMessageBox.confirm("确定要删除吗?", "提示", {
  114. confirmButtonText: "确定",
  115. cancelButtonText: "取消",
  116. type: "warning",
  117. }).then(async () => {
  118. const res = await delDictFileLists(row.id);
  119. params.pagging.queryReset()
  120. });
  121. }
  122. const changeSelection = (selectScenes) => {
  123. if (params.pagging.loading) return;
  124. const pagScenes = params.pagging.state.table.rows;
  125. const type = params.pagging.state.query.type;
  126. caseScenes.value = selectScenes;
  127. };
  128. function formatSizeUnits(bytes){
  129. if (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
  130. else if (bytes >= 1048576) { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
  131. else if (bytes >= 1024) { bytes = (bytes / 1024).toFixed(2) + " KB"; }
  132. else if (bytes > 1) { bytes = bytes + " bytes"; }
  133. else if (bytes == 1) { bytes = bytes + " byte"; }
  134. else { bytes = "0 bytes"; }
  135. return bytes;
  136. }
  137. // 初始化数据
  138. onMounted(async () => {
  139. const res = await getDictFileLists(1);
  140. console.log('onMounted', res);
  141. options.value = res;
  142. });
  143. const submit = async () => {
  144. return caseScenes.value.map((item) => item.uploadId || item.id);
  145. // () => replaceCaseScenes(props.caseId, caseScenes.value)
  146. };
  147. defineExpose<QuiskExpose>({
  148. submit,
  149. });
  150. </script>