Browse Source

[new]增加消息提醒日期选择对话框,支持自定义选择回调并优化周选择逻辑

zk 2 months ago
parent
commit
24b0acf297

+ 91 - 7
lib/dialog/select_message_reminder_date_dialog.dart

@@ -11,26 +11,68 @@ import '../resource/colors.gen.dart';
 class SelectMessageReminderDateDialog {
 class SelectMessageReminderDateDialog {
   static const String _tag = 'SelectMessageReminderDateDialog';
   static const String _tag = 'SelectMessageReminderDateDialog';
 
 
-  static void show({List<int>? selectWeekDays}) {
+  static void show(
+      {List<int>? selectWeekDays, void Function(List<int>)? onSelected}) {
     SmartDialog.show(
     SmartDialog.show(
         tag: _tag,
         tag: _tag,
         animationType: SmartAnimationType.centerFade_otherSlide,
         animationType: SmartAnimationType.centerFade_otherSlide,
         alignment: Alignment.bottomCenter,
         alignment: Alignment.bottomCenter,
         keepSingle: true,
         keepSingle: true,
         builder: (_) {
         builder: (_) {
-          return SelectMessageReminderDateView(selectWeekDays);
+          return SelectMessageReminderDateView(selectWeekDays, onSelected);
         });
         });
   }
   }
 
 
   static void hide() {
   static void hide() {
     SmartDialog.dismiss(tag: _tag);
     SmartDialog.dismiss(tag: _tag);
   }
   }
+
+  static String convertString(List<int> weekDays) {
+    //如果weekDays = 7天则返回每天
+    if (weekDays.length == 7) {
+      return '每天';
+    }
+    //如果不是则返回周一/周三/周四/周五/周六/周日 这样
+    List<String> dayNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
+    List<String> selectedDayNames = [];
+    for (var day in weekDays) {
+      if (day >= 1 && day <= 7) {
+        selectedDayNames.add(dayNames[day - 1]);
+      }
+    }
+    return selectedDayNames.join('/');
+  }
 }
 }
 
 
-class SelectMessageReminderDateView extends StatelessWidget {
+class SelectMessageReminderDateView extends StatefulWidget {
   final List<int>? selectWeekDays;
   final List<int>? selectWeekDays;
+  final void Function(List<int>)? onSelected;
+
+  const SelectMessageReminderDateView(this.selectWeekDays, this.onSelected,
+      {super.key});
+
+  @override
+  State<SelectMessageReminderDateView> createState() =>
+      _SelectMessageReminderDateViewState();
+}
 
 
-  const SelectMessageReminderDateView(this.selectWeekDays, {super.key});
+class _SelectMessageReminderDateViewState
+    extends State<SelectMessageReminderDateView> {
+  late List<int> _selectedWeekDays;
+
+  @override
+  void initState() {
+    super.initState();
+    // 传入的1=周一, 2=周二, ..., 7=周日,内部用0=周日, 1=周一...
+    if (widget.selectWeekDays != null) {
+      _selectedWeekDays = widget.selectWeekDays!
+          .where((d) => d >= 1 && d <= 7)
+          .map((d) => d % 7) // 1=>1, 2=>2, ..., 7=>0
+          .toList();
+    } else {
+      _selectedWeekDays = [];
+    }
+  }
 
 
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
@@ -65,7 +107,14 @@ class SelectMessageReminderDateView extends StatelessWidget {
   }
   }
 
 
   Widget buildDateView() {
   Widget buildDateView() {
-    return WeekdaySelector();
+    return WeekdaySelector(
+      initialSelected: _selectedWeekDays,
+      onChanged: (selected) {
+        setState(() {
+          _selectedWeekDays = selected;
+        });
+      },
+    );
   }
   }
 
 
   Widget buildSelectBtnView() {
   Widget buildSelectBtnView() {
@@ -116,17 +165,43 @@ class SelectMessageReminderDateView extends StatelessWidget {
     );
     );
   }
   }
 
 
-  void onSureClick() {}
+  void onSureClick() {
+    // 返回时将0=周日, 1=周一... 转换为1=周一, ..., 7=周日  并将7放到最后
+    List<int> result = _selectedWeekDays.map((d) => d == 0 ? 7 : d).toList();
+    result.sort((a, b) {
+      if (a == 7 && b != 7) return 1;
+      if (a != 7 && b == 7) return -1;
+      return a.compareTo(b);
+    });
+    widget.onSelected?.call(result);
+    SelectMessageReminderDateDialog.hide();
+  }
 }
 }
 
 
 class WeekdaySelector extends StatefulWidget {
 class WeekdaySelector extends StatefulWidget {
+  final List<int>? initialSelected;
+  final ValueChanged<List<int>>? onChanged;
+
+  const WeekdaySelector({this.initialSelected, this.onChanged, super.key});
+
   @override
   @override
   _WeekdaySelectorState createState() => _WeekdaySelectorState();
   _WeekdaySelectorState createState() => _WeekdaySelectorState();
 }
 }
 
 
 class _WeekdaySelectorState extends State<WeekdaySelector> {
 class _WeekdaySelectorState extends State<WeekdaySelector> {
   final List<String> days = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
   final List<String> days = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
-  List<bool> selected = List.filled(7, false); // 保存勾选状态
+  late List<bool> selected;
+
+  @override
+  void initState() {
+    super.initState();
+    selected = List.filled(7, false);
+    if (widget.initialSelected != null) {
+      for (var i in widget.initialSelected!) {
+        if (i >= 0 && i < 7) selected[i] = true;
+      }
+    }
+  }
 
 
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
@@ -139,6 +214,7 @@ class _WeekdaySelectorState extends State<WeekdaySelector> {
               onTap: () {
               onTap: () {
                 setState(() {
                 setState(() {
                   selected[index] = !selected[index];
                   selected[index] = !selected[index];
+                  widget.onChanged?.call(_getSelectedIndexes());
                 });
                 });
               },
               },
               child: Container(
               child: Container(
@@ -169,4 +245,12 @@ class _WeekdaySelectorState extends State<WeekdaySelector> {
       }),
       }),
     );
     );
   }
   }
+
+  List<int> _getSelectedIndexes() {
+    List<int> result = [];
+    for (int i = 0; i < selected.length; i++) {
+      if (selected[i]) result.add(i);
+    }
+    return result;
+  }
 }
 }

+ 11 - 3
lib/module/commonpoint/detail/common_point_detail_controller.dart

@@ -54,7 +54,11 @@ class CommonPointDetailController extends BaseController {
 
 
   void onSelectMessageReminderClick() {
   void onSelectMessageReminderClick() {
     hideKeyboard(Get.context!);
     hideKeyboard(Get.context!);
-    SelectMessageReminderDateDialog.show(selectWeekDays: selectedWeekDays);
+    SelectMessageReminderDateDialog.show(
+        selectWeekDays: selectedWeekDays,
+        onSelected: (days) {
+          selectedWeekDays.assignAll(days);
+        });
   }
   }
 
 
   void onSelectAddressClick() async {
   void onSelectAddressClick() async {
@@ -81,9 +85,13 @@ class CommonPointDetailController extends BaseController {
       ToastUtil.show(StringName.commonPointAddGuardTimePeriodHint);
       ToastUtil.show(StringName.commonPointAddGuardTimePeriodHint);
       return;
       return;
     }
     }
+    if (selectedWeekDays.isEmpty) {
+      ToastUtil.show(StringName.commonPointAddMessageReminderHint);
+      return;
+    }
     _isShowDuplicateName.value = false;
     _isShowDuplicateName.value = false;
     CustomLoadingDialog.show();
     CustomLoadingDialog.show();
-
-    // rangePointRepository.pointInfoCreate(title:);
+    final int radius = selectedAddressMap?['radius'] ?? 0;
+    // rangePointRepository.pointInfoCreate(title: title, radius: radius);
   }
   }
 }
 }

+ 13 - 4
lib/module/commonpoint/detail/common_point_detail_page.dart

@@ -5,6 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/base/base_page.dart';
+import 'package:location/dialog/select_message_reminder_date_dialog.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/utils/common_expand.dart';
 import 'package:location/utils/common_expand.dart';
 
 
@@ -99,10 +100,18 @@ class CommonPointDetailPage extends BasePage<CommonPointDetailController> {
             );
             );
           }), onClick: controller.onGuardTimePeriodClick),
           }), onClick: controller.onGuardTimePeriodClick),
           buildAddItem(StringName.commonPointAddMessageReminder,
           buildAddItem(StringName.commonPointAddMessageReminder,
-              contentWidget: Text(
-                StringName.commonPointAddMessageReminderHint,
-                style: TextStyle(fontSize: 13.sp, color: ColorName.black30),
-              ),
+              contentWidget: Obx(() {
+            if (controller.selectedWeekDays.isNotEmpty) {
+              return Text(
+                  SelectMessageReminderDateDialog.convertString(
+                      controller.selectedWeekDays),
+                  style: TextStyle(fontSize: 13.sp, color: ColorName.black60));
+            }
+            return Text(
+              StringName.commonPointAddMessageReminderHint,
+              style: TextStyle(fontSize: 13.sp, color: ColorName.black30),
+            );
+          }),
               isShowBottomLine: false,
               isShowBottomLine: false,
               onClick: controller.onSelectMessageReminderClick),
               onClick: controller.onSelectMessageReminderClick),
         ],
         ],