SHA256
295 lines
7.1 KiB
Dart
295 lines
7.1 KiB
Dart
part of 'studio_app.dart';
|
|
|
|
const String _defaultWorkspace = 'ttx-xwms-test';
|
|
|
|
class StudioRuntime {
|
|
const StudioRuntime({
|
|
required this.backendUrl,
|
|
required this.client,
|
|
required this.session,
|
|
required this.user,
|
|
required this.loginConfig,
|
|
required this.systemConfig,
|
|
required this.orgName,
|
|
required this.allowedMenuIds,
|
|
required this.profile,
|
|
});
|
|
|
|
final String backendUrl;
|
|
final StudioBackendClient client;
|
|
final StudioBackendSession session;
|
|
final StudioUser user;
|
|
final Map<String, dynamic> loginConfig;
|
|
final Map<String, dynamic> systemConfig;
|
|
final String orgName;
|
|
final Set<String> allowedMenuIds;
|
|
final StudioBackendUserProfile? profile;
|
|
}
|
|
|
|
class StudioUser {
|
|
const StudioUser({
|
|
required this.workspace,
|
|
required this.displayName,
|
|
required this.role,
|
|
required this.languageCode,
|
|
required this.backendAppName,
|
|
required this.organizationName,
|
|
});
|
|
|
|
final String workspace;
|
|
final String displayName;
|
|
final String role;
|
|
final String languageCode;
|
|
final String backendAppName;
|
|
final String organizationName;
|
|
}
|
|
|
|
class StudioActivity {
|
|
StudioActivity({required this.title, required this.detail})
|
|
: time = DateTime.now();
|
|
|
|
final String title;
|
|
final String detail;
|
|
final DateTime time;
|
|
}
|
|
|
|
class StudioTab {
|
|
StudioTab({
|
|
required this.id,
|
|
required this.title,
|
|
required this.summary,
|
|
required this.pageType,
|
|
required this.icon,
|
|
});
|
|
|
|
static const String dashboardId = 'dashboard';
|
|
|
|
factory StudioTab.dashboard() {
|
|
return StudioTab(
|
|
id: dashboardId,
|
|
title: '工作台',
|
|
summary: 'Studio 首页和快捷入口',
|
|
pageType: StudioPageType.dashboard,
|
|
icon: Icons.space_dashboard_rounded,
|
|
);
|
|
}
|
|
|
|
final String id;
|
|
final String title;
|
|
final String summary;
|
|
final StudioPageType pageType;
|
|
final IconData icon;
|
|
}
|
|
|
|
enum StudioPageType {
|
|
dashboard,
|
|
modelEditor,
|
|
jsonEditor,
|
|
navigationEditor,
|
|
manage,
|
|
history,
|
|
sync,
|
|
repair,
|
|
sqlTemplate,
|
|
sqlRunner,
|
|
portalMaintain,
|
|
}
|
|
|
|
class StudioNavNode {
|
|
StudioNavNode({
|
|
required this.id,
|
|
required this.title,
|
|
required this.summary,
|
|
required this.icon,
|
|
required this.pageType,
|
|
this.children = const [],
|
|
});
|
|
|
|
final String id;
|
|
final String title;
|
|
final String summary;
|
|
final IconData icon;
|
|
final StudioPageType pageType;
|
|
final List<StudioNavNode> children;
|
|
}
|
|
|
|
class _HistoryRow {
|
|
const _HistoryRow(this.version, this.user, this.time, this.status, this.note);
|
|
|
|
final String version;
|
|
final String user;
|
|
final String time;
|
|
final String status;
|
|
final String note;
|
|
}
|
|
|
|
final List<StudioNavNode> studioNavTree = [
|
|
StudioNavNode(
|
|
id: 'model-center',
|
|
title: '模型中心',
|
|
summary: '数据、单据、界面和导航',
|
|
icon: Icons.account_tree_rounded,
|
|
pageType: StudioPageType.dashboard,
|
|
children: [
|
|
StudioNavNode(
|
|
id: 'TableModelEditor',
|
|
title: '数据模型',
|
|
summary: '字段、索引、关系与版本',
|
|
icon: Icons.table_rows_rounded,
|
|
pageType: StudioPageType.modelEditor,
|
|
),
|
|
StudioNavNode(
|
|
id: 'BillModelEditor',
|
|
title: '单据模型',
|
|
summary: '业务单据结构和规则',
|
|
icon: Icons.description_rounded,
|
|
pageType: StudioPageType.modelEditor,
|
|
),
|
|
StudioNavNode(
|
|
id: 'ViewModelEditor',
|
|
title: '界面模型',
|
|
summary: '界面布局和控件配置',
|
|
icon: Icons.dashboard_customize_rounded,
|
|
pageType: StudioPageType.modelEditor,
|
|
),
|
|
StudioNavNode(
|
|
id: 'NavigationEditor',
|
|
title: '菜单维护',
|
|
summary: '导航结构和入口配置',
|
|
icon: Icons.menu_rounded,
|
|
pageType: StudioPageType.navigationEditor,
|
|
),
|
|
],
|
|
),
|
|
StudioNavNode(
|
|
id: 'history',
|
|
title: '模型日志',
|
|
summary: '版本与修改历史',
|
|
icon: Icons.history_rounded,
|
|
pageType: StudioPageType.dashboard,
|
|
children: [
|
|
StudioNavNode(
|
|
id: 'TableModelHistory',
|
|
title: '数据模型日志',
|
|
summary: '数据模型修改历史',
|
|
icon: Icons.query_builder_rounded,
|
|
pageType: StudioPageType.history,
|
|
),
|
|
StudioNavNode(
|
|
id: 'BillModelHistory',
|
|
title: '单据模型日志',
|
|
summary: '单据模型修改历史',
|
|
icon: Icons.history_toggle_off_rounded,
|
|
pageType: StudioPageType.history,
|
|
),
|
|
StudioNavNode(
|
|
id: 'WsoDataHistory',
|
|
title: '界面模型日志',
|
|
summary: '界面模型修改历史',
|
|
icon: Icons.event_note_rounded,
|
|
pageType: StudioPageType.history,
|
|
),
|
|
StudioNavNode(
|
|
id: 'NavigatorHistory',
|
|
title: '菜单维护日志',
|
|
summary: '菜单配置修改历史',
|
|
icon: Icons.receipt_long_rounded,
|
|
pageType: StudioPageType.history,
|
|
),
|
|
],
|
|
),
|
|
StudioNavNode(
|
|
id: 'ModelSync',
|
|
title: '配置下载',
|
|
summary: '同步和导出配置',
|
|
icon: Icons.file_download_rounded,
|
|
pageType: StudioPageType.sync,
|
|
),
|
|
StudioNavNode(
|
|
id: 'DataRepair',
|
|
title: '数据修复',
|
|
summary: '异常数据处理和修复',
|
|
icon: Icons.build_rounded,
|
|
pageType: StudioPageType.repair,
|
|
),
|
|
StudioNavNode(
|
|
id: 'SqlTemplate',
|
|
title: 'SQL 模板',
|
|
summary: '查询模板和脚本管理',
|
|
icon: Icons.description_rounded,
|
|
pageType: StudioPageType.sqlTemplate,
|
|
),
|
|
StudioNavNode(
|
|
id: 'AdvancedSqlTemplate',
|
|
title: 'SQL 模板执行',
|
|
summary: '直接执行查询模板',
|
|
icon: Icons.play_arrow_rounded,
|
|
pageType: StudioPageType.sqlRunner,
|
|
),
|
|
StudioNavNode(
|
|
id: 'PortalMaintain',
|
|
title: 'Portal 配置',
|
|
summary: '门户和主题管理',
|
|
icon: Icons.settings_applications_rounded,
|
|
pageType: StudioPageType.portalMaintain,
|
|
),
|
|
];
|
|
|
|
List<StudioNavNode> _filterNavNodes(
|
|
List<StudioNavNode> nodes,
|
|
Set<String> allowedIds,
|
|
) {
|
|
if (allowedIds.isEmpty) {
|
|
return nodes;
|
|
}
|
|
|
|
final filtered = <StudioNavNode>[];
|
|
for (final node in nodes) {
|
|
final filteredChildren = node.children.isEmpty
|
|
? const <StudioNavNode>[]
|
|
: _filterNavNodes(node.children, allowedIds);
|
|
final allowed = allowedIds.contains(node.id);
|
|
if (allowed || filteredChildren.isNotEmpty) {
|
|
filtered.add(
|
|
StudioNavNode(
|
|
id: node.id,
|
|
title: node.title,
|
|
summary: node.summary,
|
|
icon: node.icon,
|
|
pageType: node.pageType,
|
|
children: filteredChildren,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
return filtered;
|
|
}
|
|
|
|
String _extractStringFromConfig(
|
|
Map<String, dynamic> config,
|
|
List<String> keys,
|
|
) {
|
|
for (final key in keys) {
|
|
final value = config[key];
|
|
if (value != null && value.toString().trim().isNotEmpty) {
|
|
return value.toString().trim();
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
String? _extractAppName(Map<String, dynamic>? config) {
|
|
if (config == null || config.isEmpty) {
|
|
return null;
|
|
}
|
|
|
|
final candidate = _extractStringFromConfig(config, const [
|
|
'appName',
|
|
'name',
|
|
'title',
|
|
'portalName',
|
|
'systemName',
|
|
]);
|
|
return candidate.isEmpty ? null : candidate;
|
|
}
|