Showing
14 changed files
with
134 additions
and
41 deletions
@@ -42,12 +42,12 @@ async function genreateIcon() { | @@ -42,12 +42,12 @@ async function genreateIcon() { | ||
42 | 42 | ||
43 | const iconNameList = Array.from(string.matchAll(groupReg)).map(([string]) => { | 43 | const iconNameList = Array.from(string.matchAll(groupReg)).map(([string]) => { |
44 | const [, , name] = string.match(getIdReg) || []; | 44 | const [, , name] = string.match(getIdReg) || []; |
45 | - return name; | 45 | + return name.replace('iconfont-', ''); |
46 | }); | 46 | }); |
47 | 47 | ||
48 | await fs.writeFileSync( | 48 | await fs.writeFileSync( |
49 | join(output, outputFileName), | 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 | global.console.log( | 53 | global.console.log( |
@@ -32,6 +32,7 @@ import ApiRadioGroup from './components/ApiRadioGroup.vue'; | @@ -32,6 +32,7 @@ import ApiRadioGroup from './components/ApiRadioGroup.vue'; | ||
32 | import JAddInput from './externalCompns/components/JAddInput.vue'; | 32 | import JAddInput from './externalCompns/components/JAddInput.vue'; |
33 | import { JEasyCron } from './externalCompns/components/JEasyCron'; | 33 | import { JEasyCron } from './externalCompns/components/JEasyCron'; |
34 | import ColorPicker from './components/ColorPicker.vue'; | 34 | import ColorPicker from './components/ColorPicker.vue'; |
35 | +import IconDrawer from './components/IconDrawer.vue'; | ||
35 | 36 | ||
36 | const componentMap = new Map<ComponentType, Component>(); | 37 | const componentMap = new Map<ComponentType, Component>(); |
37 | 38 | ||
@@ -71,6 +72,7 @@ componentMap.set('Upload', BasicUpload); | @@ -71,6 +72,7 @@ componentMap.set('Upload', BasicUpload); | ||
71 | componentMap.set('JAddInput', JAddInput); | 72 | componentMap.set('JAddInput', JAddInput); |
72 | componentMap.set('JEasyCron', JEasyCron); | 73 | componentMap.set('JEasyCron', JEasyCron); |
73 | componentMap.set('ColorPicker', ColorPicker); | 74 | componentMap.set('ColorPicker', ColorPicker); |
75 | +componentMap.set('IconDrawer', IconDrawer); | ||
74 | 76 | ||
75 | export function add(compName: ComponentType, component: Component) { | 77 | export function add(compName: ComponentType, component: Component) { |
76 | componentMap.set(compName, component); | 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> |
1 | export default { | 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 | }; |
@@ -7,8 +7,11 @@ | @@ -7,8 +7,11 @@ | ||
7 | import { ref, unref } from 'vue'; | 7 | import { ref, unref } from 'vue'; |
8 | import VisualOptionsModal from './VisualOptionsModal.vue'; | 8 | import VisualOptionsModal from './VisualOptionsModal.vue'; |
9 | import { useModal } from '/@/components/Modal'; | 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 | const [basicRegister, basicMethod] = useForm({ | 16 | const [basicRegister, basicMethod] = useForm({ |
14 | schemas: basicSchema, | 17 | schemas: basicSchema, |
@@ -48,7 +51,7 @@ | @@ -48,7 +51,7 @@ | ||
48 | 51 | ||
49 | const handleAdd = () => { | 52 | const handleAdd = () => { |
50 | unref(dataSource).push({ | 53 | unref(dataSource).push({ |
51 | - id: Math.random(), | 54 | + id: buildUUID(), |
52 | }); | 55 | }); |
53 | }; | 56 | }; |
54 | </script> | 57 | </script> |
@@ -70,7 +73,7 @@ | @@ -70,7 +73,7 @@ | ||
70 | <CopyOutlined @click="handleCopy(item)" class="cursor-pointer text-lg" /> | 73 | <CopyOutlined @click="handleCopy(item)" class="cursor-pointer text-lg" /> |
71 | </Tooltip> | 74 | </Tooltip> |
72 | <Tooltip title="设置"> | 75 | <Tooltip title="设置"> |
73 | - <SettingOutlined @click="handleSetting(item)" class="cursor-pointer text-lg" /> | 76 | + <SettingOutlined @click="handleSetting()" class="cursor-pointer text-lg" /> |
74 | </Tooltip> | 77 | </Tooltip> |
75 | <Tooltip title="删除"> | 78 | <Tooltip title="删除"> |
76 | <DeleteOutlined @click="handleDelete(item)" class="cursor-pointer text-lg" /> | 79 | <DeleteOutlined @click="handleDelete(item)" class="cursor-pointer text-lg" /> |
1 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
2 | import { Tabs } from 'ant-design-vue'; | 2 | import { Tabs } from 'ant-design-vue'; |
3 | - import { ref } from 'vue'; | ||
4 | import BasicModal from '/@/components/Modal/src/BasicModal.vue'; | 3 | import BasicModal from '/@/components/Modal/src/BasicModal.vue'; |
5 | import BasicConfiguration from './BasicConfiguration.vue'; | 4 | import BasicConfiguration from './BasicConfiguration.vue'; |
6 | import VisualConfiguration from './VisualConfiguration.vue'; | 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 | </script> | 15 | </script> |
10 | 16 | ||
11 | <template> | 17 | <template> |
12 | <BasicModal v-bind="$attrs" title="自定义组件" width="70%"> | 18 | <BasicModal v-bind="$attrs" title="自定义组件" width="70%"> |
13 | <section> | 19 | <section> |
14 | - <Tabs type="card" v-model:activeKey="activeKey"> | 20 | + <Tabs type="card"> |
15 | <Tabs.TabPane key="1" tab="基础配置"> | 21 | <Tabs.TabPane key="1" tab="基础配置"> |
16 | - <BasicConfiguration /> | 22 | + <BasicConfiguration @change="handleSettingUpdate" /> |
17 | </Tabs.TabPane> | 23 | </Tabs.TabPane> |
18 | <Tabs.TabPane key="2" tab="可视化配置"> | 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 | </Tabs.TabPane> | 26 | </Tabs.TabPane> |
24 | </Tabs> | 27 | </Tabs> |
25 | </section> | 28 | </section> |
1 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
2 | import { Tabs, List } from 'ant-design-vue'; | 2 | import { Tabs, List } from 'ant-design-vue'; |
3 | - import { ref } from 'vue'; | ||
4 | import VisualWidgetSelect from './VisualWidgetSelect.vue'; | 3 | import VisualWidgetSelect from './VisualWidgetSelect.vue'; |
5 | import TextComponent from '../../components/TextComponent/TextComponent.vue'; | 4 | import TextComponent from '../../components/TextComponent/TextComponent.vue'; |
6 | import { textComponentConfig } from '../../components/TextComponent/config'; | 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 | const handleCheck = (checked: string) => { | 11 | const handleCheck = (checked: string) => { |
10 | - checkedId.value = checked; | 12 | + emit('update:value', checked); |
11 | }; | 13 | }; |
12 | </script> | 14 | </script> |
13 | 15 | ||
@@ -15,11 +17,14 @@ | @@ -15,11 +17,14 @@ | ||
15 | <section> | 17 | <section> |
16 | <Tabs> | 18 | <Tabs> |
17 | <Tabs.TabPane key="1" tab="文本组件"> | 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 | <template #renderItem="{ item }"> | 24 | <template #renderItem="{ item }"> |
20 | <List.Item> | 25 | <List.Item> |
21 | <VisualWidgetSelect | 26 | <VisualWidgetSelect |
22 | - :checked-id="checkedId" | 27 | + :checked-id="props.value" |
23 | :control-id="item.id" | 28 | :control-id="item.id" |
24 | @change="handleCheck" | 29 | @change="handleCheck" |
25 | > | 30 | > |
1 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
2 | - import { modeOne } from '../config/visualOptions'; | 2 | + import { modeOne, modeTwo, modeThree, modeFour } from '../config/visualOptions'; |
3 | import { useForm, BasicForm } from '/@/components/Form'; | 3 | import { useForm, BasicForm } from '/@/components/Form'; |
4 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 4 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
5 | + | ||
5 | const [registerForm, method] = useForm({ | 6 | const [registerForm, method] = useForm({ |
6 | - schemas: modeOne, | 7 | + schemas: modeTwo, |
7 | showActionButtonGroup: false, | 8 | showActionButtonGroup: false, |
8 | labelWidth: 120, | 9 | labelWidth: 120, |
9 | baseColProps: { | 10 | baseColProps: { |
@@ -11,17 +12,21 @@ | @@ -11,17 +12,21 @@ | ||
11 | }, | 12 | }, |
12 | }); | 13 | }); |
13 | 14 | ||
14 | - const [registerModal, { closeModal }] = useModalInner(); | 15 | + const [register, { closeModal }] = useModalInner(); |
15 | 16 | ||
16 | const handleGetValue = () => { | 17 | const handleGetValue = () => { |
17 | const value = method.getFieldsValue(); | 18 | const value = method.getFieldsValue(); |
18 | console.log(value); | 19 | console.log(value); |
19 | }; | 20 | }; |
21 | + | ||
22 | + const handleClose = () => { | ||
23 | + handleGetValue(); | ||
24 | + closeModal(); | ||
25 | + }; | ||
20 | </script> | 26 | </script> |
21 | 27 | ||
22 | <template> | 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 | <BasicForm @register="registerForm" /> | 30 | <BasicForm @register="registerForm" /> |
25 | - <button @click="handleGetValue">啊按钮</button> | ||
26 | </BasicModal> | 31 | </BasicModal> |
27 | </template> | 32 | </template> |
1 | +import { getOrganizationList } from '/@/api/system/system'; | ||
1 | import { FormSchema } from '/@/components/Form'; | 2 | import { FormSchema } from '/@/components/Form'; |
2 | 3 | ||
3 | export const basicSchema: FormSchema[] = [ | 4 | export const basicSchema: FormSchema[] = [ |
@@ -16,11 +17,19 @@ export const basicSchema: FormSchema[] = [ | @@ -16,11 +17,19 @@ export const basicSchema: FormSchema[] = [ | ||
16 | export const dataSourceSchema: FormSchema[] = [ | 17 | export const dataSourceSchema: FormSchema[] = [ |
17 | { | 18 | { |
18 | field: 'org', | 19 | field: 'org', |
19 | - component: 'TreeSelect', | 20 | + component: 'ApiTreeSelect', |
20 | label: '组织', | 21 | label: '组织', |
21 | colProps: { span: 6 }, | 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,7 +29,7 @@ export const modeOne: FormSchema[] = [ | ||
29 | 29 | ||
30 | export const modeTwo: FormSchema[] = [ | 30 | export const modeTwo: FormSchema[] = [ |
31 | { | 31 | { |
32 | - field: visualOptionField.UNIT, | 32 | + field: visualOptionField.FONT_COLOR, |
33 | label: '数值字体颜色', | 33 | label: '数值字体颜色', |
34 | component: 'ColorPicker', | 34 | component: 'ColorPicker', |
35 | changeEvent: 'update:value', | 35 | changeEvent: 'update:value', |
@@ -51,7 +51,14 @@ export const modeTwo: FormSchema[] = [ | @@ -51,7 +51,14 @@ export const modeTwo: FormSchema[] = [ | ||
51 | { | 51 | { |
52 | field: visualOptionField.ICON, | 52 | field: visualOptionField.ICON, |
53 | label: '图标', | 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,7 +180,7 @@ | ||
180 | :w="item.w" | 180 | :w="item.w" |
181 | :h="item.h" | 181 | :h="item.h" |
182 | :i="item.i" | 182 | :i="item.i" |
183 | - style="display: flex; flex-wrap: wrap" | 183 | + :style="{ display: 'flex', flexWrap: 'wrap' }" |
184 | class="grid-item-layout" | 184 | class="grid-item-layout" |
185 | @resized="itemResized" | 185 | @resized="itemResized" |
186 | @resize="itemResized" | 186 | @resize="itemResized" |
@@ -189,7 +189,7 @@ | @@ -189,7 +189,7 @@ | ||
189 | > | 189 | > |
190 | <WidgetWrapper | 190 | <WidgetWrapper |
191 | :key="item.i" | 191 | :key="item.i" |
192 | - :ref="(el) => setComponentRef(el, item)" | 192 | + :ref="(el: Element) => setComponentRef(el, item)" |
193 | :data-source="item.chart" | 193 | :data-source="item.chart" |
194 | > | 194 | > |
195 | <template #header> | 195 | <template #header> |
@@ -58,7 +58,7 @@ | @@ -58,7 +58,7 @@ | ||
58 | ]; | 58 | ]; |
59 | 59 | ||
60 | const handleMenuEvent = (event: DropMenu) => { | 60 | const handleMenuEvent = (event: DropMenu) => { |
61 | - if (event.event === MoreEvent.EDIT) { | 61 | + if (event.event === MoreActionEvent.EDIT) { |
62 | handleEdit(); | 62 | handleEdit(); |
63 | } | 63 | } |
64 | }; | 64 | }; |