home_view.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import 'package:flutter/material.dart';
  2. import 'package:provider/provider.dart';
  3. import 'package:sis_flutter/data/session/session_storage.dart';
  4. import 'package:sis_flutter/models/usuario_model.dart';
  5. import 'package:sis_flutter/services/usuario_session_service.dart';
  6. import 'package:sis_flutter/viewmodels/login_view_model.dart';
  7. import 'package:sis_flutter/viewmodels/tarea_view_model.dart';
  8. import 'package:sis_flutter/viewmodels/viewmodels.dart';
  9. import 'package:sis_flutter/widgets/app_dropdown_search.dart';
  10. import '../../models/actividad_model.dart';
  11. import '../../themes/themes.dart';
  12. class HomeBody extends StatefulWidget {
  13. const HomeBody({
  14. super.key,
  15. });
  16. @override
  17. State<HomeBody> createState() => _HomeBodyState();
  18. }
  19. class _HomeBodyState extends State<HomeBody> {
  20. Usuario? _usuario;
  21. List<Usuario> _usuariosList = [];
  22. TextEditingController _usuariosController = TextEditingController();
  23. @override
  24. void initState() {
  25. super.initState();
  26. final idUsuario =
  27. Provider.of<LoginViewModel>(context, listen: false).idUsuario;
  28. _fetchActividad(idUsuario);
  29. _loadUsuarios();
  30. }
  31. @override
  32. void dispose() {
  33. super.dispose();
  34. }
  35. Future<void> _loadUsuarios() async {
  36. final usuario = await getUsuarioFromSessionStorage();
  37. final idUsuario = usuario.id;
  38. final usuariosList =
  39. await Provider.of<UsuariosViewModel>(context, listen: false)
  40. .fetchUsuarios(idUsuario, 20, 0);
  41. setState(() {
  42. _usuario = usuario;
  43. _usuariosList = usuariosList;
  44. });
  45. }
  46. Future _fetchActividad(String? idUsuario) async {
  47. idUsuario ??= Provider.of<LoginViewModel>(context, listen: false).idUsuario;
  48. Provider.of<PrioridadesViewMode>(context, listen: false)
  49. .fetchActividad(idUsuario);
  50. }
  51. @override
  52. Widget build(BuildContext context) {
  53. var vm = Provider.of<PrioridadesViewMode>(context);
  54. var actividadDetalle = vm.actividadList;
  55. var usuario = Provider.of<LoginViewModel>(context, listen: false);
  56. final height = MediaQuery.of(context).size.height;
  57. return SafeArea(
  58. child: SingleChildScrollView(
  59. child: Column(
  60. children: [
  61. Container(
  62. padding: const EdgeInsets.all(10),
  63. decoration: const BoxDecoration(
  64. color: Colors.white,
  65. borderRadius:
  66. BorderRadius.vertical(bottom: Radius.circular(15))),
  67. child: Padding(
  68. padding: const EdgeInsets.all(8.0),
  69. child: Column(
  70. mainAxisAlignment: MainAxisAlignment.start,
  71. crossAxisAlignment: CrossAxisAlignment.start,
  72. children: [
  73. const Text("Bienvenido ",
  74. style: TextStyle(
  75. fontSize: 25,
  76. )),
  77. Text(_usuario!.name! ?? usuario.name!,
  78. style: const TextStyle(
  79. fontSize: 45,
  80. fontWeight: FontWeight.bold,
  81. height: -1)),
  82. const SizedBox(height: 10),
  83. Container(
  84. decoration: BoxDecoration(
  85. borderRadius: BorderRadius.circular(10),
  86. ),
  87. child: AppDropdownSearch<Usuario>(
  88. controller: _usuariosController,
  89. itemAsString: (u) => u.name!,
  90. selectedItem: _usuario,
  91. compareFn: (item1, item2) {
  92. return item1.id == item2.id;
  93. },
  94. onChanged: (selectedUsuario) {
  95. if (selectedUsuario != null) {
  96. _fetchActividad(selectedUsuario.id);
  97. }
  98. },
  99. items: _usuariosList,
  100. etiqueta: "Actividades",
  101. )),
  102. ]),
  103. ),
  104. ),
  105. const SizedBox(height: 10),
  106. SizedBox(
  107. width: double.infinity,
  108. height: height * 0.9,
  109. child: ListView.builder(
  110. itemCount: actividadDetalle.length,
  111. itemBuilder: (context, index) {
  112. var actividad = actividadDetalle[index];
  113. return _infoCard(actividad);
  114. }),
  115. ),
  116. ],
  117. ),
  118. ),
  119. );
  120. }
  121. Card _infoCard(Actividad actividad) {
  122. List<Widget> tareaWidgets = [];
  123. for (var tarea in actividad.tareas!) {
  124. final posicion = (actividad.tareas!.indexOf(tarea) + 1).toString();
  125. tareaWidgets.add(
  126. ListTile(
  127. title: Text(tarea.contenido!),
  128. subtitle: Text("Subtarea ${tarea.iops}"),
  129. ),
  130. );
  131. }
  132. return Card(
  133. margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8),
  134. elevation: 4,
  135. shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(6.0)),
  136. child: ExpansionTile(
  137. backgroundColor: Colors.white24,
  138. leading: const Icon(Icons.local_fire_department_rounded),
  139. title: Text(
  140. "${actividad.nombreProyecto!} - ${actividad.nombre!} ",
  141. style: const TextStyle(
  142. fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black54),
  143. strutStyle: const StrutStyle(fontWeight: FontWeight.bold),
  144. ),
  145. trailing: const Icon(Icons.arrow_drop_down),
  146. subtitle: Row(
  147. mainAxisAlignment: MainAxisAlignment.start,
  148. crossAxisAlignment: CrossAxisAlignment.center,
  149. children: [
  150. Text(actividad.avance!),
  151. const SizedBox(width: 10),
  152. Expanded(
  153. child: ClipRRect(
  154. borderRadius: const BorderRadius.all(Radius.circular(10)),
  155. child: LinearProgressIndicator(
  156. value: double.parse(actividad.avance!) / 100,
  157. backgroundColor: Colors.grey,
  158. valueColor: const AlwaysStoppedAnimation(AppTheme.primary)),
  159. ),
  160. ),
  161. ],
  162. ),
  163. children: tareaWidgets,
  164. ),
  165. );
  166. }
  167. }