feat: add options data

This commit is contained in:
Qiuxia Fan 2021-12-24 16:53:58 +08:00
parent 7627a8a15c
commit f3e7b56d56
5 changed files with 48 additions and 35 deletions

View File

@ -16,11 +16,11 @@
*/ */
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { store } from "@/store"; import { store } from "@/store";
import { GridItemData } from "@/types/dashboard"; import { LayoutConfig } from "@/types/dashboard";
interface DashboardState { interface DashboardState {
showConfig: boolean; showConfig: boolean;
layout: GridItemData[]; layout: LayoutConfig[];
} }
export const dashboardStore = defineStore({ export const dashboardStore = defineStore({
@ -30,25 +30,25 @@ export const dashboardStore = defineStore({
showConfig: false, showConfig: false,
}), }),
actions: { actions: {
setLayout(data: GridItemData[]) { setLayout(data: LayoutConfig[]) {
this.layout = data; this.layout = data;
}, },
addWidget() { addWidget() {
const newWidget: GridItemData = { const newWidget: LayoutConfig = {
x: 0, x: 0,
y: 0, y: 0,
w: 12, w: 24,
h: 12, h: 12,
i: String(this.layout.length), i: String(this.layout.length),
}; };
this.layout = this.layout.map((d: GridItemData) => { this.layout = this.layout.map((d: LayoutConfig) => {
d.y = d.y + newWidget.h; d.y = d.y + newWidget.h;
return d; return d;
}); });
this.layout.push(newWidget); this.layout.push(newWidget);
}, },
removeWidget(item: GridItemData) { removeWidget(item: LayoutConfig) {
this.layout = this.layout.filter((d: GridItemData) => d.i !== item.i); this.layout = this.layout.filter((d: LayoutConfig) => d.i !== item.i);
}, },
setConfigPanel(show: boolean) { setConfigPanel(show: boolean) {
this.showConfig = show; this.showConfig = show;

View File

@ -1,3 +1,5 @@
import { string } from "vue-types";
/** /**
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
@ -14,11 +16,24 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
export interface GridItemData { export interface LayoutConfig {
x: number; x: number;
y: number; y?: number;
w: number; w: number;
h: number; h: number;
i: string; i: string;
static?: boolean; widget?: WidgetConfig;
graph?: GraphConfig;
}
export interface WidgetConfig {
title: string;
Metrics: string[];
unit: string;
tips: string;
sortOrder: string;
}
export interface GraphConfig {
type: string;
} }

View File

@ -38,29 +38,27 @@ limitations under the License. -->
<script lang="ts" setup> <script lang="ts" setup>
import { ElButton } from "element-plus"; import { ElButton } from "element-plus";
import GridLayout from "./panel/Layout.vue"; import GridLayout from "./panel/Layout.vue";
import { GridItemData } from "@/types/dashboard"; import { LayoutConfig } from "@/types/dashboard";
import { useDashboardStore } from "@/store/modules/dashboard"; import { useDashboardStore } from "@/store/modules/dashboard";
const dashboardStore = useDashboardStore(); const dashboardStore = useDashboardStore();
// fetch layout data from serve side // fetch layout data from serve side
const layout: GridItemData[] = [ const layout: LayoutConfig[] = [
{ x: 0, y: 0, w: 2, h: 12, i: "0" }, { x: 0, y: 0, w: 4, h: 12, i: "0" },
{ x: 2, y: 0, w: 2, h: 12, i: "1" }, { x: 4, y: 0, w: 4, h: 12, i: "1" },
{ x: 4, y: 0, w: 2, h: 15, i: "2" }, { x: 8, y: 0, w: 4, h: 15, i: "2" },
{ x: 6, y: 0, w: 2, h: 9, i: "3" }, { x: 12, y: 0, w: 4, h: 9, i: "3" },
{ x: 8, y: 0, w: 2, h: 9, i: "4" }, { x: 16, y: 0, w: 4, h: 9, i: "4" },
{ x: 10, y: 0, w: 2, h: 9, i: "5" }, { x: 20, y: 0, w: 4, h: 9, i: "5" },
{ x: 0, y: 5, w: 2, h: 15, i: "6" }, { x: 0, y: 12, w: 4, h: 15, i: "7" },
{ x: 2, y: 5, w: 2, h: 15, i: "7" }, { x: 4, y: 12, w: 4, h: 15, i: "8" },
{ x: 4, y: 5, w: 2, h: 15, i: "8" }, { x: 8, y: 15, w: 4, h: 12, i: "9" },
{ x: 6, y: 3, w: 2, h: 12, i: "9" }, { x: 12, y: 9, w: 4, h: 12, i: "10" },
{ x: 8, y: 4, w: 2, h: 12, i: "10" }, { x: 16, y: 9, w: 4, h: 12, i: "11" },
{ x: 10, y: 4, w: 2, h: 12, i: "11" }, { x: 20, y: 9, w: 4, h: 15, i: "12" },
{ x: 0, y: 10, w: 2, h: 15, i: "12" }, { x: 0, y: 27, w: 4, h: 12, i: "14" },
{ x: 2, y: 10, w: 2, h: 15, i: "13" }, { x: 4, y: 8, w: 4, h: 12, i: "15" },
{ x: 4, y: 8, w: 2, h: 12, i: "14" }, { x: 8, y: 10, w: 4, h: 15, i: "16" },
{ x: 6, y: 8, w: 2, h: 12, i: "15" },
{ x: 8, y: 10, w: 2, h: 15, i: "16" },
]; ];
dashboardStore.setLayout(layout); dashboardStore.setLayout(layout);
document.addEventListener("click", setConfig, true); document.addEventListener("click", setConfig, true);

View File

@ -15,7 +15,7 @@ limitations under the License. -->
<template> <template>
<grid-layout <grid-layout
v-model:layout="dashboardStore.layout" v-model:layout="dashboardStore.layout"
:col-num="12" :col-num="24"
:row-height="10" :row-height="10"
:is-draggable="true" :is-draggable="true"
:is-resizable="true" :is-resizable="true"
@ -36,11 +36,11 @@ limitations under the License. -->
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useDashboardStore } from "@/store/modules/dashboard"; import { useDashboardStore } from "@/store/modules/dashboard";
import { GridItemData } from "@/types/dashboard"; import { LayoutConfig } from "@/types/dashboard";
import Widget from "./Widget.vue"; import Widget from "./Widget.vue";
const dashboardStore = useDashboardStore(); const dashboardStore = useDashboardStore();
function layoutUpdatedEvent(newLayout: GridItemData) { function layoutUpdatedEvent(newLayout: LayoutConfig) {
dashboardStore.setLayout(newLayout); dashboardStore.setLayout(newLayout);
} }
</script> </script>

View File

@ -32,11 +32,11 @@ limitations under the License. -->
<script lang="ts" setup> <script lang="ts" setup>
import { defineProps } from "vue"; import { defineProps } from "vue";
import type { PropType } from "vue"; import type { PropType } from "vue";
import { GridItemData } from "@/types/dashboard"; import { LayoutConfig } from "@/types/dashboard";
import { useDashboardStore } from "@/store/modules/dashboard"; import { useDashboardStore } from "@/store/modules/dashboard";
const props = defineProps({ const props = defineProps({
item: { type: Object as PropType<GridItemData> }, item: { type: Object as PropType<LayoutConfig> },
}); });
const dashboardStore = useDashboardStore(); const dashboardStore = useDashboardStore();
function removeWidget() { function removeWidget() {