From 7d9530ebb624230f25bcee22409278aae8493030 Mon Sep 17 00:00:00 2001 From: William Ricardo Munaretto Date: Tue, 6 Dec 2022 17:32:44 -0300 Subject: [PATCH 1/4] nova pagina de listar documentos por categorias - categoria_page. --- lib/components/categoriaList.dart | 149 ------ lib/components/modal_edit_del_document.dart | 10 - lib/database/database_config.dart | 0 lib/main.dart | 38 +- lib/models/categoria.dart | 28 +- lib/models/documento.dart | 40 +- lib/models/notificacao.dart | 18 + lib/pages/cadastrar_documentoPage.dart | 123 +++++ lib/pages/categoria_page.dart | 134 ++++++ lib/pages/homePage.dart | 449 ++++++++++++++++++ lib/pages/listview_categoria_page.dart | 57 --- lib/pages/newCategoriaPage.dart | 21 + lib/pages/notificacaoPage.dart | 53 +++ lib/pages/pesquisaPage.dart | 21 + lib/pages/sobrePage.dart | 21 + macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 230 +++++++++ pubspec.yaml | 16 +- 18 files changed, 1155 insertions(+), 257 deletions(-) delete mode 100644 lib/components/categoriaList.dart delete mode 100644 lib/components/modal_edit_del_document.dart create mode 100644 lib/database/database_config.dart create mode 100644 lib/models/notificacao.dart create mode 100644 lib/pages/cadastrar_documentoPage.dart create mode 100644 lib/pages/categoria_page.dart create mode 100644 lib/pages/homePage.dart delete mode 100644 lib/pages/listview_categoria_page.dart create mode 100644 lib/pages/newCategoriaPage.dart create mode 100644 lib/pages/notificacaoPage.dart create mode 100644 lib/pages/pesquisaPage.dart create mode 100644 lib/pages/sobrePage.dart diff --git a/lib/components/categoriaList.dart b/lib/components/categoriaList.dart deleted file mode 100644 index 7533cf8..0000000 --- a/lib/components/categoriaList.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; - -import '../models/documento.dart'; - -class CategoriaList extends StatelessWidget { - final List documentos; - - //constructor - - CategoriaList(this.documentos); - - @override - Widget build(BuildContext context) { - return SizedBox( - height: 520, - child: ListView.builder( - itemCount: documentos.length, - itemBuilder: (ctx, index) { - final doc = documentos[index]; - return Card( - color: const Color(0xffDEF1EB), - shadowColor: const Color(0xffFE7C3F), - margin: const EdgeInsets.all(5), - child: Row( - children: [ - GestureDetector( - onTap: () { - print('Teste'); - }, - child: Container( - margin: const EdgeInsets.only(left: 10), - child: Image.asset( - 'assets/images/icon_doc.png', - height: 55, - ), - ), - ), - Container( - width: 220, - padding: const EdgeInsets.all(5), - margin: const EdgeInsets.only(left: 10, top: 10, bottom: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - const Text( - 'Nome: ', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - color: Colors.black), - ), - Text( - doc.id.toString(), - style: const TextStyle( - fontSize: 14, - color: Colors.black, - ), - ), - ], - ), - Row( - children: [ - const Text( - 'Competência: ', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - color: Colors.black), - ), - Text( - DateFormat('d/MMM/y.') - .format(doc.criadoEm!) - .toString(), - style: const TextStyle( - fontSize: 14, color: Colors.black), - ), - ], - ), - Row( - children: [ - const Text( - 'Criado em: ', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - color: Colors.black), - ), - Text( - DateFormat('d/MMM/y.') - .format(doc.criadoEm!) - .toString(), - style: const TextStyle( - fontSize: 14, color: Colors.black), - ), - ], - ), - Row( - children: [ - const Text( - 'Categoria: ', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - color: Colors.black), - ), - Text( - doc.nome!, - style: const TextStyle( - fontSize: 14, - color: Colors.black, - ), - ), - ], - ), - ], - ), - ), - Container( - margin: const EdgeInsets.only(left: 5), - child: Row( - // ignore: prefer_const_literals_to_create_immutables - children: [ - const Icon( - Icons.edit, - color: Colors.amber, - size: 30.0, - ), - const SizedBox( - width: 15, - ), - const Icon( - Icons.delete, - color: Colors.red, - size: 30.0, - ), - ], - ), - ), - ], //children end - ), - ); - }, - ), - ); - } -} diff --git a/lib/components/modal_edit_del_document.dart b/lib/components/modal_edit_del_document.dart deleted file mode 100644 index a29f2b4..0000000 --- a/lib/components/modal_edit_del_document.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -class ModalDocumentoExcluirEditar extends StatelessWidget { - - - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/lib/database/database_config.dart b/lib/database/database_config.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/main.dart b/lib/main.dart index 23f483b..a240b03 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,27 +1,27 @@ -import 'package:first_app/pages/listview_categoria_page.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:to_file/pages/homePage.dart'; -main() => runApp(TwoFileApp()); - -class TwoFileApp extends StatefulWidget { - @override - State createState() => _TwoFileAppState(); +void main() { + WidgetsFlutterBinding.ensureInitialized(); + runApp(const TwoFileApp()); } -class _TwoFileAppState extends State { +class TwoFileApp extends StatelessWidget { + const TwoFileApp({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { - final ThemeData tema = ThemeData(); - - return MaterialApp( - debugShowCheckedModeBanner: false, - home: CategoriaListPage(), - theme: tema.copyWith( - colorScheme: tema.colorScheme.copyWith( - primary: const Color(0xff0C322C), - secondary: Colors.amber, - ), - ), - ); + return const MaterialApp( + localizationsDelegates: [ + GlobalWidgetsLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + ], + supportedLocales: [ + Locale("pt", "BR") + ], + debugShowCheckedModeBanner: false, + home: HomePage() // tela inicial do App + ); } } diff --git a/lib/models/categoria.dart b/lib/models/categoria.dart index 9f9d174..8f2d118 100644 --- a/lib/models/categoria.dart +++ b/lib/models/categoria.dart @@ -1,9 +1,25 @@ -class Categoria{ +class Categoria { + int? id; + String nome; + // String? nome_icone; + // DateTime criadoEm; - int? id; - String? nome; - String? nome_icone; - DateTime? timestamp; + Categoria({ + this.id, + required this.nome, + }); - Categoria({this.nome, this.nome_icone, this.timestamp}); + factory Categoria.fromMap(Map json) => Categoria( + id: json['id'], + nome: json['name'], + // criadoEm: json['criado_em'], + //inserir o campo nomeIcone + ); + + Map toMap() => { + 'id': id, + 'name': nome, + // 'criado_em': criadoEm, + //inserir o campo nomeIcone + }; } diff --git a/lib/models/documento.dart b/lib/models/documento.dart index 32cf1a9..3a16ae3 100644 --- a/lib/models/documento.dart +++ b/lib/models/documento.dart @@ -1,13 +1,35 @@ -import 'categoria.dart'; - -class Documento{ - +class Documento { int? id; - String? nome; - DateTime? criadoEm; - + String nome; + // DateTime criadoEm; + // DateTime dataCompetencia; + // DateTime dataValidade; + // Categoria idCategoria; - Documento({this.id, this.nome, this.criadoEm}); + Documento({ + this.id, + required this.nome, + // required this.criadoEm, + // required this.dataCompetencia, + // required this.dataValidade, + //inserir o this.idCategoria + }); + factory Documento.fromMap(Map json) => Documento( + id: json['id'], + nome: json['nome'], + // dataCompetencia: DateTime.parse(['data_competencia'].toString()), + // dataValidade: DateTime.parse(['data_validade'].toString()), + // criadoEm: DateTime.parse(['criado_em'].toString()), + // inserir o campo idCategoria + ); -} \ No newline at end of file + Map toMap() => { + 'id': id, + 'nome': nome, + // 'data_competencia': dataCompetencia.toString(), + // 'data_validade': dataValidade.toString(), + // 'criado_em': criadoEm.toString(), + //inserir o campo idCategoria + }; +} diff --git a/lib/models/notificacao.dart b/lib/models/notificacao.dart new file mode 100644 index 0000000..6c29502 --- /dev/null +++ b/lib/models/notificacao.dart @@ -0,0 +1,18 @@ +class Notificacao { + int? id; + DateTime criadoEm; + + Notificacao({this.id, required this.criadoEm}); + + factory Notificacao.fromMap(Map json) => Notificacao( + id: json['id'], + criadoEm: json['criado_em'], + //inserir o campo id_documento + ); + + Map toMap() => { + 'id': id, + 'criado_em': criadoEm, + //inserir o campo id_documento + }; +} diff --git a/lib/pages/cadastrar_documentoPage.dart b/lib/pages/cadastrar_documentoPage.dart new file mode 100644 index 0000000..5ef061b --- /dev/null +++ b/lib/pages/cadastrar_documentoPage.dart @@ -0,0 +1,123 @@ +// ignore_for_file: avoid_print + +import 'package:flutter/material.dart'; + +import 'package:intl/intl.dart'; + +import '../database/database_config.dart'; +import '../models/documento.dart'; +import 'categoria_page.dart'; + +class CadastrarDocumentoPage extends StatefulWidget { + const CadastrarDocumentoPage({Key? key}) : super(key: key); + + @override + State createState() => _CadastrarDocumentoPageState(); +} + +class _CadastrarDocumentoPageState extends State { + final textController = TextEditingController(); + + final _controllerNome = TextEditingController(); + final _controllerDataCompetencia = TextEditingController(); + final _controllerDataValidade = TextEditingController(); + + DateTime? pickedDataCompetencia; + DateTime? pickedDataValidade; + DateTime? dataCompetenciaTimeStamp; + DateTime? dataValidadeTimeStamp; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color.fromARGB(255, 255, 255, 255), + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: const Text('Adicionar documento'), + ), + body: ListView(padding: const EdgeInsets.all(16), children: [ + TextField( + controller: _controllerNome, + decoration: const InputDecoration( + border: OutlineInputBorder(), labelText: 'Nome do Documento'), + ), + const SizedBox(height: 24), + TextField( + controller: _controllerDataCompetencia, + decoration: const InputDecoration( + icon: Icon(Icons.calendar_today), + labelText: "Data de Competência"), + readOnly: true, + onTap: () { + _pickDateDialogCompetencia(); + }), + TextField( + controller: _controllerDataValidade, + decoration: const InputDecoration( + icon: Icon(Icons.calendar_today), + labelText: "Data de Validade"), + readOnly: true, + onTap: () { + _pickDateDialogValidade(); + }), + const SizedBox(height: 32), + ElevatedButton( + child: const Text('Salvar'), + onPressed: () { + final documento = Documento( + nome: _controllerNome.text, + // dataCompetencia: pickedDataCompetencia!, + // dataValidade: pickedDataValidade!, + // criadoEm: DateTime.now(), + ); + + DatabaseHelper.instance.addDocumento(documento); + + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const CategoriaPage())); + }, + ) + ]), + ); + } + + void _pickDateDialogCompetencia() async { + pickedDataCompetencia = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime(2023), + locale: const Locale("pt", "BR"), + ); + + if (pickedDataCompetencia != null) { + setState(() { + _controllerDataCompetencia.text = + '${pickedDataCompetencia!.day}/${pickedDataCompetencia!.month}/${pickedDataCompetencia!.year}'; + dataCompetenciaTimeStamp = DateTime.fromMicrosecondsSinceEpoch( + pickedDataCompetencia!.microsecondsSinceEpoch); + }); + } + } + + void _pickDateDialogValidade() async { + pickedDataValidade = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime(2023), + locale: const Locale("pt", "BR"), + ); + + if (pickedDataValidade != null) { + setState(() { + _controllerDataValidade.text = + '${pickedDataValidade!.day}/${pickedDataValidade!.month}/${pickedDataValidade!.year}'; + dataValidadeTimeStamp = DateTime.fromMicrosecondsSinceEpoch( + pickedDataValidade!.microsecondsSinceEpoch); + }); + } + } +} diff --git a/lib/pages/categoria_page.dart b/lib/pages/categoria_page.dart new file mode 100644 index 0000000..5c24c01 --- /dev/null +++ b/lib/pages/categoria_page.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; + +import '../database/database_config.dart'; +import '../models/documento.dart'; +import 'Cadastrar_documentoPage.dart'; + +class CategoriaPage extends StatefulWidget { + const CategoriaPage({super.key}); + + @override + State createState() => _CategoriaPageState(); +} + +class _CategoriaPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: const Text('Nome da Categoria'), + ), + body: Center( + child: FutureBuilder>( + future: DatabaseHelper.instance.listDocumentos(), + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + return snapshot.data!.isEmpty + ? const Center( + child: Text('Lista de documentos vazia.'), + ) + : ListView( + children: snapshot.data!.map((document) { + return Center( + child: Card( + color: const Color(0xffDEF1EB), + child: Column( + children: [ + ListTile( + contentPadding: + const EdgeInsets.fromLTRB(10, 10, 10, 5), + leading: Image.asset( + 'assets/images/icon_doc.png', + height: 60), + title: Text( + document.nome, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24), + ), + subtitle: Padding( + padding: const EdgeInsets.all(8.0), + child: RichText( + text: TextSpan(children: [ + const TextSpan( + text: 'Competência: ', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + TextSpan( + text: ' ${document.nome}.', + style: const TextStyle( + color: Colors.black), + ), + const TextSpan( + text: '\nValidade: ', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black)), + TextSpan( + text: ' ${document.nome}.', + style: const TextStyle( + color: Colors.black), + ), + ]), + ), + ), + trailing: GestureDetector( + child: const Icon(Icons.more_vert), + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return SimpleDialog( + children: [ + SimpleDialogOption( + onPressed: (() { + setState(() { + DatabaseHelper.instance + .removeDocumento( + document.id!); + }); + + Navigator.pop(context); + }), + child: const Text('Excluir'), + ), + const SizedBox( + height: 10, + ), + SimpleDialogOption( + onPressed: (() { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext + context) => + const CadastrarDocumentoPage())); + }), + child: const Text('Editar'), + ), + ], + ); + }); + }, + ), + isThreeLine: false, + onTap: () { + //chamar função para abrir view documento + }, + ), + ], + ), + ), + ); + }).toList(), + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/homePage.dart b/lib/pages/homePage.dart new file mode 100644 index 0000000..1de33be --- /dev/null +++ b/lib/pages/homePage.dart @@ -0,0 +1,449 @@ +import 'package:flutter/material.dart'; + +import 'package:to_file/pages/cadastrar_documentoPage.dart'; +import 'package:to_file/pages/newCategoriaPage.dart'; +import 'package:to_file/pages/pesquisaPage.dart'; +import 'package:to_file/pages/sobrePage.dart'; + +import 'categoriaPage.dart'; +import 'categoria_page_2.dart'; + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + TextEditingController? textController; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xffF5F5F5), + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: Image.asset( + 'assets/images/appbar.png', + height: 100.0, + width: 120.0, + fit: BoxFit.cover, + ), + actions: [ + IconButton( + onPressed: () { + setState(() { + pageSobre(); + }); + }, + icon: const Icon(Icons.info, color: Color(0xffFE7C3F)), + ), + const IconButton( + onPressed: null, + icon: Icon( + Icons.notifications, + color: Color(0xffFE7C3F), + )) + ], + ), + body: Column( + children: [ + Container( + margin: const EdgeInsets.only(top: 30.0), + height: 65, + width: 350, + // alignment: Alignment.center, + padding: const EdgeInsets.all(10), + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.white), + ), + onPressed: () { + setState(() { + pageSearch(); + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: const [ + Text( + 'pesquisar', + style: TextStyle( + color: Color(0xffB9B1B1), + ), + ), + Icon( + Icons.search, + color: Color(0xffB9B1B1), + ), + ], + ), + ), + ), + const SizedBox(height: 20), + Container( + height: 400.0, + child: GridView.count( + crossAxisCount: 3, + primary: false, + padding: const EdgeInsets.all(20), + crossAxisSpacing: 10, + mainAxisSpacing: 10, + children: [ + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + const CadastrarDocumentoPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 5.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/recibo.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Recibo"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + icon: ImageIcon( + AssetImage('assets/images/fatura.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + onPressed: null, + ), + Text("Fatura"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/extrato-bancario.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Extrato Bancário", textAlign: TextAlign.center), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/notaFiscal.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Nota Fiscal"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/contrato.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Contrato"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/boleto.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Boleto"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + IconButton( + onPressed: null, + icon: ImageIcon( + AssetImage('assets/images/pessoal.png'), + color: Color(0xffFE7C3F), + size: 40, + ), + ), + Text("Pessoal"), + ], + ), + ), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + const NewCategoriaPage())); + }, + child: Container( + height: 100.0, + width: 100.0, + padding: const EdgeInsets.all(8), + // color: const Color(0xffEAEBD9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black38, + blurRadius: 3.0, + offset: Offset(0.0, 0.80), + ), + ], + ), + child: const IconButton( + onPressed: null, + icon: Icon( + Icons.add, + color: Color(0xffFE7C3F), + size: 40, + )), + ), + ), + ], + ), + ), + ], + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + setState(() { + pageDocument(); + }); + }, + backgroundColor: const Color(0xff30BA78), + child: const Icon( + Icons.add, + color: Colors.white, + size: 40, + ), + ), + ); + } + + void pageSobre() { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const SobrePage())); + } + + void pageDocument() { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const CadastrarDocumentoPage())); + } + + void pageSearch() { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const PesquisaPage())); + } +} diff --git a/lib/pages/listview_categoria_page.dart b/lib/pages/listview_categoria_page.dart deleted file mode 100644 index 59c83ca..0000000 --- a/lib/pages/listview_categoria_page.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:first_app/models/categoria.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import '../components/categoriaList.dart'; -import '../models/documento.dart'; - -class CategoriaListPage extends StatefulWidget { - @override - State createState() => _CategoriaListPageState(); -} - -class _CategoriaListPageState extends State { - late final List _documentosList = [ - Documento( - id: 1, - nome: 'Carta', - criadoEm: DateTime.now(), - ), - Documento(id: 2, nome: 'Memorando', criadoEm: DateTime.now()), - Documento(id: 3, nome: 'Paper', criadoEm: DateTime.now()), - Documento(id: 4, nome: 'Artigo', criadoEm: DateTime.now()), - Documento(id: 5, nome: 'TCC', criadoEm: DateTime.now()), - Documento(id: 6, nome: 'oficio', criadoEm: DateTime.now()), - Documento(id: 7, nome: 'nota fiscal', criadoEm: DateTime.now()), - ]; - - late final Categoria categoria; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("2File"), - ), - body: Column( - children: [ - Container( - padding: EdgeInsets.all(20), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - Text( - 'Categoria', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - CategoriaList(_documentosList) - ], - )); - } -} diff --git a/lib/pages/newCategoriaPage.dart b/lib/pages/newCategoriaPage.dart new file mode 100644 index 0000000..9ac52d1 --- /dev/null +++ b/lib/pages/newCategoriaPage.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class NewCategoriaPage extends StatefulWidget { + const NewCategoriaPage({Key? key}) : super(key: key); + + @override + State createState() => _CategoriaPageState(); +} + +class _CategoriaPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xffF5F5F5), + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: const Text('Adicionar Categoria'), + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/notificacaoPage.dart b/lib/pages/notificacaoPage.dart new file mode 100644 index 0000000..dd84140 --- /dev/null +++ b/lib/pages/notificacaoPage.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +import '../database/database_config.dart'; +import '../models/notificacao.dart'; + +class Notificacoes extends StatefulWidget { + const Notificacoes({super.key}); + + @override + State createState() => _NotificacoesState(); +} + +class _NotificacoesState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Notificações'), + ), + body: Center( + child: FutureBuilder>( + future: DatabaseHelper.instance.listNotificacoes(), + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + return snapshot.data!.isEmpty + ? const Center( + child: Text('Lista de notificações vazia.'), + ) + : ListView( + children: snapshot.data!.map((notify) { + return Center( + child: Card( + color: const Color(0xffDEF1EB), + child: Column( + children: [ + ListTile( + contentPadding: EdgeInsets.all(10.0), + subtitle: const Text( + 'O documento x venceu hoje - data - ', + style: TextStyle(fontSize: 15), + ), + isThreeLine: true, + ), + ], + ), + ), + ); + }).toList(), + ); + }), + )); + } +} diff --git a/lib/pages/pesquisaPage.dart b/lib/pages/pesquisaPage.dart new file mode 100644 index 0000000..28b0100 --- /dev/null +++ b/lib/pages/pesquisaPage.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class PesquisaPage extends StatefulWidget { + const PesquisaPage({Key? key}) : super(key: key); + + @override + State createState() => _CategoriaPageState(); +} + +class _CategoriaPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xffF5F5F5), + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: const Text('Pesquisar documento'), + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/sobrePage.dart b/lib/pages/sobrePage.dart new file mode 100644 index 0000000..68a2719 --- /dev/null +++ b/lib/pages/sobrePage.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class SobrePage extends StatefulWidget { + const SobrePage({Key? key}) : super(key: key); + + @override + State createState() => _CategoriaPageState(); +} + +class _CategoriaPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xffF5F5F5), + appBar: AppBar( + backgroundColor: const Color(0xff0C322C), + title: const Text('Sobre'), + ), + ); + } +} \ No newline at end of file diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..f419d26 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,10 @@ import FlutterMacOS import Foundation +import path_provider_macos +import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index dabce23..b5b3bd3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.5" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" async: dependency: transitive description: @@ -22,6 +36,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" clock: dependency: transitive description: @@ -36,6 +64,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -50,11 +92,32 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.0" flutter_lints: dependency: "direct dev" description: @@ -62,11 +125,23 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.2" intl: dependency: "direct main" description: @@ -74,6 +149,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.5" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.7.0" lints: dependency: transitive description: @@ -109,6 +198,90 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + path_provider: + dependency: "direct main" + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.22" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + pointycastle: + dependency: transitive + description: + name: pointycastle + url: "https://pub.dartlang.org" + source: hosted + version: "3.6.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" sky_engine: dependency: transitive description: flutter @@ -121,6 +294,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.9.0" + sqflite: + dependency: "direct main" + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -142,6 +329,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+3" term_glyph: dependency: transitive description: @@ -156,6 +350,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" vector_math: dependency: transitive description: @@ -163,5 +364,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+2" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" sdks: dart: ">=2.18.2 <3.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index f93db59..28b4bb3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,9 +1,9 @@ -name: first_app +name: to_file description: A new Flutter project. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=2.18.2 <3.0.0' + sdk: ">=2.18.2 <3.3.9" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -31,14 +31,16 @@ environment: dependencies: flutter: sdk: flutter - + flutter_localizations: + sdk: flutter intl: ^0.17.0 - # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + sqflite: ^2.2.0+3 + path_provider: ^2.0.11 dev_dependencies: flutter_test: @@ -50,13 +52,13 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^2.0.0 + flutter_launcher_icons: "^0.10.0" # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. @@ -64,7 +66,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - - assets/images/ + - assets/images/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see From 7fec60946ef52a664777385496a8d8954fc1f629 Mon Sep 17 00:00:00 2001 From: William Ricardo Munaretto Date: Tue, 6 Dec 2022 17:38:34 -0300 Subject: [PATCH 2/4] pasta assets --- assets/icons/icon.png | Bin 0 -> 348005 bytes assets/icons/logotipo.png | Bin 0 -> 98951 bytes assets/images/appbar.png | Bin 0 -> 14164 bytes assets/images/boleto.png | Bin 0 -> 1826 bytes assets/images/contrato.png | Bin 0 -> 2577 bytes assets/images/extrato-bancario.png | Bin 0 -> 2703 bytes assets/images/fatura.png | Bin 0 -> 2748 bytes assets/images/notaFiscal.png | Bin 0 -> 2261 bytes assets/images/pessoal.png | Bin 0 -> 1396 bytes assets/images/recibo.png | Bin 0 -> 1479 bytes lib/database/database_config.dart | 144 +++++++++++++++++++++++++++++ lib/pages/homePage.dart | 3 +- test/widget_test.dart | 5 +- 13 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 assets/icons/icon.png create mode 100644 assets/icons/logotipo.png create mode 100644 assets/images/appbar.png create mode 100644 assets/images/boleto.png create mode 100644 assets/images/contrato.png create mode 100644 assets/images/extrato-bancario.png create mode 100644 assets/images/fatura.png create mode 100644 assets/images/notaFiscal.png create mode 100644 assets/images/pessoal.png create mode 100644 assets/images/recibo.png diff --git a/assets/icons/icon.png b/assets/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..164a63db358345f8e13fb2e4aa4b09c0e623d8cb GIT binary patch literal 348005 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

XZ0vS)A!u79i~PmDr<^v}q(%L5&&>lN1yjq3wB4 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