From 09352a3061afa0e7a4df3590b56716056eefc50c Mon Sep 17 00:00:00 2001 From: Augusto Date: Fri, 28 Jul 2023 11:51:48 -0300 Subject: [PATCH] change arch in admin view --- .../shared/controllers/auth_controller.dart | 2 +- lib/src/views/admin/home/home_screen.dart | 206 ++++++++++++++++++ lib/src/views/admin/item/item_screen.dart | 112 ++++++++++ lib/src/views/admin/user/user_screen.dart | 72 ++++++ 4 files changed, 391 insertions(+), 1 deletion(-) create mode 100644 lib/src/views/admin/home/home_screen.dart create mode 100644 lib/src/views/admin/item/item_screen.dart create mode 100644 lib/src/views/admin/user/user_screen.dart diff --git a/lib/src/shared/controllers/auth_controller.dart b/lib/src/shared/controllers/auth_controller.dart index 1b070a5..1211c7e 100644 --- a/lib/src/shared/controllers/auth_controller.dart +++ b/lib/src/shared/controllers/auth_controller.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pizzaria/src/shared/handlers/handlers.dart'; -import 'package:pizzaria/src/views/admin/screen/home/home_screen.dart'; +import 'package:pizzaria/src/views/admin/home/home_screen.dart'; import 'package:pizzaria/src/shared/models/user_model.dart'; import 'package:pizzaria/src/shared/repository/auth_respository.dart'; import 'package:pizzaria/src/views/client/home/home_screen.dart'; diff --git a/lib/src/views/admin/home/home_screen.dart b/lib/src/views/admin/home/home_screen.dart new file mode 100644 index 0000000..70ecc9b --- /dev/null +++ b/lib/src/views/admin/home/home_screen.dart @@ -0,0 +1,206 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:pizzaria/src/shared/constants/app.dart'; +import 'package:pizzaria/src/shared/controllers/order_controller.dart'; +import 'package:pizzaria/src/shared/models/order_model.dart'; +import 'package:pizzaria/src/views/admin/home/constants/home_admin.dart'; +import 'package:pizzaria/src/views/admin/item/item_screen.dart'; +import 'package:pizzaria/src/shared/controllers/auth_controller.dart'; +import 'package:pizzaria/src/shared/themes/colors/color_schemes.g.dart'; +import 'package:pizzaria/src/shared/services/util_service.dart'; +import 'package:pizzaria/src/views/admin/user/user_screen.dart'; +import 'package:stomp_dart_client/stomp.dart'; +import 'package:stomp_dart_client/stomp_config.dart'; +import 'package:stomp_dart_client/stomp_frame.dart'; + +class HomeAdminScreen extends StatefulWidget { + const HomeAdminScreen({super.key}); + + @override + State createState() => _HomeAdminScreenState(); +} + +class _HomeAdminScreenState extends State { + late StompClient stompClient; + + void onConnect(StompClient stompClient, StompFrame stompFrame) { + stompClient.subscribe( + destination: '/topic/message', + callback: (frame) { + if (frame.body != null) { + setState(() {}); + } + }); + } + + @override + void initState() { + super.initState(); + + stompClient = StompClient( + config: StompConfig.SockJS( + url: "${AppConstants.baseUrl}/ws-message", + onConnect: (stompFrame) => onConnect(stompClient, stompFrame), + ), + ); + + stompClient.activate(); + } + + @override + Widget build(BuildContext context) { + final utilService = UtilService(); + final authController = AuthController(); + final orderController = OrderController(); + return Scaffold( + //Appbar + appBar: AppBar( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + "Painel administrativo", + ), + IconButton( + onPressed: () async { + authController.signOut(); + }, + icon: const Icon( + Icons.logout, + ), + ) + ], + ), + ), + + //Body + body: Column( + children: [ + Expanded( + child: GridView.count( + crossAxisSpacing: 0, + crossAxisCount: MediaQuery.of(context).size.width < 800 ? 2 : 6, + children: List.generate( + HomeAdmin.labels.length, + (index) => Padding( + padding: const EdgeInsets.all(6.0), + + //Containers menu + child: GestureDetector( + onTap: () => index.isEqual(1) + ? Get.to(const ItemAdminScreen()) + : index.isEqual(0) + ? Get.to(const UserAdminScreen()) + : null, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: lightColorScheme.primary, + ), + color: lightColorScheme.background, + borderRadius: BorderRadius.circular(12), + ), + + //Title, icon, description + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleAvatar( + maxRadius: + utilService.screenDeviceWidth(13, 30, context), + child: Icon(HomeAdmin.icons[index]), + ), + const SizedBox(height: 10), + Text(HomeAdmin.labels[index]), + Text( + HomeAdmin.description[index], + style: TextStyle(color: Colors.grey.shade500), + ), + ], + ), + ), + ), + ), + ), + ), + ), + + //Orders + const Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Text( + 'Pedidos em andamento', + style: TextStyle(fontSize: 32), + ), + ], + ), + ), + Expanded( + child: FutureBuilder( + future: orderController.get(), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + return ListView.separated( + separatorBuilder: (context, index) => const Divider(), + itemCount: snapshot.data!.length, + itemBuilder: (context, index) { + final orderModel = + OrderModel.fromMap(snapshot.data?[index] ?? {}); + + //List oreder + return ListTile( + //ID + title: Text(orderModel.id!), + + //Items in order + subtitle: Row( + children: List.generate( + orderModel.item!.length, + (index) => + Text("+ ${orderModel.item![index]['name']} ")), + ), + + //Total price + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + utilService.convertToBRL(orderModel.total ?? 0), + style: const TextStyle(fontSize: 16), + ), + IconButton( + onPressed: () async { + await orderController.delete(id: orderModel.id!); + setState(() {}); + }, + icon: const Icon( + Icons.delete, + color: Colors.red, + ), + ), + ], + ), + ); + }, + ); + }, + ), + ), + ], + ), + ); + } + + @override + void dispose() { + stompClient.deactivate(); + super.dispose(); + } +} diff --git a/lib/src/views/admin/item/item_screen.dart b/lib/src/views/admin/item/item_screen.dart new file mode 100644 index 0000000..2628a84 --- /dev/null +++ b/lib/src/views/admin/item/item_screen.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; +import 'package:pizzaria/src/views/admin/item/item_details_screen.dart'; +import 'package:pizzaria/src/views/admin/item/widgets/additem.dart'; +import 'package:pizzaria/src/shared/services/util_service.dart'; +import 'package:pizzaria/src/shared/controllers/item_controller.dart'; +import 'package:pizzaria/src/shared/models/item_model.dart'; +import 'package:pizzaria/src/shared/themes/colors/color_schemes.g.dart'; +import 'package:pizzaria/src/widgets/progress_custom.dart'; + +class ItemAdminScreen extends StatefulWidget { + const ItemAdminScreen({super.key}); + + @override + State createState() => _ItemAdminScreenState(); +} + +class _ItemAdminScreenState extends State { + final itemController = ItemController(); + final utilService = UtilService(); + + @override + void initState() { + itemController.addListener(() => setState(() {})); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("Gerenciamento de itens"), + ), + body: StreamBuilder( + stream: itemController.getLikeStream(), + builder: (context, snapshot) { + //Progress data. + if (!snapshot.hasData) { + return const ProgressCustom( + height: 25, + width: 25, + ); + } + + //List items + return ListView.separated( + itemBuilder: (context, index) { + //Constructor item model. + final itemModel = + ItemModel.fromMap(snapshot.data?[index] ?? {}); + + return GestureDetector( + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ItemAdminDetailsScreen( + itemModel: itemModel, + ), + ), + ), + child: ListTile( + title: Text(itemModel.name!), + subtitle: Text( + itemModel.description ?? "Não há descrição neste item"), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + //Price + IconButton( + onPressed: () {}, + icon: Text( + utilService.convertToBRL(itemModel.price!), + ), + ), + //Delete + IconButton( + onPressed: () async { + await itemController.delete(itemModel.id!); + }, + icon: Icon( + Icons.delete, + color: lightColorScheme.error, + ), + ) + ], + ), + ), + ); + }, + separatorBuilder: (context, index) => const Divider(), + itemCount: snapshot.data?.length ?? 0); + }, + ), + + //Add items + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + showDialog( + context: context, + builder: (context) => const Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AddItemWindow(), + ], + ), + ); + }, + label: const Text("Adicionar"), + ), + ); + } +} diff --git a/lib/src/views/admin/user/user_screen.dart b/lib/src/views/admin/user/user_screen.dart new file mode 100644 index 0000000..936364e --- /dev/null +++ b/lib/src/views/admin/user/user_screen.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:pizzaria/src/shared/controllers/user_controller.dart'; +import 'package:pizzaria/src/shared/handlers/handlers.dart'; +import 'package:pizzaria/src/shared/models/user_model.dart'; +import 'package:pizzaria/src/shared/themes/colors/color_schemes.g.dart'; +import 'package:pizzaria/src/views/admin/user/user_details_screen.dart'; +import 'package:pizzaria/src/views/auth/register_screen.dart'; +import 'package:pizzaria/src/widgets/progress_custom.dart'; + +class UserAdminScreen extends StatelessWidget { + const UserAdminScreen({super.key}); + + @override + Widget build(BuildContext context) { + final userController = UserController(); + return Scaffold( + appBar: AppBar( + title: const Text("Gerenciamento de usuários"), + ), + + //Body + body: StreamBuilder( + stream: userController.getByLikeStream(), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const ProgressCustom(); + } + + return ListView.separated( + padding: const EdgeInsets.only(top: 10), + separatorBuilder: (context, index) => const Divider(), + itemCount: snapshot.data!.length, + itemBuilder: (context, index) { + final userModel = UserModel.fromMap(snapshot.data?[index] ?? {}); + return GestureDetector( + onTap: () => Get.to(UserDetailsScreen(userModel: userModel)), + child: ListTile( + leading: const CircleAvatar( + child: Icon(Icons.person), + ), + title: Text(userModel.email!), + trailing: IconButton( + onPressed: () async { + await userController.delete(id: userModel.id!).then( + (value) => Handlers.message( + message: "Usuário deletado", + iconData: Icons.check, + context: context)); + }, + icon: Icon( + Icons.delete, + color: lightColorScheme.error, + ), + ), + ), + ); + }, + ); + }, + ), + + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + Get.to(RegisterScreen()); + }, + icon: const Icon(Icons.person_add), + label: const Text("Registrar usuário"), + ), + ); + } +}