ソースを参照

working models

c90Beretta 5 ヶ月 前
コミット
f247f1b030

+ 1 - 1
lib/main.dart

@@ -1,7 +1,7 @@
 //import 'package:fluent_ui/fluent_ui.dart';
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
-import 'package:sis_flutter/viewmodels/tarea_view_mode.dart';
+import 'package:sis_flutter/viewmodels/tarea_view_model.dart';
 import '../themes/themes.dart';
 import 'views/home/home_screen.dart';
 import 'views/login/login_screen.dart';

+ 38 - 0
lib/models/actividad_model.dart

@@ -0,0 +1,38 @@
+import 'package:sis_flutter/models/basico_model.dart';
+import 'package:sis_flutter/models/tarea_model.dart';
+
+class Actividad extends Basico {
+  final String? nombre;
+  final String? avance;
+  final List<Tarea>? tareas;
+  final int? prioridad;
+  final String? nombreProyecto;
+  final String? idProyecto;
+
+  Actividad({
+    super.id,
+    this.nombre,
+    this.avance,
+    this.tareas,
+    this.prioridad,
+    this.nombreProyecto,
+    this.idProyecto,
+  });
+
+  factory Actividad.fromJson(Map<String, dynamic> json) {
+    var tareasPendientesjson = json["tareasPendientes"] as List<dynamic>;
+    List<Tarea> tareasPendientesList = tareasPendientesjson
+        .map((e) => Tarea.fromJson(e as Map<String, dynamic>))
+        .toList();
+
+    return Actividad(
+      id: Basico.parseString(json["id"]),
+      nombre: Basico.parseString(json["nombre"]),
+      avance: Basico.parseString(json["avance"]),
+      tareas: tareasPendientesList,
+      prioridad: Basico.parseInt(json["prioridad"]),
+      nombreProyecto: Basico.parseString(json["nombreProyecto"]),
+      idProyecto: Basico.parseString(json["idProyecto"]),
+    );
+  }
+}

+ 3 - 36
lib/models/tarea_model.dart

@@ -1,49 +1,16 @@
 // ignore_for_file: constant_identifier_names
 
+import 'package:sis_flutter/models/actividad_model.dart';
 import 'package:sis_flutter/models/models.dart';
 
 class PrioridadesPersonaResponse extends Basico {
-  final List<Detalle> detalle;
+  final List<Actividad> detalle;
 
   PrioridadesPersonaResponse({
     required this.detalle,
   });
 }
 
-class Detalle extends Basico {
-  final String? nombre;
-  final String? avance;
-  final List<Tarea>? tareas;
-  final int? prioridad;
-  final String? nombreProyecto;
-  final String? idProyecto;
-
-  Detalle({
-    super.id,
-    this.nombre,
-    this.avance,
-    this.tareas,
-    this.prioridad,
-    this.nombreProyecto,
-    this.idProyecto,
-  });
-
-  factory Detalle.fromJson(Map<String, dynamic> json) {
-    return Detalle(
-      id: Basico.parseString(json["id"]),
-      nombre: Basico.parseString(json["nombre"]),
-      avance: Basico.parseString(json["avance"]),
-      tareas: (json["tareasPendientes"] as List)
-          .map((e) => Tarea.fromJson(e))
-          .toList()
-          .cast(),
-      prioridad: Basico.parseInt(json["prioridad"]),
-      nombreProyecto: Basico.parseString(json["nombreProyecto"]),
-      idProyecto: Basico.parseString(json["idProyecto"]),
-    );
-  }
-}
-
 class Tarea extends Basico {
   final int? idActividad;
   final String? idUsuario;
@@ -80,7 +47,7 @@ class Tarea extends Basico {
 
   factory Tarea.fromJson(Map<String, dynamic> json) {
     return Tarea(
-      id: Basico.parseString("${json["id"]}"),
+      id: Basico.parseString(json["id"]),
       idActividad: Basico.parseInt(json["id_actividad"]),
       idUsuario: Basico.parseString(json["id_usuario"]),
       contenido: Basico.parseString(json["contenido"]),

+ 8 - 34
lib/services/tarea_service.dart

@@ -1,36 +1,12 @@
 import 'dart:convert';
-
-import 'package:sis_flutter/data/api_response.dart';
+import 'package:sis_flutter/models/actividad_model.dart';
 import 'package:sis_flutter/models/tarea_model.dart';
 import 'package:sis_flutter/services/base_service.dart';
 
 class PrioridadesService extends BaseService {
   final endpoint = "/v1/actividad/prioridades";
 
-  Future<List<Tarea>> getPrioridades(String idUsuario) async {
-    var r = await get(endpoint, headers: {
-      'Content-Type': 'application/json'
-    }, queryParameters: {
-      'usuario': idUsuario,
-    });
-
-    var body = jsonDecode(r.body);
-    var detalle = (body['detalle'] as List<dynamic>)
-        .cast<Map<String, dynamic>>()
-        .toList();
-
-    final List<Tarea> prioridades = [];
-    if (r.statusCode == 200) {
-      for (var i in detalle) {
-        Tarea tareasPendiente = Tarea.fromJson(i);
-        prioridades.add(tareasPendiente);
-      }
-    }
-
-    return prioridades;
-  }
-
-  Future<List<Detalle>> getDetalle(String idUsuario) async {
+  Future<List<Actividad>> getActividad(String idUsuario) async {
     var r = await get(endpoint, headers: {
       'Content-Type': 'application/json'
     }, queryParameters: {
@@ -38,18 +14,16 @@ class PrioridadesService extends BaseService {
     });
 
     var body = jsonDecode(r.body);
-    var detalle = (body['detalle'] as List<dynamic>)
-        .cast<Map<String, dynamic>>()
-        .toList();
+    var actividadbody = (body['detalle']).cast<Map<String, dynamic>>().toList();
 
-    final List<Detalle> prioridades = [];
+    final List<Actividad> actividadList = [];
     if (r.statusCode == 200) {
-      for (var i in detalle) {
-        Detalle detalle = Detalle.fromJson(i);
-        prioridades.add(detalle);
+      for (var i in actividadbody) {
+        Actividad actividadJson = Actividad.fromJson(i);
+        actividadList.add(actividadJson);
       }
     }
 
-    return prioridades;
+    return actividadList;
   }
 }

+ 2 - 1
lib/themes/themes.dart

@@ -3,12 +3,13 @@ import 'package:flutter/material.dart';
 class AppTheme {
   // Colors
   static const Color primary = Color(0xFF1A73E8); // Blue accent
+
   static const Color secondary = Color(0xFFF6A14C); // Orange for icons
   static const Color background = Colors.white;
   static const Color surface = Colors.white;
   static const Color textPrimary = Color(0xFF202124);
   static const Color textSecondary = Color(0xFF5F6368);
-  static const Color divider = Color(0xFFE8EAED);
+  static const Color divider = Color.fromARGB(255, 1, 21, 42);
   static const Color progressBackground = Color(0xFFE8EAED);
 
   // Text Styles

+ 1 - 0
lib/viewmodels/login_view_model.dart

@@ -55,6 +55,7 @@ class LoginViewModel extends ChangeNotifier {
           _status = Status.authenticated;
           _cargando = false;
           notifyListeners();
+          return _status;
         }
       }
       if (apiResponse.isError) {

+ 0 - 27
lib/viewmodels/tarea_view_mode.dart

@@ -1,27 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:sis_flutter/models/tarea_model.dart';
-import 'package:sis_flutter/services/tarea_service.dart';
-
-class PrioridadesViewMode extends ChangeNotifier {
-  List<Tarea> _prioridades = [];
-  List<Tarea> get prioridades => _prioridades;
-
-  List<Detalle> _detalle = [];
-  List<Detalle> get detalle => _detalle;
-
-  Future<List<Tarea>> fetchPriodidades(idUsuario) async {
-    final prioridadesdata =
-        await PrioridadesService().getPrioridades(idUsuario);
-    _prioridades = prioridadesdata;
-    notifyListeners();
-    return _prioridades;
-  }
-
-  Future<List<Detalle>> fetchDetalle(idUsuario) async {
-    final detalledata = await PrioridadesService().getDetalle(idUsuario);
-    _detalle = detalledata;
-    notifyListeners();
-    return _detalle;
-  }
-}

+ 28 - 0
lib/viewmodels/tarea_view_model.dart

@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+import 'package:sis_flutter/models/actividad_model.dart';
+
+// import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/services/tarea_service.dart';
+
+class PrioridadesViewMode extends ChangeNotifier {
+  // List<Tarea> _prioridades = [];
+  // List<Tarea> get prioridades => _prioridades;
+
+  List<Actividad> _actividadlist = [];
+  List<Actividad> get actividadList => _actividadlist;
+
+  // Future<List<Tarea>> fetchPriodidades(idUsuario) async {
+  //   final prioridadesdata =
+  //       await PrioridadesService().getPrioridades(idUsuario);
+  //   _prioridades = prioridadesdata;
+  //   notifyListeners();
+  //   return _prioridades;
+  // }
+
+  Future<List<Actividad>> fetchActividad(idUsuario) async {
+    final detalledata = await PrioridadesService().getActividad(idUsuario);
+    _actividadlist = detalledata;
+    notifyListeners();
+    return _actividadlist;
+  }
+}

+ 48 - 39
lib/views/home/home_screen.dart

@@ -1,10 +1,13 @@
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
+import 'package:sis_flutter/models/actividad_model.dart';
 import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/themes/themes.dart';
 
 import 'package:sis_flutter/viewmodels/login_view_model.dart';
-import 'package:sis_flutter/viewmodels/tarea_view_mode.dart';
+import 'package:sis_flutter/viewmodels/tarea_view_model.dart';
 import 'package:sis_flutter/widgets/app_drawer.dart';
+import 'package:sis_flutter/widgets/custom_bottom_navigation_bar.dart';
 import 'package:sis_flutter/widgets/widgets_components.dart';
 
 class HomeScreen extends StatefulWidget {
@@ -33,13 +36,20 @@ class Formulario extends State<HomeScreen> {
       backgroundColor: Colors.grey.shade200,
       drawer: AppDrawer(),
       appBar: encabezado(
+        estilo: TextStyle(
+          color: Colors.white,
+          fontSize: 20,
+          fontWeight: FontWeight.bold,
+        ),
+        backgroundColor: AppTheme.divider,
         acciones: [
           IconButton(
               onPressed: () {}, icon: const Icon(Icons.restart_alt_rounded)),
         ],
-        titulo: 'Inicio',
+        titulo: "Actividades",
       ),
       body: const Bodytest(),
+      bottomNavigationBar: const CustomBottomNavigationBar(),
     );
   }
 }
@@ -62,11 +72,11 @@ class _BodytestState extends State<Bodytest> {
         final idusuario =
             Provider.of<LoginViewModel>(context, listen: false).idUsuario;
 
-        Provider.of<PrioridadesViewMode>(context, listen: false)
-            .fetchPriodidades(idusuario);
+        // Provider.of<PrioridadesViewMode>(context, listen: false)
+        //     .fetchPriodidades(idusuario);
 
         Provider.of<PrioridadesViewMode>(context, listen: false)
-            .fetchDetalle(idusuario);
+            .fetchActividad(idusuario);
       },
     );
   }
@@ -79,31 +89,42 @@ class _BodytestState extends State<Bodytest> {
   @override
   Widget build(BuildContext context) {
     var vm = Provider.of<PrioridadesViewMode>(context);
-    var prioridades = vm.prioridades;
-    var detalles = vm.detalle;
+    // var prioridades = vm.prioridades;
+    var actividadDetalle = vm.actividadList;
+
+    final height = MediaQuery.of(context).size.height;
+    final width = MediaQuery.of(context).size.width;
 
     return SingleChildScrollView(
       child: Column(
         mainAxisAlignment: MainAxisAlignment.start,
         children: [
-          SizedBox(
-              height: 500,
-              child: ListView.builder(
-                  itemCount: detalles.length,
-                  itemBuilder: (context, index) {
-                    var detalle = detalles[index];
-                    var prioridad = prioridades[index];
-                    return _infoCard(prioridad, detalle);
-                  })),
+          Container(
+            height: height * 0.9,
+            child: ListView.builder(
+                itemCount: actividadDetalle.length,
+                itemBuilder: (context, index) {
+                  var actividad = actividadDetalle[index];
+
+                  return _infoCard(actividad);
+                }),
+          ),
         ],
       ),
     );
   }
 
-  Card _infoCard(Tarea prioridad, Detalle detalle) {
-    print(detalle);
-    print(detalle.nombreProyecto);
-    print(detalle.nombre);
+  Card _infoCard(Actividad actividad) {
+    List<Widget> tareaWidgets = [];
+    for (var tarea in actividad.tareas!) {
+      final posicion = (actividad.tareas!.indexOf(tarea) + 1).toString();
+      tareaWidgets.add(
+        ListTile(
+          title: Text(tarea.contenido!),
+          subtitle: Text("Subtarea $posicion"),
+        ),
+      );
+    }
     return Card(
       margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8),
       elevation: 4,
@@ -112,8 +133,7 @@ class _BodytestState extends State<Bodytest> {
         backgroundColor: Colors.white24,
         leading: const Icon(Icons.local_fire_department_rounded),
         title: Text(
-          //!detalle nombre
-          "${detalle.nombreProyecto!} - ${detalle.nombre!}",
+          "${actividad.nombreProyecto!} - ${actividad.nombre!} ",
           style: const TextStyle(fontSize: 20),
           strutStyle: const StrutStyle(fontWeight: FontWeight.bold),
         ),
@@ -122,34 +142,23 @@ class _BodytestState extends State<Bodytest> {
           mainAxisAlignment: MainAxisAlignment.start,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text(detalle.avance!),
-            const SizedBox(
-                width:
-                    10), // Añadir espacio entre el texto y el indicador de progreso
+            Text(actividad.avance!),
+            const SizedBox(width: 10),
             Expanded(
               child: ClipRRect(
-                borderRadius: BorderRadius.all(Radius.circular(10)),
+                borderRadius: const BorderRadius.all(Radius.circular(10)),
                 child: LinearProgressIndicator(
-                  value: double.parse(detalle.avance!) / 100,
+                  value: double.parse(actividad.avance!) / 100,
                   backgroundColor: Colors.grey,
                   valueColor: AlwaysStoppedAnimation<Color>(
-                    _calcularColorPorcentaje(detalle.avance!),
+                    _calcularColorPorcentaje(actividad.avance!),
                   ),
                 ),
               ),
             ),
           ],
         ),
-        children: [
-          ListTile(
-            title: Text(prioridad.id),
-            subtitle: Text("Subtarea 1"),
-          ),
-          ListTile(
-            title: Text("Tarea 2"),
-            subtitle: Text("Subtarea 2"),
-          ),
-        ],
+        children: tareaWidgets,
       ),
     );
   }

+ 6 - 1
lib/views/login/login_screen.dart

@@ -54,6 +54,7 @@ class _LoginScreenState extends State<LoginScreen> {
               SizedBox(
                 width: size.width < 1200 ? size.width : size.width * .35,
                 child: Card(
+                  color: Colors.white,
                   elevation: 5,
                   shape: RoundedRectangleBorder(
                       borderRadius: BorderRadius.circular(15)),
@@ -117,7 +118,7 @@ class _LoginScreenState extends State<LoginScreen> {
                         ),
                       ),
                       backgroundColor:
-                          MaterialStatePropertyAll(AppTheme.secondary),
+                          MaterialStatePropertyAll(AppTheme.primary),
                     ),
                     onPressed: () async {
                       await loginViewModel.setCargando(true);
@@ -141,6 +142,10 @@ class _LoginScreenState extends State<LoginScreen> {
                                 Row(children: [
                                   Expanded(
                                       child: TextButton(
+                                    style: const ButtonStyle(
+                                      backgroundColor: MaterialStatePropertyAll(
+                                          AppTheme.primary),
+                                    ),
                                     onPressed: () async {
                                       Navigator.pop(context);
                                     },

+ 1 - 1
lib/views/main/main_screen.dart

@@ -18,7 +18,7 @@ class MainScreenState extends State<MainScreen> {
   @override
   void initState() {
     super.initState();
-    Future(() async {
+    Future(() {
       Provider.of<LoginViewModel>(context, listen: false).checkSession();
     });
   }

+ 40 - 0
lib/widgets/custom_bottom_navigation_bar.dart

@@ -0,0 +1,40 @@
+// ignore_for_file: prefer_const_constructors
+
+import 'package:flutter/material.dart';
+import 'package:sis_flutter/themes/themes.dart';
+
+class CustomBottomNavigationBar extends StatelessWidget {
+  const CustomBottomNavigationBar({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return BottomNavigationBar(
+      backgroundColor: AppTheme.divider,
+      selectedItemColor: AppTheme.primary,
+      unselectedItemColor: Colors.white,
+      items: const [
+        BottomNavigationBarItem(
+          icon: Icon(
+            Icons.home,
+            color: Colors.white,
+          ),
+          label: 'Inicio',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(
+            Icons.calendar_today,
+            color: Colors.white,
+          ),
+          label: 'Calendario',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(
+            Icons.person,
+            color: Colors.white,
+          ),
+          label: "Perfil",
+        ),
+      ],
+    );
+  }
+}

+ 2 - 2
lib/widgets/widgets_components.dart

@@ -27,6 +27,7 @@ import 'package:flutter/foundation.dart' show kIsWeb;
 
 encabezado(
     {double elevacion = 1,
+    TextStyle? estilo,
     List<Widget>? acciones,
     PreferredSize? bottom,
     Color? backgroundColor,
@@ -35,8 +36,6 @@ encabezado(
     String? titulo,
     bool centerTitle = true,
     bool withDrawer = false}) {
-  TextStyle estilo = const TextStyle(fontWeight: FontWeight.bold);
-
   if (acciones == null) {
     acciones = [];
   }
@@ -51,6 +50,7 @@ encabezado(
       elevation: elevacion,
       backgroundColor: backgroundColor,
       centerTitle: centerTitle,
+      titleTextStyle: estilo,
       title: titulo == null
           ? Image.asset("assets/logo.png", width: 100)
           : Text(titulo.toString(), style: estilo),