crowd_select_label.dart 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/pages/controllers/crowd_labels.dart';
  5. class CrowdSelectLabelView extends StatefulWidget {
  6. final CrowdLabelsController controller;
  7. const CrowdSelectLabelView({super.key, required this.controller});
  8. @override
  9. State<StatefulWidget> createState() => _CrowdSelectLabelState();
  10. }
  11. class _CrowdSelectLabelState extends State<CrowdSelectLabelView> {
  12. late CrowdLabelsController controller;
  13. @override
  14. void initState() {
  15. super.initState();
  16. controller = widget.controller;
  17. }
  18. @override
  19. Widget build(BuildContext context) {
  20. final state = controller.state;
  21. return Obx(() => Wrap(
  22. spacing: 16,
  23. runSpacing: 12,
  24. children: [
  25. buildItem(LabelDTO(code: "0", labelName: "全选"), context),
  26. ...state.normalOptions
  27. .where((element) => [
  28. "RQFL_ET",
  29. "RQFL_YF",
  30. "RQFL_LNR",
  31. ].contains(element.code))
  32. .map((LabelDTO e) => buildItem(e, context))
  33. .toList(),
  34. ...state.diseaseOptions
  35. .where((element) => [
  36. "CJJB_GXY",
  37. "CJJB_TNB",
  38. "CJJB_YZJSBZA",
  39. "CJJB_FJH",
  40. ].contains(element.code))
  41. .map((LabelDTO e) => buildItem(e, context))
  42. .toList(),
  43. ...state.specialCareOptions
  44. .where((element) => [].contains(element.code))
  45. .map((LabelDTO e) => buildItem(e, context))
  46. .toList(),
  47. ],
  48. ));
  49. }
  50. Widget buildItem(LabelDTO dto, BuildContext context) {
  51. return InkWell(
  52. child: VCheckBoxButton(
  53. key: GlobalKey(),
  54. label: dto.labelName ?? '',
  55. isChecked: controller.state.isAllSelect
  56. ? controller.state.isAllSelect
  57. : controller.state.selectedCodes.contains(dto.code),
  58. isAllChecked: controller.state.isAllSelect,
  59. onChanged: (value) {
  60. if (controller.state.isAllSelect && dto.code != "0") {
  61. return;
  62. }
  63. controller.onItemCheckChanged(dto.code!);
  64. if (controller.state.selectedCodes.length == 7) {
  65. controller.state.isAllSelect = true;
  66. }
  67. setState(() {});
  68. },
  69. ),
  70. );
  71. }
  72. }
  73. /// 按钮式多选框
  74. class VCheckBoxButton extends StatefulWidget {
  75. /// 文本
  76. final String label;
  77. /// 是否默认选中
  78. final bool? isChecked;
  79. /// 是否默认选中
  80. final bool? isAllChecked;
  81. /// 选中状态变更
  82. final ValueChanged<bool>? onChanged;
  83. const VCheckBoxButton({
  84. super.key,
  85. required this.label,
  86. this.isChecked,
  87. this.onChanged,
  88. this.isAllChecked,
  89. });
  90. @override
  91. State<StatefulWidget> createState() => _VCheckBoxState();
  92. }
  93. class _VCheckBoxState extends State<VCheckBoxButton> {
  94. bool _isChecked = false;
  95. bool _isAllChecked = false;
  96. @override
  97. void initState() {
  98. if (widget.isChecked != null) {
  99. _isChecked = widget.isChecked!;
  100. }
  101. if (widget.isAllChecked != null) {
  102. _isAllChecked = widget.isAllChecked!;
  103. }
  104. super.initState();
  105. }
  106. @override
  107. Widget build(BuildContext context) {
  108. const height = 40.0;
  109. const borderRadius = height / 3;
  110. final primaryColor = Theme.of(context).primaryColor;
  111. return Material(
  112. child: Ink(
  113. child: InkWell(
  114. borderRadius: BorderRadius.circular(borderRadius),
  115. onTap: () {
  116. setState(() {
  117. _isChecked = !_isChecked;
  118. widget.onChanged?.call(_isChecked);
  119. });
  120. },
  121. child: IntrinsicWidth(
  122. child: Container(
  123. padding: const EdgeInsets.only(left: 10, right: 10),
  124. constraints: const BoxConstraints(minWidth: 150),
  125. alignment: Alignment.center,
  126. height: height,
  127. decoration: BoxDecoration(
  128. color: (_isAllChecked && widget.label != "全选")
  129. ? Colors.grey
  130. : _isChecked
  131. ? primaryColor
  132. : Colors.white,
  133. borderRadius: BorderRadius.circular(borderRadius),
  134. border: ((_isAllChecked && widget.label != "全选") || _isChecked)
  135. ? null
  136. : Border.all(color: primaryColor),
  137. ),
  138. child: Row(
  139. mainAxisSize: MainAxisSize.min,
  140. crossAxisAlignment: CrossAxisAlignment.center,
  141. children: [
  142. Text(
  143. widget.label,
  144. style: TextStyle(
  145. color: (_isAllChecked && widget.label != "全选")
  146. ? Colors.black
  147. : _isChecked
  148. ? Colors.white
  149. : primaryColor,
  150. fontSize: 16,
  151. ),
  152. ),
  153. ],
  154. ),
  155. ),
  156. ),
  157. ),
  158. ),
  159. );
  160. }
  161. }
  162. class ContractStateSelectLabelView extends StatefulWidget {
  163. final List<ContractStateEnum> ContractStateEnums;
  164. final Function selectRaidoChange;
  165. final ContractStateEnum? selectContractState;
  166. const ContractStateSelectLabelView(
  167. {super.key,
  168. required this.ContractStateEnums,
  169. required this.selectRaidoChange,
  170. this.selectContractState});
  171. @override
  172. State<StatefulWidget> createState() => _ContractStateSelectLabelState();
  173. }
  174. class _ContractStateSelectLabelState
  175. extends State<ContractStateSelectLabelView> {
  176. late List<ContractStateEnum> ContractStateEnums;
  177. String selectContractState = "0";
  178. final Map<String, String> ContractStateMap = {
  179. "All": "未选择",
  180. "Unsigned": "未签约",
  181. "Cancelled": "已取消",
  182. "Expired": "已过期",
  183. "Signed": "已签约",
  184. "Voided": "已解约",
  185. "Refused": "已拒绝",
  186. };
  187. @override
  188. void initState() {
  189. super.initState();
  190. ContractStateEnums = widget.ContractStateEnums;
  191. if (widget.selectContractState != null) {
  192. selectContractState = widget.selectContractState!.name;
  193. } else {
  194. selectContractState = "0";
  195. }
  196. }
  197. @override
  198. Widget build(BuildContext context) {
  199. return Wrap(
  200. spacing: 16,
  201. runSpacing: 12,
  202. children: [
  203. buildItem(LabelDTO(code: "0", labelName: "全选"), context),
  204. ...ContractStateEnums.map((ContractStateEnum e) => buildItem(
  205. LabelDTO(code: e.name, labelName: ContractStateMap[e.name]),
  206. context)).toList(),
  207. ],
  208. );
  209. }
  210. Widget buildItem(LabelDTO dto, BuildContext context) {
  211. return InkWell(
  212. child: VCheckBoxButton(
  213. key: GlobalKey(),
  214. label: dto.labelName ?? '',
  215. isChecked: selectContractState == dto.code,
  216. // isAllChecked: selectContractState == "0",
  217. onChanged: (value) {
  218. // if (selectContractState == "0" && dto.code != "0") {
  219. // return;
  220. // }
  221. selectContractState = dto.code ?? '0';
  222. widget.selectRaidoChange(dto.code);
  223. setState(() {});
  224. },
  225. ),
  226. );
  227. }
  228. }