- Add PageUrlState utility for URL ↔ state serialization - Add column `id` field for unique column identification in URLs - Update idSelector to return String for URL compatibility - All DataGrid pages now support URL params: search, sort, order, id - Browser URL updates via replaceState (no GoRouter rebuilds) - Add FilterPanelSemantics for filter panel semantic IDs - Add TESTING.md documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
126 lines
4.0 KiB
Dart
126 lines
4.0 KiB
Dart
/// Semantic identifiers for UI automation and accessibility.
|
|
///
|
|
/// These IDs are exposed via Flutter's Semantics tree, making widgets
|
|
/// discoverable by automation tools (Appium, WebDriver, Puppeteer with
|
|
/// accessibility enabled).
|
|
///
|
|
/// Naming convention: `{area}_{component}_{identifier}`
|
|
/// - area: room or feature area (e.g., profile, nav, dataGrid)
|
|
/// - component: widget type (e.g., menu, button, row)
|
|
/// - identifier: specific item (e.g., light, containers, selectAll)
|
|
library;
|
|
|
|
/// Profile dropdown menu IDs.
|
|
abstract class ProfileSemantics {
|
|
static const button = 'profile_button';
|
|
static const menu = 'profile_menu';
|
|
static const settings = 'profile_menu_settings';
|
|
static const themeSystem = 'profile_menu_theme_system';
|
|
static const themeLight = 'profile_menu_theme_light';
|
|
static const themeDark = 'profile_menu_theme_dark';
|
|
static const logout = 'profile_menu_logout';
|
|
}
|
|
|
|
/// Room tab navigation IDs.
|
|
abstract class RoomTabSemantics {
|
|
static const frontHall = 'roomTab_frontHall';
|
|
static const controlRoom = 'roomTab_controlRoom';
|
|
static const security = 'roomTab_security';
|
|
static const parlor = 'roomTab_parlor';
|
|
|
|
/// Get semantic ID for room index.
|
|
static String forIndex(int index) => switch (index) {
|
|
0 => frontHall,
|
|
1 => controlRoom,
|
|
2 => security,
|
|
3 => parlor,
|
|
_ => 'roomTab_$index',
|
|
};
|
|
}
|
|
|
|
/// Navigation panel IDs.
|
|
abstract class NavSemantics {
|
|
static const panel = 'nav_panel';
|
|
static const refresh = 'nav_refresh';
|
|
|
|
/// Generate ID for a nav item.
|
|
static String item(String id) => 'nav_item_$id';
|
|
|
|
/// Generate ID for a nav section.
|
|
static String section(String id) => 'nav_section_$id';
|
|
}
|
|
|
|
/// DataGrid component IDs.
|
|
abstract class DataGridSemantics {
|
|
static const grid = 'dataGrid';
|
|
static const search = 'dataGrid_search';
|
|
static const searchClear = 'dataGrid_search_clear';
|
|
static const selectAll = 'dataGrid_selectAll';
|
|
static const loading = 'dataGrid_loading';
|
|
static const empty = 'dataGrid_empty';
|
|
static const error = 'dataGrid_error';
|
|
static const refresh = 'dataGrid_refresh';
|
|
|
|
/// Generate ID for a column header.
|
|
static String header(String columnId) => 'dataGrid_header_$columnId';
|
|
|
|
/// Generate ID for a row.
|
|
static String row(String itemId) => 'dataGrid_row_$itemId';
|
|
|
|
/// Generate ID for a row checkbox.
|
|
static String rowCheckbox(String itemId) => 'dataGrid_row_${itemId}_checkbox';
|
|
|
|
/// Generate ID for a row actions menu.
|
|
static String rowActions(String itemId) => 'dataGrid_row_${itemId}_actions';
|
|
|
|
/// Generate ID for a row action.
|
|
static String rowAction(String itemId, String actionId) =>
|
|
'dataGrid_row_${itemId}_action_$actionId';
|
|
|
|
/// Generate ID for a bulk action button.
|
|
static String bulkAction(String actionId) => 'dataGrid_bulk_$actionId';
|
|
|
|
static const bulkClear = 'dataGrid_bulk_clear';
|
|
}
|
|
|
|
/// Dialog/modal IDs.
|
|
abstract class DialogSemantics {
|
|
static const confirm = 'dialog_confirm';
|
|
static const cancel = 'dialog_cancel';
|
|
static const close = 'dialog_close';
|
|
|
|
/// Generate ID for a named dialog.
|
|
static String named(String name) => 'dialog_$name';
|
|
|
|
/// Generate ID for a dialog action button.
|
|
static String action(String dialogName, String actionId) =>
|
|
'dialog_${dialogName}_$actionId';
|
|
}
|
|
|
|
/// Settings page IDs.
|
|
abstract class SettingsSemantics {
|
|
static const themeDropdown = 'settings_theme';
|
|
static const defaultRoomDropdown = 'settings_defaultRoom';
|
|
}
|
|
|
|
/// Filter panel IDs.
|
|
abstract class FilterPanelSemantics {
|
|
static const panel = 'filterPanel';
|
|
static const search = 'filterPanel_search';
|
|
static const searchClear = 'filterPanel_search_clear';
|
|
static const refresh = 'filterPanel_refresh';
|
|
|
|
/// Generate ID for a filter item.
|
|
static String item(String id) => 'filterPanel_item_$id';
|
|
}
|
|
|
|
/// Loading/state indicator IDs.
|
|
abstract class StateSemantics {
|
|
static const authLoading = 'state_auth_loading';
|
|
static const authError = 'state_auth_error';
|
|
static const pageLoading = 'state_page_loading';
|
|
|
|
/// Generate ID for a snackbar.
|
|
static String snackbar(String type) => 'snackbar_$type';
|
|
}
|