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

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

@ -125,9 +125,9 @@ class _TemplateFilterPanelState extends State<TemplateFilterPanel> {
const SizedBox(width: 16), const SizedBox(width: 16),
ElevatedButton( ElevatedButton(
onPressed: () { 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 {
final selectedNodes = controller.getSelectedNodes(); final selectedNodes = controller.getSelectedNodes();
if (selectedNodes.isEmpty) return; if (selectedNodes.isEmpty) return;
//
final dataSource = _TemplateItemDataSource(
rows: _buildDataRows(selectedNodes, controller.displayedItems),
selectedNodes: selectedNodes,
);
// //
String csvData = '序号\t'; 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'; csvData += '\n';
//
final rows = _getGroupedData(controller);
// //
for (var i = 0; i < rows.length; i++) { for (final row in dataSource.rows) {
csvData += '${i + 1}\t'; csvData += '${row.getCells()[0].value}\t'; //
csvData += selectedNodes for (int i = 1; i < row.getCells().length; i++) {
.map((node) { csvData += row.getCells()[i].value.toString();
return rows[i][node.path] ?? ''; if (i < row.getCells().length - 1) csvData += '\t';
}) }
.join('\t');
csvData += '\n'; csvData += '\n';
} }
//
final filePath = await FilePicker.platform.saveFile( final filePath = await FilePicker.platform.saveFile(
dialogTitle: '保存导出结果', dialogTitle: '保存导出结果',
fileName: 'template_results.csv', fileName: 'template_results.csv',
@ -165,60 +170,6 @@ class TemplateGridView extends StatelessWidget {
return row; return row;
}).toList(); }).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 { class _TemplateItemDataSource extends DataGridSource {

Loading…
Cancel
Save