Commit 67a97b78a5c5dfa8fee82518ff031b3219fbd4c7

Authored by ww
1 parent 77028fb7

wip: data board component

... ... @@ -42,12 +42,12 @@ async function genreateIcon() {
42 42
43 43 const iconNameList = Array.from(string.matchAll(groupReg)).map(([string]) => {
44 44 const [, , name] = string.match(getIdReg) || [];
45   - return name;
  45 + return name.replace('iconfont-', '');
46 46 });
47 47
48 48 await fs.writeFileSync(
49 49 join(output, outputFileName),
50   - `export default ${JSON.stringify({ icons: iconNameList }, null, 2)}`
  50 + `export default ${JSON.stringify({ prefix: 'iconfont', icons: iconNameList }, null, 2)}`
51 51 );
52 52
53 53 global.console.log(
... ...
... ... @@ -32,6 +32,7 @@ import ApiRadioGroup from './components/ApiRadioGroup.vue';
32 32 import JAddInput from './externalCompns/components/JAddInput.vue';
33 33 import { JEasyCron } from './externalCompns/components/JEasyCron';
34 34 import ColorPicker from './components/ColorPicker.vue';
  35 +import IconDrawer from './components/IconDrawer.vue';
35 36
36 37 const componentMap = new Map<ComponentType, Component>();
37 38
... ... @@ -71,6 +72,7 @@ componentMap.set('Upload', BasicUpload);
71 72 componentMap.set('JAddInput', JAddInput);
72 73 componentMap.set('JEasyCron', JEasyCron);
73 74 componentMap.set('ColorPicker', ColorPicker);
  75 +componentMap.set('IconDrawer', IconDrawer);
74 76
75 77 export function add(compName: ComponentType, component: Component) {
76 78 componentMap.set(compName, component);
... ...
  1 +<script lang="ts" setup>
  2 + import { BasicDrawer, useDrawer, useDrawerInner } from '/@/components/Drawer';
  3 + import IconData from '/@/components/Icon/data/iconfont.data';
  4 + import { SvgIcon } from '/@/components/Icon';
  5 + import { computed } from '@vue/reactivity';
  6 + import { onMounted, unref } from 'vue';
  7 +
  8 + const props = defineProps<{
  9 + value?: string;
  10 + color?: string;
  11 + }>();
  12 + const emit = defineEmits(['update:value']);
  13 + const iconList = IconData.icons;
  14 + const [register, { openDrawer, closeDrawer }] = useDrawer();
  15 + const getIcon = computed(() => {
  16 + return props.value || 'temperature';
  17 + });
  18 +
  19 + const getColor = computed(() => {
  20 + return props.color || '#377DFF';
  21 + });
  22 +
  23 + const handleOpenDrawer = () => {
  24 + openDrawer();
  25 + };
  26 +
  27 + const handleClick = (icon: string) => {
  28 + emit('update:value', icon);
  29 + closeDrawer();
  30 + };
  31 +
  32 + onMounted(() => {
  33 + emit('update:value', unref(getIcon));
  34 + });
  35 +</script>
  36 +
  37 +<template>
  38 + <SvgIcon
  39 + :name="getIcon"
  40 + :icon="getIcon"
  41 + prefix="iconfont"
  42 + class="cursor-pointer !w-6 !h-6"
  43 + :style="{ color: getColor }"
  44 + @click="handleOpenDrawer"
  45 + />
  46 + <BasicDrawer @register="register" v-bind="$attrs" title="选择图标" width="300px">
  47 + <section class="flex flex-wrap justify-start">
  48 + <SvgIcon
  49 + class="!h-6 cursor-pointer mb-3"
  50 + style="flex: 0 0 25%"
  51 + v-for="item in iconList"
  52 + :key="item"
  53 + :icon="item"
  54 + :name="item"
  55 + prefix="iconfont"
  56 + @click="handleClick(item)"
  57 + />
  58 + </section>
  59 + </BasicDrawer>
  60 +</template>
  61 +
  62 +<style scoped></style>
... ...
... ... @@ -113,4 +113,5 @@ export type ComponentType =
113 113 | 'Slider'
114 114 | 'JAddInput'
115 115 | 'Rate'
116   - | 'ColorPicker';
  116 + | 'ColorPicker'
  117 + | 'IconDrawer';
... ...
1 1 export default {
2   - icons: [
3   - 'iconfont-offline',
4   - 'iconfont-online',
5   - 'iconfont-wind-speed',
6   - 'iconfont-temperature',
7   - 'iconfont-CO2',
8   - 'iconfont-wind-speed-1',
9   - ],
  2 + prefix: 'iconfont',
  3 + icons: ['offline', 'online', 'wind-speed', 'temperature', 'CO2', 'wind-speed-1'],
10 4 };
... ...
... ... @@ -3,3 +3,5 @@ export enum MoreActionEvent {
3 3 COPY = 'copy',
4 4 DELETE = 'delete',
5 5 }
  6 +
  7 +// export enum
... ...
... ... @@ -7,8 +7,11 @@
7 7 import { ref, unref } from 'vue';
8 8 import VisualOptionsModal from './VisualOptionsModal.vue';
9 9 import { useModal } from '/@/components/Modal';
  10 + import { buildUUID } from '/@/utils/uuid';
10 11
11   - const dataSource = ref([{ id: 1 }]);
  12 + const props = defineProps();
  13 +
  14 + const dataSource = ref([{ id: 'string' }]);
12 15
13 16 const [basicRegister, basicMethod] = useForm({
14 17 schemas: basicSchema,
... ... @@ -48,7 +51,7 @@
48 51
49 52 const handleAdd = () => {
50 53 unref(dataSource).push({
51   - id: Math.random(),
  54 + id: buildUUID(),
52 55 });
53 56 };
54 57 </script>
... ... @@ -70,7 +73,7 @@
70 73 <CopyOutlined @click="handleCopy(item)" class="cursor-pointer text-lg" />
71 74 </Tooltip>
72 75 <Tooltip title="设置">
73   - <SettingOutlined @click="handleSetting(item)" class="cursor-pointer text-lg" />
  76 + <SettingOutlined @click="handleSetting()" class="cursor-pointer text-lg" />
74 77 </Tooltip>
75 78 <Tooltip title="删除">
76 79 <DeleteOutlined @click="handleDelete(item)" class="cursor-pointer text-lg" />
... ...
1 1 <script lang="ts" setup>
2 2 import { Tabs } from 'ant-design-vue';
3   - import { ref } from 'vue';
4 3 import BasicModal from '/@/components/Modal/src/BasicModal.vue';
5 4 import BasicConfiguration from './BasicConfiguration.vue';
6 5 import VisualConfiguration from './VisualConfiguration.vue';
7   - import VisualOptionsModal from './VisualOptionsModal.vue';
8   - const activeKey = ref('1');
  6 + import { ref } from 'vue';
  7 +
  8 + const componentId = ref('');
  9 +
  10 + interface SettingOption {
  11 + color?: string;
  12 + }
  13 +
  14 + const handleSettingUpdate = (value: SettingOption) => {};
9 15 </script>
10 16
11 17 <template>
12 18 <BasicModal v-bind="$attrs" title="自定义组件" width="70%">
13 19 <section>
14   - <Tabs type="card" v-model:activeKey="activeKey">
  20 + <Tabs type="card">
15 21 <Tabs.TabPane key="1" tab="基础配置">
16   - <BasicConfiguration />
  22 + <BasicConfiguration @change="handleSettingUpdate" />
17 23 </Tabs.TabPane>
18 24 <Tabs.TabPane key="2" tab="可视化配置">
19   - <VisualConfiguration />
20   - </Tabs.TabPane>
21   - <Tabs.TabPane key="3" tab="可视化选项">
22   - <VisualOptionsModal />
  25 + <VisualConfiguration v-model:value="componentId" />
23 26 </Tabs.TabPane>
24 27 </Tabs>
25 28 </section>
... ...
1 1 <script lang="ts" setup>
2 2 import { Tabs, List } from 'ant-design-vue';
3   - import { ref } from 'vue';
4 3 import VisualWidgetSelect from './VisualWidgetSelect.vue';
5 4 import TextComponent from '../../components/TextComponent/TextComponent.vue';
6 5 import { textComponentConfig } from '../../components/TextComponent/config';
7   - const checkedId = ref('1');
  6 + const props = defineProps<{
  7 + value: string;
  8 + }>();
  9 + const emit = defineEmits(['update:value']);
8 10
9 11 const handleCheck = (checked: string) => {
10   - checkedId.value = checked;
  12 + emit('update:value', checked);
11 13 };
12 14 </script>
13 15
... ... @@ -15,11 +17,14 @@
15 17 <section>
16 18 <Tabs>
17 19 <Tabs.TabPane key="1" tab="文本组件">
18   - <List :grid="{ gutter: 10, column: 3 }" :data-source="textComponentConfig">
  20 + <List
  21 + :grid="{ gutter: 10, column: 3, xs: 3, sm: 3, md: 3, lg: 3, xl: 3, xxl: 3 }"
  22 + :data-source="textComponentConfig"
  23 + >
19 24 <template #renderItem="{ item }">
20 25 <List.Item>
21 26 <VisualWidgetSelect
22   - :checked-id="checkedId"
  27 + :checked-id="props.value"
23 28 :control-id="item.id"
24 29 @change="handleCheck"
25 30 >
... ...
1 1 <script lang="ts" setup>
2   - import { modeOne } from '../config/visualOptions';
  2 + import { modeOne, modeTwo, modeThree, modeFour } from '../config/visualOptions';
3 3 import { useForm, BasicForm } from '/@/components/Form';
4 4 import { BasicModal, useModalInner } from '/@/components/Modal';
  5 +
5 6 const [registerForm, method] = useForm({
6   - schemas: modeOne,
  7 + schemas: modeTwo,
7 8 showActionButtonGroup: false,
8 9 labelWidth: 120,
9 10 baseColProps: {
... ... @@ -11,17 +12,21 @@
11 12 },
12 13 });
13 14
14   - const [registerModal, { closeModal }] = useModalInner();
  15 + const [register, { closeModal }] = useModalInner();
15 16
16 17 const handleGetValue = () => {
17 18 const value = method.getFieldsValue();
18 19 console.log(value);
19 20 };
  21 +
  22 + const handleClose = () => {
  23 + handleGetValue();
  24 + closeModal();
  25 + };
20 26 </script>
21 27
22 28 <template>
23   - <BasicModal v-bind="$attrs" @register="registerModal" title="" width="60%">
  29 + <BasicModal v-bind="$attrs" @register="register" @ok="handleClose" title="选项" width="60%">
24 30 <BasicForm @register="registerForm" />
25   - <button @click="handleGetValue">啊按钮</button>
26 31 </BasicModal>
27 32 </template>
... ...
  1 +import { getOrganizationList } from '/@/api/system/system';
1 2 import { FormSchema } from '/@/components/Form';
2 3
3 4 export const basicSchema: FormSchema[] = [
... ... @@ -16,11 +17,19 @@ export const basicSchema: FormSchema[] = [
16 17 export const dataSourceSchema: FormSchema[] = [
17 18 {
18 19 field: 'org',
19   - component: 'TreeSelect',
  20 + component: 'ApiTreeSelect',
20 21 label: '组织',
21 22 colProps: { span: 6 },
22   - componentProps: {
23   - placeholder: '请选择组织',
  23 + componentProps() {
  24 + return {
  25 + placeholder: '请选择组织',
  26 + api: async () => {
  27 + const data = await getOrganizationList();
  28 + return data;
  29 + },
  30 +
  31 + onChange() {},
  32 + };
24 33 },
25 34 },
26 35 {
... ...
... ... @@ -29,7 +29,7 @@ export const modeOne: FormSchema[] = [
29 29
30 30 export const modeTwo: FormSchema[] = [
31 31 {
32   - field: visualOptionField.UNIT,
  32 + field: visualOptionField.FONT_COLOR,
33 33 label: '数值字体颜色',
34 34 component: 'ColorPicker',
35 35 changeEvent: 'update:value',
... ... @@ -51,7 +51,14 @@ export const modeTwo: FormSchema[] = [
51 51 {
52 52 field: visualOptionField.ICON,
53 53 label: '图标',
54   - component: 'Input',
  54 + component: 'IconDrawer',
  55 + changeEvent: 'update:value',
  56 + componentProps({ formModel }) {
  57 + const color = formModel[visualOptionField.ICON_COLOR];
  58 + return {
  59 + color,
  60 + };
  61 + },
55 62 },
56 63 ];
57 64
... ...
... ... @@ -180,7 +180,7 @@
180 180 :w="item.w"
181 181 :h="item.h"
182 182 :i="item.i"
183   - style="display: flex; flex-wrap: wrap"
  183 + :style="{ display: 'flex', flexWrap: 'wrap' }"
184 184 class="grid-item-layout"
185 185 @resized="itemResized"
186 186 @resize="itemResized"
... ... @@ -189,7 +189,7 @@
189 189 >
190 190 <WidgetWrapper
191 191 :key="item.i"
192   - :ref="(el) => setComponentRef(el, item)"
  192 + :ref="(el: Element) => setComponentRef(el, item)"
193 193 :data-source="item.chart"
194 194 >
195 195 <template #header>
... ...
... ... @@ -58,7 +58,7 @@
58 58 ];
59 59
60 60 const handleMenuEvent = (event: DropMenu) => {
61   - if (event.event === MoreEvent.EDIT) {
  61 + if (event.event === MoreActionEvent.EDIT) {
62 62 handleEdit();
63 63 }
64 64 };
... ...