event_manage.dart 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import 'package:app_business/service/api.dart';
  2. import 'package:app_business/view/home/dialog_event_register.dart';
  3. import 'package:pretty_qr_code/pretty_qr_code.dart';
  4. import 'package:track_common/widget.dart';
  5. import 'package:track_common/widget/prelude.dart';
  6. import 'event_manage_controller.dart';
  7. class EventManage extends GetView<EventManagerController> {
  8. const EventManage({super.key});
  9. @override
  10. Widget build(BuildContext context) {
  11. return GetBuilder(
  12. init: EventManagerController(),
  13. builder: (c) {
  14. return Level2View(
  15. level1: level1(),
  16. level2: level2(),
  17. level1Title: '赛事列表',
  18. level1Action: wDate(context),
  19. level2Title: '用户列表',
  20. level2SubTitle: Obx(() => Text(
  21. c.selected?.name != null ? '(${c.selected!.name})' : '',
  22. style: const TextStyle(color: Colors.grey, fontSize: 14.22),
  23. )));
  24. });
  25. }
  26. Widget wDate(BuildContext context) {
  27. return GestureDetector(
  28. onTap: () => _onTapDate(context),
  29. child: Obx(() => Container(
  30. height: 22.04,
  31. padding: const EdgeInsets.symmetric(horizontal: 8),
  32. decoration: BoxDecoration(
  33. border:
  34. Border.all(color: const Color(0xffe3e3e3), width: 0.71),
  35. borderRadius: BorderRadius.circular(2.13)),
  36. child: Text(controller.dateStr),
  37. )));
  38. }
  39. Future<void> _onTapDate(BuildContext context) async {
  40. final date = await showDatePicker(
  41. context: context,
  42. initialDate: controller.filterDate.value,
  43. firstDate: DateTime.now(),
  44. lastDate: DateTime.now().add(365.days));
  45. if (date != null) {
  46. controller.filterDate.value = date;
  47. controller.flushList();
  48. }
  49. }
  50. Widget level1() {
  51. return Obx(() => ListView(
  52. children: controller.eventList
  53. .map((e) => EventTitle(
  54. data: e,
  55. selected: controller.selectedId.value == e.id,
  56. onTap: () => controller.selectedId.value = e.id,
  57. ))
  58. .toList()));
  59. }
  60. Widget level2() {
  61. return Column(
  62. children: [
  63. Expanded(
  64. child: ListView(
  65. children: [
  66. Obx(() => LineChart(titles: rightTitles(), children: rightUsers()))
  67. ],
  68. ))
  69. ],
  70. );
  71. }
  72. Iterable<LineChartTitle> rightTitles() {
  73. return [
  74. LineChartTitle(
  75. title: Checkbox(value: true, onChanged: (v) {}), width: 32),
  76. const LineChartTitle(title: Text('序号'), width: 42),
  77. const LineChartTitle(title: Text('用户名'), width: 70),
  78. const LineChartTitle(title: Text('手机号'), flex: 1),
  79. const LineChartTitle(title: Text('签到时间'), flex: 1),
  80. const LineChartTitle(title: Text('删除'), width: 67),
  81. ];
  82. }
  83. Iterable<LineChartElem> rightUsers() {
  84. return controller.userList.indexed.map((e) {
  85. final (i, one) = e;
  86. return LineChartElem([
  87. Checkbox(value: false, onChanged: (v) {}),
  88. Text('${i + 1}'),
  89. Text(one.name),
  90. Text(one.phone),
  91. Text(one.checkTime),
  92. SizedBox(
  93. width: 51.2,
  94. height: 22.76,
  95. child: SmallButton(
  96. color: const Color(0xffff0000),
  97. onPressed: () {},
  98. child: Text('删除'),
  99. ))
  100. ]);
  101. });
  102. }
  103. }
  104. class EventTitle extends GetView<EventManagerController> {
  105. final bool selected;
  106. final EventInManage data;
  107. final VoidCallback onTap;
  108. const EventTitle(
  109. {super.key,
  110. required this.selected,
  111. required this.data,
  112. required this.onTap});
  113. @override
  114. Widget build(BuildContext context) {
  115. var children = <Widget>[
  116. AppTitleList(
  117. title: data.name,
  118. tail: Text('${data.userList.length}'),
  119. isSelected: selected,
  120. onTap: onTap,
  121. )
  122. ];
  123. if (selected) {
  124. children.add(SizedBox(
  125. height: 2,
  126. ));
  127. children.add(Container(
  128. decoration: const BoxDecoration(
  129. color: Color(0xfff1f1f1),
  130. borderRadius: BorderRadius.only(
  131. bottomLeft: Radius.circular(14.22),
  132. bottomRight: Radius.circular(14.22))),
  133. padding: const EdgeInsets.all(16.3),
  134. width: 221.87,
  135. child: Column(
  136. mainAxisSize: MainAxisSize.min,
  137. children: [
  138. Row(
  139. children: [
  140. DarkButton(
  141. onPressed: data.isAllowDel
  142. ? () => controller.deleteEvent(data)
  143. : null,
  144. child: const Text('删除')),
  145. const Spacer(),
  146. DarkButton(
  147. color: Colors.blue,
  148. onPressed: data.isAllowEdit
  149. ? () async {
  150. final r = await showEventEditDialog(
  151. controller.mapId!,
  152. EventRegisterInfo()..name = data.name);
  153. if (r != null) {
  154. controller.eventEdit(data.id, r);
  155. }
  156. }
  157. : null,
  158. child: const Text('修改')),
  159. ],
  160. ),
  161. const SizedBox(height: 24),
  162. SizedBox.square(
  163. dimension: 128, child: PrettyQrView.data(data: data.qrCode)),
  164. const SizedBox(height: 12),
  165. const Text(
  166. '用彩图奔跑APP扫码签到',
  167. style: TextStyle(color: Colors.red, fontSize: 14.22),
  168. )
  169. ],
  170. ),
  171. ));
  172. }
  173. return Column(
  174. mainAxisSize: MainAxisSize.min,
  175. children: children,
  176. );
  177. }
  178. }