crowd_select_label.dart 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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.allLabels
  27. .map((LabelDTO e) => buildItem(e, context))
  28. .toList(),
  29. ],
  30. ));
  31. }
  32. Widget buildItem(LabelDTO dto, BuildContext context) {
  33. return InkWell(
  34. child: VCheckBoxButton(
  35. key: GlobalKey(),
  36. label: dto.labelName ?? '',
  37. isChecked: controller.state.isAllSelect
  38. ? controller.state.isAllSelect
  39. : controller.state.selectedFilterCodes.contains(dto.code),
  40. isAllChecked: controller.state.isAllSelect,
  41. onChanged: (value) {
  42. if (controller.state.isAllSelect && dto.code != "0") {
  43. return;
  44. }
  45. controller.onItemCheckFilterChanged(dto.code!);
  46. if (controller.state.selectedFilterCodes.length == 7) {
  47. controller.state.isAllSelect = true;
  48. }
  49. setState(() {});
  50. },
  51. ),
  52. );
  53. }
  54. }
  55. /// 按钮式多选框
  56. class VCheckBoxButton extends StatefulWidget {
  57. /// 文本
  58. final String label;
  59. /// 是否默认选中
  60. final bool? isChecked;
  61. /// 是否默认选中
  62. final bool? isAllChecked;
  63. /// 选中状态变更
  64. final ValueChanged<bool>? onChanged;
  65. const VCheckBoxButton({
  66. super.key,
  67. required this.label,
  68. this.isChecked,
  69. this.onChanged,
  70. this.isAllChecked,
  71. });
  72. @override
  73. State<StatefulWidget> createState() => _VCheckBoxState();
  74. }
  75. class _VCheckBoxState extends State<VCheckBoxButton> {
  76. bool _isChecked = false;
  77. bool _isAllChecked = false;
  78. @override
  79. void initState() {
  80. if (widget.isChecked != null) {
  81. _isChecked = widget.isChecked!;
  82. }
  83. if (widget.isAllChecked != null) {
  84. _isAllChecked = widget.isAllChecked!;
  85. }
  86. super.initState();
  87. }
  88. @override
  89. Widget build(BuildContext context) {
  90. const height = 40.0;
  91. const borderRadius = height / 3;
  92. final primaryColor = Theme.of(context).primaryColor;
  93. return Material(
  94. child: Ink(
  95. child: InkWell(
  96. borderRadius: BorderRadius.circular(borderRadius),
  97. onTap: () {
  98. setState(() {
  99. _isChecked = !_isChecked;
  100. widget.onChanged?.call(_isChecked);
  101. });
  102. },
  103. child: IntrinsicWidth(
  104. child: Container(
  105. padding: const EdgeInsets.only(left: 10, right: 10),
  106. constraints: const BoxConstraints(minWidth: 150),
  107. alignment: Alignment.center,
  108. height: height,
  109. decoration: BoxDecoration(
  110. color: (_isAllChecked && widget.label != "全选")
  111. ? Colors.grey.shade400
  112. : _isChecked
  113. ? primaryColor
  114. : Colors.white,
  115. borderRadius: BorderRadius.circular(borderRadius),
  116. border: ((_isAllChecked && widget.label != "全选") || _isChecked)
  117. ? null
  118. : Border.all(color: primaryColor),
  119. ),
  120. child: Row(
  121. mainAxisSize: MainAxisSize.min,
  122. crossAxisAlignment: CrossAxisAlignment.center,
  123. children: [
  124. Text(
  125. widget.label,
  126. style: TextStyle(
  127. color: (_isAllChecked && widget.label != "全选")
  128. ? Colors.white
  129. : _isChecked
  130. ? Colors.white
  131. : primaryColor,
  132. fontSize: 16,
  133. ),
  134. ),
  135. ],
  136. ),
  137. ),
  138. ),
  139. ),
  140. ),
  141. );
  142. }
  143. }
  144. class ContractStateSelectLabelView extends StatefulWidget {
  145. final List<ContractStateEnum> ContractStateEnums;
  146. final Function selectRaidoChange;
  147. final ContractStateEnum? selectContractState;
  148. const ContractStateSelectLabelView(
  149. {super.key,
  150. required this.ContractStateEnums,
  151. required this.selectRaidoChange,
  152. this.selectContractState});
  153. @override
  154. State<StatefulWidget> createState() => _ContractStateSelectLabelState();
  155. }
  156. class _ContractStateSelectLabelState
  157. extends State<ContractStateSelectLabelView> {
  158. late List<ContractStateEnum> ContractStateEnums;
  159. String selectContractState = "0";
  160. final Map<String, String> ContractStateMap = {
  161. "Unsigned": "未签约",
  162. "Cancelled": "已解约",
  163. "Expired": "已过期",
  164. "Signed": "已签约",
  165. "Voided": "已作废",
  166. "Refused": "已拒签",
  167. };
  168. @override
  169. void initState() {
  170. super.initState();
  171. ContractStateEnums = widget.ContractStateEnums;
  172. if (widget.selectContractState != null) {
  173. selectContractState = widget.selectContractState!.name;
  174. } else {
  175. selectContractState = "0";
  176. }
  177. }
  178. @override
  179. Widget build(BuildContext context) {
  180. return Wrap(
  181. spacing: 16,
  182. runSpacing: 12,
  183. children: [
  184. buildItem(LabelDTO(code: "0", labelName: "全选"), context),
  185. ...ContractStateEnums.map((ContractStateEnum e) => buildItem(
  186. LabelDTO(code: e.name, labelName: ContractStateMap[e.name]),
  187. context)).toList(),
  188. ],
  189. );
  190. }
  191. Widget buildItem(LabelDTO dto, BuildContext context) {
  192. return InkWell(
  193. child: VCheckBoxButton(
  194. key: GlobalKey(),
  195. label: dto.labelName ?? '',
  196. isChecked: selectContractState == dto.code,
  197. // isAllChecked: selectContractState == "0",
  198. onChanged: (value) {
  199. // if (selectContractState == "0" && dto.code != "0") {
  200. // return;
  201. // }
  202. selectContractState = dto.code ?? '0';
  203. widget.selectRaidoChange(dto.code);
  204. setState(() {});
  205. },
  206. ),
  207. );
  208. }
  209. }
  210. class ScopeEnquiryResidents extends StatefulWidget {
  211. final Function selectRaidoChange;
  212. final int? selectIndex;
  213. const ScopeEnquiryResidents({
  214. super.key,
  215. required this.selectRaidoChange,
  216. this.selectIndex,
  217. });
  218. @override
  219. State<StatefulWidget> createState() => _ScopeEnquiryResidentsState();
  220. }
  221. class _ScopeEnquiryResidentsState extends State<ScopeEnquiryResidents> {
  222. int selectIndex = 0;
  223. @override
  224. void initState() {
  225. super.initState();
  226. if (widget.selectIndex != null) {
  227. selectIndex = widget.selectIndex!;
  228. } else {
  229. selectIndex = 0;
  230. }
  231. }
  232. @override
  233. Widget build(BuildContext context) {
  234. return Wrap(
  235. spacing: 16,
  236. runSpacing: 12,
  237. children: [
  238. buildItem(LabelDTO(code: "0", labelName: "仅当前医生建档"), context),
  239. buildItem(LabelDTO(code: "1", labelName: "当前团队所有居民"), context),
  240. ],
  241. );
  242. }
  243. Widget buildItem(LabelDTO dto, BuildContext context) {
  244. return InkWell(
  245. child: VCheckBoxButton(
  246. key: GlobalKey(),
  247. label: dto.labelName ?? '',
  248. isChecked: selectIndex.toString() == dto.code,
  249. // isAllChecked: selectContractState == "0",
  250. onChanged: (value) {
  251. // if (selectContractState == "0" && dto.code != "0") {
  252. // return;
  253. // }
  254. selectIndex = int.parse(dto.code!);
  255. widget.selectRaidoChange(selectIndex);
  256. setState(() {});
  257. },
  258. ),
  259. );
  260. }
  261. }