fix: scope selector UX, ARIA, and code quality improvements

- removeScope preserves graph state when items remain (only resets on empty)
- Extract shared CheckIcon, CloseIcon, Spinner, ScopeListItem components
- Unify three handleSelect* into single handleToggle
- Fix shared mutable Set in reset state (factory function)
- Add MAX_SCOPE_ITEMS UI feedback (disabled button, warning banner)
- Correct ARIA: dialog > tablist + listbox > option structure
- Event listeners only attached when dropdown is open
- isSelected uses Set lookup via useMemo instead of O(n) scan
- Clear user search only on add, not on deselect
This commit is contained in:
Fringg
2026-03-20 02:44:29 +03:00
parent db76cd0c64
commit 2780898d1c
6 changed files with 230 additions and 229 deletions

View File

@@ -1309,7 +1309,8 @@
"noResults": "Nothing found",
"removeItem": "Remove {{label}}",
"clearAll": "Clear all selections",
"addScope": "Add scope"
"addScope": "Add scope",
"maxReached": "Maximum {{max}} items"
},
"loading": "Loading graph...",
"error": "Failed to load network data",

View File

@@ -1143,7 +1143,8 @@
"noResults": "نتیجه‌ای یافت نشد",
"removeItem": "حذف {{label}}",
"clearAll": "پاک کردن همه انتخاب‌ها",
"addScope": "افزودن محدوده"
"addScope": "افزودن محدوده",
"maxReached": "حداکثر {{max}} مورد"
},
"loading": "بارگذاری گراف...",
"error": "خطا در بارگذاری داده‌های شبکه",

View File

@@ -1330,7 +1330,8 @@
"noResults": "Ничего не найдено",
"removeItem": "Удалить {{label}}",
"clearAll": "Очистить все выбранные",
"addScope": "Добавить область"
"addScope": "Добавить область",
"maxReached": "Максимум {{max}} элементов"
},
"loading": "Загрузка графа...",
"error": "Ошибка загрузки данных сети",

View File

@@ -1143,7 +1143,8 @@
"noResults": "未找到",
"removeItem": "移除 {{label}}",
"clearAll": "清除所有选择",
"addScope": "添加范围"
"addScope": "添加范围",
"maxReached": "最多 {{max}} 个项目"
},
"loading": "加载图表...",
"error": "加载网络数据失败",