diff --git a/package-lock.json b/package-lock.json index d9ff368332..58bda4d24c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,9 @@ "@datadog/browser-rum": "^6.22.0", "@datadog/browser-rum-react": "^6.22.0", "@descope/react-sdk": "^2.16.1", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@estruyf/github-actions-reporter": "^1.9.2", "@floating-ui/react": "^0.27.2", "@formkit/auto-animate": "^0.8.2", @@ -20,6 +23,8 @@ "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", "@sentry/react": "^8.47.0", + "@tanstack/react-table": "^8.21.3", + "@tanstack/react-virtual": "^3.13.12", "@types/lodash": "^4.17.13", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", @@ -300,7 +305,6 @@ "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -523,7 +527,6 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -583,8 +586,7 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.1.tgz", "integrity": "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==", - "license": "(Apache-2.0 AND BSD-3-Clause)", - "peer": true + "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", @@ -653,6 +655,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=0.1.90" } @@ -989,7 +992,6 @@ "integrity": "sha512-KchMDNtU4CDTdkyf0qG7ugJ6qHTOR/aI7XebYn3OTCNagaDYWiZUVKgRgwH79yeMkpNgvEUaXSK7wKjaBK9b/Q==", "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@bufbuild/protobuf": "^1.10.0" } @@ -1093,7 +1095,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1117,7 +1118,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1423,6 +1423,59 @@ "tslib": "2.8.1" } }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@emnapi/core": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", @@ -2575,7 +2628,6 @@ "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.30.0", "@typescript-eslint/types": "4.30.0", @@ -3111,7 +3163,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3233,6 +3284,7 @@ "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 20" } @@ -3263,6 +3315,7 @@ "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" @@ -3277,6 +3330,7 @@ "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", @@ -3291,7 +3345,8 @@ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@octokit/plugin-paginate-rest": { "version": "13.1.1", @@ -3299,6 +3354,7 @@ "integrity": "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/types": "^14.1.0" }, @@ -3315,6 +3371,7 @@ "integrity": "sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", @@ -3333,6 +3390,7 @@ "integrity": "sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" @@ -3350,6 +3408,7 @@ "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/endpoint": "^11.0.0", "@octokit/request-error": "^7.0.0", @@ -3367,6 +3426,7 @@ "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/types": "^14.0.0" }, @@ -3380,6 +3440,7 @@ "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/openapi-types": "^25.1.0" } @@ -3402,7 +3463,6 @@ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright": "1.56.1" }, @@ -3488,7 +3548,6 @@ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", "license": "MIT", - "peer": true, "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", @@ -3805,7 +3864,8 @@ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", @@ -4021,6 +4081,7 @@ "integrity": "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", @@ -4052,6 +4113,7 @@ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -4062,6 +4124,7 @@ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -4079,6 +4142,7 @@ "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -4095,6 +4159,7 @@ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4108,6 +4173,7 @@ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4341,6 +4407,7 @@ "integrity": "sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", @@ -4366,6 +4433,7 @@ "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=16" }, @@ -4471,6 +4539,7 @@ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -4484,6 +4553,7 @@ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -5189,6 +5259,7 @@ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", "license": "MIT", + "peer": true, "peerDependencies": { "@svgdotjs/svg.js": "^3.2.4" } @@ -5198,6 +5269,7 @@ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", "license": "MIT", + "peer": true, "dependencies": { "@svgdotjs/svg.js": "^3.2.4" }, @@ -5221,6 +5293,7 @@ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 14.18" }, @@ -5507,6 +5580,66 @@ "@svgr/core": "*" } }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", + "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", + "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -6068,7 +6201,8 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/lodash": { "version": "4.17.20", @@ -6104,7 +6238,6 @@ "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.10.0" } @@ -6164,7 +6297,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6457,7 +6589,6 @@ "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", @@ -7379,7 +7510,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -7413,7 +7545,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7473,7 +7604,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7615,7 +7745,8 @@ "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/aria-query": { "version": "5.3.0", @@ -7711,6 +7842,7 @@ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -8054,7 +8186,8 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/better-ajv-errors": { "version": "1.2.0", @@ -8137,7 +8270,8 @@ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/brace-expansion": { "version": "1.1.12", @@ -8189,7 +8323,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -8403,6 +8536,7 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -8471,7 +8605,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8612,6 +8745,7 @@ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -8634,6 +8768,7 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8650,6 +8785,7 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8667,6 +8803,7 @@ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8678,7 +8815,8 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -8686,6 +8824,7 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8696,6 +8835,7 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8711,6 +8851,7 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8724,6 +8865,7 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8742,6 +8884,7 @@ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8761,6 +8904,7 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=10" } @@ -8771,6 +8915,7 @@ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "string-width": "^4.2.0" }, @@ -8786,7 +8931,8 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -8794,6 +8940,7 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8804,6 +8951,7 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8819,6 +8967,7 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9213,6 +9362,7 @@ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9297,7 +9447,6 @@ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -9463,7 +9612,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.0.tgz", "integrity": "sha512-2d2EwwhaxLWC8ahkH1PpQwCyu6EY3xDRdcEJXrLTb4fOUtVc+YWQalHU67rFS1a6ngj1fgv9dQLtJxP/KAFZEw==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9873,7 +10021,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10438,6 +10585,7 @@ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -10483,7 +10631,8 @@ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/empathic": { "version": "2.0.0", @@ -10519,6 +10668,7 @@ "integrity": "sha512-mT3ks8F0kwpo7SYNds6nWj0PaRh+qJxIeBVBXAKTN9hphAzZv7s0QAZQbqnB1fAv/r4pJUGE15BV9UrS31FP2w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" @@ -10746,7 +10896,6 @@ "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -10846,7 +10995,6 @@ "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -10908,7 +11056,6 @@ "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -10935,6 +11082,7 @@ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -10947,6 +11095,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -10992,6 +11141,7 @@ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7" }, @@ -11010,6 +11160,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -11055,6 +11206,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -11065,6 +11217,7 @@ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -11078,6 +11231,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -11088,6 +11242,7 @@ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -11861,7 +12016,8 @@ "url": "https://opencollective.com/fastify" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -12083,6 +12239,7 @@ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -12096,6 +12253,7 @@ "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" @@ -12258,6 +12416,7 @@ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -12345,6 +12504,7 @@ "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -12521,6 +12681,7 @@ "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argv-formatter": "~1.0.0", "spawn-error-forwarder": "~1.0.0", @@ -12536,6 +12697,7 @@ "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "through2": "~2.0.0" } @@ -12692,6 +12854,7 @@ "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", @@ -12713,6 +12876,7 @@ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -12723,6 +12887,7 @@ "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -12736,6 +12901,7 @@ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -12943,6 +13109,7 @@ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": "*" } @@ -12962,6 +13129,7 @@ "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -13185,7 +13353,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.10" }, @@ -13249,7 +13416,6 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -13389,6 +13555,7 @@ "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "from2": "^2.3.0", "p-is-promise": "^3.0.0" @@ -14046,6 +14213,7 @@ "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", @@ -14098,6 +14266,7 @@ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6.0" } @@ -14107,7 +14276,6 @@ "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.11.tgz", "integrity": "sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==", "license": "MIT", - "peer": true, "dependencies": { "relative-time-format": "^1.1.6" } @@ -14301,7 +14469,8 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -14815,6 +14984,7 @@ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -14831,6 +15001,7 @@ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -14895,7 +15066,8 @@ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -14908,7 +15080,8 @@ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -14922,7 +15095,8 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.kebabcase": { "version": "4.1.1", @@ -14971,7 +15145,8 @@ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.upperfirst": { "version": "4.3.1", @@ -15154,7 +15329,6 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -15168,6 +15342,7 @@ "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-escapes": "^7.0.0", "ansi-regex": "^6.1.0", @@ -15190,6 +15365,7 @@ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -16233,6 +16409,7 @@ "https://github.com/sponsors/broofa" ], "license": "MIT", + "peer": true, "bin": { "mime": "bin/cli.js" }, @@ -16416,7 +16593,6 @@ "resolved": "https://registry.npmjs.org/monaco-textmate/-/monaco-textmate-3.0.1.tgz", "integrity": "sha512-ZxxY3OsqUczYP1sGqo97tu+CJmMBwuSW+dL0WEBdDhOZ5G1zntw72hvBc68ZQAirosWvbDKgN1dL5k173QtFww==", "license": "MIT", - "peer": true, "dependencies": { "fast-plist": "^0.1.2" }, @@ -16613,6 +16789,7 @@ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -19159,7 +19336,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -19522,6 +19698,7 @@ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -19583,7 +19760,6 @@ "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", "license": "MIT", - "peer": true, "dependencies": { "lru-cache": "^5.1.1" } @@ -19702,6 +19878,7 @@ "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -19715,6 +19892,7 @@ "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-map": "^7.0.1" }, @@ -19731,6 +19909,7 @@ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -19823,6 +20002,7 @@ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -19949,7 +20129,8 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", @@ -19957,6 +20138,7 @@ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "parse5": "^6.0.1" } @@ -19966,7 +20148,8 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/parseurl": { "version": "1.3.3", @@ -20142,6 +20325,7 @@ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -20162,6 +20346,7 @@ "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" @@ -20176,6 +20361,7 @@ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^2.0.0" }, @@ -20189,6 +20375,7 @@ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -20203,6 +20390,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-try": "^1.0.0" }, @@ -20216,6 +20404,7 @@ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^1.1.0" }, @@ -20229,6 +20418,7 @@ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -20356,7 +20546,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -20586,7 +20775,6 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -20735,7 +20923,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20922,7 +21109,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20942,7 +21128,6 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -21084,7 +21269,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.1.tgz", "integrity": "sha512-jVKHXoWRIsD/qS6lvGveckwb862EekvapdHJN/cGmzw40KnJH5gg53ujOJ4qX6EKIK9LSBfFed/xiQ5yeXNrUA==", "license": "MIT", - "peer": true, "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -21107,7 +21291,6 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.7.1.tgz", "integrity": "sha512-bavdk2BA5r3MYalGKZ01u8PGuDBloQmzpBZVhDLrOOv1N943Wq6dcM9GhB3x8b7AbqPMEezauv4PeGkAJfy7FQ==", "license": "MIT", - "peer": true, "dependencies": { "react-router": "7.7.1" }, @@ -21124,7 +21307,6 @@ "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -21264,6 +21446,7 @@ "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -21537,15 +21720,13 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", - "peer": true, "peerDependencies": { "redux": "^5.0.0" } @@ -22010,7 +22191,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -22297,6 +22477,7 @@ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -22307,6 +22488,7 @@ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -22320,6 +22502,7 @@ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -22337,6 +22520,7 @@ "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -22353,6 +22537,7 @@ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22366,6 +22551,7 @@ "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", @@ -22393,6 +22579,7 @@ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -22410,6 +22597,7 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -22423,6 +22611,7 @@ "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -22436,6 +22625,7 @@ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18.0" } @@ -22446,6 +22636,7 @@ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22459,6 +22650,7 @@ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -22471,7 +22663,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/semantic-release/node_modules/marked": { "version": "15.0.12", @@ -22479,6 +22672,7 @@ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -22492,6 +22686,7 @@ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" @@ -22509,6 +22704,7 @@ "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22522,6 +22718,7 @@ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -22535,6 +22732,7 @@ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -22560,6 +22758,7 @@ "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -22576,6 +22775,7 @@ "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22773,6 +22973,7 @@ "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", @@ -22788,6 +22989,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -22801,6 +23003,7 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -22816,6 +23019,7 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -22825,7 +23029,8 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/signale/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -22833,6 +23038,7 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -22843,6 +23049,7 @@ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -22856,6 +23063,7 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -22866,6 +23074,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -22894,6 +23103,7 @@ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -23541,6 +23751,7 @@ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=14.16" }, @@ -23646,7 +23857,8 @@ "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/spdx-correct": { "version": "3.2.0", @@ -23757,7 +23969,6 @@ "integrity": "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@storybook/core": "8.6.14" }, @@ -23785,6 +23996,7 @@ "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -24121,6 +24333,7 @@ "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "function-timeout": "^1.0.1", "time-span": "^5.1.0" @@ -24150,6 +24363,7 @@ "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -24314,7 +24528,6 @@ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -24583,6 +24796,7 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -24594,6 +24808,7 @@ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "convert-hrtime": "^5.0.0" }, @@ -24782,6 +24997,7 @@ "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -25031,7 +25247,6 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -25113,6 +25328,7 @@ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -25262,7 +25478,8 @@ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/universalify": { "version": "2.0.1", @@ -25369,6 +25586,7 @@ "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -25499,7 +25717,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -25741,7 +25958,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -26227,7 +26443,6 @@ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -26267,6 +26482,7 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.4" } @@ -26414,7 +26630,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 946b8196e1..52dff71010 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,9 @@ "@datadog/browser-rum": "^6.22.0", "@datadog/browser-rum-react": "^6.22.0", "@descope/react-sdk": "^2.16.1", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@estruyf/github-actions-reporter": "^1.9.2", "@floating-ui/react": "^0.27.2", "@formkit/auto-animate": "^0.8.2", @@ -65,6 +68,8 @@ "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", "@sentry/react": "^8.47.0", + "@tanstack/react-table": "^8.21.3", + "@tanstack/react-virtual": "^3.13.12", "@types/lodash": "^4.17.13", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", diff --git a/src/assets/image/icons/GripVertical.svg b/src/assets/image/icons/GripVertical.svg new file mode 100644 index 0000000000..be3d2f1fec --- /dev/null +++ b/src/assets/image/icons/GripVertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/image/icons/index.ts b/src/assets/image/icons/index.ts index c8612590bc..eb27924eb9 100644 --- a/src/assets/image/icons/index.ts +++ b/src/assets/image/icons/index.ts @@ -115,3 +115,5 @@ export { default as LinkIcon } from "@assets/image/icons/Link.svg?react"; export { default as InfoIconNoCircle } from "@assets/image/icons/InfoNoCircle.svg?react"; // Taken from: https://fontawesome.com/icons/file-zipper?f=classic&s=regular export { default as ZipFileIcon } from "@assets/image/icons/ZipFile.svg?react"; +// Taken from: https://tabler.io/icons/icon/grip-vertical +export { default as GripVerticalIcon } from "@assets/image/icons/GripVertical.svg?react"; diff --git a/src/autokitteh b/src/autokitteh index 360c2d3d5b..d4d4ba7abf 160000 --- a/src/autokitteh +++ b/src/autokitteh @@ -1 +1 @@ -Subproject commit 360c2d3d5bea6b6d64b574be93e1ea5ce68c9bac +Subproject commit d4d4ba7abf0e6e349fd15b7b29cf5062301b956e diff --git a/src/components/molecules/index.ts b/src/components/molecules/index.ts index 02a9857918..48bbcc8bf8 100644 --- a/src/components/molecules/index.ts +++ b/src/components/molecules/index.ts @@ -31,3 +31,10 @@ export { PlanComparisonTable } from "@components/molecules/planComparisonTable"; export { DiffNavigationToolbar } from "@components/molecules/diffNavigationToolbar"; export { InfoPopover } from "@components/molecules/infoPopover"; export { AddButton } from "@components/molecules/configListAddButton"; +export { + TableTanstack, + THeadTanstack, + ThTanstack, + TableRowTanstack, + FilterTableTanstack, +} from "@components/molecules/table"; diff --git a/src/components/molecules/table/filterTanstack.tsx b/src/components/molecules/table/filterTanstack.tsx new file mode 100644 index 0000000000..006ca3a56d --- /dev/null +++ b/src/components/molecules/table/filterTanstack.tsx @@ -0,0 +1,62 @@ +import React, { useMemo } from "react"; + +import debounce from "lodash/debounce"; + +import { FilterTableTanstackProps, FilterVariantColumnTable, SelectOption } from "@interfaces/components"; +import { Input } from "@src/components/atoms"; + +import { Select } from "@components/molecules"; + +export const FilterTableTanstack = ({ column }: FilterTableTanstackProps) => { + const { filterVariant } = (column.columnDef.meta || {}) as FilterVariantColumnTable; + const columnFilterValue = column.getFilterValue(); + + const sortedUniqueValues = useMemo( + () => Array.from(column.getFacetedUniqueValues().keys()).sort().slice(0, 5000), + [column] + ); + + const debouncedSetFilter = useMemo( + () => + debounce((value: string) => { + column.setFilterValue(value); + }, 300), + [column] + ); + + if (filterVariant === "select") { + const options: SelectOption[] = sortedUniqueValues.map((value) => ({ + label: String(value), + value: String(value), + })); + + return ( +
+ debouncedSetFilter(e.target.value)} + type="text" + value={columnFilterValue as string} + /> + ); + } + + return null; +}; diff --git a/src/components/molecules/table/index.ts b/src/components/molecules/table/index.ts new file mode 100644 index 0000000000..4047a026c7 --- /dev/null +++ b/src/components/molecules/table/index.ts @@ -0,0 +1,5 @@ +export { ThTanstack } from "@components/molecules/table/tH"; +export { THeadTanstack } from "@components/molecules/table/tHead"; +export { TableRowTanstack } from "@components/molecules/table/tRowTanstack"; +export { TableTanstack } from "@components/molecules/table/tableTanstack"; +export { FilterTableTanstack } from "@components/molecules/table/filterTanstack"; diff --git a/src/components/molecules/table/tH.tsx b/src/components/molecules/table/tH.tsx new file mode 100644 index 0000000000..530345428d --- /dev/null +++ b/src/components/molecules/table/tH.tsx @@ -0,0 +1,100 @@ +import React, { useId, useCallback } from "react"; + +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { flexRender } from "@tanstack/react-table"; +import { useTranslation } from "react-i18next"; + +import { FilterVariantColumnTable, ThTanstackProps } from "@interfaces/components"; +import { SortDirectionVariant } from "@src/enums/components"; +import { SortDirection as SortDirectionType } from "@src/types/components"; +import { cn } from "@src/utilities"; + +import { ResizeButton } from "@components/atoms"; +import { SortButton } from "@components/molecules"; +import { FilterTableTanstack } from "@components/molecules/table"; + +import { GripVerticalIcon } from "@assets/image/icons"; + +export const ThTanstack = ({ header, className, enableColumnDnD }: ThTanstackProps) => { + const { t } = useTranslation("table", { keyPrefix: "tableActions" }); + const { filterVariant } = (header.column.columnDef.meta || {}) as FilterVariantColumnTable; + const resizeId = useId(); + + const isLastColumn = header.column.getIsLastColumn(); + const isRowSelection = header.column.id === "rowSelection"; + const isActions = header.column.id === "actions"; + const enableResize = header.column.getCanResize(); + const canSort = header.column.getCanSort(); + const isSorted = header.column.getIsSorted() as boolean; + const sortDirection = header.column.getIsSorted() as SortDirectionType; + + const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ + id: header.column.id, + disabled: !enableColumnDnD, + }); + + const style = { + transform: transform ? CSS.Translate.toString({ ...transform, y: 0 }) : undefined, + transition, + }; + + const handleSort = useCallback(() => { + if (!canSort) return; + header.column.toggleSorting(sortDirection === SortDirectionVariant.ASC); + }, [canSort, header.column, sortDirection]); + + const thClassName = cn( + "group relative cursor-pointer py-0.5 pr-4 font-normal first:rounded-tl-14 first:pl-4 last:rounded-tr-14", + { "align-top": filterVariant }, + className + ); + + return ( + +
+ {flexRender(header.column.columnDef.header, header.getContext())} + {canSort ? ( + + ) : null} + {enableColumnDnD && !isRowSelection && !isActions ? ( + + ) : null} +
+ {filterVariant ? : null} + {!isLastColumn && !isRowSelection && enableResize ? ( + + ) : null} + + ); +}; diff --git a/src/components/molecules/table/tHead.tsx b/src/components/molecules/table/tHead.tsx new file mode 100644 index 0000000000..099a1044d6 --- /dev/null +++ b/src/components/molecules/table/tHead.tsx @@ -0,0 +1,37 @@ +import React, { useMemo } from "react"; + +import { ThTanstack } from "./tH"; +import { FilterVariantColumnTable, THeadTanstackProps } from "@interfaces/components"; +import { cn } from "@utilities"; + +export const THeadTanstack = ({ headerGroups, className, enableColumnDnD }: THeadTanstackProps) => { + const hasAnyFilter = useMemo( + () => + headerGroups.some((headerGroup) => + headerGroup.headers.some( + (header) => (header.column.columnDef.meta as FilterVariantColumnTable)?.filterVariant + ) + ), + [headerGroups] + ); + + const headStyle = cn( + "sticky top-0 z-10 h-9.5 border-b-2 border-gray-1050 bg-gray-1250 text-left text-gray-500", + { + "align-top leading-7": hasAnyFilter, + }, + className + ); + + return ( + + {headerGroups.map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + ))} + + ))} + + ); +}; diff --git a/src/components/molecules/table/tRowTanstack.tsx b/src/components/molecules/table/tRowTanstack.tsx new file mode 100644 index 0000000000..291a20cc9b --- /dev/null +++ b/src/components/molecules/table/tRowTanstack.tsx @@ -0,0 +1,32 @@ +import React from "react"; + +import { flexRender } from "@tanstack/react-table"; + +import { TableRowTanstackProps } from "@interfaces/components"; +import { cn } from "@utilities"; + +export const TableRowTanstack = ({ row, className, onRowSelect }: TableRowTanstackProps) => { + const trStyle = cn( + "cursor-pointer border-y border-transparent hover:bg-gray-1300", + { + "bg-gray-1250/55 border-y border-gray-1200": row.getIsSelected(), + }, + className + ); + + return ( + onRowSelect(row)}> + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ); +}; diff --git a/src/components/molecules/table/tableActions.tsx b/src/components/molecules/table/tableActions.tsx new file mode 100644 index 0000000000..096b634bdb --- /dev/null +++ b/src/components/molecules/table/tableActions.tsx @@ -0,0 +1,41 @@ +import React, { useMemo } from "react"; + +import { RowData } from "@tanstack/react-table"; +import { useTranslation } from "react-i18next"; + +import { TableActionsProps } from "@interfaces/components"; + +import { Button } from "@components/atoms"; + +export const TableActionsTanstack = ({ + selectedRows, + actions, + onReset, +}: TableActionsProps) => { + const { t } = useTranslation("table", { keyPrefix: "tableActions" }); + + const isShowActions = useMemo(() => { + return selectedRows.length > 0; + }, [selectedRows]); + + return ( +
+
+ + {isShowActions + ? actions?.map((action, index) => ( + + )) + : null} +
+
+ ); +}; diff --git a/src/components/molecules/table/tableTanstack.tsx b/src/components/molecules/table/tableTanstack.tsx new file mode 100644 index 0000000000..b64a9e030f --- /dev/null +++ b/src/components/molecules/table/tableTanstack.tsx @@ -0,0 +1,187 @@ +import React, { useRef, useState, memo, useMemo, useEffect } from "react"; + +import { DndContext, closestCenter, PointerSensor, useSensor, useSensors, DragEndEvent } from "@dnd-kit/core"; +import { arrayMove, SortableContext, horizontalListSortingStrategy } from "@dnd-kit/sortable"; +import { + useReactTable, + getCoreRowModel, + getFilteredRowModel, + ColumnFiltersState, + getFacetedUniqueValues, + RowSelectionState, + createColumnHelper, + RowData, + getSortedRowModel, + Row, +} from "@tanstack/react-table"; +import { useVirtualizer } from "@tanstack/react-virtual"; + +import { TableActionsTanstack } from "./tableActions"; +import { TableTanstackProps } from "@interfaces/components"; +import { cn } from "@src/utilities"; + +import { Checkbox } from "@components/atoms/checkbox"; +import { TableRowTanstack, THeadTanstack } from "@components/molecules/table"; + +const columnHelper = createColumnHelper(); + +const MemoizedRow = memo(({ row, onRowSelect }: { onRowSelect: (row: Row) => void; row: any }) => { + return ; +}); + +MemoizedRow.displayName = "MemoizedRow"; + +export const TableTanstack = ({ + data, + columns, + className, + actionConfig, + enableColumnResizing = false, + initialSortId, + enableColumnDnD = false, +}: TableTanstackProps) => { + const tableRef = useRef(null); + const tbodyRef = useRef(null); + const [columnFilters, setColumnFilters] = useState([]); + const [rowSelection, setRowSelection] = useState({}); + const [sorting, setSorting] = useState(initialSortId ? [{ id: initialSortId, desc: false }] : []); + + const selectionColumn = columnHelper.display({ + id: "rowSelection", + cell: ({ row }) => ( + + ), + size: 30, + }); + + const hasActionConfig = useMemo(() => { + return actionConfig && actionConfig.length > 0; + }, [actionConfig]); + + const table = useReactTable({ + data, + columns: hasActionConfig ? [selectionColumn, ...columns] : columns, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + getSortedRowModel: getSortedRowModel(), + enableColumnResizing, + columnResizeMode: "onChange", + state: { + columnFilters, + rowSelection, + sorting, + }, + onColumnFiltersChange: setColumnFilters, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + enableRowSelection: hasActionConfig, + defaultColumn: { + size: 150, + minSize: 30, + maxSize: 200, + enableSorting: false, + }, + }); + + const [columnOrder, setColumnOrder] = useState(() => table.getAllLeafColumns().map((col) => col.id)); + + useEffect(() => { + table.setColumnOrder(columnOrder); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [columnOrder]); + + const sensors = useSensors(useSensor(PointerSensor)); + const handleDragEnd = (event: DragEndEvent) => { + const { active, over } = event; + if (active.id === over?.id) return; + + setColumnOrder((prev) => { + const newOrder = arrayMove(prev, prev.indexOf(active.id as string), prev.indexOf(over!.id as string)); + if (hasActionConfig) { + ["rowSelection", "actions"].forEach((id, i) => { + const index = newOrder.indexOf(id); + if (index !== -1) { + newOrder.splice(index, 1); + newOrder.splice(i === 0 ? 0 : newOrder.length, 0, id); + } + }); + } + return newOrder; + }); + }; + + const rowVirtualizer = useVirtualizer({ + count: table.getRowModel().rows.length, + getScrollElement: () => tableRef.current, + estimateSize: () => 40, + overscan: 10, + }); + + const virtualRows = rowVirtualizer.getVirtualItems(); + const totalSize = rowVirtualizer.getTotalSize(); + + const paddingTop = virtualRows.length > 0 ? virtualRows[0].start : 0; + const paddingBottom = virtualRows.length > 0 ? totalSize - virtualRows[virtualRows.length - 1].end : 0; + + const handleRowSelect = (row: Row) => { + row.toggleSelected(); + }; + + const selectedRows = table.getSelectedRowModel().rows.map((row) => row.original); + + return ( +
+ {actionConfig ? ( + { + setRowSelection({}); + }} + selectedRows={selectedRows} + /> + ) : null} + +
+ + {enableColumnDnD ? ( + + + + + + ) : ( + + )} + + {paddingTop > 0 ? ( + + + ) : null} + + {virtualRows.map((virtualRow) => { + const row = table.getRowModel().rows[virtualRow.index]; + return ; + })} + + {paddingBottom > 0 ? ( + + + ) : null} + +
+
+
+
+
+ ); +}; diff --git a/src/components/organisms/settings/organization/members/table.tsx b/src/components/organisms/settings/organization/members/table.tsx index 1adf5f3b8c..f6ad997935 100644 --- a/src/components/organisms/settings/organization/members/table.tsx +++ b/src/components/organisms/settings/organization/members/table.tsx @@ -1,7 +1,9 @@ import React, { useEffect, useRef, useState } from "react"; +import { CellContext, ColumnDef } from "@tanstack/react-table"; import { useTranslation } from "react-i18next"; +import { featureFlags } from "@constants"; import { ModalName } from "@src/enums/components"; import { CreateMemberModalRef } from "@src/interfaces/components"; import { useModalStore, useOrganizationStore, useToastStore } from "@src/store"; @@ -9,6 +11,7 @@ import { EnrichedMember } from "@src/types/models"; import { cn } from "@src/utilities"; import { Button, IconButton, Loader, TBody, THead, Table, Td, Th, Tr, Typography } from "@components/atoms"; +import { TableTanstack } from "@components/molecules/table"; import { CreateMemberModal, DeleteMemberModal } from "@components/organisms/settings/organization"; import { TrashIcon } from "@assets/image/icons"; @@ -106,6 +109,64 @@ export const OrganizationMembersTable = () => { }); }; + const columns: ColumnDef[] = [ + { + accessorKey: "name", + header: t("table.headers.name"), + cell: ({ row }) => row.original.name, + }, + { + accessorKey: "email", + header: t("table.headers.email"), + cell: ({ row }) => row.original.email, + meta: { + filterVariant: "search", + }, + }, + { + accessorKey: "status", + header: t("table.headers.status"), + size: 100, + cell: ({ row }) => row.original.status, + meta: { + filterVariant: "select", + }, + }, + { + accessorKey: "role", + header: t("table.headers.role"), + size: 100, + cell: ({ row }) => row.original.role, + }, + ...(amIadminCurrentOrganization + ? [ + { + accessorKey: "actions", + header: t("table.headers.actions"), + size: 50, + cell: (props: CellContext) => { + const { row } = props; + return ( + + openModal(ModalName.deleteMemberFromOrg, { + name: row.original.name, + id: row.original.id, + email: row.original.email, + }) + } + title={t("table.actions.delete", { name: row.original.name })} + > + + + ); + }, + }, + ] + : []), + ]; + return (
@@ -121,88 +182,96 @@ export const OrganizationMembersTable = () => { ) : null} - - - - - - - - {amIadminCurrentOrganization ? ( - - ) : null} - - - - {isLoading.members ? ( + {featureFlags.displayTableTanstack ? ( + isLoading.members ? ( ) : ( - - {members?.map((member) => ( - - - - - - {amIadminCurrentOrganization ? ( - + {amIadminCurrentOrganization ? ( + + ) : null} + + ))} + + )} +
- {t("table.headers.name")} - - {t("table.headers.email")} - - {t("table.headers.status")} - {t("table.headers.role")}{t("table.headers.actions")}
- {member.name} - - {member.email} - - {member.status} - {member.role} - - openModal(ModalName.deleteMemberFromOrg, { - name: member.name, - id: member.id, - email: member.email, - }) - } - title={t("table.actions.delete", { name: member.name })} - > - - + + ) + ) : ( + + + + + + + + {amIadminCurrentOrganization ? ( + + ) : null} + + + + {isLoading.members ? ( + + ) : ( + + {members?.map((member) => ( + + + + - ) : null} - - ))} - - )} -
+ {t("table.headers.name")} + + {t("table.headers.email")} + + {t("table.headers.status")} + {t("table.headers.role")}{t("table.headers.actions")}
+ {member.name} + + {member.email} + + {member.status}
+
{member.role} + + openModal(ModalName.deleteMemberFromOrg, { + name: member.name, + id: member.id, + email: member.email, + }) + } + title={t("table.actions.delete", { name: member.name })} + > + + +
+ )} { !amIadminCurrentOrganization ); + const handleBulkDelete = async (organizations: EnrichedOrganization[]) => { + for (const organization of organizations) { + if (!isNameInputDisabled(organization.id, amIadminCurrentOrganization)) { + await onDelete(organization); + } + } + }; + + const actionConfig: TableAction[] = useMemo( + () => [ + { + label: t("table.actions.delete", { name: "" }).replace(" - ", ""), + onClick: handleBulkDelete, + }, + ], + // eslint-disable-next-line react-hooks/exhaustive-deps + [t] + ); + + const columns: ColumnDef[] = [ + { + accessorKey: "displayName", + header: t("table.headers.name"), + cell: ({ row }) => row.original.displayName, + enableSorting: true, + meta: { + filterVariant: "search", + }, + }, + { + accessorKey: "uniqueName", + header: t("table.headers.uniqueName"), + cell: ({ row }) => row.original.uniqueName, + enableSorting: true, + meta: { + filterVariant: "search", + }, + }, + { + accessorKey: "role", + header: t("table.headers.role"), + size: 100, + cell: ({ row }) => row.original.currentMember?.role, + enableSorting: true, + meta: { + filterVariant: "select", + }, + }, + { + accessorKey: "status", + header: t("table.headers.status"), + size: 100, + cell: ({ row }) => row.original.currentMember?.status, + enableSorting: true, + meta: { + filterVariant: "select", + }, + }, + { + accessorKey: "actions", + header: t("table.headers.actions"), + size: 50, + enableSorting: false, + cell: ({ row }) => ( + openModal(ModalName.deleteOrganization, row.original)} + title={t("table.actions.delete", { name: row.original.displayName })} + > + + + ), + }, + ]; + return (
@@ -83,48 +161,69 @@ export const UserOrganizationsTable = () => { > {t("buttons.addOrganization")} - - - - - - - - - - - - {isLoading.organizations ? ( + + {featureFlags.displayTableTanstack ? ( + isLoading.organizations ? ( ) : ( - - {enrichedOrganizations ? ( - enrichedOrganizations.map((organization) => ( - - - - - - - - )) - ) : ( -
- {t("table.errors.noOrganizationsFound")} -
- )} - - )} -
{t("table.headers.name")}{t("table.headers.uniqueName")}{t("table.headers.role")}{t("table.headers.status")}{t("table.headers.actions")}
{organization.displayName}{organization.uniqueName}{organization.currentMember?.role}{organization.currentMember?.status} - openModal(ModalName.deleteOrganization, organization)} - title={t("table.actions.delete", { name: organization.displayName })} - > - - -
+ + ) + ) : ( + + + + + + + + + + + + {isLoading.organizations ? ( + + ) : ( + + {enrichedOrganizations ? ( + enrichedOrganizations.map((organization) => ( + + + + + + + + )) + ) : ( +
+ {t("table.errors.noOrganizationsFound")} +
+ )} + + )} +
{t("table.headers.name")}{t("table.headers.uniqueName")}{t("table.headers.role")}{t("table.headers.status")}{t("table.headers.actions")}
{organization.displayName}{organization.uniqueName} + {organization.currentMember?.role} + + {organization.currentMember?.status} + + openModal(ModalName.deleteOrganization, organization)} + title={t("table.actions.delete", { name: organization.displayName })} + > + + +
+ )}
); diff --git a/src/constants/featureFlags.constants.ts b/src/constants/featureFlags.constants.ts index c51765b80e..b86859d605 100644 --- a/src/constants/featureFlags.constants.ts +++ b/src/constants/featureFlags.constants.ts @@ -10,4 +10,5 @@ export const featureFlags = { sendDotEmptyTriggerFilter: import.meta.env.VITE_SEND_DOT_EMPTY_TRIGGER_FILTER, displayChatbot: import.meta.env.VITE_DISPLAY_CHATBOT, displayBilling: import.meta.env.VITE_DISPLAY_BILLING, + displayTableTanstack: import.meta.env.VITE_DISPLAY_TABLE_TANSTACK, }; diff --git a/src/interfaces/components/index.ts b/src/interfaces/components/index.ts index dfe229529b..7459fe54c7 100644 --- a/src/interfaces/components/index.ts +++ b/src/interfaces/components/index.ts @@ -72,6 +72,14 @@ export type { TableRowGroupProps, TableRowProps, TableVariantContextType, + TableAction, + TableActionsProps, + TableTanstackProps, + TableRowTanstackProps, + THeadTanstackProps, + ThTanstackProps, + FilterVariantColumnTable, + FilterTableTanstackProps, } from "@interfaces/components/table.interface"; export type { TableHeader } from "@interfaces/components/tables"; export type { TabListProps, TabProps, TabsContextProps, TabsProps } from "@interfaces/components/tabs.interface"; diff --git a/src/interfaces/components/table.interface.ts b/src/interfaces/components/table.interface.ts index 27c83bcd9f..e83f7cae0b 100644 --- a/src/interfaces/components/table.interface.ts +++ b/src/interfaces/components/table.interface.ts @@ -1,5 +1,7 @@ import { KeyboardEvent, MouseEvent } from "react"; +import { Column, Header, HeaderGroup, Row, RowData } from "@tanstack/react-table"; + import { ColorSchemes } from "@src/types"; export interface TableProps { @@ -34,3 +36,50 @@ export interface TableRowProps { export interface TableVariantContextType { variant: ColorSchemes; } + +export interface TableAction { + label: string; + onClick: (rows: TData[]) => void; +} + +export interface TableActionsProps { + selectedRows: TData[]; + actions: TableAction[]; + onReset: () => void; +} + +export interface TableTanstackProps { + data: TData[]; + columns: any[]; + className?: string; + actionConfig?: TableAction[]; + enableColumnResizing?: boolean; + enableColumnDnD?: boolean; + initialSortId?: string; +} + +export interface TableRowTanstackProps { + row: Row; + className?: string; + onRowSelect: (row: Row) => void; +} + +export interface THeadTanstackProps { + headerGroups: HeaderGroup[]; + className?: string; + enableColumnDnD?: boolean; +} + +export interface ThTanstackProps { + header: Header; + className?: string; + enableColumnDnD?: boolean; +} + +export interface FilterVariantColumnTable { + filterVariant?: "select" | "search"; +} + +export interface FilterTableTanstackProps { + column: Column; +} diff --git a/src/locales/en/index.ts b/src/locales/en/index.ts index 71ce189158..68ccd9ae9c 100644 --- a/src/locales/en/index.ts +++ b/src/locales/en/index.ts @@ -26,6 +26,7 @@ import settings from "@locales/en/settings/translation.json"; import shared from "@locales/en/shared/translation.json"; import sidebar from "@locales/en/sidebar/translation.json"; import stores from "@locales/en/stores/translation.json"; +import table from "@locales/en/table/translation.json"; import tabs from "@locales/en/tabs/translation.json"; import templates from "@locales/en/templates/translation.json"; import toasts from "@locales/en/toasts/translation.json"; @@ -62,6 +63,7 @@ export default { settings, sidebar, stores, + table, tabs, toasts, validations, diff --git a/src/locales/en/table/translation.json b/src/locales/en/table/translation.json new file mode 100644 index 0000000000..d5395db99e --- /dev/null +++ b/src/locales/en/table/translation.json @@ -0,0 +1,6 @@ +{ + "tableActions": { + "resetAll": "Reset All", + "sortBy": "Sort by" + } +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 1933dd80fe..b66595dd5c 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -35,6 +35,7 @@ interface ImportMetaEnv { readonly VITE_DATADOG_SITE: string; readonly VITE_DATADOG_SERVICE: string; readonly VITE_DATADOG_ENV: string; + readonly VITE_DISPLAY_TABLE_TANSTACK: boolean; } interface ImportMeta {