mirror of
https://github.com/apache/skywalking-booster-ui.git
synced 2025-05-01 22:04:30 +00:00
feat: add hooks and utils
This commit is contained in:
parent
89673ff65c
commit
a496b6d24c
44
src/hooks/data.ts
Normal file
44
src/hooks/data.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* 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 enum sizeEnum {
|
||||||
|
XS = "XS",
|
||||||
|
SM = "SM",
|
||||||
|
MD = "MD",
|
||||||
|
LG = "LG",
|
||||||
|
XL = "XL",
|
||||||
|
XXL = "XXL",
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum screenEnum {
|
||||||
|
XS = 480,
|
||||||
|
SM = 576,
|
||||||
|
MD = 768,
|
||||||
|
LG = 992,
|
||||||
|
XL = 1200,
|
||||||
|
XXL = 1600,
|
||||||
|
}
|
||||||
|
|
||||||
|
const screenMap = new Map<sizeEnum, number>();
|
||||||
|
|
||||||
|
screenMap.set(sizeEnum.XS, screenEnum.XS);
|
||||||
|
screenMap.set(sizeEnum.SM, screenEnum.SM);
|
||||||
|
screenMap.set(sizeEnum.MD, screenEnum.MD);
|
||||||
|
screenMap.set(sizeEnum.LG, screenEnum.LG);
|
||||||
|
screenMap.set(sizeEnum.XL, screenEnum.XL);
|
||||||
|
screenMap.set(sizeEnum.XXL, screenEnum.XXL);
|
||||||
|
|
||||||
|
export { screenMap };
|
106
src/hooks/useBreakpoint.ts
Normal file
106
src/hooks/useBreakpoint.ts
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
import { ref, computed, ComputedRef, unref } from "vue";
|
||||||
|
import { useEventListener } from "./useEventListener";
|
||||||
|
import { screenMap, sizeEnum, screenEnum } from "./data";
|
||||||
|
|
||||||
|
let globalScreenRef: ComputedRef<sizeEnum | undefined>;
|
||||||
|
let globalWidthRef: ComputedRef<number>;
|
||||||
|
let globalRealWidthRef: ComputedRef<number>;
|
||||||
|
|
||||||
|
export interface CreateCallbackParams {
|
||||||
|
screen: ComputedRef<sizeEnum | undefined>;
|
||||||
|
width: ComputedRef<number>;
|
||||||
|
realWidth: ComputedRef<number>;
|
||||||
|
screenEnum: typeof screenEnum;
|
||||||
|
screenMap: Map<sizeEnum, number>;
|
||||||
|
sizeEnum: typeof sizeEnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useBreakpoint(): any {
|
||||||
|
return {
|
||||||
|
screenRef: computed(() => unref(globalScreenRef)),
|
||||||
|
widthRef: globalWidthRef,
|
||||||
|
screenEnum,
|
||||||
|
realWidthRef: globalRealWidthRef,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createBreakpointListen(
|
||||||
|
fn?: (opt: CreateCallbackParams) => void
|
||||||
|
): any {
|
||||||
|
const screenRef = ref<sizeEnum>(sizeEnum.XL || "");
|
||||||
|
const realWidthRef = ref(window.innerWidth);
|
||||||
|
|
||||||
|
function getWindowWidth() {
|
||||||
|
const width = document.body.clientWidth;
|
||||||
|
const xs = screenMap.get(sizeEnum.XS) || "";
|
||||||
|
const sm = screenMap.get(sizeEnum.SM) || "";
|
||||||
|
const md = screenMap.get(sizeEnum.MD) || "";
|
||||||
|
const lg = screenMap.get(sizeEnum.LG) || "";
|
||||||
|
const xl = screenMap.get(sizeEnum.XL) || "";
|
||||||
|
if (width < xs) {
|
||||||
|
screenRef.value = sizeEnum.XS;
|
||||||
|
} else if (width < sm) {
|
||||||
|
screenRef.value = sizeEnum.SM;
|
||||||
|
} else if (width < md) {
|
||||||
|
screenRef.value = sizeEnum.MD;
|
||||||
|
} else if (width < lg) {
|
||||||
|
screenRef.value = sizeEnum.LG;
|
||||||
|
} else if (width < xl) {
|
||||||
|
screenRef.value = sizeEnum.XL;
|
||||||
|
} else {
|
||||||
|
screenRef.value = sizeEnum.XXL;
|
||||||
|
}
|
||||||
|
realWidthRef.value = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
useEventListener({
|
||||||
|
el: window,
|
||||||
|
name: "resize",
|
||||||
|
|
||||||
|
listener: () => {
|
||||||
|
getWindowWidth();
|
||||||
|
resizeFn();
|
||||||
|
},
|
||||||
|
// wait: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
getWindowWidth();
|
||||||
|
globalScreenRef = computed(() => unref(screenRef));
|
||||||
|
globalWidthRef = computed((): number => screenMap.get(unref(screenRef)) || 0);
|
||||||
|
globalRealWidthRef = computed((): number => unref(realWidthRef));
|
||||||
|
|
||||||
|
function resizeFn() {
|
||||||
|
fn?.({
|
||||||
|
screen: globalScreenRef,
|
||||||
|
width: globalWidthRef,
|
||||||
|
realWidth: globalRealWidthRef,
|
||||||
|
screenEnum,
|
||||||
|
screenMap,
|
||||||
|
sizeEnum,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
resizeFn();
|
||||||
|
return {
|
||||||
|
screenRef: globalScreenRef,
|
||||||
|
screenEnum,
|
||||||
|
widthRef: globalWidthRef,
|
||||||
|
realWidthRef: globalRealWidthRef,
|
||||||
|
};
|
||||||
|
}
|
144
src/hooks/useEcharts.ts
Normal file
144
src/hooks/useEcharts.ts
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
import { BarSeriesOption, LineSeriesOption } from "echarts/charts";
|
||||||
|
import {
|
||||||
|
TitleComponentOption,
|
||||||
|
TooltipComponentOption,
|
||||||
|
GridComponentOption,
|
||||||
|
DatasetComponentOption,
|
||||||
|
} from "echarts/components";
|
||||||
|
import type { Ref } from "vue";
|
||||||
|
import { useTimeoutFn } from "./useTimeout";
|
||||||
|
import { tryOnUnmounted } from "@vueuse/core";
|
||||||
|
import { unref, nextTick, watch, computed, ref } from "vue";
|
||||||
|
import { useDebounceFn } from "@vueuse/core";
|
||||||
|
import { useEventListener } from "./useEventListener";
|
||||||
|
import { useBreakpoint } from "./useBreakpoint";
|
||||||
|
import echarts from "@/utils/echarts";
|
||||||
|
|
||||||
|
export type ECOption = echarts.ComposeOption<
|
||||||
|
| BarSeriesOption
|
||||||
|
| LineSeriesOption
|
||||||
|
| TitleComponentOption
|
||||||
|
| TooltipComponentOption
|
||||||
|
| GridComponentOption
|
||||||
|
| DatasetComponentOption
|
||||||
|
>;
|
||||||
|
|
||||||
|
export function useECharts(
|
||||||
|
elRef: Ref<HTMLDivElement>,
|
||||||
|
theme: "light" | "dark" | "default" = "default"
|
||||||
|
): any {
|
||||||
|
const getDarkMode = computed(() => {
|
||||||
|
return theme === "default" ? "light" : theme;
|
||||||
|
});
|
||||||
|
let chartInstance: echarts.ECharts | null = null;
|
||||||
|
let resizeFn: Fn = resize;
|
||||||
|
const cacheOptions = ref({}) as Ref<ECOption>;
|
||||||
|
let removeResizeFn: Fn = () => ({});
|
||||||
|
|
||||||
|
resizeFn = useDebounceFn(resize, 200);
|
||||||
|
|
||||||
|
const getOptions = computed(() => {
|
||||||
|
if (getDarkMode.value !== "dark") {
|
||||||
|
return cacheOptions.value as ECOption;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
backgroundColor: "transparent",
|
||||||
|
...cacheOptions.value,
|
||||||
|
} as ECOption;
|
||||||
|
});
|
||||||
|
|
||||||
|
function initCharts(t = theme) {
|
||||||
|
const el = unref(elRef);
|
||||||
|
if (!el || !unref(el)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chartInstance = echarts.init(el, t);
|
||||||
|
const { removeEvent } = useEventListener({
|
||||||
|
el: window,
|
||||||
|
name: "resize",
|
||||||
|
listener: resizeFn,
|
||||||
|
});
|
||||||
|
removeResizeFn = removeEvent;
|
||||||
|
const { widthRef, screenEnum } = useBreakpoint();
|
||||||
|
if (unref(widthRef) <= screenEnum.MD || el.offsetHeight === 0) {
|
||||||
|
useTimeoutFn(() => {
|
||||||
|
resizeFn();
|
||||||
|
}, 30);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setOptions(options: ECOption, clear = true) {
|
||||||
|
cacheOptions.value = options;
|
||||||
|
if (unref(elRef)?.offsetHeight === 0) {
|
||||||
|
useTimeoutFn(() => {
|
||||||
|
setOptions(unref(getOptions));
|
||||||
|
}, 30);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nextTick(() => {
|
||||||
|
useTimeoutFn(() => {
|
||||||
|
if (!chartInstance) {
|
||||||
|
initCharts(getDarkMode.value as "default");
|
||||||
|
|
||||||
|
if (!chartInstance) return;
|
||||||
|
}
|
||||||
|
clear && chartInstance?.clear();
|
||||||
|
|
||||||
|
chartInstance?.setOption(unref(getOptions));
|
||||||
|
}, 30);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function resize() {
|
||||||
|
chartInstance?.resize();
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => getDarkMode.value,
|
||||||
|
(theme) => {
|
||||||
|
if (chartInstance) {
|
||||||
|
chartInstance.dispose();
|
||||||
|
initCharts(theme as "default");
|
||||||
|
setOptions(cacheOptions.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
tryOnUnmounted(() => {
|
||||||
|
if (!chartInstance) return;
|
||||||
|
removeResizeFn();
|
||||||
|
chartInstance.dispose();
|
||||||
|
chartInstance = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
function getInstance(): echarts.ECharts | null {
|
||||||
|
if (!chartInstance) {
|
||||||
|
initCharts(getDarkMode.value as "default");
|
||||||
|
}
|
||||||
|
return chartInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
setOptions,
|
||||||
|
resize,
|
||||||
|
echarts,
|
||||||
|
getInstance,
|
||||||
|
};
|
||||||
|
}
|
76
src/hooks/useEventListener.ts
Normal file
76
src/hooks/useEventListener.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
import type { Ref } from "vue";
|
||||||
|
import { ref, watch, unref } from "vue";
|
||||||
|
import { useThrottleFn, useDebounceFn } from "@vueuse/core";
|
||||||
|
|
||||||
|
export type RemoveEventFn = () => void;
|
||||||
|
export interface UseEventParams {
|
||||||
|
el?: Element | Ref<Element | undefined> | Window | any;
|
||||||
|
name: string;
|
||||||
|
listener: EventListener;
|
||||||
|
options?: boolean | AddEventListenerOptions;
|
||||||
|
autoRemove?: boolean;
|
||||||
|
isDebounce?: boolean;
|
||||||
|
wait?: number;
|
||||||
|
}
|
||||||
|
export function useEventListener({
|
||||||
|
el = window,
|
||||||
|
name,
|
||||||
|
listener,
|
||||||
|
options,
|
||||||
|
autoRemove = true,
|
||||||
|
isDebounce = true,
|
||||||
|
wait = 80,
|
||||||
|
}: UseEventParams): { removeEvent: RemoveEventFn } {
|
||||||
|
let remove: RemoveEventFn = () => ({});
|
||||||
|
const isAddRef = ref(false);
|
||||||
|
|
||||||
|
if (el) {
|
||||||
|
const element = ref(el as Element) as Ref<Element>;
|
||||||
|
|
||||||
|
const handler = isDebounce
|
||||||
|
? useDebounceFn(listener, wait)
|
||||||
|
: useThrottleFn(listener, wait);
|
||||||
|
const realHandler = wait ? handler : listener;
|
||||||
|
const removeEventListener = (e: Element) => {
|
||||||
|
isAddRef.value = true;
|
||||||
|
e.removeEventListener(name, realHandler, options);
|
||||||
|
};
|
||||||
|
const addEventListener = (e: Element) =>
|
||||||
|
e.addEventListener(name, realHandler, options);
|
||||||
|
|
||||||
|
const removeWatch = watch(
|
||||||
|
element,
|
||||||
|
(v, _ov, cleanUp) => {
|
||||||
|
if (v) {
|
||||||
|
!unref(isAddRef) && addEventListener(v);
|
||||||
|
cleanUp(() => {
|
||||||
|
autoRemove && removeEventListener(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
|
|
||||||
|
remove = () => {
|
||||||
|
removeEventListener(element.value);
|
||||||
|
removeWatch();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { removeEvent: remove };
|
||||||
|
}
|
65
src/hooks/useTimeout.ts
Normal file
65
src/hooks/useTimeout.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
import { ref, watch } from "vue";
|
||||||
|
import { tryOnUnmounted } from "@vueuse/core";
|
||||||
|
import { isFunction } from "@/utils/is";
|
||||||
|
|
||||||
|
export function useTimeoutFn(
|
||||||
|
handle: Fn<any>,
|
||||||
|
wait: number,
|
||||||
|
native = false
|
||||||
|
): any {
|
||||||
|
if (!isFunction(handle)) {
|
||||||
|
throw new Error("handle is not Function!");
|
||||||
|
}
|
||||||
|
|
||||||
|
const { readyRef, stop, start } = useTimeoutRef(wait);
|
||||||
|
if (native) {
|
||||||
|
handle();
|
||||||
|
} else {
|
||||||
|
watch(
|
||||||
|
readyRef,
|
||||||
|
(maturity) => {
|
||||||
|
maturity && handle();
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return { readyRef, stop, start };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useTimeoutRef(wait: number): any {
|
||||||
|
const readyRef = ref(false);
|
||||||
|
|
||||||
|
let timer: TimeoutHandle;
|
||||||
|
function stop(): void {
|
||||||
|
readyRef.value = false;
|
||||||
|
timer && window.clearTimeout(timer);
|
||||||
|
}
|
||||||
|
function start(): void {
|
||||||
|
stop();
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
readyRef.value = true;
|
||||||
|
}, wait);
|
||||||
|
}
|
||||||
|
|
||||||
|
start();
|
||||||
|
|
||||||
|
tryOnUnmounted(stop);
|
||||||
|
|
||||||
|
return { readyRef, stop, start };
|
||||||
|
}
|
44
src/types/index.d.ts
vendored
Normal file
44
src/types/index.d.ts
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
declare interface Fn<T = any, R = T> {
|
||||||
|
(...arg: T[]): R;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare interface PromiseFn<T = any, R = T> {
|
||||||
|
(...arg: T[]): Promise<R>;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare type RefType<T> = T | null;
|
||||||
|
|
||||||
|
declare type LabelValueOptions = {
|
||||||
|
label: string;
|
||||||
|
value: any;
|
||||||
|
[key: string]: string | number | boolean;
|
||||||
|
}[];
|
||||||
|
|
||||||
|
declare type EmitType = (event: string, ...args: any[]) => void;
|
||||||
|
|
||||||
|
declare type TargetContext = "_self" | "_blank";
|
||||||
|
|
||||||
|
declare interface ComponentElRef<T extends HTMLElement = HTMLDivElement> {
|
||||||
|
$el: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare type ComponentRef<T extends HTMLElement = HTMLDivElement> =
|
||||||
|
ComponentElRef<T> | null;
|
||||||
|
|
||||||
|
declare type ElRef<T extends HTMLElement = HTMLDivElement> = Nullable<T>;
|
48
src/utils/echarts.ts
Normal file
48
src/utils/echarts.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
import * as echarts from "echarts/core";
|
||||||
|
|
||||||
|
import { BarChart, LineChart, PieChart, HeatmapChart } from "echarts/charts";
|
||||||
|
|
||||||
|
import {
|
||||||
|
TitleComponent,
|
||||||
|
TooltipComponent,
|
||||||
|
GridComponent,
|
||||||
|
LegendComponent,
|
||||||
|
DataZoomComponent,
|
||||||
|
VisualMapComponent,
|
||||||
|
TimelineComponent,
|
||||||
|
} from "echarts/components";
|
||||||
|
|
||||||
|
import { SVGRenderer } from "echarts/renderers";
|
||||||
|
|
||||||
|
echarts.use([
|
||||||
|
LegendComponent,
|
||||||
|
TitleComponent,
|
||||||
|
TooltipComponent,
|
||||||
|
GridComponent,
|
||||||
|
BarChart,
|
||||||
|
LineChart,
|
||||||
|
PieChart,
|
||||||
|
HeatmapChart,
|
||||||
|
SVGRenderer,
|
||||||
|
DataZoomComponent,
|
||||||
|
VisualMapComponent,
|
||||||
|
TimelineComponent,
|
||||||
|
]);
|
||||||
|
|
||||||
|
export default echarts;
|
110
src/utils/is.ts
Normal file
110
src/utils/is.ts
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
const toString = Object.prototype.toString;
|
||||||
|
|
||||||
|
export function is(val: unknown, type: string): boolean {
|
||||||
|
return toString.call(val) === `[object ${type}]`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isDef<T = unknown>(val?: T): val is T {
|
||||||
|
return typeof val !== "undefined";
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isUnDef<T = unknown>(val?: T): val is T {
|
||||||
|
return !isDef(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isObject(val: unknown): val is Record<any, any> {
|
||||||
|
return val !== null && is(val, "Object");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isEmpty<T = unknown>(val: any): val is T {
|
||||||
|
if (isArray(val) || isString(val)) {
|
||||||
|
return val.length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val instanceof Map || val instanceof Set) {
|
||||||
|
return val.size === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isObject(val)) {
|
||||||
|
return Object.keys(val).length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isDate(val: unknown): val is Date {
|
||||||
|
return is(val, "Date");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isNull(val: unknown): val is null {
|
||||||
|
return val === null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isNullAndUnDef(val: unknown): val is null | undefined {
|
||||||
|
return isUnDef(val) && isNull(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isNullOrUnDef(val: unknown): val is null | undefined {
|
||||||
|
return isUnDef(val) || isNull(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isNumber(val: unknown): val is number {
|
||||||
|
return is(val, "Number");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isPromise<T = any>(val: unknown): val is Promise<T> {
|
||||||
|
return (
|
||||||
|
is(val, "Promise") &&
|
||||||
|
isObject(val) &&
|
||||||
|
isFunction(val.then) &&
|
||||||
|
isFunction(val.catch)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isString(val: unknown): val is string {
|
||||||
|
return is(val, "String");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isFunction(val: unknown): boolean {
|
||||||
|
return typeof val === "function";
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isBoolean(val: unknown): val is boolean {
|
||||||
|
return is(val, "Boolean");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isRegExp(val: unknown): val is RegExp {
|
||||||
|
return is(val, "RegExp");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isArray(val: any): boolean {
|
||||||
|
return val && Array.isArray(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isWindow(val: unknown): val is Window {
|
||||||
|
return typeof window !== "undefined" && is(val, "Window");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isElement(val: unknown): val is Element {
|
||||||
|
return isObject(val) && !!val.tagName;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isMap(val: unknown): val is Map<any, any> {
|
||||||
|
return is(val, "Map");
|
||||||
|
}
|
@ -34,7 +34,7 @@
|
|||||||
"webpack-env",
|
"webpack-env",
|
||||||
"jest"
|
"jest"
|
||||||
],
|
],
|
||||||
"typeRoots": ["./node_modules/@types/", "./types"],
|
"typeRoots": ["./node_modules/@types/"],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": [
|
"@/*": [
|
||||||
"src/*"
|
"src/*"
|
||||||
|
Loading…
Reference in New Issue
Block a user