diff --git a/package-lock.json b/package-lock.json index 6ed766e2..a12118cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -168,7 +168,6 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -3031,7 +3030,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3041,7 +3039,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3100,7 +3097,6 @@ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", @@ -3607,8 +3603,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@xyflow/react": { "version": "12.10.0", @@ -3647,7 +3642,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" }, @@ -4065,7 +4059,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4694,7 +4687,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" } @@ -5223,7 +5215,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5421,7 +5412,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -6715,7 +6705,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -7470,7 +7459,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -7678,7 +7666,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -7719,7 +7706,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8614,7 +8600,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8781,7 +8766,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8947,7 +8931,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9275,7 +9258,6 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/modules/peers/PeersTable.tsx b/src/modules/peers/PeersTable.tsx index 3fda0740..cc25ab5f 100644 --- a/src/modules/peers/PeersTable.tsx +++ b/src/modules/peers/PeersTable.tsx @@ -97,6 +97,10 @@ const PeersTableColumns: ColumnDef[] = [ accessorKey: "ip", sortingFn: "text", }, + { + id: "has_user", + accessorFn: (peer) => !!peer.user_id, + }, { id: "user_name", accessorFn: (peer) => (peer.user ? peer.user?.name : "Unknown"), @@ -314,6 +318,7 @@ export default function PeersTable({ group_name_strings: false, group_names: false, ip: false, + has_user: false, serial: false, user_name: false, user_email: false, @@ -336,6 +341,9 @@ export default function PeersTable({ let groupFilters = table .getColumn("group_names") ?.getFilterValue(); + let hasUserFilter = table + .getColumn("has_user") + ?.getFilterValue(); table.setColumnFilters([ { id: "connected", @@ -350,8 +358,8 @@ export default function PeersTable({ value: groupFilters ?? [], }, { - id: "group_names", - value: groupFilters ?? [], + id: "has_user", + value: hasUserFilter, }, ]); resetSelectedRows(); @@ -370,6 +378,9 @@ export default function PeersTable({ let groupFilters = table .getColumn("group_names") ?.getFilterValue(); + let hasUserFilter = table + .getColumn("has_user") + ?.getFilterValue(); table.setColumnFilters([ { id: "connected", @@ -384,8 +395,8 @@ export default function PeersTable({ value: groupFilters ?? [], }, { - id: "group_names", - value: groupFilters ?? [], + id: "has_user", + value: hasUserFilter, }, ]); resetSelectedRows(); @@ -405,6 +416,9 @@ export default function PeersTable({ let groupFilters = table .getColumn("group_names") ?.getFilterValue(); + let hasUserFilter = table + .getColumn("has_user") + ?.getFilterValue(); table.setColumnFilters([ { id: "connected", @@ -418,6 +432,10 @@ export default function PeersTable({ id: "group_names", value: groupFilters ?? [], }, + { + id: "has_user", + value: hasUserFilter, + }, ]); resetSelectedRows(); }} @@ -442,6 +460,9 @@ export default function PeersTable({ undefined ? true : undefined; + let hasUserFilter = table + .getColumn("has_user") + ?.getFilterValue(); table.setColumnFilters([ { @@ -452,6 +473,10 @@ export default function PeersTable({ id: "approval_required", value: current, }, + { + id: "has_user", + value: hasUserFilter, + }, ]); resetSelectedRows(); @@ -468,6 +493,53 @@ export default function PeersTable({ )} + {!isUser && ( + + { + table.setPageIndex(0); + const current = + table.getColumn("has_user")?.getFilterValue(); + table + .getColumn("has_user") + ?.setFilterValue( + current === true ? undefined : true, + ); + resetSelectedRows(); + }} + variant={ + table.getColumn("has_user")?.getFilterValue() === true + ? "tertiary" + : "secondary" + } + > + With Users + + { + table.setPageIndex(0); + const current = + table.getColumn("has_user")?.getFilterValue(); + table + .getColumn("has_user") + ?.setFilterValue( + current === false ? undefined : false, + ); + resetSelectedRows(); + }} + variant={ + table.getColumn("has_user")?.getFilterValue() === false + ? "tertiary" + : "secondary" + } + > + No Users + + + )} + {!isUser && (