|
@@ -49,7 +49,12 @@
|
|
</div>
|
|
</div>
|
|
<template v-else>
|
|
<template v-else>
|
|
<div
|
|
<div
|
|
- v-if="activedGroup === '组件' || activedGroup === '图片'"
|
|
|
|
|
|
+ v-if="
|
|
|
|
+ activedGroup === '组件' ||
|
|
|
|
+ activedGroup === '图片' ||
|
|
|
|
+ (activeAssets === 'user' &&
|
|
|
|
+ (activedGroup === '方案' || activedGroup === '模板'))
|
|
|
|
+ "
|
|
class="px-16 mt-12 mb-8 ml-4"
|
|
class="px-16 mt-12 mb-8 ml-4"
|
|
>
|
|
>
|
|
<a @click="onCreateFolder">+ 新建文件夹</a>
|
|
<a @click="onCreateFolder">+ 新建文件夹</a>
|
|
@@ -81,8 +86,8 @@
|
|
<t-space size="small" @click.stop tabindex="0">
|
|
<t-space size="small" @click.stop tabindex="0">
|
|
<t-upload
|
|
<t-upload
|
|
v-if="
|
|
v-if="
|
|
- item.canEdited ||
|
|
|
|
- (activedGroup === '组件' && item.name === '我的组件')
|
|
|
|
|
|
+ item.canEdited &&
|
|
|
|
+ (activedGroup === '组件' || activedGroup === '图片')
|
|
"
|
|
"
|
|
action="/api/image/upload"
|
|
action="/api/image/upload"
|
|
:accept="activedGroup === '组件' ? '.svg' : 'image/*'"
|
|
:accept="activedGroup === '组件' ? '.svg' : 'image/*'"
|
|
@@ -103,8 +108,13 @@
|
|
>
|
|
>
|
|
<t-icon name="image" class="hover" />
|
|
<t-icon name="image" class="hover" />
|
|
</t-upload>
|
|
</t-upload>
|
|
-
|
|
|
|
<template v-if="item.canEdited">
|
|
<template v-if="item.canEdited">
|
|
|
|
+ <t-icon
|
|
|
|
+ v-if="activedGroup === '方案' || activedGroup === '模板'"
|
|
|
|
+ name="add"
|
|
|
|
+ class="hover"
|
|
|
|
+ @click="onAdd(item)"
|
|
|
|
+ />
|
|
<t-icon
|
|
<t-icon
|
|
name="edit"
|
|
name="edit"
|
|
class="hover"
|
|
class="hover"
|
|
@@ -267,10 +277,11 @@ import {
|
|
getComponentsList,
|
|
getComponentsList,
|
|
getLe5leV,
|
|
getLe5leV,
|
|
updateCollection,
|
|
updateCollection,
|
|
|
|
+ getCollectionList,
|
|
} from '@/services/api';
|
|
} from '@/services/api';
|
|
import { convertPen } from '@/services/upgrade';
|
|
import { convertPen } from '@/services/upgrade';
|
|
import { isGif } from '@/services/utils';
|
|
import { isGif } from '@/services/utils';
|
|
-import { autoSave, delAttrs } from '@/services/common';
|
|
|
|
|
|
+import { autoSave, delAttrs, blank, useFolder } from '@/services/common';
|
|
import { debounce, throttle } from '@/services/debouce';
|
|
import { debounce, throttle } from '@/services/debouce';
|
|
import { searchObjectPinyin } from '@/services/pinyin';
|
|
import { searchObjectPinyin } from '@/services/pinyin';
|
|
import { getCookie } from '@/services/cookie';
|
|
import { getCookie } from '@/services/cookie';
|
|
@@ -281,6 +292,7 @@ import { useUser } from '@/services/user';
|
|
import { iframeCustom } from '@/services/defaults';
|
|
import { iframeCustom } from '@/services/defaults';
|
|
|
|
|
|
const { user } = useUser();
|
|
const { user } = useUser();
|
|
|
|
+const { setFolder } = useFolder();
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
|
|
|
const activedGroup = ref('');
|
|
const activedGroup = ref('');
|
|
@@ -365,8 +377,6 @@ const activedPanels = reactive<any>({});
|
|
|
|
|
|
const caseCaches = [];
|
|
const caseCaches = [];
|
|
const templateCaches = [];
|
|
const templateCaches = [];
|
|
-const userCaseCaches = [];
|
|
|
|
-const userTemplateCaches = [];
|
|
|
|
const materials = [];
|
|
const materials = [];
|
|
const pngs = [];
|
|
const pngs = [];
|
|
|
|
|
|
@@ -421,22 +431,9 @@ const groupChange = async (name: string) => {
|
|
subGroups.value = cases;
|
|
subGroups.value = cases;
|
|
lastName = name;
|
|
lastName = name;
|
|
} else {
|
|
} else {
|
|
- if (!userCaseCaches.length) {
|
|
|
|
- loading.value = true;
|
|
|
|
- userCaseCaches.push(...(await getCaseProjects('我的方案')));
|
|
|
|
- for (const group of cases) {
|
|
|
|
- group.list = [];
|
|
|
|
- for (const item of userCaseCaches) {
|
|
|
|
- if (item.case === group.name) {
|
|
|
|
- group.list.push(item);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- loading.value = false;
|
|
|
|
- }
|
|
|
|
|
|
+ subGroups.value = await getUserProjects('le5leV');
|
|
groupType.value = 1;
|
|
groupType.value = 1;
|
|
- //TODO 场景选择
|
|
|
|
- subGroups.value = cases;
|
|
|
|
|
|
+ await getPrivateProjects('le5leV');
|
|
userLastName = name;
|
|
userLastName = name;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -460,22 +457,9 @@ const groupChange = async (name: string) => {
|
|
subGroups.value = templates;
|
|
subGroups.value = templates;
|
|
lastName = name;
|
|
lastName = name;
|
|
} else {
|
|
} else {
|
|
- if (!userTemplateCaches.length) {
|
|
|
|
- loading.value = true;
|
|
|
|
- userTemplateCaches.push(...(await getCaseProjects('我的模版')));
|
|
|
|
- for (const group of templates) {
|
|
|
|
- group.list = [];
|
|
|
|
- for (const item of userTemplateCaches) {
|
|
|
|
- if (item.case === group.name) {
|
|
|
|
- group.list.push(item);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- loading.value = false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ subGroups.value = await getUserProjects('le5leV-template');
|
|
groupType.value = 1;
|
|
groupType.value = 1;
|
|
- subGroups.value = templates;
|
|
|
|
|
|
+ await getPrivateProjects('le5leV-template');
|
|
userLastName = name;
|
|
userLastName = name;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -636,6 +620,44 @@ const getCaseProjects = async (name: string, current = 1, pageSize = 1000) => {
|
|
return ret.list;
|
|
return ret.list;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+// const getUserProjects = async (name: string, current = 1, pageSize = 1000) => {
|
|
|
|
+// const query: any = { tags: name };
|
|
|
|
+
|
|
|
|
+// const ret: any = await axios.post(
|
|
|
|
+// '/api/data/le5leV/list',
|
|
|
|
+// {
|
|
|
|
+// query,
|
|
|
|
+// projection: {
|
|
|
|
+// id: 1,
|
|
|
|
+// _id: 1,
|
|
|
|
+// name: 1,
|
|
|
|
+// image: 1,
|
|
|
|
+// price: 1,
|
|
|
|
+// case: 1,
|
|
|
|
+// folder: 1,
|
|
|
|
+// },
|
|
|
|
+// sort: { createdAt: 1 },
|
|
|
|
+// },
|
|
|
|
+// {
|
|
|
|
+// params: {
|
|
|
|
+// current,
|
|
|
|
+// pageSize,
|
|
|
|
+// },
|
|
|
|
+// }
|
|
|
|
+// );
|
|
|
|
+
|
|
|
|
+// if (!ret) {
|
|
|
|
+// return [];
|
|
|
|
+// }
|
|
|
|
+// for (const item of ret.list) {
|
|
|
|
+// if (!item.id) {
|
|
|
|
+// item.id = item._id;
|
|
|
|
+// }
|
|
|
|
+// item.draggable = false;
|
|
|
|
+// }
|
|
|
|
+// return ret.list;
|
|
|
|
+// };
|
|
|
|
+
|
|
const getPrivateGroups = async () => {
|
|
const getPrivateGroups = async () => {
|
|
const list = [
|
|
const list = [
|
|
{
|
|
{
|
|
@@ -722,6 +744,86 @@ const getUserComponents = async () => {
|
|
return list;
|
|
return list;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+const getUserProjects = async (type: string) => {
|
|
|
|
+ const list = [
|
|
|
|
+ {
|
|
|
|
+ name: '未分类',
|
|
|
|
+ list: [],
|
|
|
|
+ },
|
|
|
|
+ ];
|
|
|
|
+ const config = {
|
|
|
|
+ params: {
|
|
|
|
+ current: 1,
|
|
|
|
+ pageSize: 1000,
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ let ret: any = await axios.post(
|
|
|
|
+ '/api/data/folders/list',
|
|
|
|
+ {
|
|
|
|
+ projection: {
|
|
|
|
+ image: 1,
|
|
|
|
+ _id: 1,
|
|
|
|
+ name: 1,
|
|
|
|
+ list: 1,
|
|
|
|
+ },
|
|
|
|
+ query: {
|
|
|
|
+ type,
|
|
|
|
+ },
|
|
|
|
+ sort: { createdAt: 1 },
|
|
|
|
+ },
|
|
|
|
+ config
|
|
|
|
+ );
|
|
|
|
+ if (!ret) {
|
|
|
|
+ ret = { list: [] };
|
|
|
|
+ }
|
|
|
|
+ for (const item of ret.list) {
|
|
|
|
+ item.canEdited = true;
|
|
|
|
+ }
|
|
|
|
+ list.push(...ret.list);
|
|
|
|
+ return list;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const getPrivateProjects = async (type: string) => {
|
|
|
|
+ for (const item of subGroups.value) {
|
|
|
|
+ if (!item.list.length) {
|
|
|
|
+ item.loading = true;
|
|
|
|
+ //TODO 方案/模板分类
|
|
|
|
+ if (item.name === '未分类') {
|
|
|
|
+ const data = {
|
|
|
|
+ query: {
|
|
|
|
+ folder: '',
|
|
|
|
+ isTemplate: type === 'le5leV-template' ? true : undefined,
|
|
|
|
+ },
|
|
|
|
+ projection: {
|
|
|
|
+ image: 1,
|
|
|
|
+ _id: 1,
|
|
|
|
+ name: 1,
|
|
|
|
+ isTemplate: 1,
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ const config = {
|
|
|
|
+ params: {
|
|
|
|
+ current: 1,
|
|
|
|
+ pageSize: 1000,
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ const res: any = await getCollectionList('le5leV', data, config);
|
|
|
|
+ if (res?.list) {
|
|
|
|
+ // res.list.forEach((item) => {
|
|
|
|
+ // item.draggable = false;
|
|
|
|
+ // })
|
|
|
|
+ item.list = res.list;
|
|
|
|
+ if (type === 'le5leV') {
|
|
|
|
+ //过滤模板
|
|
|
|
+ item.list = res.list.filter((item) => !item.isTemplate);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ item.loading = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
const dragStart = async (event: DragEvent | MouseEvent, item: any) => {
|
|
const dragStart = async (event: DragEvent | MouseEvent, item: any) => {
|
|
event.stopPropagation();
|
|
event.stopPropagation();
|
|
if (!item) {
|
|
if (!item) {
|
|
@@ -734,7 +836,13 @@ const dragStart = async (event: DragEvent | MouseEvent, item: any) => {
|
|
let data = null;
|
|
let data = null;
|
|
const id = item._id || item.id;
|
|
const id = item._id || item.id;
|
|
let isAsync: boolean;
|
|
let isAsync: boolean;
|
|
- if (item.draggable === false) {
|
|
|
|
|
|
+ if (
|
|
|
|
+ activeAssets.value === 'user' &&
|
|
|
|
+ ['方案', '模板'].includes(activedGroup.value)
|
|
|
|
+ ) {
|
|
|
|
+ item.draggable = false;
|
|
|
|
+ data = item.data || item;
|
|
|
|
+ } else if (item.draggable === false) {
|
|
//方案
|
|
//方案
|
|
data = item.data || item;
|
|
data = item.data || item;
|
|
} else if (item['3d']) {
|
|
} else if (item['3d']) {
|
|
@@ -745,9 +853,9 @@ const dragStart = async (event: DragEvent | MouseEvent, item: any) => {
|
|
tags: ['meta3d'],
|
|
tags: ['meta3d'],
|
|
zIndex: 1,
|
|
zIndex: 1,
|
|
operationalRect: {
|
|
operationalRect: {
|
|
- x: 0.1,
|
|
|
|
|
|
+ x: 0.2,
|
|
y: 0.2,
|
|
y: 0.2,
|
|
- height: 0.9,
|
|
|
|
|
|
+ height: 0.8,
|
|
width: 0.6,
|
|
width: 0.6,
|
|
},
|
|
},
|
|
props: {
|
|
props: {
|
|
@@ -804,7 +912,6 @@ const dragStart = async (event: DragEvent | MouseEvent, item: any) => {
|
|
if (!Array.isArray(data)) {
|
|
if (!Array.isArray(data)) {
|
|
data = deepClone([data]);
|
|
data = deepClone([data]);
|
|
}
|
|
}
|
|
-
|
|
|
|
!dropped && (meta2d.canvas.addCaches = data);
|
|
!dropped && (meta2d.canvas.addCaches = data);
|
|
|
|
|
|
if (event instanceof DragEvent) {
|
|
if (event instanceof DragEvent) {
|
|
@@ -827,7 +934,6 @@ const open = async (item: any) => {
|
|
if (!item || item.draggable !== false) {
|
|
if (!item || item.draggable !== false) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
const ret: any = await getLe5leV(item._id || item.id);
|
|
const ret: any = await getLe5leV(item._id || item.id);
|
|
if (!ret) {
|
|
if (!ret) {
|
|
if (item.price > 0) {
|
|
if (item.price > 0) {
|
|
@@ -837,20 +943,30 @@ const open = async (item: any) => {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- sessionStorage.setItem('opening', '1');
|
|
|
|
- router.push({
|
|
|
|
- path: '/',
|
|
|
|
- query: {
|
|
|
|
- r: Date.now() + '',
|
|
|
|
- },
|
|
|
|
- });
|
|
|
|
|
|
+ if (activeAssets.value === 'user') {
|
|
|
|
+ router.push({
|
|
|
|
+ path: '/',
|
|
|
|
+ query: {
|
|
|
|
+ r: Date.now() + '',
|
|
|
|
+ id: item._id,
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ sessionStorage.setItem('opening', '1');
|
|
|
|
+ router.push({
|
|
|
|
+ path: '/',
|
|
|
|
+ query: {
|
|
|
|
+ r: Date.now() + '',
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
|
|
- for (const k of delAttrs) {
|
|
|
|
- delete ret[k];
|
|
|
|
|
|
+ for (const k of delAttrs) {
|
|
|
|
+ delete ret[k];
|
|
|
|
+ }
|
|
|
|
+ autoSave();
|
|
|
|
+ meta2d.open(ret);
|
|
|
|
+ meta2d.fitView();
|
|
}
|
|
}
|
|
- autoSave();
|
|
|
|
- meta2d.open(ret);
|
|
|
|
- meta2d.fitView();
|
|
|
|
};
|
|
};
|
|
|
|
|
|
const getPrivateGraphics = async () => {
|
|
const getPrivateGraphics = async () => {
|
|
@@ -942,7 +1058,11 @@ const createFoder = async () => {
|
|
MessagePlugin.error('已经存在相同名称文件夹');
|
|
MessagePlugin.error('已经存在相同名称文件夹');
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (activedGroup.value === '组件') {
|
|
|
|
|
|
+ if (activeAssets.value !== 'user') {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (['组件', '方案', '模板'].includes(activedGroup.value)) {
|
|
if (editedFolder.value._id) {
|
|
if (editedFolder.value._id) {
|
|
const ret: any = await axios.post('/api/data/folders/update', {
|
|
const ret: any = await axios.post('/api/data/folders/update', {
|
|
_id: editedFolder.value._id,
|
|
_id: editedFolder.value._id,
|
|
@@ -953,9 +1073,15 @@ const createFoder = async () => {
|
|
editedFolder.value.edited = false;
|
|
editedFolder.value.edited = false;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
|
|
+ let type =
|
|
|
|
+ activedGroup.value === '组件'
|
|
|
|
+ ? 'le5leV-components'
|
|
|
|
+ : activedGroup.value === '模板'
|
|
|
|
+ ? 'le5leV-template'
|
|
|
|
+ : 'le5leV';
|
|
const ret: any = await axios.post('/api/data/folders/add', {
|
|
const ret: any = await axios.post('/api/data/folders/add', {
|
|
name: editedFolder.value.label,
|
|
name: editedFolder.value.label,
|
|
- type: 'le5leV-components',
|
|
|
|
|
|
+ type,
|
|
list: [],
|
|
list: [],
|
|
});
|
|
});
|
|
if (ret) {
|
|
if (ret) {
|
|
@@ -994,6 +1120,18 @@ const onEditHeader = (item: any) => {
|
|
editedFolder.value = item;
|
|
editedFolder.value = item;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+const onAdd = (item: any) => {
|
|
|
|
+ blank();
|
|
|
|
+ setFolder(item);
|
|
|
|
+ router.push({
|
|
|
|
+ path: '/',
|
|
|
|
+ query: {
|
|
|
|
+ r: Date.now() + '',
|
|
|
|
+ folder: item.name,
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+};
|
|
|
|
+
|
|
const onKeyHeader = (text: string, event: any) => {
|
|
const onKeyHeader = (text: string, event: any) => {
|
|
if (event.e.key === 'Escape') {
|
|
if (event.e.key === 'Escape') {
|
|
editedFolder.value.edited = false;
|
|
editedFolder.value.edited = false;
|
|
@@ -1369,7 +1507,10 @@ const delFolder = async (item: any) => {
|
|
|
|
|
|
const id = item._id || item.id;
|
|
const id = item._id || item.id;
|
|
let ret: any;
|
|
let ret: any;
|
|
- if (activedGroup.value === '组件') {
|
|
|
|
|
|
+ if (activeAssets.value !== 'user') {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (['组件', '方案', '模板'].includes(activedGroup.value)) {
|
|
ret = await axios.post('/api/data/folders/delete', {
|
|
ret = await axios.post('/api/data/folders/delete', {
|
|
id,
|
|
id,
|
|
});
|
|
});
|
|
@@ -1414,6 +1555,12 @@ onUnmounted(() => {
|
|
justify-content: center;
|
|
justify-content: center;
|
|
align-items: center;
|
|
align-items: center;
|
|
display: flex;
|
|
display: flex;
|
|
|
|
+ .t-radio-button {
|
|
|
|
+ &.t-is-checked {
|
|
|
|
+ background-color: var(--color-primary-hover) !important;
|
|
|
|
+ color: #fff !important;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
.groups-panel {
|
|
.groups-panel {
|
|
display: grid;
|
|
display: grid;
|