diff --git a/src/utils/mutation.ts b/src/utils/mutation.ts new file mode 100644 index 00000000..219d9337 --- /dev/null +++ b/src/utils/mutation.ts @@ -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 class mutationObserver { + private static mutationObserverMap: Map = new Map(); + + static create(key: string, callback: MutationCallback) { + const observer = new MutationObserver(callback); + mutationObserver.mutationObserverMap.set(key, observer); + } + + static observe(key: string, target: Node, options?: MutationObserverInit) { + const observer = mutationObserver.mutationObserverMap.get(key); + if (observer) { + observer.observe(target, options); + } + } + + static deleteObserve(key: string): void { + this.disconnect(key); + this.mutationObserverMap.delete(key); + } + + static disconnect(key: string): void { + const observer = this.mutationObserverMap.get(key); + if (observer) { + observer.disconnect(); + } + } +} diff --git a/src/views/dashboard/controls/Trace.vue b/src/views/dashboard/controls/Trace.vue index e94cea82..4db7e77a 100644 --- a/src/views/dashboard/controls/Trace.vue +++ b/src/views/dashboard/controls/Trace.vue @@ -29,9 +29,14 @@ limitations under the License. -->
-
+
- +
@@ -47,7 +52,7 @@ limitations under the License. --> import TraceDetail from "../related/trace/Detail.vue"; import { useI18n } from "vue-i18n"; import { useDashboardStore } from "@/store/modules/dashboard"; - import emitter from "@/utils/mitt"; + import { mutationObserver } from "@/utils/mutation"; /* global defineProps */ const props = defineProps({ @@ -79,9 +84,7 @@ limitations under the License. --> function triggerArrow() { currentWidth.value = isLeft.value ? 0 : defaultWidth; isLeft.value = !isLeft.value; - setTimeout(() => { - emitter.emit("traceResize", "trace-arrow"); - }); + startObserve(); } function popSegmentList() { if (currentWidth.value >= defaultWidth) { @@ -89,7 +92,16 @@ limitations under the License. --> } currentWidth.value = defaultWidth; isLeft.value = true; - emitter.emit("traceResize", "trace-search"); + } + function startObserve() { + mutationObserver.observe("trigger-resize", document.querySelector(".trace-list")!, { + attributes: true, + attributeFilter: ["style"], + }); + } + function stopObserve(event: MouseEvent) { + mutationObserver.disconnect("trigger-resize"); + event.stopPropagation(); } const mousemove = (event: MouseEvent) => { if (!isDrag.value) { @@ -99,15 +111,17 @@ limitations under the License. --> let leftWidth = document.querySelector(".trace-list")!.getBoundingClientRect(); currentWidth.value = diffX - leftWidth.left; isLeft.value = currentWidth.value >= minArrowLeftWidth; - emitter.emit("traceResize", "trace-move"); }; - const mouseup = () => { + const mouseup = (event: MouseEvent) => { showIcon.value = false; isDrag.value = false; + stopObserve(event); }; const mousedown = (event: MouseEvent) => { if ((event.target as HTMLDivElement)?.className === "trace-line") { isDrag.value = true; + startObserve(); + event.stopPropagation(); } }; onMounted(() => { @@ -119,7 +133,6 @@ limitations under the License. --> document.removeEventListener("mousedown", mousedown); document.removeEventListener("mousemove", mousemove); document.removeEventListener("mouseup", mouseup); - emitter.off("traceResize"); });