186 lines
4.9 KiB
Dart
186 lines
4.9 KiB
Dart
import 'package:equatable/equatable.dart';
|
||
|
||
class TabConfigItem extends Equatable {
|
||
final String id;
|
||
final String name;
|
||
final String nameEn;
|
||
final String icon;
|
||
final bool isEnabled;
|
||
final int order;
|
||
|
||
const TabConfigItem({
|
||
required this.id,
|
||
required this.name,
|
||
required this.nameEn,
|
||
required this.icon,
|
||
required this.isEnabled,
|
||
required this.order,
|
||
});
|
||
|
||
TabConfigItem copyWith({
|
||
String? id,
|
||
String? name,
|
||
String? nameEn,
|
||
String? icon,
|
||
bool? isEnabled,
|
||
int? order,
|
||
}) {
|
||
return TabConfigItem(
|
||
id: id ?? this.id,
|
||
name: name ?? this.name,
|
||
nameEn: nameEn ?? this.nameEn,
|
||
icon: icon ?? this.icon,
|
||
isEnabled: isEnabled ?? this.isEnabled,
|
||
order: order ?? this.order,
|
||
);
|
||
}
|
||
|
||
@override
|
||
List<Object?> get props => [id, name, nameEn, icon, isEnabled, order];
|
||
}
|
||
|
||
class TabConfig extends Equatable {
|
||
final List<TabConfigItem> items;
|
||
|
||
const TabConfig({required this.items});
|
||
|
||
List<TabConfigItem> get enabledItems {
|
||
final enabled = items.where((item) => item.isEnabled).toList();
|
||
enabled.sort((a, b) => a.order.compareTo(b.order));
|
||
return enabled;
|
||
}
|
||
|
||
/// roleKey == 'personal'(个人角色):底部导航与「系统设置 → Tab 设置」强制只保留
|
||
/// 「设备(device) + 我的(me)」,且常显、开关锁定不可关闭;其他角色不受影响。
|
||
static const String personalRoleKey = 'personal';
|
||
static const Set<String> personalVisibleTabIds = {'device', 'me'};
|
||
|
||
/// 底部导航实际渲染的 Tab:
|
||
/// - personal:强制返回 设备 + 我的(忽略 isEnabled,恒为启用),按 order 排序
|
||
/// - 其他角色:返回用户启用的 Tab(enabledItems)
|
||
List<TabConfigItem> navItemsForRole(String? roleKey) {
|
||
if (roleKey == personalRoleKey) {
|
||
final forced = items
|
||
.where((item) => personalVisibleTabIds.contains(item.id))
|
||
.map((item) => item.copyWith(isEnabled: true))
|
||
.toList();
|
||
forced.sort((a, b) => a.order.compareTo(b.order));
|
||
return forced;
|
||
}
|
||
return enabledItems;
|
||
}
|
||
|
||
/// 「Tab 设置」列表应展示的 Tab:
|
||
/// - personal:只列出 设备 + 我的,按 order 排序
|
||
/// - 其他角色:列出全部
|
||
List<TabConfigItem> settingItemsForRole(String? roleKey) {
|
||
if (roleKey == personalRoleKey) {
|
||
final visible = items
|
||
.where((item) => personalVisibleTabIds.contains(item.id))
|
||
.toList();
|
||
visible.sort((a, b) => a.order.compareTo(b.order));
|
||
return visible;
|
||
}
|
||
return items;
|
||
}
|
||
|
||
TabConfig copyWith({List<TabConfigItem>? items}) {
|
||
return TabConfig(items: items ?? this.items);
|
||
}
|
||
|
||
TabConfig toggleItem(String itemId) {
|
||
final currentItem = items.firstWhere((item) => item.id == itemId);
|
||
|
||
// 如果当前项是启用的,检查是否是最后一个启用的
|
||
if (currentItem.isEnabled) {
|
||
final enabledCount = items.where((item) => item.isEnabled).length;
|
||
if (enabledCount <= 1) {
|
||
// 至少保留一个 Tab,不允许关闭
|
||
return this;
|
||
}
|
||
}
|
||
|
||
final updatedItems = items.map((item) {
|
||
if (item.id == itemId) {
|
||
return item.copyWith(isEnabled: !item.isEnabled);
|
||
}
|
||
return item;
|
||
}).toList();
|
||
return copyWith(items: updatedItems);
|
||
}
|
||
|
||
static TabConfig defaultConfig() {
|
||
return const TabConfig(
|
||
items: [
|
||
TabConfigItem(
|
||
id: 'home_v2',
|
||
name: '首页',
|
||
nameEn: 'Home',
|
||
icon: 'home_rounded',
|
||
isEnabled: true,
|
||
order: 1,
|
||
),
|
||
TabConfigItem(
|
||
id: 'device',
|
||
name: '设备',
|
||
nameEn: 'Device',
|
||
icon: 'devices_rounded',
|
||
isEnabled: true,
|
||
order: 2,
|
||
),
|
||
TabConfigItem(
|
||
id: 'ai',
|
||
name: 'AI',
|
||
nameEn: 'AI',
|
||
icon: 'auto_awesome_rounded',
|
||
isEnabled: false,
|
||
order: 3,
|
||
),
|
||
TabConfigItem(
|
||
id: 'warning',
|
||
name: '告警',
|
||
nameEn: 'Alerts',
|
||
icon: 'warning_amber_rounded',
|
||
isEnabled: true,
|
||
order: 4,
|
||
),
|
||
TabConfigItem(
|
||
id: 'workorder',
|
||
name: '工单',
|
||
nameEn: 'WorkOrder',
|
||
icon: 'assignment_rounded',
|
||
isEnabled: true,
|
||
order: 5,
|
||
),
|
||
TabConfigItem(
|
||
id: 'report',
|
||
name: '上报',
|
||
nameEn: 'Report',
|
||
icon: 'post_add_rounded',
|
||
isEnabled: true,
|
||
order: 6,
|
||
),
|
||
TabConfigItem(
|
||
id: 'my',
|
||
name: '旧我的',
|
||
nameEn: 'Old Profile',
|
||
icon: 'person_rounded',
|
||
isEnabled: false,
|
||
order: 7,
|
||
),
|
||
TabConfigItem(
|
||
id: 'me',
|
||
name: '我的',
|
||
nameEn: 'Profile',
|
||
icon: 'person_rounded',
|
||
isEnabled: true,
|
||
order: 8,
|
||
),
|
||
],
|
||
);
|
||
}
|
||
|
||
@override
|
||
List<Object?> get props => [items];
|
||
}
|