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>