,
+ resp: { errors: string; data: { [key: string]: any } },
+ config: { metrics: string[]; metricTypes: string[] }
+): any {
+ if (resp.errors) {
+ ElMessage.error(resp.errors);
+ return {};
+ }
+ const data = pods.map((d: Instance | any, idx: number) => {
+ config.metrics.map((name: string, index: number) => {
+ const key = name + idx + index;
+ if (config.metricTypes[index] === MetricQueryTypes.ReadMetricsValue) {
+ d[name] = resp.data[key];
+ }
+ if (config.metricTypes[index] === MetricQueryTypes.ReadMetricsValues) {
+ d[name] = resp.data[key].values.values.map(
+ (d: { value: number }) => d.value
+ );
+ }
+ });
+
+ return d;
+ });
+ return data;
+}
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
index 4be1f20f..a00568ae 100644
--- a/src/layout/components/AppMain.vue
+++ b/src/layout/components/AppMain.vue
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. -->
-
+
diff --git a/src/locales/lang/en.ts b/src/locales/lang/en.ts
index 06c0c22f..e7b840fa 100644
--- a/src/locales/lang/en.ts
+++ b/src/locales/lang/en.ts
@@ -30,7 +30,7 @@ const msg = {
events: "Events",
alerts: "Alerts",
settings: "Settings",
- dashboards: "Dashboards",
+ dashboards: "Dashboard",
profiles: "Profiles",
database: "Database",
serviceName: "Service Name",
@@ -53,7 +53,8 @@ const msg = {
instance: "Instance",
create: "Create",
loading: "Loading",
- selectVisualization: "Select your visualization",
+ selectVisualization: "Visualize your metrics",
+ visualization: "Visualization",
graphStyles: "Graph styles",
widgetOptions: "Widget options",
standardOptions: "Standard options",
@@ -72,6 +73,8 @@ const msg = {
fontSize: "Font Size",
showBackground: "Show Background",
areaOpacity: "Area Opacity",
+ editGraph: "Edit Graph Options",
+ dashboardName: "Select Dashboard Name",
hourTip: "Select Hour",
minuteTip: "Select Minute",
secondTip: "Select Second",
diff --git a/src/locales/lang/zh.ts b/src/locales/lang/zh.ts
index c8bdd9d4..42137a22 100644
--- a/src/locales/lang/zh.ts
+++ b/src/locales/lang/zh.ts
@@ -51,7 +51,8 @@ const msg = {
endpoint: "端点",
create: "新建",
loading: "加载中",
- selectVisualization: "选择你的可视化",
+ selectVisualization: "可视化指标",
+ visualization: "可视化",
graphStyles: "图形样式",
widgetOptions: "组件选项",
standardOptions: "标准选项",
@@ -70,6 +71,8 @@ const msg = {
fontSize: "字体大小",
showBackground: "显示背景",
areaOpacity: "透明度",
+ editGraph: "编辑图表选项",
+ dashboardName: "选择仪表板名称",
hourTip: "选择小时",
minuteTip: "选择分钟",
secondTip: "选择秒数",
diff --git a/src/main.ts b/src/main.ts
index 7f5fe3fc..4cb44b1d 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -20,10 +20,10 @@ import router from "./router";
import { store } from "./store";
import components from "@/components";
import i18n from "./locales";
+import "element-plus/dist/index.css";
import "./styles/lib.scss";
import "./styles/reset.scss";
import ElementPlus from "element-plus";
-import "element-plus/dist/index.css";
const app = createApp(App);
diff --git a/src/router/dashboard.ts b/src/router/dashboard.ts
index c1924a21..0bb9e519 100644
--- a/src/router/dashboard.ts
+++ b/src/router/dashboard.ts
@@ -48,9 +48,29 @@ export const routesDashboard: Array = [
},
},
{
- path: "/dashboard/edit/:layerId/:entity/:dashboardId",
+ path: "/dashboard/:layerId/:entity/:name",
component: () => import("@/views/dashboard/Edit.vue"),
- name: "Edit",
+ name: "Create",
+ meta: {
+ title: "dashboardEdit",
+ exact: false,
+ notShow: true,
+ },
+ },
+ {
+ path: "/dashboard/:layerId/:entity/:serviceId/:name",
+ component: () => import("@/views/dashboard/Edit.vue"),
+ name: "CreateService",
+ meta: {
+ title: "dashboardEdit",
+ exact: false,
+ notShow: true,
+ },
+ },
+ {
+ path: "/dashboard/:layerId/:entity/:serviceId/:podId/:name",
+ component: () => import("@/views/dashboard/Edit.vue"),
+ name: "ViewPod",
meta: {
title: "dashboardEdit",
exact: false,
diff --git a/src/store/data.ts b/src/store/data.ts
index fbff8ab7..25caaecf 100644
--- a/src/store/data.ts
+++ b/src/store/data.ts
@@ -26,6 +26,8 @@ export const NewControl = {
},
graph: {},
standard: {},
+ metrics: [""],
+ metricTypes: [""],
};
export const ConfigData: any = {
x: 0,
@@ -34,14 +36,64 @@ export const ConfigData: any = {
h: 12,
i: "0",
metrics: ["service_resp_time"],
- queryMetricType: "readMetricsValues",
+ metricTypes: ["readMetricsValues"],
type: "Widget",
widget: {
- title: "Title",
+ title: "service_resp_time",
tips: "Tooltip",
},
graph: {
type: "Line",
+ showXAxis: true,
+ showYAxis: true,
+ },
+ standard: {
+ sortOrder: "DEC",
+ unit: "min",
+ },
+ children: [],
+};
+export const ConfigData1: any = {
+ x: 0,
+ y: 0,
+ w: 8,
+ h: 12,
+ i: "0",
+ metrics: ["service_instance_resp_time"],
+ metricTypes: ["readMetricsValues"],
+ type: "Widget",
+ widget: {
+ title: "service_instance_resp_time",
+ tips: "Tooltip",
+ },
+ graph: {
+ type: "Line",
+ showXAxis: true,
+ showYAxis: true,
+ },
+ standard: {
+ sortOrder: "DEC",
+ unit: "min",
+ },
+ children: [],
+};
+export const ConfigData2: any = {
+ x: 0,
+ y: 0,
+ w: 8,
+ h: 12,
+ i: "0",
+ metrics: ["endpoint_avg"],
+ metricTypes: ["readMetricsValues"],
+ type: "Widget",
+ widget: {
+ title: "endpoint_avg",
+ tips: "Tooltip",
+ },
+ graph: {
+ type: "Line",
+ showXAxis: true,
+ showYAxis: true,
},
standard: {
sortOrder: "DEC",
diff --git a/src/store/modules/dashboard.ts b/src/store/modules/dashboard.ts
index 5fb95524..47fc4a71 100644
--- a/src/store/modules/dashboard.ts
+++ b/src/store/modules/dashboard.ts
@@ -18,10 +18,13 @@ import { defineStore } from "pinia";
import { store } from "@/store";
import { LayoutConfig } from "@/types/dashboard";
import graph from "@/graph";
-import { AxiosResponse } from "axios";
-import { ConfigData } from "../data";
+import { ConfigData, ConfigData1, ConfigData2 } from "../data";
import { useAppStoreWithOut } from "@/store/modules/app";
+import { useSelectorStore } from "@/store/modules/selectors";
import { NewControl } from "../data";
+import { Duration } from "@/types/app";
+import axios, { AxiosResponse } from "axios";
+import { cancelToken } from "@/utils/cancelToken";
interface DashboardState {
showConfig: boolean;
layout: LayoutConfig[];
@@ -29,6 +32,8 @@ interface DashboardState {
entity: string;
layerId: string;
activedGridItem: string;
+ durationTime: Duration;
+ selectorStore: any;
}
export const dashboardStore = defineStore({
@@ -40,6 +45,8 @@ export const dashboardStore = defineStore({
entity: "",
layerId: "",
activedGridItem: "",
+ durationTime: useAppStoreWithOut().durationTime,
+ selectorStore: useSelectorStore(),
}),
actions: {
setLayout(data: LayoutConfig[]) {
@@ -50,6 +57,8 @@ export const dashboardStore = defineStore({
...NewControl,
i: String(this.layout.length),
type,
+ metricTypes: [""],
+ metrics: [""],
};
if (type === "Tab") {
newWidget.h = 24;
@@ -129,14 +138,20 @@ export const dashboardStore = defineStore({
setConfigPanel(show: boolean) {
this.showConfig = show;
},
- selectWidget(widget: Nullable) {
- this.selectedGrid = widget;
+ selectWidget(item: Nullable) {
+ this.selectedGrid = item;
},
setLayer(id: string) {
this.layerId = id;
},
setEntity(type: string) {
this.entity = type;
+ if (type === "ServiceInstance") {
+ this.layout = [ConfigData1];
+ }
+ if (type === "Endpoint") {
+ this.layout = [ConfigData2];
+ }
},
setConfigs(param: { [key: string]: unknown }) {
const actived = this.activedGridItem.split("-");
@@ -165,29 +180,24 @@ export const dashboardStore = defineStore({
return res.data;
},
- async fetchMetricValue(config: LayoutConfig) {
- // if (!config.queryMetricType) {
- // return;
- // }
- config.queryMetricType = "readMetricsValues";
- const appStoreWithOut = useAppStoreWithOut();
- const variable = {
- condition: {
- name: "service_resp_time",
- entity: {
- normal: true,
- scope: "Service",
- serviceName: "agentless::app",
- },
- },
- duration: appStoreWithOut.durationTime,
- };
+ async fetchMetricList(regex: string) {
const res: AxiosResponse = await graph
- .query(config.queryMetricType)
- .params(variable);
+ .query("queryMetrics")
+ .params({ regex });
return res.data;
},
+ async fetchMetricValue(param: {
+ queryStr: string;
+ conditions: { [key: string]: unknown };
+ }) {
+ const res: AxiosResponse = await axios.post(
+ "/graphql",
+ { query: param.queryStr, variables: { ...param.conditions } },
+ { cancelToken: cancelToken() }
+ );
+ return res.data;
+ },
},
});
diff --git a/src/store/modules/selectors.ts b/src/store/modules/selectors.ts
index 10453ae4..24d4b49b 100644
--- a/src/store/modules/selectors.ts
+++ b/src/store/modules/selectors.ts
@@ -15,25 +15,45 @@
* limitations under the License.
*/
import { defineStore } from "pinia";
-import { Option, Duration } from "@/types/app";
+import { Duration } from "@/types/app";
+import { Service, Instance, Endpoint } from "@/types/selector";
import { store } from "@/store";
import graph from "@/graph";
import { AxiosResponse } from "axios";
+import { useAppStoreWithOut } from "@/store/modules/app";
interface SelectorState {
- services: Option[];
+ services: Service[];
+ pods: Array;
+ currentService: Nullable;
+ currentPod: Nullable;
+ currentDestService: Nullable;
+ currentDestPod: Nullable;
+ durationTime: Duration;
}
export const selectorStore = defineStore({
id: "selector",
state: (): SelectorState => ({
services: [],
+ pods: [],
+ currentService: null,
+ currentPod: null,
+ currentDestService: null,
+ currentDestPod: null,
+ durationTime: useAppStoreWithOut().durationTime,
}),
actions: {
+ setCurrentService(service: Service) {
+ this.currentService = service;
+ },
+ setCurrentPod(pod: Nullable) {
+ this.currentPod = pod;
+ },
async fetchLayers(): Promise {
const res: AxiosResponse = await graph.query("queryLayers").params({});
- return res;
+ return res.data || {};
},
async fetchServices(layer: string): Promise {
const res: AxiosResponse = await graph
@@ -41,30 +61,89 @@ export const selectorStore = defineStore({
.params({ layer });
if (!res.data.errors) {
- this.services = res.data.data.services;
+ this.services = res.data.data.services || [];
}
- return res;
+ return res.data;
},
- async getServiceInstances(params: {
+ async getServiceInstances(param?: {
serviceId: string;
- duration: Duration;
- }): Promise {
- const res: AxiosResponse = await graph
- .query("queryInstances")
- .params(params);
- return res;
+ }): Promise> {
+ const serviceId = param ? param.serviceId : this.currentService?.id;
+ if (!serviceId) {
+ return null;
+ }
+ const res: AxiosResponse = await graph.query("queryInstances").params({
+ serviceId,
+ duration: this.durationTime,
+ });
+ if (!res.data.errors) {
+ this.pods = res.data.data.pods || [];
+ }
+ return res.data;
},
- async getEndpoints(params: {
- keyword: string;
- serviceId: string;
- }): Promise {
+ async getEndpoints(params?: {
+ keyword?: string;
+ serviceId?: string;
+ }): Promise> {
+ if (!params) {
+ params = {};
+ }
if (!params.keyword) {
params.keyword = "";
}
- const res: AxiosResponse = await graph
- .query("queryEndpoints")
- .params(params);
- return res;
+ const serviceId = params.serviceId || this.currentService?.id;
+ if (!serviceId) {
+ return null;
+ }
+ const res: AxiosResponse = await graph.query("queryEndpoints").params({
+ serviceId,
+ duration: this.durationTime,
+ keyword: params.keyword,
+ });
+ if (!res.data.errors) {
+ this.pods = res.data.data.pods || [];
+ }
+ return res.data;
+ },
+ async getService(serviceId: string) {
+ if (!serviceId) {
+ return;
+ }
+ const res: AxiosResponse = await graph.query("queryService").params({
+ serviceId,
+ });
+ if (!res.data.errors) {
+ this.currentService = res.data.data.service || {};
+ this.services = [res.data.data.service];
+ }
+
+ return res.data;
+ },
+ async getInstance(instanceId: string) {
+ if (!instanceId) {
+ return;
+ }
+ const res: AxiosResponse = await graph.query("queryInstance").params({
+ instanceId,
+ });
+ if (!res.data.errors) {
+ this.currentPod = res.data.data.instance || null;
+ }
+
+ return res.data;
+ },
+ async getEndpoint(endpointId: string) {
+ if (!endpointId) {
+ return;
+ }
+ const res: AxiosResponse = await graph.query("queryEndpoint").params({
+ endpointId,
+ });
+ if (!res.data.errors) {
+ this.currentPod = res.data.data.endpoint || null;
+ }
+
+ return res.data;
},
},
});
diff --git a/src/styles/reset.scss b/src/styles/reset.scss
index c4384346..b65abdb9 100644
--- a/src/styles/reset.scss
+++ b/src/styles/reset.scss
@@ -15,20 +15,22 @@
* limitations under the License.
*/
- body {
+body {
margin: 0;
line-height: 1.5;
font-size: 14px;
color: #3d444f;
- font-family: 'Helvetica', 'Arial', 'Source Han Sans CN', 'Microsoft YaHei', 'sans-serif';
+ font-family: Helvetica, Arial, "Source Han Sans CN", "Microsoft YaHei",
+ sans-serif;
text-rendering: optimizeLegibility;
- -ms-text-size-adjust: 100%;
- -webkit-text-size-adjust: 100%;
+ text-size-adjust: 100%;
}
+
html,
body {
height: 100%;
}
+
div,
header,
footer,
@@ -53,6 +55,7 @@ a,
img {
box-sizing: border-box;
}
+
input,
textarea,
select,
@@ -60,41 +63,51 @@ button {
font-size: 100%;
font-family: inherit;
}
+
h1 {
font-size: 26px;
}
+
h2 {
font-size: 24px;
}
+
h3 {
font-size: 21px;
}
+
h4 {
font-size: 18px;
}
+
h5 {
font-size: 14px;
}
+
h6 {
font-size: 1em;
}
+
ul,
ol {
margin: 0;
padding-left: 0;
list-style-type: none;
}
+
a {
text-decoration: none;
cursor: pointer;
color: inherit;
-webkit-tap-highlight-color: transparent;
- -webkit-appearance: none;
+ appearance: none;
}
+
hr {
border-width: 0;
border-bottom: 1px solid #e0e0e0;
}
+
blockquote {
margin-left: 0;
margin-right: 0;
@@ -102,76 +115,11 @@ blockquote {
border-left: 4px solid #cacaca;
}
+.el-dialog__body {
+ padding: 10px 20px;
+}
+
code,
pre {
font-family: Consolas, Menlo, Courier, monospace;
}
-/*webkit core*/
-.scroll_hide::-webkit-scrollbar {
- width: 0px;
- height: 0px;
-}
-.scroll_hide::-webkit-scrollbar-button {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-webkit-scrollbar-track {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-webkit-scrollbar-track-piece {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-webkit-scrollbar-thumb {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-webkit-scrollbar-corner {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-webkit-scrollbar-resizer {
- background-color: rgba(0, 0, 0, 0);
-}
-/*o core*/
-.scroll_hide .-o-scrollbar {
- -moz-appearance: none !important;
- background: rgba(0, 255, 0, 0) !important;
-}
-.scroll_hide::-o-scrollbar-button {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-o-scrollbar-track {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-o-scrollbar-track-piece {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-o-scrollbar-thumb {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-o-scrollbar-corner {
- background-color: rgba(0, 0, 0, 0);
-}
-.scroll_hide::-o-scrollbar-resizer {
- background-color: rgba(0, 0, 0, 0);
-}
-/*IE10,IE11,IE12*/
-.scroll_hide {
- -ms-scroll-chaining: chained;
- -ms-overflow-style: none;
- -ms-content-zooming: zoom;
- -ms-scroll-rails: none;
- -ms-content-zoom-limit-min: 100%;
- -ms-content-zoom-limit-max: 500%;
- -ms-scroll-snap-points-x: snapList(100%, 200%, 300%, 400%, 500%);
- -ms-overflow-style: none;
- overflow: auto;
-}
-.scroll_bar_style::-webkit-scrollbar {
- width: 9px;
- height: 6px;
-}
-.scroll_bar_style::-webkit-scrollbar-track {
- background-color: #3d444f;
-}
-.scroll_bar_style::-webkit-scrollbar-thumb {
- border-radius: 5px;
- background: rgba(196, 200, 225, .2);
-}
diff --git a/src/types/app.d.ts b/src/types/app.d.ts
index 82369754..74e69c32 100644
--- a/src/types/app.d.ts
+++ b/src/types/app.d.ts
@@ -15,7 +15,7 @@
* limitations under the License.
*/
export interface Option {
- value: string | number;
+ value: string;
label: string;
}
export interface Duration {
diff --git a/src/types/dashboard.ts b/src/types/dashboard.ts
index 1680dc34..e8b27db9 100644
--- a/src/types/dashboard.ts
+++ b/src/types/dashboard.ts
@@ -20,12 +20,12 @@ export interface LayoutConfig {
w: number;
h: number;
i: string;
- widget?: WidgetConfig;
- graph?: GraphConfig;
- standard?: StandardConfig;
- metrics?: string[];
- type?: string;
- queryMetricType?: string;
+ widget: WidgetConfig;
+ graph: GraphConfig;
+ standard: StandardConfig;
+ metrics: string[];
+ type: string;
+ metricTypes: string[];
children?: any;
}
@@ -45,9 +45,17 @@ export interface StandardConfig {
divide?: string;
milliseconds?: string;
seconds?: string;
+ maxItemNum?: number;
}
-export type GraphConfig = BarConfig | LineConfig | CardConfig | TableConfig;
+export type GraphConfig =
+ | BarConfig
+ | LineConfig
+ | CardConfig
+ | TableConfig
+ | EndpointListConfig
+ | ServiceListConfig
+ | InstanceListConfig;
export interface BarConfig {
type?: string;
showBackground?: boolean;
@@ -57,6 +65,8 @@ export interface LineConfig extends AreaConfig {
smooth?: boolean;
showSymbol?: boolean;
step?: boolean;
+ showXAxis?: boolean;
+ showYAxis?: boolean;
}
export interface AreaConfig {
@@ -67,7 +77,8 @@ export interface AreaConfig {
export interface CardConfig {
type?: string;
fontSize?: number;
- showUint: boolean;
+ showUint?: boolean;
+ textAlign?: "center" | "right" | "left";
}
export interface TableConfig {
@@ -81,3 +92,21 @@ export interface TopListConfig {
type?: string;
topN: number;
}
+
+export interface ServiceListConfig {
+ type?: string;
+ dashboardName: string;
+ fontSize: number;
+}
+
+export interface InstanceListConfig {
+ type?: string;
+ dashboardName: string;
+ fontSize: number;
+}
+
+export interface EndpointListConfig {
+ type?: string;
+ dashboardName: string;
+ fontSize: number;
+}
diff --git a/src/types/selector.d.ts b/src/types/selector.d.ts
new file mode 100644
index 00000000..4b9a6f42
--- /dev/null
+++ b/src/types/selector.d.ts
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export type Service = {
+ id: string;
+ label: string;
+ value: string;
+ layers: string[];
+ normal: boolean;
+ group: string;
+};
+
+export type Instance = {
+ value: string;
+ label: string;
+ layer: string;
+ language: string;
+ instanceUUID: string;
+ attributes: { name: string; value: string }[];
+};
+
+export type Endpoint = {
+ id: string;
+ label: string;
+ value: string;
+};
+
+export type Service = {
+ id: string;
+ value: string;
+ label: string;
+ group: string;
+ normal: boolean;
+ layers: string[];
+ shortName: string;
+};
diff --git a/src/views/Log.vue b/src/views/Log.vue
index 6e121b20..f70cb63a 100644
--- a/src/views/Log.vue
+++ b/src/views/Log.vue
@@ -16,7 +16,7 @@ limitations under the License. -->
{{ props.msg }}
+
diff --git a/src/views/dashboard/configuration/StandardOptions.vue b/src/views/dashboard/configuration/StandardOptions.vue
index 56081354..42558448 100644
--- a/src/views/dashboard/configuration/StandardOptions.vue
+++ b/src/views/dashboard/configuration/StandardOptions.vue
@@ -116,22 +116,16 @@ limitations under the License. -->
diff --git a/src/views/dashboard/configuration/graph-styles/InstanceList.vue b/src/views/dashboard/configuration/graph-styles/InstanceList.vue
new file mode 100644
index 00000000..78df72d3
--- /dev/null
+++ b/src/views/dashboard/configuration/graph-styles/InstanceList.vue
@@ -0,0 +1,60 @@
+
+
+
+ {{ t("fontSize") }}
+
+
+
+
+
diff --git a/src/views/dashboard/configuration/graph-styles/Line.vue b/src/views/dashboard/configuration/graph-styles/Line.vue
index 4afb630a..159bca52 100644
--- a/src/views/dashboard/configuration/graph-styles/Line.vue
+++ b/src/views/dashboard/configuration/graph-styles/Line.vue
@@ -42,25 +42,23 @@ limitations under the License. -->
diff --git a/src/views/dashboard/configuration/graph-styles/Table.vue b/src/views/dashboard/configuration/graph-styles/Table.vue
index 100550f9..e12498b5 100644
--- a/src/views/dashboard/configuration/graph-styles/Table.vue
+++ b/src/views/dashboard/configuration/graph-styles/Table.vue
@@ -44,29 +44,23 @@ limitations under the License. -->
diff --git a/src/views/dashboard/graphs/EndpointList.vue b/src/views/dashboard/graphs/EndpointList.vue
index 3f14aa94..a895349c 100644
--- a/src/views/dashboard/graphs/EndpointList.vue
+++ b/src/views/dashboard/graphs/EndpointList.vue
@@ -13,22 +13,159 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/graphs/HeatMap.vue b/src/views/dashboard/graphs/HeatMap.vue
index a07f22ce..952658e1 100644
--- a/src/views/dashboard/graphs/HeatMap.vue
+++ b/src/views/dashboard/graphs/HeatMap.vue
@@ -16,10 +16,11 @@ limitations under the License. -->
+
diff --git a/src/views/dashboard/graphs/Line.vue b/src/views/dashboard/graphs/Line.vue
index 34b7ec74..0aaabe0f 100644
--- a/src/views/dashboard/graphs/Line.vue
+++ b/src/views/dashboard/graphs/Line.vue
@@ -16,11 +16,12 @@ limitations under the License. -->
+
diff --git a/src/views/dashboard/graphs/Table.vue b/src/views/dashboard/graphs/Table.vue
index 4e69adbb..a84576f9 100644
--- a/src/views/dashboard/graphs/Table.vue
+++ b/src/views/dashboard/graphs/Table.vue
@@ -22,9 +22,9 @@ limitations under the License. -->
>
{{ config.tableHeaderCol1 || $t("name") }}
-
+
+
+
{{ config.tableHeaderCol2 || $t("value") }}
@@ -45,11 +45,12 @@ limitations under the License. -->