index.vue
2.88 KB
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
<script lang="ts" setup>
import { StageFrame } from './components/StageFrame';
import { packageList } from '../packages/package';
import { computed, ref } from 'vue';
import { Tabs } from 'ant-design-vue';
import {
ComponentMode,
ConfigType,
PackagesCategoryEnum,
PackagesCategoryNameEnum,
} from '../packages/index.type';
import { fetchViewComponent, createComponent } from '../packages';
import { componentMap, registerComponent } from '../packages/componentMap';
import { watchEffect } from 'vue';
import { unref } from 'vue';
import { watch } from 'vue';
interface PropsCheckedType {
componentKey: string;
categoryKey: string;
}
const props = defineProps<{
checked?: PropsCheckedType;
}>();
const emit = defineEmits<{
(event: 'update:checked', value: PropsCheckedType): void;
}>();
const activeKey = ref(PackagesCategoryEnum.TEXT);
const getCategory = computed(() => {
return Object.keys(packageList).map((key) => {
const category = packageList[key] as ConfigType[];
return {
title: PackagesCategoryNameEnum[PackagesCategoryEnum[key]],
key,
items: category,
};
});
});
const getBindConfig = (key: string) => {
const config = createComponent({ key } as ConfigType, { mode: ComponentMode.SELECT_PREVIEW });
return {
config,
};
};
watchEffect(() => {
unref(getCategory).forEach((category) => {
category.items.forEach((item) => {
const { key } = item;
const component = fetchViewComponent({ key } as ConfigType);
registerComponent(key, component);
});
});
});
const handleSelected = (item: ConfigType) => {
const { key, package: packageKey } = item;
emit('update:checked', { categoryKey: packageKey!, componentKey: key });
};
watch(
() => props.checked?.categoryKey,
(value) => {
if (value) activeKey.value = value as PackagesCategoryEnum;
}
);
</script>
<template>
<section>
<Tabs v-model:activeKey="activeKey">
<Tabs.TabPane
v-for="item in getCategory"
:key="item.key"
:tab="item.title"
:forceRender="false"
>
<main class="flex min-h-64 px-2 gap-8 flex-wrap justify-start py-2">
<StageFrame
class="mt-4"
v-for="temp in item.items"
:key="temp.key"
@click.capture="handleSelected(temp)"
:class="temp.key === props.checked?.componentKey ? '!border-2 !border-blue-500' : ''"
>
<component :is="componentMap.get(temp.key)" v-bind="getBindConfig(temp.key)" />
<template #description>
<div class="h-10 leading-10 text-center border-t border-light-600 border-solid">
{{ temp.title }}
</div>
</template>
</StageFrame>
</main>
</Tabs.TabPane>
</Tabs>
</section>
</template>