From 21420e739526df06a0e22a74c8abc8b4d9b60960 Mon Sep 17 00:00:00 2001 From: Qiuxia Fan Date: Wed, 6 Jul 2022 15:12:48 +0800 Subject: [PATCH] support multiple widgets --- src/components/Graph.vue | 2 +- src/types/components.d.ts | 28 --------------- src/types/dashboard.d.ts | 13 +++++++ .../configuration/widget/AssociateOptions.vue | 36 +++++++++---------- src/views/dashboard/controls/Widget.vue | 11 ++++++ src/views/dashboard/graphs/Line.vue | 15 +++++--- 6 files changed, 53 insertions(+), 52 deletions(-) diff --git a/src/components/Graph.vue b/src/components/Graph.vue index 7d1ba978..344217e5 100644 --- a/src/components/Graph.vue +++ b/src/components/Graph.vue @@ -61,7 +61,7 @@ onMounted(async () => { if (!instance) { return; } - instance.on("click", (params: any) => { + instance.on("click", (params: unknown) => { emits("select", params); }); }, 1000); diff --git a/src/types/components.d.ts b/src/types/components.d.ts index 98d9902c..73addae0 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -5,36 +5,8 @@ declare module '@vue/runtime-core' { export interface GlobalComponents { DateCalendar: typeof import('./../components/DateCalendar.vue')['default'] - ElButton: typeof import('element-plus/es')['ElButton'] - ElCollapse: typeof import('element-plus/es')['ElCollapse'] - ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] - ElDialog: typeof import('element-plus/es')['ElDialog'] - ElDropdown: typeof import('element-plus/es')['ElDropdown'] - ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] - ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] - ElIcon: typeof import('element-plus/es')['ElIcon'] - ElInput: typeof import('element-plus/es')['ElInput'] - ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] - ElMenu: typeof import('element-plus/es')['ElMenu'] - ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] - ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] - ElOption: typeof import('element-plus/es')['ElOption'] - ElPagination: typeof import('element-plus/es')['ElPagination'] - ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm'] - ElPopover: typeof import('element-plus/es')['ElPopover'] - ElProgress: typeof import('element-plus/es')['ElProgress'] - ElRadio: typeof import('element-plus/es')['ElRadio'] - ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] - ElSelect: typeof import('element-plus/es')['ElSelect'] - ElSlider: typeof import('element-plus/es')['ElSlider'] - ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] - ElSwitch: typeof import('element-plus/es')['ElSwitch'] - ElTable: typeof import('element-plus/es')['ElTable'] - ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] - ElTooltip: typeof import('element-plus/es')['ElTooltip'] Graph: typeof import('./../components/Graph.vue')['default'] Icon: typeof import('./../components/Icon.vue')['default'] - Loading: typeof import('element-plus/es')['ElLoadingDirective'] Radio: typeof import('./../components/Radio.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/types/dashboard.d.ts b/src/types/dashboard.d.ts index 9ef32d53..3ecaf4cb 100644 --- a/src/types/dashboard.d.ts +++ b/src/types/dashboard.d.ts @@ -37,6 +37,7 @@ export interface LayoutConfig { activedTabIndex?: number; metricConfig?: MetricConfigOpt[]; id?: string; + associate?: { widgetIds: string }[]; } export type MetricConfigOpt = { @@ -139,3 +140,15 @@ export interface TopologyConfig { depth?: number; showDepth?: boolean; } +export type EventParams = { + componentType: string; + seriesType: string; + seriesIndex: number; + seriesName: string; + name: string; + dataIndex: number; + data: Record; + dataType: string; + value: number | number[]; + color: string; +}; diff --git a/src/views/dashboard/configuration/widget/AssociateOptions.vue b/src/views/dashboard/configuration/widget/AssociateOptions.vue index 6bd7c423..b49d4967 100644 --- a/src/views/dashboard/configuration/widget/AssociateOptions.vue +++ b/src/views/dashboard/configuration/widget/AssociateOptions.vue @@ -16,12 +16,13 @@ limitations under the License. -->
{{ t("widget") }}
@@ -31,13 +32,14 @@ import { useI18n } from "vue-i18n"; import { useDashboardStore } from "@/store/modules/dashboard"; import getDashboard from "@/hooks/useDashboardsSession"; import { LayoutConfig } from "@/types/dashboard"; +import { Option } from "@/types/app"; const { t } = useI18n(); const dashboardStore = useDashboardStore(); const associate = dashboardStore.selectedGrid.associate || {}; -const widgetId = ref(associate.widgetId || ""); +const widgetIds = ref(associate.widgetIds || []); const widgets = computed(() => { - const isLinear = ["Bar", "Line"].includes( + const isLinear = ["Bar", "Line", "Area"].includes( dashboardStore.selectedGrid.graph && dashboardStore.selectedGrid.graph.type ); const isRank = ["TopList"].includes( @@ -47,14 +49,14 @@ const widgets = computed(() => { const items = widgets.filter( (d: { value: string; label: string } & LayoutConfig) => { if (dashboardStore.selectedGrid.id !== d.id) { - if (isLinear && d.widget) { - d.value = d.id || ""; - d.label = d.widget.name || d.id || ""; + if (isLinear && d.widget && d.id) { + d.value = d.id; + d.label = d.widget.name || d.id; return d; } - if (isRank && d.type !== "Widget" && d.widget) { - d.value = d.id || ""; - d.label = d.widget.name || d.id || ""; + if (isRank && d.type !== "Widget" && d.widget && d.id) { + d.value = d.id; + d.label = d.widget.name || d.id; return d; } } @@ -62,17 +64,13 @@ const widgets = computed(() => { ); return items; }); -function updateWidgetConfig(param: { [key: string]: string }) { - const key = Object.keys(param)[0]; - if (!key) { - return; - } - const { selectedGrid } = dashboardStore; +function updateWidgetConfig(options: Option[]) { + const opt = options.map((d: Option) => d.value); const widget = { - ...dashboardStore.selectedGrid.widget, - [key]: decodeURIComponent(param[key]), + ...dashboardStore.selectedGrid, + associate: { widgetIds: opt }, }; - dashboardStore.selectWidget({ ...selectedGrid, widget }); + dashboardStore.selectWidget({ ...widget }); }