11 changed files with 263 additions and 272 deletions
@ -1,11 +1,23 @@ |
|||||||
import 'package:get/get.dart'; |
import 'package:get/get.dart'; |
||||||
|
import 'package:problem_check_system/data/models/problem_model.dart'; |
||||||
import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart'; |
import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart'; |
||||||
|
|
||||||
class ProblemFormBinding extends Bindings { |
class ProblemFormBinding extends Bindings { |
||||||
@override |
@override |
||||||
void dependencies() { |
void dependencies() { |
||||||
|
final dynamic arguments = Get.arguments; |
||||||
|
final bool readOnly = Get.parameters['isReadOnly'] == 'true'; |
||||||
|
|
||||||
|
Problem? problem; |
||||||
|
if (arguments != null && arguments is Problem) { |
||||||
|
problem = arguments; |
||||||
|
} |
||||||
Get.lazyPut<ProblemFormController>( |
Get.lazyPut<ProblemFormController>( |
||||||
() => ProblemFormController(problemRepository: Get.find()), |
() => ProblemFormController( |
||||||
|
problemRepository: Get.find(), |
||||||
|
problem: problem, |
||||||
|
isReadOnly: readOnly, |
||||||
|
), |
||||||
); |
); |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -1,122 +0,0 @@ |
|||||||
// widgets/compact_filter_bar.dart |
|
||||||
import 'package:flutter/material.dart'; |
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
||||||
import 'package:get/get.dart'; |
|
||||||
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; |
|
||||||
|
|
||||||
import 'custom_filter_dropdown.dart'; |
|
||||||
|
|
||||||
class CompactFilterBar extends GetView<ProblemController> { |
|
||||||
final bool showDateRangeFilter; |
|
||||||
final bool showUploadFilter; |
|
||||||
final bool showBindFilter; |
|
||||||
final bool showCustomButton; // 新增:是否显示自定义按钮 |
|
||||||
final String? customButtonText; // 新增:自定义按钮文本 |
|
||||||
final IconData? customButtonIcon; // 新增:自定义按钮图标 |
|
||||||
final VoidCallback? onCustomButtonPressed; // 新增:自定义按钮点击回调 |
|
||||||
final EdgeInsetsGeometry? padding; |
|
||||||
|
|
||||||
const CompactFilterBar({ |
|
||||||
super.key, |
|
||||||
this.showDateRangeFilter = true, |
|
||||||
this.showUploadFilter = true, |
|
||||||
this.showBindFilter = true, |
|
||||||
this.showCustomButton = false, // 默认不显示 |
|
||||||
this.customButtonText, |
|
||||||
this.customButtonIcon, |
|
||||||
this.onCustomButtonPressed, |
|
||||||
this.padding, |
|
||||||
}); |
|
||||||
|
|
||||||
@override |
|
||||||
Widget build(BuildContext context) { |
|
||||||
return Container( |
|
||||||
padding: padding ?? EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), |
|
||||||
color: Colors.grey[50], |
|
||||||
child: Row( |
|
||||||
children: [ |
|
||||||
// 自定义按钮 |
|
||||||
if (showCustomButton) ...[_buildCustomButton()], |
|
||||||
// 日期范围筛选 |
|
||||||
if (showDateRangeFilter) ...[ |
|
||||||
Obx( |
|
||||||
() => CustomFilterDropdown( |
|
||||||
title: '时间范围', |
|
||||||
options: controller.dateRangeOptions, |
|
||||||
selectedValue: controller.currentDateRange.value.name, |
|
||||||
onChanged: controller.updateDateRange, |
|
||||||
width: 100.w, |
|
||||||
showBorder: false, |
|
||||||
), |
|
||||||
), |
|
||||||
], |
|
||||||
|
|
||||||
// 上传状态筛选 |
|
||||||
if (showUploadFilter) ...[ |
|
||||||
Obx( |
|
||||||
() => CustomFilterDropdown( |
|
||||||
title: '上传状态', |
|
||||||
options: controller.uploadOptions, |
|
||||||
selectedValue: controller.currentUploadFilter.value, |
|
||||||
onChanged: controller.updateUploadFilter, |
|
||||||
width: 100.w, |
|
||||||
showBorder: false, |
|
||||||
), |
|
||||||
), |
|
||||||
], |
|
||||||
|
|
||||||
// 绑定状态筛选 |
|
||||||
if (showBindFilter) ...[ |
|
||||||
Obx( |
|
||||||
() => CustomFilterDropdown( |
|
||||||
title: '绑定状态', |
|
||||||
options: controller.bindOptions, |
|
||||||
selectedValue: controller.currentBindFilter.value, |
|
||||||
onChanged: controller.updateBindFilter, |
|
||||||
width: 100.w, |
|
||||||
showBorder: false, |
|
||||||
), |
|
||||||
), |
|
||||||
], |
|
||||||
], |
|
||||||
), |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
// 构建自定义按钮 |
|
||||||
Widget _buildCustomButton() { |
|
||||||
return SizedBox( |
|
||||||
width: 110.w, |
|
||||||
// decoration: BoxDecoration( |
|
||||||
// border: Border.all(color: Colors.grey.shade300), |
|
||||||
// borderRadius: BorderRadius.circular(8.r), |
|
||||||
// ), |
|
||||||
child: TextButton( |
|
||||||
onPressed: onCustomButtonPressed, |
|
||||||
style: TextButton.styleFrom( |
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 4.h), |
|
||||||
shape: RoundedRectangleBorder( |
|
||||||
borderRadius: BorderRadius.circular(8.r), |
|
||||||
), |
|
||||||
), |
|
||||||
child: Row( |
|
||||||
mainAxisAlignment: MainAxisAlignment.center, |
|
||||||
children: [ |
|
||||||
if (customButtonIcon != null) ...[ |
|
||||||
Icon(customButtonIcon, size: 16.sp, color: Colors.grey[700]), |
|
||||||
SizedBox(width: 4.w), |
|
||||||
], |
|
||||||
Text( |
|
||||||
customButtonText ?? '自定义', |
|
||||||
style: TextStyle( |
|
||||||
fontSize: 14.sp, |
|
||||||
color: Colors.black87, |
|
||||||
fontWeight: FontWeight.normal, |
|
||||||
), |
|
||||||
), |
|
||||||
], |
|
||||||
), |
|
||||||
), |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,66 @@ |
|||||||
|
// widgets/compact_filter_bar.dart |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
||||||
|
import 'package:get/get.dart'; |
||||||
|
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; |
||||||
|
|
||||||
|
import 'custom_filter_dropdown.dart'; |
||||||
|
|
||||||
|
class CurrentFilterBar extends GetView<ProblemController> { |
||||||
|
final EdgeInsetsGeometry? padding; |
||||||
|
|
||||||
|
const CurrentFilterBar({super.key, this.padding}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Container( |
||||||
|
padding: padding ?? EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), |
||||||
|
color: Colors.grey[50], |
||||||
|
child: Row( |
||||||
|
children: [ |
||||||
|
// 日期范围筛选 |
||||||
|
...[ |
||||||
|
Obx( |
||||||
|
() => CustomFilterDropdown( |
||||||
|
title: '时间范围', |
||||||
|
options: controller.dateRangeOptions, |
||||||
|
selectedValue: controller.currentDateRange.value.name, |
||||||
|
onChanged: controller.updateCurrentDateRange, |
||||||
|
width: 100.w, |
||||||
|
showBorder: false, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
|
||||||
|
// 上传状态筛选 |
||||||
|
...[ |
||||||
|
Obx( |
||||||
|
() => CustomFilterDropdown( |
||||||
|
title: '上传状态', |
||||||
|
options: controller.uploadOptions, |
||||||
|
selectedValue: controller.currentUploadFilter.value, |
||||||
|
onChanged: controller.updateCurrentUpload, |
||||||
|
width: 100.w, |
||||||
|
showBorder: false, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
|
||||||
|
// 绑定状态筛选 |
||||||
|
...[ |
||||||
|
Obx( |
||||||
|
() => CustomFilterDropdown( |
||||||
|
title: '绑定状态', |
||||||
|
options: controller.bindOptions, |
||||||
|
selectedValue: controller.currentBindFilter.value, |
||||||
|
onChanged: controller.updateCurrentBind, |
||||||
|
width: 100.w, |
||||||
|
showBorder: false, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -1,53 +0,0 @@ |
|||||||
import 'package:flutter/material.dart'; |
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
||||||
import 'package:get/get.dart'; |
|
||||||
import 'package:problem_check_system/modules/problem/views/widgets/models/dropdown_option.dart'; |
|
||||||
|
|
||||||
class CustomObjectDropdown extends StatelessWidget { |
|
||||||
final RxString selectedValue; |
|
||||||
final List<DropdownOption> items; |
|
||||||
final Function(String) onChanged; |
|
||||||
|
|
||||||
const CustomObjectDropdown({ |
|
||||||
super.key, |
|
||||||
required this.selectedValue, |
|
||||||
required this.items, |
|
||||||
required this.onChanged, |
|
||||||
}); |
|
||||||
|
|
||||||
@override |
|
||||||
Widget build(BuildContext context) { |
|
||||||
return Obx( |
|
||||||
() => Container( |
|
||||||
height: 30.h, |
|
||||||
margin: EdgeInsets.only(right: 10.w, top: 10.w, bottom: 10.w), |
|
||||||
alignment: Alignment.center, |
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.5.w, vertical: 7.5.h), |
|
||||||
decoration: BoxDecoration( |
|
||||||
color: const Color.fromARGB(90, 158, 158, 158), |
|
||||||
borderRadius: BorderRadius.circular(7.5.w), |
|
||||||
), |
|
||||||
child: DropdownButtonHideUnderline( |
|
||||||
child: DropdownButton<String>( |
|
||||||
value: selectedValue.value, |
|
||||||
onChanged: (String? newValue) { |
|
||||||
if (newValue != null) { |
|
||||||
onChanged(newValue); |
|
||||||
} |
|
||||||
}, |
|
||||||
items: items.map((DropdownOption option) { |
|
||||||
return DropdownMenuItem<String>( |
|
||||||
value: option.value, |
|
||||||
child: Text(option.label), |
|
||||||
); |
|
||||||
}).toList(), |
|
||||||
icon: const Icon(Icons.arrow_drop_down, size: 15), |
|
||||||
style: TextStyle(fontSize: 10.sp, color: Colors.black), |
|
||||||
dropdownColor: Colors.white, |
|
||||||
underline: const SizedBox.shrink(), |
|
||||||
), |
|
||||||
), |
|
||||||
), |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,97 @@ |
|||||||
|
// widgets/compact_filter_bar.dart |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
||||||
|
import 'package:get/get.dart'; |
||||||
|
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; |
||||||
|
|
||||||
|
import 'custom_filter_dropdown.dart'; |
||||||
|
|
||||||
|
class HistoryFilterBar extends GetView<ProblemController> { |
||||||
|
final EdgeInsetsGeometry? padding; |
||||||
|
|
||||||
|
const HistoryFilterBar({super.key, this.padding}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Container( |
||||||
|
padding: padding ?? EdgeInsets.symmetric(horizontal: 16.w, vertical: 5.h), |
||||||
|
color: Colors.grey[50], |
||||||
|
child: Row( |
||||||
|
children: [ |
||||||
|
// 显示日期选择 |
||||||
|
...[ |
||||||
|
SizedBox( |
||||||
|
width: 110.w, |
||||||
|
// decoration: BoxDecoration( |
||||||
|
// border: Border.all(color: Colors.grey.shade300), |
||||||
|
// borderRadius: BorderRadius.circular(8.r), |
||||||
|
// ), |
||||||
|
child: TextButton( |
||||||
|
onPressed: () { |
||||||
|
controller.selectDateRange(context); |
||||||
|
}, |
||||||
|
style: TextButton.styleFrom( |
||||||
|
padding: EdgeInsets.symmetric( |
||||||
|
horizontal: 12.w, |
||||||
|
vertical: 4.h, |
||||||
|
), |
||||||
|
shape: RoundedRectangleBorder( |
||||||
|
borderRadius: BorderRadius.circular(8.r), |
||||||
|
), |
||||||
|
), |
||||||
|
child: Row( |
||||||
|
mainAxisAlignment: MainAxisAlignment.center, |
||||||
|
children: [ |
||||||
|
Icon( |
||||||
|
Icons.date_range, |
||||||
|
size: 16.sp, |
||||||
|
color: Colors.grey[700], |
||||||
|
), |
||||||
|
SizedBox(width: 4.w), |
||||||
|
|
||||||
|
Text( |
||||||
|
'选择日期', |
||||||
|
style: TextStyle( |
||||||
|
fontSize: 14.sp, |
||||||
|
color: Colors.black87, |
||||||
|
fontWeight: FontWeight.normal, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
|
||||||
|
// 上传状态筛选 |
||||||
|
...[ |
||||||
|
Obx( |
||||||
|
() => CustomFilterDropdown( |
||||||
|
title: '上传状态', |
||||||
|
options: controller.uploadOptions, |
||||||
|
selectedValue: controller.historyUploadFilter.value, |
||||||
|
onChanged: controller.updateHistoryUpload, |
||||||
|
width: 100.w, |
||||||
|
showBorder: false, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
|
||||||
|
// 绑定状态筛选 |
||||||
|
...[ |
||||||
|
Obx( |
||||||
|
() => CustomFilterDropdown( |
||||||
|
title: '绑定状态', |
||||||
|
options: controller.bindOptions, |
||||||
|
selectedValue: controller.historyBindFilter.value, |
||||||
|
onChanged: controller.updateHistoryBind, |
||||||
|
width: 100.w, |
||||||
|
showBorder: false, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue