Browse Source

数据加载和过滤OK

master
hejl 2 months ago
parent
commit
2e1c192cd7
  1. 15
      win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart
  2. 4
      win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart
  3. 81
      win_text_editor/lib/modules/template_parser/widgets/grid_view.dart

15
win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
// filter_controller.dart
import 'package:flutter/foundation.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/modules/template_parser/models/template_node.dart';
import 'template_notifier.dart';
@ -96,23 +97,28 @@ class FilterController extends TemplateNotifier { @@ -96,23 +97,28 @@ class FilterController extends TemplateNotifier {
return templateItems;
}
Logger().info("过滤:$selectedFilterField $selectedFilterOperator $filterValue");
List<TemplateItem> filteredItems = [];
// 1.
final primaryMatches = templateItems.where((item) {
final nodeName = item.xPath.split('/').last;
return nodeName == selectedFilterField && _matchesCondition(item.value);
if (nodeName == selectedFilterField) {
return _matchesCondition(item.value);
}
return false;
});
// 2. IDID
final matchedIds = primaryMatches.map((item) => item.id).toSet();
final matchedRowIds = primaryMatches.map((item) => item.rowId).toSet();
// 3.
filteredItems.cast();
filteredItems.addAll(
filteredItems.where((item) {
return matchedIds.contains(item.id);
templateItems.where((item) {
return matchedRowIds.contains(item.rowId);
}).toList(),
);
@ -125,7 +131,6 @@ class FilterController extends TemplateNotifier { @@ -125,7 +131,6 @@ class FilterController extends TemplateNotifier {
if (selectedFilterOperator == null || filterValue.isEmpty) {
return false;
}
switch (selectedFilterOperator!) {
case '==':
return value == filterValue;

4
win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart

@ -125,9 +125,9 @@ class _TemplateFilterPanelState extends State<TemplateFilterPanel> { @@ -125,9 +125,9 @@ class _TemplateFilterPanelState extends State<TemplateFilterPanel> {
const SizedBox(width: 16),
ElevatedButton(
onPressed: () {
controller.applyFilter();
controller.clearFilter();
},
child: const Text('刷新'),
child: const Text('还原'),
),
],
),

81
win_text_editor/lib/modules/template_parser/widgets/grid_view.dart

@ -61,25 +61,30 @@ class TemplateGridView extends StatelessWidget { @@ -61,25 +61,30 @@ class TemplateGridView extends StatelessWidget {
final selectedNodes = controller.getSelectedNodes();
if (selectedNodes.isEmpty) return;
//
final dataSource = _TemplateItemDataSource(
rows: _buildDataRows(selectedNodes, controller.displayedItems),
selectedNodes: selectedNodes,
);
//
String csvData = '序号\t';
csvData += selectedNodes.map((node) => node.name).join('\t');
csvData += selectedNodes
.map((node) => node.isAttribute ? node.name.substring(1) : node.name)
.join('\t');
csvData += '\n';
//
final rows = _getGroupedData(controller);
//
for (var i = 0; i < rows.length; i++) {
csvData += '${i + 1}\t';
csvData += selectedNodes
.map((node) {
return rows[i][node.path] ?? '';
})
.join('\t');
for (final row in dataSource.rows) {
csvData += '${row.getCells()[0].value}\t'; //
for (int i = 1; i < row.getCells().length; i++) {
csvData += row.getCells()[i].value.toString();
if (i < row.getCells().length - 1) csvData += '\t';
}
csvData += '\n';
}
//
final filePath = await FilePicker.platform.saveFile(
dialogTitle: '保存导出结果',
fileName: 'template_results.csv',
@ -165,60 +170,6 @@ class TemplateGridView extends StatelessWidget { @@ -165,60 +170,6 @@ class TemplateGridView extends StatelessWidget {
return row;
}).toList();
}
//
List<Map<String, String>> _getGroupedData(GridViewController controller) {
final selectedNodes = controller.getSelectedNodes();
if (selectedNodes.isEmpty) return [];
//
final allItems =
controller.templateItems.where((item) {
return selectedNodes.any((node) => item.xPath == node.path);
}).toList();
//
final parentPaths =
selectedNodes.map((node) {
return node.path.substring(0, node.path.lastIndexOf('/'));
}).toSet();
final groupedData = <Map<String, String>>[];
for (final parentPath in parentPaths) {
//
final items =
allItems.where((item) {
return item.xPath.startsWith(parentPath) ||
item.xPath == parentPath ||
(item.xPath.contains('@') &&
item.xPath.substring(0, item.xPath.lastIndexOf('@')) == parentPath);
}).toList();
//
final instanceGroups = <String, Map<String, String>>{};
for (final item in items) {
//
final instanceId = _getInstanceId(item.xPath, parentPath);
if (!instanceGroups.containsKey(instanceId)) {
instanceGroups[instanceId] = {'_parent': parentPath};
}
instanceGroups[instanceId]![item.xPath] = item.value;
}
groupedData.addAll(instanceGroups.values);
}
return groupedData;
}
String _getInstanceId(String fullPath, String parentPath) {
// 使ID
return fullPath.substring(parentPath.length);
}
}
class _TemplateItemDataSource extends DataGridSource {

Loading…
Cancel
Save