From 29e7f8d035fa9e38a7aa44ff891d713c55d87f84 Mon Sep 17 00:00:00 2001 From: kanishk6103 Date: Sat, 15 Nov 2025 02:10:51 +0530 Subject: [PATCH 1/2] added parent null checks to tooltip components --- package-lock.json | 17 +++++++++++++++++ src/api/tooltips/ToolTip.js | 7 +++++++ .../tooltips/components/TooltipComponent.vue | 3 +++ src/api/tooltips/tooltipMixins.js | 4 ++++ 4 files changed, 31 insertions(+) diff --git a/package-lock.json b/package-lock.json index 5925dbd0411..ba7b350c9ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -406,6 +406,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", @@ -1670,6 +1671,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "dev": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2261,6 +2263,7 @@ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2308,6 +2311,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2680,6 +2684,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -4489,6 +4494,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4544,6 +4550,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7160,6 +7167,7 @@ "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, + "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -8824,6 +8832,7 @@ "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -8886,6 +8895,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -8987,6 +8997,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -9830,6 +9841,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -10696,6 +10708,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10825,6 +10838,7 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -10934,6 +10948,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11412,6 +11427,7 @@ "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -11458,6 +11474,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", "dev": true, + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.0", diff --git a/src/api/tooltips/ToolTip.js b/src/api/tooltips/ToolTip.js index d2393e49357..941dd531409 100644 --- a/src/api/tooltips/ToolTip.js +++ b/src/api/tooltips/ToolTip.js @@ -67,6 +67,13 @@ class Tooltip extends EventEmitter { * @private **/ show() { + const parentExists = this.tooltip && this.tooltip.parentElement && + document.contains(this.tooltip.parentElement); + + if (!parentExists) { + console.warn('Tooltip parent does not exist anymore!'); + return; + } document.body.appendChild(this.component.$el); this.isActive = true; } diff --git a/src/api/tooltips/components/TooltipComponent.vue b/src/api/tooltips/components/TooltipComponent.vue index f76577c2be3..c083836f5be 100644 --- a/src/api/tooltips/components/TooltipComponent.vue +++ b/src/api/tooltips/components/TooltipComponent.vue @@ -40,6 +40,9 @@ export default { inject: ['toolTipText', 'toolTipLocation', 'parentElement', 'cssClasses'], computed: { toolTipCoordinates() { + if (!this.parentElement || !document.contains(this.parentElement)) { + return { top: 0, left: 0, height: 0, width: 0 }; + } return this.parentElement.getBoundingClientRect(); }, toolTipLocationStyle() { diff --git a/src/api/tooltips/tooltipMixins.js b/src/api/tooltips/tooltipMixins.js index cd5681903dd..9e1dc3b104a 100644 --- a/src/api/tooltips/tooltipMixins.js +++ b/src/api/tooltips/tooltipMixins.js @@ -53,6 +53,10 @@ const tooltipHelpers = { return; } let parentElement = this.$refs[elementRef]; + if (!parentElement || !document.contains(parentElement)) { + console.warn('Cannot create tooltip: parent element does not exist'); + return; + } if (Array.isArray(parentElement)) { parentElement = parentElement[0]; } From fe2c1ab0e2ed51812f2c0709ebc585080df8ae9e Mon Sep 17 00:00:00 2001 From: kanishk6103 Date: Sat, 15 Nov 2025 02:46:57 +0530 Subject: [PATCH 2/2] implemented null check suggestions --- src/api/tooltips/ToolTip.js | 5 ++--- src/api/tooltips/components/TooltipComponent.vue | 2 +- src/api/tooltips/tooltipMixins.js | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/api/tooltips/ToolTip.js b/src/api/tooltips/ToolTip.js index 941dd531409..017d662e8f1 100644 --- a/src/api/tooltips/ToolTip.js +++ b/src/api/tooltips/ToolTip.js @@ -35,7 +35,7 @@ class Tooltip extends EventEmitter { } ) { super(); - + this.parentElement = parentElement; const { vNode, destroy } = mount({ components: { TooltipComponent: TooltipComponent @@ -67,8 +67,7 @@ class Tooltip extends EventEmitter { * @private **/ show() { - const parentExists = this.tooltip && this.tooltip.parentElement && - document.contains(this.tooltip.parentElement); + const parentExists = this.parentElement && document.body.contains(this.parentElement); if (!parentExists) { console.warn('Tooltip parent does not exist anymore!'); diff --git a/src/api/tooltips/components/TooltipComponent.vue b/src/api/tooltips/components/TooltipComponent.vue index c083836f5be..460d154ac97 100644 --- a/src/api/tooltips/components/TooltipComponent.vue +++ b/src/api/tooltips/components/TooltipComponent.vue @@ -40,7 +40,7 @@ export default { inject: ['toolTipText', 'toolTipLocation', 'parentElement', 'cssClasses'], computed: { toolTipCoordinates() { - if (!this.parentElement || !document.contains(this.parentElement)) { + if (!this.parentElement || !document.body.contains(this.parentElement)) { return { top: 0, left: 0, height: 0, width: 0 }; } return this.parentElement.getBoundingClientRect(); diff --git a/src/api/tooltips/tooltipMixins.js b/src/api/tooltips/tooltipMixins.js index 9e1dc3b104a..29e136bc44f 100644 --- a/src/api/tooltips/tooltipMixins.js +++ b/src/api/tooltips/tooltipMixins.js @@ -53,7 +53,7 @@ const tooltipHelpers = { return; } let parentElement = this.$refs[elementRef]; - if (!parentElement || !document.contains(parentElement)) { + if (!parentElement || !document.body.contains(parentElement)) { console.warn('Cannot create tooltip: parent element does not exist'); return; }