diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 6662ef53d5e..492016be471 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -97,6 +97,7 @@ "nanoid": "^5.1.6", "ol": "^7.5.2", "prop-types": "^15.8.1", + "query-string": "6.14.1", "re-resizable": "^6.11.2", "react": "^17.0.2", "react-checkbox-tree": "^1.8.0", @@ -4427,157 +4428,6 @@ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, - "node_modules/@encodable/color": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@encodable/color/-/color-1.1.1.tgz", - "integrity": "sha512-3QlHqsaD+D4W4T6E4Wq4mp7MBpt5yCkCmgTh6AfsoUfJeAEogA92d8r3Y67Zuppcs/eepHW0ip8zfehS2jZNkQ==", - "license": "Apache-2.0", - "dependencies": { - "@encodable/registry": "^1.0.3", - "@types/d3-interpolate": "^1.3.1", - "@types/d3-scale": "^3.1.0", - "@types/d3-scale-chromatic": "^1.2.0", - "d3-interpolate": "^2.0.1", - "d3-scale": "^3.2.1", - "d3-scale-chromatic": "^2.0.0" - } - }, - "node_modules/@encodable/color/node_modules/@types/d3-color": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", - "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==", - "license": "MIT" - }, - "node_modules/@encodable/color/node_modules/@types/d3-interpolate": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.5.tgz", - "integrity": "sha512-k9L18hXXv7OvK4PqW1kSFYIzasGOvfhPUWmHFkoZ8/ci99EAmY4HoF6zMefrHl0SGV7XYc7Qq2MNh8dK3edg5A==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "^1" - } - }, - "node_modules/@encodable/color/node_modules/@types/d3-scale": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", - "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "^2" - } - }, - "node_modules/@encodable/color/node_modules/@types/d3-time": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", - "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==", - "license": "MIT" - }, - "node_modules/@encodable/color/node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1 - 2" - } - }, - "node_modules/@encodable/color/node_modules/d3-scale": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" - } - }, - "node_modules/@encodable/color/node_modules/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "2" - } - }, - "node_modules/@encodable/color/node_modules/d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1 - 2" - } - }, - "node_modules/@encodable/format": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@encodable/format/-/format-1.0.6.tgz", - "integrity": "sha512-gtzLMQyw4AJ7m3TIANm2z2QfzZJLGLdhVmKbizRRu9MRMlYIVXhk+46zPm10RNxGv4ybpsfcCfkCd4nL3RlZRg==", - "license": "Apache-2.0", - "dependencies": { - "@encodable/registry": "^1.0.3", - "@types/d3-format": "^1.3.1", - "@types/d3-time": "^1.0.10", - "@types/d3-time-format": "^2.1.1", - "d3-format": "^2.0.0", - "d3-time": "^2.0.0", - "d3-time-format": "^3.0.0" - } - }, - "node_modules/@encodable/format/node_modules/@types/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==", - "license": "MIT" - }, - "node_modules/@encodable/format/node_modules/@types/d3-time": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", - "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==", - "license": "MIT" - }, - "node_modules/@encodable/format/node_modules/@types/d3-time-format": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.4.tgz", - "integrity": "sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==", - "license": "MIT" - }, - "node_modules/@encodable/format/node_modules/d3-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", - "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==", - "license": "BSD-3-Clause" - }, - "node_modules/@encodable/format/node_modules/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "2" - } - }, - "node_modules/@encodable/format/node_modules/d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1 - 2" - } - }, - "node_modules/@encodable/registry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@encodable/registry/-/registry-1.0.3.tgz", - "integrity": "sha512-YH2nSBZJKgbH/9MkQXzAEE9UwTaVcWiKgVFyEU/gvrfmNWqecYaHMTyObo+ADSTGF4kk0cZZkr7VqZgIQbvrUw==", - "license": "Apache-2.0", - "peerDependencies": { - "global-box": "*" - } - }, "node_modules/@epic-web/invariant": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", @@ -19313,9 +19163,9 @@ "license": "MIT" }, "node_modules/@types/d3-array": { - "version": "2.12.7", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-2.12.7.tgz", - "integrity": "sha512-SVvxzxRVnIgtJbNTj5ZVJ9CZkVOANCpW0nQbRi7EOU5Q9G+JQQjXD2SCpr1OYCX09b3Yr7o0+CBofZAgU42rbQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-cloud": { @@ -19376,21 +19226,17 @@ "version": "2.2.10", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.2.10.tgz", "integrity": "sha512-j4V7qQ+CQzK2KpvI5NDejdPAcds+fTzNGqWXrCXv1zNR33HRir0bMdhzN1OHDQLNXYffW/zOr3FOS2qlHDEgrw==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-time": "^1" } }, - "node_modules/@types/d3-scale-chromatic": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.4.tgz", - "integrity": "sha512-HwLVEm8laYTNOR9Kc9745XDKgRa69VIIChNkSKJgrJOsDLI9QSiFSH2Bi4wMbGrvFs+X64azev7NfBPq+VOFVg==", - "license": "MIT" - }, "node_modules/@types/d3-scale/node_modules/@types/d3-time": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-shape": { @@ -19974,15 +19820,6 @@ "@types/lodash": "*" } }, - "node_modules/@types/lodash.get": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.9.tgz", - "integrity": "sha512-J5dvW98sxmGnamqf+/aLP87PYXyrha9xIgc2ZlHl6OHMFR2Ejdxep50QfU0abO1+CH6+ugx+8wEUN1toImAinA==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/mapbox__geojson-extent": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/mapbox__geojson-extent/-/mapbox__geojson-extent-1.0.3.tgz", @@ -28323,25 +28160,6 @@ "d3-time-format": "2" } }, - "node_modules/d3-scale-chromatic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", - "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1 - 2", - "d3-interpolate": "1 - 2" - } - }, - "node_modules/d3-scale-chromatic/node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1 - 2" - } - }, "node_modules/d3-scale/node_modules/d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", @@ -28671,7 +28489,6 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -29687,97 +29504,6 @@ "node": ">= 4" } }, - "node_modules/encodable": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/encodable/-/encodable-0.7.8.tgz", - "integrity": "sha512-rh5isin1c3ZJuultMyJZGBRbGIh8IrVHQuwlEG3lPMGZQ5yQUb2STIbXGGEbSifxT4POnojKjTxhm3ITTSdriw==", - "license": "Apache-2.0", - "dependencies": { - "@encodable/color": "^1.1.0", - "@encodable/format": "^1.0.5", - "@types/d3-array": "^2.0.0", - "@types/d3-interpolate": "^1.3.1", - "@types/d3-scale": "^2.1.1", - "@types/d3-time": "^1.0.10", - "@types/lodash.get": "^4.4.6", - "d3-array": "^2.3.1", - "d3-interpolate": "^2.0.1", - "d3-scale": "^3.0.1", - "d3-time": "^2.0.0", - "lodash.get": "^4.4.2", - "reselect": "^4.0.0" - }, - "peerDependencies": { - "global-box": "*" - } - }, - "node_modules/encodable/node_modules/@types/d3-color": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", - "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==", - "license": "MIT" - }, - "node_modules/encodable/node_modules/@types/d3-interpolate": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.5.tgz", - "integrity": "sha512-k9L18hXXv7OvK4PqW1kSFYIzasGOvfhPUWmHFkoZ8/ci99EAmY4HoF6zMefrHl0SGV7XYc7Qq2MNh8dK3edg5A==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "^1" - } - }, - "node_modules/encodable/node_modules/@types/d3-time": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", - "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==", - "license": "MIT" - }, - "node_modules/encodable/node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1 - 2" - } - }, - "node_modules/encodable/node_modules/d3-scale": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" - } - }, - "node_modules/encodable/node_modules/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "2" - } - }, - "node_modules/encodable/node_modules/d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1 - 2" - } - }, - "node_modules/encodable/node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "license": "MIT" - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -32547,7 +32273,6 @@ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -34606,13 +34331,6 @@ "process": "^0.11.10" } }, - "node_modules/global-box": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/global-box/-/global-box-2.0.2.tgz", - "integrity": "sha512-vVSNq3+oEEqG565ProXN7iKHcK8hehtbXNLjsOmywHDTBXlwgP/Bt1Soqf4NGeOq3W3u1o7UE3t0RgiNG0BTkQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/global-directory": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", @@ -49059,7 +48777,6 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "license": "MIT", - "peer": true, "dependencies": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -54464,7 +54181,6 @@ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -54998,7 +54714,6 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -65126,7 +64841,6 @@ }, "peerDependencies": { "@apache-superset/core": "*", - "@encodable/color": "=1.1.1", "@superset-ui/core": "*", "@superset-ui/legacy-plugin-chart-calendar": "*", "@superset-ui/legacy-plugin-chart-chord": "*", @@ -66197,12 +65911,6 @@ "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", "license": "BSD-2-Clause" }, - "plugins/legacy-preset-chart-deckgl/node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, "plugins/legacy-preset-chart-deckgl/node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -66348,12 +66056,6 @@ "react-dom": "^17.0.2" } }, - "plugins/plugin-chart-ag-grid-table/node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, "plugins/plugin-chart-ag-grid-table/node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -66398,6 +66100,7 @@ "version": "0.20.3", "license": "Apache-2.0", "dependencies": { + "@types/d3-array": "^3.2.2", "@types/react-redux": "^7.1.34", "d3-array": "^3.2.4", "lodash": "^4.17.23" @@ -66543,12 +66246,6 @@ "react-dom": "^17.0.2" } }, - "plugins/plugin-chart-table/node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, "plugins/plugin-chart-table/node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -66568,8 +66265,7 @@ "dependencies": { "@types/d3-scale": "^4.0.9", "d3-cloud": "^1.2.8", - "d3-scale": "^3.0.1", - "encodable": "^0.7.8" + "d3-scale": "^3.0.1" }, "devDependencies": { "@types/d3-cloud": "^1.2.9" diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 01a739c31e9..30ef0d1d669 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -178,6 +178,7 @@ "nanoid": "^5.1.6", "ol": "^7.5.2", "prop-types": "^15.8.1", + "query-string": "6.14.1", "re-resizable": "^6.11.2", "react": "^17.0.2", "react-checkbox-tree": "^1.8.0", diff --git a/superset-frontend/packages/superset-ui-demo/package.json b/superset-frontend/packages/superset-ui-demo/package.json index f1dd21c5e87..344e7a268f8 100644 --- a/superset-frontend/packages/superset-ui-demo/package.json +++ b/superset-frontend/packages/superset-ui-demo/package.json @@ -63,7 +63,6 @@ "typescript": "^5.9.3" }, "peerDependencies": { - "@encodable/color": "=1.1.1", "@superset-ui/core": "*", "@apache-superset/core": "*", "@superset-ui/legacy-plugin-chart-calendar": "*", diff --git a/superset-frontend/plugins/plugin-chart-echarts/package.json b/superset-frontend/plugins/plugin-chart-echarts/package.json index 3d8de503a24..3bba8cfea3e 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/package.json +++ b/superset-frontend/plugins/plugin-chart-echarts/package.json @@ -24,6 +24,7 @@ "lib" ], "dependencies": { + "@types/d3-array": "^3.2.2", "@types/react-redux": "^7.1.34", "d3-array": "^3.2.4", "lodash": "^4.17.23" diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/package.json b/superset-frontend/plugins/plugin-chart-word-cloud/package.json index eb43ea19796..54bb2d7c55b 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/package.json +++ b/superset-frontend/plugins/plugin-chart-word-cloud/package.json @@ -31,8 +31,7 @@ "dependencies": { "@types/d3-scale": "^4.0.9", "d3-cloud": "^1.2.8", - "d3-scale": "^3.0.1", - "encodable": "^0.7.8" + "d3-scale": "^3.0.1" }, "peerDependencies": { "@superset-ui/chart-controls": "*", diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx index 5818b3e7bc4..6d1abedb774 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx +++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx @@ -18,18 +18,15 @@ */ import { PureComponent } from 'react'; import cloudLayout from 'd3-cloud'; -import { - PlainObject, - createEncoderFactory, - DeriveEncoding, - Encoder, -} from 'encodable'; +import { scaleLinear } from 'd3-scale'; import { seed, CategoricalColorNamespace } from '@superset-ui/core'; import { SupersetTheme, withTheme } from '@apache-superset/core/ui'; import { isEqual } from 'lodash'; const seedRandom = seed('superset-ui'); +export type PlainObject = Record; + // Polyfill Word type since it's not exported from 'd3-cloud' export type Word = { text: string; @@ -49,15 +46,27 @@ export const ROTATION = { export type RotationType = keyof typeof ROTATION; -export type WordCloudEncoding = DeriveEncoding; - -type WordCloudEncodingConfig = { - color: ['Color', string]; - fontFamily: ['Category', string]; - fontSize: ['Numeric', number]; - fontWeight: ['Category', string | number]; - text: ['Text', string]; -}; +/** + * Encoding configuration for mapping data fields to visual properties. + * Supports field-based mappings with optional scale configurations. + */ +export interface WordCloudEncoding { + color?: { + field?: string; + value?: string; + scale?: { scheme?: string }; + type?: string; + }; + fontFamily?: { field?: string; value?: string }; + fontSize?: { + field?: string; + value?: number; + scale?: { range?: [number, number]; zero?: boolean }; + type?: string; + }; + fontWeight?: { field?: string; value?: string | number }; + text?: { field?: string; value?: string }; +} export interface WordCloudVisualProps { encoding?: Partial; @@ -88,38 +97,118 @@ type FullWordCloudProps = WordCloudProps & const SCALE_FACTOR_STEP = 0.5; const MAX_SCALE_FACTOR = 3; const TOP_RESULTS_PERCENTAGE = 0.1; + +/** + * Simple encoder that maps data fields to visual properties. + * Replaces the encodable library with direct field access and d3 scales. + */ +class SimpleEncoder { + private encoding: WordCloudEncoding; + + private defaults: { + color: string; + fontFamily: string; + fontSize: number; + fontWeight: string | number; + text: string; + }; + + private fontSizeScale: ((value: number) => number) | null = null; + + constructor( + encoding: WordCloudEncoding, + defaults: { + color: string; + fontFamily: string; + fontSize: number; + fontWeight: string | number; + text: string; + }, + ) { + this.encoding = encoding; + this.defaults = defaults; + } + + /** + * Set domain from dataset to configure scales + */ + setDomainFromDataset(data: PlainObject[]): void { + const fontSizeConfig = this.encoding.fontSize; + if (fontSizeConfig?.field && fontSizeConfig?.scale?.range) { + const values = data + .map(d => Number(d[fontSizeConfig.field!]) || 0) + .filter(v => !Number.isNaN(v)); + + if (values.length > 0) { + const min = fontSizeConfig.scale.zero ? 0 : Math.min(...values); + const max = Math.max(...values); + const [rangeMin, rangeMax] = fontSizeConfig.scale.range; + + this.fontSizeScale = scaleLinear() + .domain([min, max]) + .range([rangeMin, rangeMax]); + } + } + } + + getText(d: PlainObject): string { + const config = this.encoding.text; + if (config?.field && d[config.field] !== undefined) { + return String(d[config.field]); + } + return config?.value ?? this.defaults.text; + } + + getFontSize(d: PlainObject): number { + const config = this.encoding.fontSize; + if (config?.field && d[config.field] !== undefined) { + const value = Number(d[config.field]) || 0; + if (this.fontSizeScale) { + return this.fontSizeScale(value); + } + return value || this.defaults.fontSize; + } + return config?.value ?? this.defaults.fontSize; + } + + getColor(d: PlainObject): string { + const config = this.encoding.color; + if (config?.field && d[config.field] !== undefined) { + return String(d[config.field]); + } + return config?.value ?? this.defaults.color; + } + + getFontFamily(d: PlainObject): string { + const config = this.encoding.fontFamily; + if (config?.field && d[config.field] !== undefined) { + return String(d[config.field]); + } + return config?.value ?? this.defaults.fontFamily; + } + + getFontWeight(d: PlainObject): string | number { + const config = this.encoding.fontWeight; + if (config?.field && d[config.field] !== undefined) { + return d[config.field] as string | number; + } + return config?.value ?? this.defaults.fontWeight; + } +} + class WordCloud extends PureComponent { static defaultProps = defaultProps; isComponentMounted = false; - wordCloudEncoderFactory = createEncoderFactory({ - channelTypes: { - color: 'Color', - fontFamily: 'Category', - fontSize: 'Numeric', - fontWeight: 'Category', - text: 'Text', - }, - defaultEncoding: { - color: { value: this.props.theme.colorTextLabel }, - fontFamily: { value: this.props.theme.fontFamily }, - fontSize: { value: 20 }, - fontWeight: { value: 'bold' }, - text: { value: '' }, - }, - }); - - createEncoder = ( - encoding?: Partial, - ): Encoder => { - const selector: ( - e: Partial, - ) => Encoder = - this.wordCloudEncoderFactory.createSelector(); - - return selector(encoding ?? {}); - }; + createEncoder = (encoding?: Partial): SimpleEncoder => + new SimpleEncoder(encoding ?? {}, { + color: this.props.theme.colorTextLabel, + fontFamily: this.props.theme.fontFamily, + fontSize: 20, + fontWeight: 'bold', + text: '', + }); constructor(props: FullWordCloudProps) { super(props); @@ -165,9 +254,7 @@ class WordCloud extends PureComponent { encoder.setDomainFromDataset(data); const sortedData = [...data].sort( - (a, b) => - encoder.channels.fontSize.encodeDatum(b, 0) - - encoder.channels.fontSize.encodeDatum(a, 0), + (a, b) => encoder.getFontSize(b) - encoder.getFontSize(a), ); const topResultsCount = Math.max( sortedData.length * TOP_RESULTS_PERCENTAGE, @@ -177,15 +264,13 @@ class WordCloud extends PureComponent { this.generateCloud(encoder, 1, (words: Word[]) => topResults.every((d: PlainObject) => - words.find( - ({ text }) => encoder.channels.text.getValueFromDatum(d) === text, - ), + words.find(({ text }) => encoder.getText(d) === text), ), ); } generateCloud( - encoder: Encoder, + encoder: SimpleEncoder, scaleFactor: number, isValid: (word: Word[]) => boolean, ) { @@ -196,14 +281,10 @@ class WordCloud extends PureComponent { .words(data.map((d: Word) => ({ ...d }))) .padding(5) .rotate(ROTATION[rotation] || ROTATION.flat) - .text((d: PlainObject) => encoder.channels.text.getValueFromDatum(d)) - .font((d: PlainObject) => - encoder.channels.fontFamily.encodeDatum(d, this.props.theme.fontFamily), - ) - .fontWeight((d: PlainObject) => - encoder.channels.fontWeight.encodeDatum(d, 'normal'), - ) - .fontSize((d: PlainObject) => encoder.channels.fontSize.encodeDatum(d, 0)) + .text((d: PlainObject) => encoder.getText(d)) + .font((d: PlainObject) => encoder.getFontFamily(d)) + .fontWeight((d: PlainObject) => encoder.getFontWeight(d)) + .fontSize((d: PlainObject) => encoder.getFontSize(d)) .on('end', (words: Word[]) => { if (isValid(words) || scaleFactor > MAX_SCALE_FACTOR) { this.setWords(words); @@ -219,7 +300,6 @@ class WordCloud extends PureComponent { const { width, height, encoding, sliceId, colorScheme } = this.props; const encoder = this.createEncoder(encoding); - encoder.channels.color.setDomainFromDataset(words); const colorFn = CategoricalColorNamespace.getScale(colorScheme); const viewBoxWidth = width * scaleFactor; @@ -238,10 +318,7 @@ class WordCloud extends PureComponent { fontSize={`${w.size}px`} fontWeight={w.weight} fontFamily={w.font} - fill={colorFn( - encoder.channels.color.getValueFromDatum(w) as string, - sliceId, - )} + fill={colorFn(encoder.getColor(w as PlainObject), sliceId)} textAnchor="middle" transform={`translate(${w.x}, ${w.y}) rotate(${w.rotate})`} > diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/configureEncodable.ts b/superset-frontend/plugins/plugin-chart-word-cloud/src/configureEncodable.ts deleted file mode 100644 index 05a20412865..00000000000 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/configureEncodable.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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 { - Encodable, - ColorSchemeResolver, - TimeFormatResolver, - CategoricalColorScaleResolver, - defaultColorSchemeResolver, - addPrefix, -} from 'encodable'; -import { - CategoricalColorNamespace, - getCategoricalSchemeRegistry, - getSequentialSchemeRegistry, - getNumberFormatter, - getTimeFormatter, - LOCAL_PREFIX, - getTimeFormatterRegistry, -} from '@superset-ui/core'; - -const timeFormat: TimeFormatResolver = ({ - format, - formatInLocalTime = false, -} = {}) => { - const formatString = formatInLocalTime - ? addPrefix( - LOCAL_PREFIX, - format ?? getTimeFormatterRegistry().getDefaultKey()!, - ) - : format; - - return getTimeFormatter(formatString); -}; - -const colorSchemeResolver: ColorSchemeResolver = ({ - name, - type = 'categorical', -} = {}) => { - if (type === 'sequential') { - const scheme = getSequentialSchemeRegistry().get(name); - - return typeof scheme === 'undefined' - ? scheme - : { type: 'sequential', ...scheme }; - } - if (type === 'categorical') { - const scheme = getCategoricalSchemeRegistry().get(name); - - return typeof scheme === 'undefined' - ? scheme - : { type: 'categorical', ...scheme }; - } - return defaultColorSchemeResolver({ name, type }); -}; - -const colorScaleResolver: CategoricalColorScaleResolver = ({ - name, - namespace, -} = {}) => CategoricalColorNamespace.getScale(name, namespace); - -export default function configureEncodable() { - Encodable.setNumberFormatResolver(getNumberFormatter) - .setTimeFormatResolver(timeFormat) - .setColorSchemeResolver(colorSchemeResolver) - .setCategoricalColorScaleResolver(colorScaleResolver); -} diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/index.ts b/superset-frontend/plugins/plugin-chart-word-cloud/src/index.ts index c265e837a46..87bc4ff60b0 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/index.ts +++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/index.ts @@ -19,4 +19,3 @@ export { default as WordCloudChartPlugin } from './plugin'; export * from './types'; -export { default as configureEncodable } from './configureEncodable'; diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts index a8305489dc6..c37d27d8cc3 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts +++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts @@ -29,9 +29,6 @@ import example1Dark from '../images/Word_Cloud-dark.jpg'; import example2 from '../images/Word_Cloud_2.jpg'; import example2Dark from '../images/Word_Cloud_2-dark.jpg'; import controlPanel from './controlPanel'; -import configureEncodable from '../configureEncodable'; - -configureEncodable(); const metadata = new ChartMetadata({ category: t('Ranking'),