c90Beretta 5 meses atrás
pai
commit
947a557250

+ 4 - 4
lib/data/session/session_storage.dart

@@ -17,22 +17,22 @@ class SessionStorage {
 
   Future<void> saveCorreo(String value) async {
     final preferences = await _getPreferences();
-    await preferences.setString('correo', value);
+    await preferences.setString('email', value);
   }
 
   Future<void> saveNombre(String? value) async {
     final preferences = await _getPreferences();
-    await preferences.setString('nombre', value.toString());
+    await preferences.setString('name', value.toString());
   }
 
   Future<String?> getNombre() async {
     final preferences = await _getPreferences();
-    return preferences.getString('nombre');
+    return preferences.getString('name');
   }
 
   Future<String?> getCorreo() async {
     final preferences = await _getPreferences();
-    return preferences.getString('correo');
+    return preferences.getString('email');
   }
 
   Future<String?> getEmpresa() async {

+ 18 - 26
lib/models/tarea_model.dart

@@ -65,30 +65,22 @@ class Tarea extends Basico {
     );
   }
 
-  // @override
-  // Map<String, dynamic> toJson() => {
-  //       "id": id,
-  //       "id_actividad": idActividad,
-  //       "id_usuario": idUsuario,
-  //       "contenido": contenido,
-  //       "id_tarea_padre": idTareaPadre,
-  //       "terminado": terminado,
-  //       "posicion": posicion,
-  //       "urgencia": urgencia,
-  //       "creado": creado,
-  //       "eliminado": eliminado,
-  //       "id_creador": idCreador,
-  //       "testing": testing,
-  //       "iops": iops,
-  //       "soporte": soporte,
-  //       "prioridad": prioridad,
-  //     };
+  @override
+  Map<String, dynamic> toJson() => {
+        "id": id,
+        "id_actividad": idActividad,
+        "id_usuario": idUsuario,
+        "contenido": contenido,
+        "id_tarea_padre": idTareaPadre,
+        "terminado": terminado,
+        "posicion": posicion,
+        "urgencia": urgencia,
+        "creado": creado,
+        "eliminado": eliminado,
+        "id_creador": idCreador,
+        "testing": testing,
+        "iops": iops,
+        "soporte": soporte,
+        "prioridad": prioridad,
+      };
 }
-
-enum IdCreador {
-  F37_BCVRLNFRDHCH,
-  THE_38_L81_SK35_CNDGB2,
-  THE_4_MGE9_AJMCDM6_ASV
-}
-
-enum Iops { DEFAULT }

+ 8 - 8
lib/models/usuario_model.dart

@@ -1,9 +1,9 @@
 import 'basico_model.dart';
 
 class Usuario extends Basico {
-  String? correo;
+  String? email;
   String? clave;
-  String? nombre;
+  String? name;
   String? estatus;
   String? telefono;
   String? empresa;
@@ -13,9 +13,9 @@ class Usuario extends Basico {
 
   Usuario({
     super.id,
-    this.correo,
+    this.email,
     this.clave,
-    this.nombre,
+    this.name,
     this.estatus,
     this.telefono,
     this.empresa,
@@ -26,9 +26,9 @@ class Usuario extends Basico {
   Map<String, dynamic> toJson() {
     return {
       'id': id,
-      'correo': correo,
+      'email': email,
       'clave': clave,
-      'nombre': nombre,
+      'name': name,
       'estatus': estatus,
       'telefono': telefono,
       'rol': rol,
@@ -37,9 +37,9 @@ class Usuario extends Basico {
 
   Usuario.fromJson(Map<String, dynamic> json) {
     super.parseJson(json);
-    correo = Basico.parseString(json['correo']);
+    email = Basico.parseString(json['correo']);
     clave = Basico.parseString(json['clave']);
-    nombre = Basico.parseString(json['nombre']);
+    name = Basico.parseString(json['nombre']);
     estatus = Basico.parseString(json['estatus']);
     telefono = Basico.parseString(json['telefono']);
     empresa = Basico.parseString(json['empresa']);

+ 9 - 8
lib/viewmodels/login_view_model.dart

@@ -18,11 +18,11 @@ class LoginViewModel extends ChangeNotifier {
   List<String> _permisos = [];
   List<String> get permisos => _permisos;
 
-  String _nombre = "";
-  String get nombre => _nombre;
+  String _name = "";
+  String get name => _name;
 
-  String _correo = "";
-  String get correo => _correo;
+  String _email = "";
+  String get email => _email;
 
   String _empresa = "";
   String get empresa => _empresa;
@@ -50,8 +50,9 @@ class LoginViewModel extends ChangeNotifier {
         if (token.isNotEmpty) {
           SessionStorage().saveToken(apiResponse.detalle?['token']);
           SessionStorage().saveId(apiResponse.detalle?['id']);
-          SessionStorage().saveCorreo(apiResponse.detalle!['correo']);
-          SessionStorage().saveNombre(apiResponse.detalle!['nombre']);
+          SessionStorage().saveCorreo(apiResponse.detalle!['email']);
+          SessionStorage().saveNombre(apiResponse.detalle!['name']);
+          _name = apiResponse.detalle!['name'];
           _status = Status.authenticated;
           _cargando = false;
           notifyListeners();
@@ -95,8 +96,8 @@ class LoginViewModel extends ChangeNotifier {
   }
 
   setValores() async {
-    _nombre = (await SessionStorage().getNombre()).toString();
-    _correo = (await SessionStorage().getCorreo()).toString();
+    _name = (await SessionStorage().getNombre()).toString();
+    _email = (await SessionStorage().getCorreo()).toString();
     _empresa = (await SessionStorage().getEmpresa()).toString();
     notifyListeners();
   }

+ 11 - 11
lib/viewmodels/usuarios_view_model.dart

@@ -88,13 +88,13 @@ class UsuariosViewModel extends ChangeNotifier {
 
   Future<void> guardarModelo({
     required Usuario modelo,
-    required String nombre,
-    required String correo,
+    required String name,
+    required String email,
     required String telefono,
   }) async {
     //?TEMPORAL
-    modelo.nombre = nombre;
-    modelo.correo = correo;
+    modelo.name = name;
+    modelo.name = email;
     modelo.telefono = telefono;
     modelo.creado = DateTime.now();
     notifyListeners();
@@ -102,15 +102,15 @@ class UsuariosViewModel extends ChangeNotifier {
 
   Future<void> guardarUsuario({
     required Usuario modelo,
-    required String nombre,
-    required String correo,
+    required String name,
+    required String email,
     required List<String> permisosSeleccionados,
   }) async {
     setIsLoading(true);
     try {
       var requestBody = {
-        'nombre': nombre,
-        'correo': correo,
+        'name': name,
+        'email': email,
         'permisos': permisosSeleccionados,
       };
 
@@ -133,10 +133,10 @@ class UsuariosViewModel extends ChangeNotifier {
   }
 
   bool validarUsuario({
-    required String nombre,
-    required String correo,
+    required String name,
+    required String email,
   }) {
-    if (nombre.isEmpty || correo.isEmpty) {
+    if (name.isEmpty || email.isEmpty) {
       return false;
     }
     return true;

+ 66 - 47
lib/views/home/home_screen.dart

@@ -1,14 +1,16 @@
+// ignore_for_file: use_build_context_synchronously
+
 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_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';
+
+import '../../data/session/session_storage.dart';
 
 class HomeScreen extends StatefulWidget {
   static const String route = '/home';
@@ -20,11 +22,6 @@ class HomeScreen extends StatefulWidget {
 }
 
 class Formulario extends State<HomeScreen> {
-  DateTime? fechaInicio = DateTime.now();
-  DateTime? fechaFin;
-  ScrollController horizontalScrollController = ScrollController();
-  ScrollController verticalScrollController = ScrollController();
-
   @override
   void initState() {
     super.initState();
@@ -33,37 +30,29 @@ class Formulario extends State<HomeScreen> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      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: "Actividades",
+      backgroundColor: AppTheme.progressBackground,
+      appBar: AppBar(
+        backgroundColor: Colors.white,
       ),
-      body: const Bodytest(),
+      drawerScrimColor:
+          const Color.fromARGB(255, 119, 119, 119).withOpacity(0.5),
+      drawer: AppDrawer(),
+      body: const SafeArea(child: HomeBody()),
       bottomNavigationBar: const CustomBottomNavigationBar(),
     );
   }
 }
 
-class Bodytest extends StatefulWidget {
-  const Bodytest({
+class HomeBody extends StatefulWidget {
+  const HomeBody({
     super.key,
   });
 
   @override
-  State<Bodytest> createState() => _BodytestState();
+  State<HomeBody> createState() => _HomeBodyState();
 }
 
-class _BodytestState extends State<Bodytest> {
+class _HomeBodyState extends State<HomeBody> {
   @override
   void initState() {
     super.initState();
@@ -71,10 +60,6 @@ class _BodytestState extends State<Bodytest> {
       () async {
         final idusuario =
             Provider.of<LoginViewModel>(context, listen: false).idUsuario;
-
-        // Provider.of<PrioridadesViewMode>(context, listen: false)
-        //     .fetchPriodidades(idusuario);
-
         Provider.of<PrioridadesViewMode>(context, listen: false)
             .fetchActividad(idusuario);
       },
@@ -91,15 +76,58 @@ class _BodytestState extends State<Bodytest> {
     var vm = Provider.of<PrioridadesViewMode>(context);
     // var prioridades = vm.prioridades;
     var actividadDetalle = vm.actividadList;
-
+    var usuario = Provider.of<LoginViewModel>(context, listen: false);
     final height = MediaQuery.of(context).size.height;
-    final width = MediaQuery.of(context).size.width;
 
     return SingleChildScrollView(
       child: Column(
-        mainAxisAlignment: MainAxisAlignment.start,
         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,
+                        style: const TextStyle(
+                            fontSize: 45,
+                            fontWeight: FontWeight.bold,
+                            height: -1)),
+                    const SizedBox(height: 10),
+                    Container(
+                      decoration: BoxDecoration(
+                        borderRadius: BorderRadius.circular(10),
+                        color: const Color.fromARGB(141, 232, 234, 237),
+                      ),
+                      child: const TextField(
+                        decoration: InputDecoration(
+                            contentPadding: EdgeInsets.symmetric(vertical: 15),
+                            border: InputBorder.none,
+                            prefix: Icon(
+                              Icons.search,
+                              color: Colors.black87,
+                            ),
+                            hintText: "Busqueda por Usuarios",
+                            hintStyle:
+                                TextStyle(color: Colors.grey, fontSize: 15)),
+                      ),
+                    ),
+                  ]),
+            ),
+          ),
+          const SizedBox(height: 10),
+          SizedBox(
+            width: double.infinity,
             height: height * 0.9,
             child: ListView.builder(
                 itemCount: actividadDetalle.length,
@@ -134,7 +162,8 @@ class _BodytestState extends State<Bodytest> {
         leading: const Icon(Icons.local_fire_department_rounded),
         title: Text(
           "${actividad.nombreProyecto!} - ${actividad.nombre!} ",
-          style: const TextStyle(fontSize: 20),
+          style: const TextStyle(
+              fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black54),
           strutStyle: const StrutStyle(fontWeight: FontWeight.bold),
         ),
         trailing: const Icon(Icons.arrow_drop_down),
@@ -148,12 +177,9 @@ class _BodytestState extends State<Bodytest> {
               child: ClipRRect(
                 borderRadius: const BorderRadius.all(Radius.circular(10)),
                 child: LinearProgressIndicator(
-                  value: double.parse(actividad.avance!) / 100,
-                  backgroundColor: Colors.grey,
-                  valueColor: AlwaysStoppedAnimation<Color>(
-                    _calcularColorPorcentaje(actividad.avance!),
-                  ),
-                ),
+                    value: double.parse(actividad.avance!) / 100,
+                    backgroundColor: Colors.grey,
+                    valueColor: const AlwaysStoppedAnimation(AppTheme.primary)),
               ),
             ),
           ],
@@ -163,10 +189,3 @@ class _BodytestState extends State<Bodytest> {
     );
   }
 }
-
-Color _calcularColorPorcentaje(String avance) {
-  final porcentaje = double.parse(avance);
-  if (porcentaje > 66) return Colors.green;
-  if (porcentaje > 33) return Colors.orange;
-  return Colors.red;
-}

+ 4 - 2
lib/widgets/app_drawer.dart

@@ -44,8 +44,8 @@ class AppDrawer extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    String? nombre = Provider.of<LoginViewModel>(context).nombre.toString();
-    String? correo = Provider.of<LoginViewModel>(context).correo.toString();
+    String? nombre = Provider.of<LoginViewModel>(context).name.toString();
+    String? correo = Provider.of<LoginViewModel>(context).email.toString();
     final avm = Provider.of<AdministracionViewModel>(context);
     List<String> permisos = avm.lospermisos;
     return Drawer(
@@ -76,6 +76,7 @@ class AppDrawer extends StatelessWidget {
                 Text(
                   nombre.toString(),
                   style: const TextStyle(
+                    color: Colors.white,
                     fontSize: 18,
                     fontWeight: FontWeight.bold,
                   ),
@@ -86,6 +87,7 @@ class AppDrawer extends StatelessWidget {
                 Text(
                   correo.toString(),
                   style: const TextStyle(
+                    color: Colors.white,
                     fontSize: 15,
                     fontWeight: FontWeight.bold,
                   ),

+ 161 - 0
lib/widgets/app_dropdown_search.dart

@@ -0,0 +1,161 @@
+import 'package:dropdown_search/dropdown_search.dart';
+import 'package:flutter/material.dart';
+import '../themes/themes.dart';
+
+class AppDropdownSearch extends StatelessWidget {
+  final void Function(dynamic)? onChanged;
+  final dynamic selectedItem;
+  final String? etiqueta;
+  final TextEditingController controller;
+  final String Function(dynamic)? itemAsString;
+  final Future<List<dynamic>> Function(String)? asyncItems;
+  final bool enabled;
+  final List<dynamic> items;
+  final String? Function(dynamic)? validator;
+  final dynamic Function()? onPressedClear;
+
+  const AppDropdownSearch({
+    super.key,
+    required this.controller,
+    this.itemAsString,
+    this.asyncItems,
+    this.etiqueta,
+    this.selectedItem,
+    this.onChanged,
+    this.onPressedClear,
+    this.validator,
+    this.enabled = true,
+    this.items = const [],
+  });
+
+  double _getFontSize(BuildContext context) {
+    double screenWidth = MediaQuery.of(context).size.width;
+    if (screenWidth < 480) {
+      return 12;
+    } else if (screenWidth < 800) {
+      return 15;
+    }
+    return 16;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    double fontSize = _getFontSize(context);
+    TextStyle dropdownTextStyle = TextStyle(fontSize: fontSize);
+
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        if (etiqueta != null)
+          Text(
+            etiqueta.toString(),
+            style: TextStyle(fontSize: fontSize, fontWeight: FontWeight.bold),
+          ),
+        if (etiqueta != null) const SizedBox(height: 5),
+        DropdownSearch(
+          suffixProps: DropdownSuffixProps(
+            clearButtonProps: ClearButtonProps(
+              isVisible: true,
+              icon: const Icon(Icons.clear),
+              iconSize: 20,
+            ),
+          ),
+          validator: validator,
+          onChanged: onChanged,
+          // asyncItems: asyncItems,
+          // items: items,
+          itemAsString: itemAsString,
+          selectedItem: selectedItem,
+          enabled: enabled,
+          popupProps: PopupProps.menu(
+            emptyBuilder: (context, searchEntry) => Center(
+              child: Column(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: [
+                  Icon(Icons.inbox, size: 60, color: Colors.grey),
+                  const SizedBox(height: 10),
+                  Text(
+                    'No se encontró información',
+                    style: dropdownTextStyle,
+                  ),
+                ],
+              ),
+            ),
+            // isFilterOnline: true,
+            showSearchBox: true,
+            searchFieldProps: TextFieldProps(
+              controller: controller,
+              autofocus: true,
+              decoration: InputDecoration(
+                hintText: 'Teclee para buscar',
+                hintStyle: dropdownTextStyle,
+                suffixIcon: const Icon(Icons.search, color: Colors.grey),
+                fillColor: Colors.white,
+                focusedBorder: UnderlineInputBorder(
+                  borderSide: BorderSide(color: AppTheme.primary),
+                ),
+                enabledBorder: const UnderlineInputBorder(
+                  borderSide: BorderSide(color: Colors.grey),
+                ),
+                errorBorder: UnderlineInputBorder(
+                  borderSide: BorderSide(
+                    color: Colors.grey[400]!,
+                  ),
+                ),
+                focusedErrorBorder: UnderlineInputBorder(
+                  borderSide: BorderSide(
+                    color: AppTheme.primary,
+                  ),
+                ),
+                floatingLabelStyle: TextStyle(
+                  color: AppTheme.primary,
+                  fontSize: fontSize,
+                ),
+              ),
+            ),
+          ),
+          decoratorProps: DropDownDecoratorProps(
+            baseStyle: dropdownTextStyle,
+            decoration: InputDecoration(
+              fillColor: Colors.white,
+              suffixIcon: Icon(
+                Icons.arrow_drop_down_circle,
+                color: AppTheme.primary,
+              ),
+              focusedBorder: OutlineInputBorder(
+                borderRadius: BorderRadius.circular(10),
+                borderSide: BorderSide(
+                  color: AppTheme.primary,
+                ),
+              ),
+              enabledBorder: OutlineInputBorder(
+                borderRadius: BorderRadius.circular(10),
+                borderSide: BorderSide(
+                  color: Colors.grey[400]!,
+                ),
+              ),
+              errorBorder: OutlineInputBorder(
+                borderRadius: BorderRadius.circular(10),
+                borderSide: BorderSide(
+                  color: Colors.grey[300]!,
+                ),
+              ),
+              focusedErrorBorder: OutlineInputBorder(
+                borderRadius: BorderRadius.circular(10),
+                borderSide: BorderSide(
+                  color: AppTheme.primary,
+                ),
+              ),
+              disabledBorder: OutlineInputBorder(
+                borderRadius: BorderRadius.circular(10),
+                borderSide: BorderSide(
+                  color: Colors.grey[300]!,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 5 - 5
lib/widgets/custom_bottom_navigation_bar.dart

@@ -9,28 +9,28 @@ class CustomBottomNavigationBar extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return BottomNavigationBar(
-      backgroundColor: AppTheme.divider,
+      backgroundColor: Colors.white,
       selectedItemColor: AppTheme.primary,
-      unselectedItemColor: Colors.white,
+      unselectedItemColor: Colors.black87,
       items: const [
         BottomNavigationBarItem(
           icon: Icon(
             Icons.home,
-            color: Colors.white,
+            color: Colors.black87,
           ),
           label: 'Inicio',
         ),
         BottomNavigationBarItem(
           icon: Icon(
             Icons.calendar_today,
-            color: Colors.white,
+            color: Colors.black87,
           ),
           label: 'Calendario',
         ),
         BottomNavigationBarItem(
           icon: Icon(
             Icons.person,
-            color: Colors.white,
+            color: Colors.black87,
           ),
           label: "Perfil",
         ),

+ 1 - 2
lib/widgets/widgets_components.dart

@@ -1,6 +1,5 @@
 // ignore_for_file: use_build_context_synchronously, prefer_if_null_operators, prefer_conditional_assignment, must_be_immutable, deprecated_member_use
 
-import 'dart:convert';
 import 'dart:io';
 import 'package:camera/camera.dart';
 import 'package:flutter/foundation.dart';
@@ -42,7 +41,7 @@ encabezado(
 
   if (BaseService().baseUrl.contains("test") ||
       BaseService().base_url.contains("test")) {
-    backgroundColor = Colors.grey.shade500;
+    // backgroundColor = Colors.grey.shade500;
   }
 
   return AppBar(