3x-ui/internal/web/controller
Kuzz007 2736f9beb3 feat(xray): autocomplete geosite/geoip categories in the routing rule editor
Writing a routing rule today means remembering exact geosite:/geoip:/
ext:file:code syntax by hand, with no way to discover what categories
actually exist in the .dat files sitting in the bin folder -- including
custom ones like geosite_roscom.dat added via the Geodata auto-update
feature. The Domain/IP fields in the rule editor now suggest categories
as you type (e.g. "you" -> "geosite:youtube"), built live from whatever
.dat files are actually on disk, while still accepting any free-typed
value exactly as before.

Backend: GET /panel/api/xray/getGeodataCategories scans the bin folder,
parses matched geosite*/geoip*.dat files via xray-core's own exported
protobuf types, and formats each category as the exact rule syntax
xray-core's parser accepts -- geosite:/geoip: for the default files,
ext:<file>:<code> for anything else (there's no shorthand for custom
files). Cached in memory keyed by each file's (name, size, modTime) so
a request-time scan is cheap until a file actually changes.

Frontend: the Domain/IP inputs become Select "tags" fields fed by a new
useGeodataCategories() query hook, with an explicit substring filter so
"you" matches "geosite:youtube" (not a prefix). The array<->CSV-string
adapter lives entirely at the FormField transform boundary, so the
underlying form schema and saved rule shape are unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-26 17:13:07 +03:00
..
api.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
api_auth_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
api_docs_test.go fix(api-docs): exclude /panel/outbound and /panel/routing from route guard 2026-06-22 23:48:58 +02:00
base.go
client.go Bug-label issue sweep: 16 fixes (#6083) 2026-07-23 15:34:42 +02:00
dist.go fix(web): opt panel pages out of Cloudflare Rocket Loader 2026-07-11 22:48:59 +02:00
dist_test.go
group.go feat(groups): reset group traffic without touching client counters 2026-06-27 16:33:36 +02:00
host.go feat(hosts): bulk-add multiple hosts to multiple inbounds (#5677) 2026-07-08 23:35:20 +02:00
host_test.go feat(hosts): bulk-add multiple hosts to multiple inbounds (#5677) 2026-07-08 23:35:20 +02:00
inbound.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
index.go
login_limiter.go Repo-wide self-correcting audit: 54 verified bug fixes (#5970) 2026-07-17 00:33:06 +02:00
login_limiter_test.go Repo-wide self-correcting audit: 54 verified bug fixes (#5970) 2026-07-17 00:33:06 +02:00
node.go fix(nodes): make node API tokens write-only (#5613) 2026-07-23 15:35:11 +02:00
node_credentials_writeonly_test.go fix(nodes): make node API tokens write-only (#5613) 2026-07-23 15:35:11 +02:00
panel_update_test.go fix: make all self-managed file downloads/installs atomic, with real completion status (#5711) 2026-07-02 18:19:33 +02:00
server.go Bug-label issue sweep: 16 fixes (#6083) 2026-07-23 15:34:42 +02:00
setting.go feat(sub): auto-detect subscription format by User-Agent (Updated) (#5826) 2026-07-14 13:01:40 +02:00
setting_test.go feat(sub): auto-detect subscription format by User-Agent (Updated) (#5826) 2026-07-14 13:01:40 +02:00
spa.go refactor(frontend): replace axios with the native Fetch API 2026-07-08 01:09:18 +02:00
spa_test.go fix(web): serve panel SPA routes from NoRoute (#5536) 2026-06-24 21:19:12 +02:00
util.go
util_test.go
websocket.go
xray_setting.go feat(xray): autocomplete geosite/geoip categories in the routing rule editor 2026-07-26 17:13:07 +03:00
xray_setting_geodata_test.go feat(xray): autocomplete geosite/geoip categories in the routing rule editor 2026-07-26 17:13:07 +03:00