123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_linkify/flutter_linkify.dart';
- import 'package:provider/provider.dart';
- import 'package:sis_flutter/data/session/session_storage.dart';
- import 'package:sis_flutter/models/usuario_model.dart';
- import 'package:sis_flutter/services/usuario_session_service.dart';
- import 'package:sis_flutter/viewmodels/login_view_model.dart';
- import 'package:sis_flutter/viewmodels/actividad_view_model.dart';
- import 'package:sis_flutter/viewmodels/viewmodels.dart';
- import 'package:sis_flutter/widgets/app_dropdown_search.dart';
- import 'package:sis_flutter/widgets/app_loader.dart';
- import 'package:url_launcher/url_launcher.dart';
- import 'package:url_launcher/url_launcher_string.dart';
- import '../../models/actividad_model.dart';
- import '../../themes/themes.dart';
- class HomeBody extends StatefulWidget {
- const HomeBody({
- super.key,
- });
- @override
- State<HomeBody> createState() => _HomeBodyState();
- }
- class _HomeBodyState extends State<HomeBody> {
- Usuario? _usuario;
- List<Usuario> _usuariosList = [];
- TextEditingController _usuariosController = TextEditingController();
- @override
- void initState() {
- super.initState();
- final idUsuario =
- Provider.of<LoginViewModel>(context, listen: false).idUsuario;
- _fetchActividad(idUsuario);
- _loadUsuarios();
- }
- @override
- void dispose() {
- super.dispose();
- }
- Future<void> _loadUsuarios() async {
- final usuario = await getUsuarioFromSessionStorage();
- final idUsuario = usuario.id;
- final usuariosList =
- await Provider.of<UsuariosViewModel>(context, listen: false)
- .fetchUsuarios(idUsuario, 20, 0);
- setState(() {
- _usuario = usuario;
- _usuariosList = usuariosList;
- });
- }
- Future _fetchActividad(String? idUsuario) async {
- idUsuario ??= Provider.of<LoginViewModel>(context, listen: false).idUsuario;
- Provider.of<PrioridadesViewMode>(context, listen: false)
- .fetchActividad(idUsuario);
- }
- @override
- Widget build(BuildContext context) {
- var vm = Provider.of<PrioridadesViewMode>(context);
- var actividadDetalle = vm.actividadList;
- var usuario = Provider.of<LoginViewModel>(context, listen: false);
- final height = MediaQuery.of(context).size.height;
- return SafeArea(
- child: SingleChildScrollView(
- child: Column(
- children: [
- Container(
- padding: const EdgeInsets.all(10),
- decoration: const BoxDecoration(
- color: Colors.white,
- borderRadius:
- BorderRadius.vertical(bottom: Radius.circular(15))),
- child: Padding(
- padding: const EdgeInsets.all(8.0),
- child: Column(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- const Text("Bienvenido ",
- style: TextStyle(
- fontSize: 25,
- )),
- Text(_usuario?.name! ?? "Cargando...",
- style: const TextStyle(
- fontSize: 45,
- fontWeight: FontWeight.bold,
- height: -1)),
- const SizedBox(height: 10),
- Container(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(10),
- ),
- child: AppDropdownSearch<Usuario>(
- controller: _usuariosController,
- itemAsString: (u) => u.name!,
- selectedItem: _usuario,
- compareFn: (item1, item2) {
- return item1.id == item2.id;
- },
- onChanged: (selectedUsuario) {
- if (selectedUsuario != null) {
- _fetchActividad(selectedUsuario.id);
- }
- },
- items: _usuariosList,
- etiqueta: "Actividades",
- )),
- ]),
- ),
- ),
- const SizedBox(height: 10),
- SizedBox(
- width: double.infinity,
- height: height * 0.9,
- child: ListView.builder(
- itemCount: actividadDetalle.length,
- itemBuilder: (context, index) {
- var actividad = actividadDetalle[index];
- return _infoCard(actividad);
- }),
- ),
- ],
- )),
- );
- }
- Card _infoCard(Actividad actividad) {
- List<Widget> tareaWidgets = [];
- for (var tarea in actividad.tareas!) {
- // final posicion = (actividad.tareas!.indexOf(tarea) + 1).toString();
- final Color color = getPrioridadColors(tarea.prioridad!);
- tareaWidgets.add(
- Column(
- children: [
- const FractionallySizedBox(
- widthFactor: 0.75, // 80% of the parent width
- child: Divider(
- color: Colors.grey,
- ),
- ),
- ListTile(
- leading: CircleAvatar(
- backgroundColor: color,
- child: Text(tarea.prioridad.toString()),
- ),
- title: Linkify(
- text: tarea.contenido!,
- onOpen: (link) async {
- if (await canLaunchUrlString(link.url)) {
- await launchUrlString(link.url);
- } else {
- throw CupertinoAlertDialog(
- title: const Text("Error"),
- content: const Text("No se puede abrir el link"),
- actions: [
- CupertinoDialogAction(
- child: const Text("OK"),
- onPressed: () {
- Navigator.of(context).pop();
- },
- )
- ],
- );
- }
- }),
- subtitle: Text(tarea.urgencia!),
- ),
- ],
- ),
- );
- }
- return Card(
- margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8),
- elevation: 4,
- shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(6.0)),
- child: ExpansionTile(
- backgroundColor: Colors.white24,
- leading: SizedBox(
- width: 60,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceAround,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(
- actividad.prioridad!.toString(),
- style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
- ),
- const Icon(Icons.local_fire_department_rounded),
- ],
- ),
- ),
- title: Text(
- "${actividad.nombreProyecto!} - ${actividad.nombre!} ",
- style: const TextStyle(
- fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black54),
- strutStyle: const StrutStyle(fontWeight: FontWeight.bold),
- ),
- trailing: const Icon(Icons.arrow_drop_down),
- subtitle: Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(actividad.avance!),
- const SizedBox(width: 10),
- Expanded(
- child: ClipRRect(
- borderRadius: const BorderRadius.all(Radius.circular(10)),
- child: LinearProgressIndicator(
- value: double.parse(actividad.avance!) / 100,
- backgroundColor: Colors.grey,
- valueColor: const AlwaysStoppedAnimation(AppTheme.primary)),
- ),
- ),
- ],
- ),
- children: tareaWidgets,
- ),
- );
- }
- Color getPrioridadColors(tarea) {
- return tarea == 1
- ? Colors.red
- : tarea == 2
- ? Color.fromARGB(255, 253, 211, 1)
- : tarea == 3
- ? Colors.green
- : tarea == 4
- ? Colors.purple
- : Colors.grey;
- }
- }
|