zhengyiming
20 小时以前 55119aeab85c9dc310ab8bc3de3091a20fa9a684
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<!--
 * @Author: 秦少卫
 * @Date: 2024-05-17 15:31:24
 * @LastEditors: 秦少卫
 * @LastEditTime: 2024-07-06 17:16:52
 * @Description: 素材列表
-->
 
<template>
  <div>
    <!-- 搜索组件 -->
    <searchType
      ref="selectTypeRef"
      :typeListApi="getMaterialTypes"
      @change="searchChange"
    ></searchType>
 
    <!-- 分类列表 -->
    <typeList
      v-show="!filters.material_type.$contains && !filters.name.$contains"
      :typeApi="getMaterialTypes"
      :typeListApi="getMaterialsByType"
      typeKey="material_type"
      :formatData="formatData"
      @selectType="selectType"
      @click="addItem"
      @dragend="dragItem"
    ></typeList>
 
    <!-- 搜索分页列表 -->
    <pageList
      v-if="filters.material_type.$contains || filters.name.$contains"
      DOMId="materialList"
      :pageListApi="getMaterials"
      :filters="filters"
      @click="addItem"
      :formatData="formatData"
      @dragend="dragItem"
    ></pageList>
  </div>
</template>
 
<script setup name="ImportSvg">
import searchType from '@/components/common/searchType';
import typeList from '@/components/common/typeList.vue';
import pageList from '@/components/common/pageList.vue';
import useSelect from '@/hooks/select';
import { getMaterialInfoUrl, getMaterialPreviewUrl } from '@/hooks/usePageList';
import { getMaterialTypes, getMaterialsByType, getMaterials } from '@/api/material';
import useCalculate from '@/hooks/useCalculate';
import { useRoute } from 'vue-router';
import { Utils } from '@kuaitu/core';
 
const { canvasEditor } = useSelect();
 
const { isOutsideCanvas } = useCalculate();
const selectTypeRef = ref();
 
const filters = reactive({
  material_type: {
    $contains: '',
  },
  name: {
    $contains: '',
  },
});
 
// 分页格式化
const formatData = (data) => {
  return data.map((item) => {
    return {
      id: item.id,
      name: item.attributes.name,
      desc: item.attributes.desc,
      src: getMaterialInfoUrl(item.attributes.img),
      previewSrc: getMaterialPreviewUrl(item.attributes.img),
    };
  });
};
 
// 搜索改变
const searchChange = async ({ searchKeyWord, typeValue }) => {
  filters.name.$contains = '';
  filters.material_type.$contains = '';
  await nextTick();
  filters.name.$contains = searchKeyWord;
  filters.material_type.$contains = typeValue;
};
 
// 分类列表选择
const selectType = async (type) => {
  filters.material_type.$contains = type;
  selectTypeRef.value.setType(type);
  await nextTick();
};
 
// 按照类型渲染
const dragItem = async ({ e }) => {
  if (isOutsideCanvas(e.clientX, e.clientY)) return;
  const imgItem = await canvasEditor.createImgByElement(e.target);
  canvasEditor.addBaseType(imgItem, {
    scale: true,
    event: e,
  });
};
 
const addItem = async ({ e }) => {
  const imgItem = await canvasEditor.createImgByElement(e.target);
  canvasEditor.addBaseType(imgItem, {
    scale: true,
  });
};
 
onMounted(async () => {
  // 默认添加图片
  const route = useRoute();
  if (route?.query?.loadFile) {
    const url = route.query.loadFile;
    const image = await Utils.insertImgFile(url);
    addItem({ target: image });
  }
});
</script>
 
<style scoped lang="less"></style>