diff --git a/lib/Controller/AtividadeController.dart b/lib/Controller/AtividadeController.dart new file mode 100644 index 0000000..eb458fc --- /dev/null +++ b/lib/Controller/AtividadeController.dart @@ -0,0 +1,167 @@ +import 'dart:ffi'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; +import 'package:organizei/Controller/Base/Base.dart'; +import 'package:organizei/Repository/AtividadeRepository.dart'; +import 'package:organizei/services/persistencia/login.configuracoes.dart'; + +class AtividadeController extends Base { + AtividadeController(this.repository, this.context); + + final BuildContext context; + final AtividadeRepository repository; + final formKey = GlobalKey(); + var model = AtividadeModel(); + //var loginConfiguracoes = LoginConfiguracoes(); + + atividadeId(int? value) => model.id = value; + atividadeNome(String? value) => model.nome = value.toString(); + atividadeDataInical(String? value) => model.dataInicial = value.toString(); + atividadeObservacao(String? value) => model.observacao = value.toString(); + atividadeDataFinal(String? value) => model.dataFinal = value.toString(); + atividadeCor(String? value) => model.cor = value.toString(); + atividadePrioridade(String? value) => model.prioridade = value.toString(); + + var controllerNome = TextEditingController(); + var controllerObservacao = TextEditingController(); + var controllerPrioridade = TextEditingController(); + var controllerCor = TextEditingController(); + var controllerDataIncial = TextEditingController(); + var controllerDataFinal = TextEditingController(); + + Future saveAtividade(Function? addAtividade) async { + if (!formKey.currentState!.validate()) { + return false; + } + + formKey.currentState!.save(); + + if (addAtividade != null) { + addAtividade(model); + } + + try { + if (model.id != null) { + return await repository.updateAtividade(model).then((value) async { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + elevation: 6.0, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + side: const BorderSide(color: Colors.black, width: 3), + borderRadius: BorderRadius.circular(16), + ), + content: Text( + value.msg!, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ), + backgroundColor: value.valido! + ? const Color(0xFF74C198) + : const Color(0xFFEF7E69), + ), + ); + + await Future.delayed(const Duration(milliseconds: 500)); + + if (value.valido!) { + return value.valido!; + } else { + return false; + } + }); + } else { + return true; + } + } catch (e) { + print(e); + return false; + } + } + + Future> getAtividades() async { + return await repository.getAtividades(); + } + + Future concluirAtividade(bool concluido) async { + try { + return await repository + .concluirAtividade(model, concluido) + .then((value) async { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + elevation: 6.0, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + side: const BorderSide(color: Colors.black, width: 3), + borderRadius: BorderRadius.circular(16), + ), + content: Text( + value.msg!, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ), + backgroundColor: value.valido! + ? const Color(0xFF74C198) + : const Color(0xFFEF7E69), + ), + ); + + await Future.delayed(const Duration(milliseconds: 500)); + + if (value.valido!) { + return value.valido!; + } else { + return false; + } + }); + } catch (e) { + print(e); + return false; + } + } + + Future excluirAtividade() async { + try { + return await repository.excluirAtividade(model).then((value) async { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + elevation: 6.0, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + side: const BorderSide(color: Colors.black, width: 3), + borderRadius: BorderRadius.circular(16), + ), + content: Text( + value.msg!, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ), + backgroundColor: value.valido! + ? const Color(0xFF74C198) + : const Color(0xFFEF7E69), + ), + ); + + await Future.delayed(const Duration(milliseconds: 500)); + + if (value.valido!) { + return value.valido!; + } else { + return false; + } + }); + } catch (e) { + print(e); + return false; + } + } +} diff --git a/lib/Controller/ProjetoController.dart b/lib/Controller/ProjetoController.dart index 1b94879..be3fb72 100644 --- a/lib/Controller/ProjetoController.dart +++ b/lib/Controller/ProjetoController.dart @@ -2,6 +2,7 @@ import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; import 'package:organizei/Model/Projeto/ProjetoModel.dart'; import 'package:organizei/Controller/Base/Base.dart'; import 'package:organizei/Repository/ProjetoRepository.dart'; @@ -22,6 +23,7 @@ class ProjetoController extends Base { projetoObservacao(String? value) => model.observacao = value.toString(); projetoDataFinal(String? value) => model.dataFinal = value.toString(); projetoCor(String? value) => model.cor = value.toString(); + projetoAtividades(List? value) => model.atividades = value; var controllerNome = TextEditingController(); var controllerObservacao = TextEditingController(); diff --git a/lib/Controller/TarefaController.dart b/lib/Controller/TarefaController.dart index 721f054..6474472 100644 --- a/lib/Controller/TarefaController.dart +++ b/lib/Controller/TarefaController.dart @@ -25,7 +25,6 @@ class TarefaController extends Base { var controllerNome = TextEditingController(); var controllerObservacao = TextEditingController(); - var controllerPrioridade = TextEditingController(); var controllerCor = TextEditingController(); var controllerDataehora = TextEditingController(); diff --git a/lib/Model/Atividade/AtividadeModel.dart b/lib/Model/Atividade/AtividadeModel.dart new file mode 100644 index 0000000..f7fdbab --- /dev/null +++ b/lib/Model/Atividade/AtividadeModel.dart @@ -0,0 +1,50 @@ +import 'package:organizei/Model/API/ResponseAPIModel.dart'; + +class AtividadeModel { + int? id; + int? idProjeto; + String? nome; + String? dataInicial; + String? observacao; + String? dataFinal; + String? cor; + String? prioridade; + bool? concluido; + ResponseAPIModel? responseAPIModel; + + AtividadeModel({ + this.id, + this.nome, + this.dataInicial, + this.observacao, + this.dataFinal, + this.cor, + this.prioridade, + this.concluido, + }); + + AtividadeModel.fromJson(Map json) { + id = int.parse(json['id']); + nome = json['nome']; + dataInicial = json['dataInicial']; + observacao = json['observacao']; + dataFinal = json['dataFinal']; + cor = json['cor']; + prioridade = json['prioridade']; + concluido = json['concluido']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = id; + data['nome'] = nome; + data['dataInicial'] = dataInicial; + data['observacao'] = observacao; + data['dataFinal'] = dataFinal; + data['cor'] = cor; + data['prioridade'] = prioridade; + data['concluido'] = concluido; + + return data; + } +} diff --git a/lib/Model/Lista/ListaModel.dart b/lib/Model/Lista/ListaModel.dart index 07554ef..c873336 100644 --- a/lib/Model/Lista/ListaModel.dart +++ b/lib/Model/Lista/ListaModel.dart @@ -29,10 +29,6 @@ class ListaModel { }).toList(); itens = listaItens; - - // _controllers.map((item) { - // listaitens.add(ItemModel(nome: (item.text))); - // }).toList(); } Map toJson() { diff --git a/lib/Model/Projeto/ProjetoModel.dart b/lib/Model/Projeto/ProjetoModel.dart index 7876edd..f4f4555 100644 --- a/lib/Model/Projeto/ProjetoModel.dart +++ b/lib/Model/Projeto/ProjetoModel.dart @@ -1,4 +1,5 @@ import 'package:organizei/Model/API/ResponseAPIModel.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; class ProjetoModel { int? id; @@ -7,6 +8,8 @@ class ProjetoModel { String? observacao; String? dataFinal; String? cor; + String? progresso = '0%'; + List? atividades; ResponseAPIModel? responseAPIModel; ProjetoModel( @@ -15,7 +18,9 @@ class ProjetoModel { this.dataInicial, this.observacao, this.dataFinal, - this.cor}); + this.cor, + this.atividades, + this.progresso}); ProjetoModel.fromJson(Map json) { id = int.parse(json['id']); @@ -24,6 +29,23 @@ class ProjetoModel { observacao = json['observacao']; dataFinal = json['dataFinal']; cor = json['cor']; + progresso = json['progresso']; + + List listaAtividades = []; + json['atividade'].map((item) { + listaAtividades.add(AtividadeModel( + id: int.parse(item['id']), + nome: item['nome'], + dataInicial: item['dataInicial'], + dataFinal: item['dataFinal'], + observacao: item['observacao'], + cor: item['cor'], + prioridade: item['prioridade'], + concluido: item['concluido'], + )); + }).toList(); + + atividades = listaAtividades; } Map toJson() { diff --git a/lib/Repository/AtividadeRepository.dart b/lib/Repository/AtividadeRepository.dart new file mode 100644 index 0000000..ad83472 --- /dev/null +++ b/lib/Repository/AtividadeRepository.dart @@ -0,0 +1,90 @@ +import 'dart:convert'; + +import 'package:organizei/Model/API/APIModel.dart'; + +import 'package:http/http.dart' as http; +import 'package:organizei/Model/API/ResponseAPIModel.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; + +class AtividadeRepository { + Future addAtividade(AtividadeModel model) async { + var json = { + "nome": model.nome, + "dataInicial": model.dataInicial, + "observacao": model.observacao, + "dataFinal": model.dataFinal, + "cor": model.cor, + "prioridade": model.prioridade, + }; + + final response = await http.post(Uri.parse(ApiModel.ApiUrl + '/atividades'), + headers: ApiModel.headers, body: jsonEncode(json)); + + return ResponseAPIModel.fromJson(jsonDecode(response.body)); + } + + Future updateAtividade(AtividadeModel model) async { + var json = { + "nome": model.nome, + "dataInicial": model.dataInicial, + "observacao": model.observacao, + "dataFinal": model.dataFinal, + "cor": model.cor, + "prioridade": model.prioridade, + }; + + final response = await http.put( + Uri.parse(ApiModel.ApiUrl + '/atividades/' + model.id.toString()), + headers: ApiModel.headers, + body: jsonEncode(json)); + + return ResponseAPIModel.fromJson(jsonDecode(response.body)); + } + + Future concluirAtividade( + AtividadeModel model, bool concluido) async { + var json = { + "concluido": concluido, + }; + + final response = await http.put( + Uri.parse(ApiModel.ApiUrl + + '/atividades/' + + model.id.toString() + + '/concluir'), + headers: ApiModel.headers, + body: jsonEncode(json)); + + return ResponseAPIModel.fromJson(jsonDecode(response.body)); + } + + Future excluirAtividade(AtividadeModel model) async { + final response = await http.delete( + Uri.parse(ApiModel.ApiUrl + '/atividades/' + model.id.toString()), + headers: ApiModel.headers); + + return ResponseAPIModel.fromJson(jsonDecode(response.body)); + } + + Future> getAtividades() async { + Uri url = Uri.parse(ApiModel.ApiUrl + '/atividades'); + + var _url = Uri.parse(url.toString()); + final response = await http.get(_url, headers: ApiModel.headers); + + Map jsonMap = jsonDecode(response.body); + + return jsonMap; + } + + Future> get() async { + Uri url = Uri.parse(ApiModel.ApiUrl + '/atividades'); + + var _url = Uri.parse(url.toString()); + final response = await http.get(_url, headers: ApiModel.headers); + + Map jsonMap = jsonDecode(response.body); + + return jsonMap; + } +} diff --git a/lib/Repository/ProjetoRepository.dart b/lib/Repository/ProjetoRepository.dart index 0fe60c0..e860f0f 100644 --- a/lib/Repository/ProjetoRepository.dart +++ b/lib/Repository/ProjetoRepository.dart @@ -14,10 +14,9 @@ class ProjetoRepository { "observacao": model.observacao, "dataFinal": model.dataFinal, "cor": model.cor, + "atividades": model.atividades }; - print('olha to here'); - final response = await http.post(Uri.parse(ApiModel.ApiUrl + '/projetos'), headers: ApiModel.headers, body: jsonEncode(json)); @@ -31,6 +30,7 @@ class ProjetoRepository { "observacao": model.observacao, "dataFinal": model.dataFinal, "cor": model.cor, + "atividades": model.atividades }; final response = await http.put( diff --git a/lib/components/dialogs/atividades/atividadeCadastroDialog.dart b/lib/components/dialogs/atividades/atividadeCadastroDialog.dart new file mode 100644 index 0000000..9725f95 --- /dev/null +++ b/lib/components/dialogs/atividades/atividadeCadastroDialog.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; +import 'package:organizei/Repository/AtividadeRepository.dart'; +import 'package:organizei/components/botao.dart'; +import 'package:organizei/components/dialog_personalizado.dart'; +import 'package:organizei/components/input.dart'; +import 'package:organizei/components/selectCor.dart'; +import 'package:organizei/components/selectData.dart'; +import 'package:organizei/components/selectPrioridade.dart'; +import '../../../Controller/AtividadeController.dart'; + +Future criarAtividade(BuildContext context, + {AtividadeModel? atividade = null, + Function? fecharDialog = null, + Function? addAtividade = null}) { + late AtividadeController atividadeController; + + atividadeController = AtividadeController(AtividadeRepository(), context); + + if (atividade != null) { + atividadeController.controllerNome.text = atividade.nome ?? ''; + atividadeController.controllerDataIncial.text = atividade.dataInicial ?? ''; + atividadeController.controllerDataFinal.text = atividade.dataFinal ?? ''; + atividadeController.controllerObservacao.text = atividade.observacao ?? ''; + atividadeController.controllerPrioridade.text = atividade.prioridade ?? ''; + atividadeController.atividadeCor(atividade.cor); + atividadeController.atividadeId(atividade.id); + } + + return showDialog( + barrierDismissible: false, + barrierColor: Colors.white.withOpacity(0), + context: context, + builder: (context) { + return StatefulBuilder(builder: (context, StateSetter setState) { + return Scaffold( + backgroundColor: Colors.transparent, + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Material( + type: MaterialType.transparency, + child: Form( + key: atividadeController.formKey, + child: Padding( + padding: const EdgeInsets.only(top: 24.0), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height, + ), + child: DialogPersonalizado( + nome: 'Atividade', + child: [ + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: input( + onSaved: atividadeController.atividadeNome, + textController: + atividadeController.controllerNome, + label: 'nome', + ), + ), + SelectData( + label: 'data inicial', + controller: + atividadeController.controllerDataIncial, + onSaved: atividadeController.atividadeDataInical, + ), + SelectData( + label: 'data final', + controller: atividadeController.controllerDataFinal, + onSaved: atividadeController.atividadeDataFinal, + ), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: input( + onSaved: atividadeController.atividadeObservacao, + textController: + atividadeController.controllerObservacao, + label: 'observação', + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: SelectPrioridade( + prioridade: + atividadeController.atividadePrioridade, + prioridadeAtual: atividade?.prioridade ?? ''), + ), + SelectCor( + cor: atividadeController.atividadeCor, + corAtual: atividade?.cor ?? '', + ), + Botao( + texto: 'Salvar', + cor: const Color(0xFF6385C3), + clicar: () async { + bool succes = await atividadeController + .saveAtividade(addAtividade); + + if (succes == true) { + var nav = Navigator.of(context); + nav.pop(); + + if (atividade!.id != null) { + //nav.pop(); + nav.pop(); + } + fecharDialog!(); + } + }, + ), + ], + ), + ), + ), + ), + ), + ), + ); + }); + }); +} diff --git a/lib/components/dialogs/atividades/atividadeDialog.dart b/lib/components/dialogs/atividades/atividadeDialog.dart new file mode 100644 index 0000000..d2fa969 --- /dev/null +++ b/lib/components/dialogs/atividades/atividadeDialog.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; +import 'package:organizei/Repository/AtividadeRepository.dart'; +import 'package:organizei/components/botao.dart'; +import 'package:organizei/components/dialog_personalizado.dart'; +import 'package:organizei/components/dialogs/atividades/atividadeCadastroDialog.dart'; +import '../../../Controller/AtividadeController.dart'; + +Future visualizarAtividade( + BuildContext context, { + required AtividadeModel atividade, + Function? fecharDialog = null, + Function? addAtividade, + Function? deleteAtividade, +}) { + late AtividadeController atividadeController; + atividadeController = AtividadeController(AtividadeRepository(), context); + + atividadeController.atividadeId(atividade.id); + + return showDialog( + barrierDismissible: false, + barrierColor: Colors.white.withOpacity(0), + context: context, + builder: (context) { + return StatefulBuilder(builder: (context, StateSetter setState) { + return Scaffold( + backgroundColor: Colors.transparent, + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Material( + type: MaterialType.transparency, + child: Form( + key: atividadeController.formKey, + child: Padding( + padding: const EdgeInsets.only(top: 24.0), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height, + ), + child: DialogPersonalizado( + nome: atividade.nome ?? '', + cor: atividade.cor ?? '', + child: [ + Text(atividade.observacao ?? ''), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'data inicial: ', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w700, + ), + ), + Text(atividade.dataInicial ?? ''), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'data final: ', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w700, + ), + ), + Text(atividade.dataFinal ?? ''), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'prioridade: ', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w700, + ), + ), + Text(atividade.prioridade ?? ''), + ], + ), + Padding( + padding: const EdgeInsets.only(bottom: 16, top: 16), + child: Botao( + texto: 'Concluir', + cor: const Color(0xFF74C198), + clicar: () async { + bool succes = await atividadeController + .concluirAtividade(true); + + if (succes == true) { + Navigator.pop(context); + fecharDialog!(); + } + }, + ), + ), + Botao( + texto: 'Editar', + cor: const Color(0xFF6385C3), + clicar: () async { + //Navigator.pop(context); + criarAtividade(context, + atividade: atividade, + addAtividade: addAtividade, + fecharDialog: fecharDialog); + }, + ), + Padding( + padding: const EdgeInsets.only(bottom: 16, top: 16), + child: Botao( + texto: 'Excluir', + cor: const Color(0xFFEF7E69), + clicar: () async { + bool succes = await atividadeController + .excluirAtividade(); + + if (succes == true) { + deleteAtividade!(); + Navigator.pop(context); + fecharDialog!(); + } + }, + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + }); + }); +} diff --git a/lib/components/dialogs/listas/listaCadastroDialog.dart b/lib/components/dialogs/listas/listaCadastroDialog.dart index 4df611f..b8e9509 100644 --- a/lib/components/dialogs/listas/listaCadastroDialog.dart +++ b/lib/components/dialogs/listas/listaCadastroDialog.dart @@ -88,8 +88,6 @@ Future criarLista(BuildContext context, excluir: true, funcao: () async { if (itens![index]!.id != null) { - print('entrei no if'); - print(itens[index]!.id); itemController.itemId(itens[index]!.id); await itemController.excluirItem(); } diff --git a/lib/components/dialogs/listas/listaDialog.dart b/lib/components/dialogs/listas/listaDialog.dart index cf57e51..459bfd6 100644 --- a/lib/components/dialogs/listas/listaDialog.dart +++ b/lib/components/dialogs/listas/listaDialog.dart @@ -17,9 +17,6 @@ Future visualizarLista(BuildContext context, itemController = ItemController(ItemRepository(), context); listaController.listaId(lista.id); - - var _pageSize = MediaQuery.of(context).size.height; - var _notifySize = MediaQuery.of(context).padding.top; //var _appBarSize = appBar.preferredSize.height; return showDialog( diff --git a/lib/components/dialogs/projetos/projetoCadastroDialog.dart b/lib/components/dialogs/projetos/projetoCadastroDialog.dart index 799b6d4..f6e5362 100644 --- a/lib/components/dialogs/projetos/projetoCadastroDialog.dart +++ b/lib/components/dialogs/projetos/projetoCadastroDialog.dart @@ -1,20 +1,29 @@ import 'package:flutter/material.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; import 'package:organizei/Model/Projeto/ProjetoModel.dart'; import 'package:organizei/Repository/ProjetoRepository.dart'; import 'package:organizei/components/botao.dart'; +import 'package:organizei/components/card_item.dart'; import 'package:organizei/components/dialog_personalizado.dart'; +import 'package:organizei/components/dialogs/atividades/atividadeCadastroDialog.dart'; +import 'package:organizei/components/dialogs/atividades/atividadeDialog.dart'; import 'package:organizei/components/input.dart'; import 'package:organizei/components/selectCor.dart'; import 'package:organizei/components/selectData.dart'; import 'package:organizei/components/selectPrioridade.dart'; import '../../../Controller/ProjetoController.dart'; -Future criarProjeto(BuildContext context, - {ProjetoModel? projeto = null, Function? fecharDialog = null}) { +Future criarProjeto( + BuildContext context, { + ProjetoModel? projeto = null, + Function? fecharDialog = null, +}) { late ProjetoController projetoController; projetoController = ProjetoController(ProjetoRepository(), context); + late List? atividades = []; + if (projeto != null) { projetoController.controllerNome.text = projeto.nome ?? ''; projetoController.controllerDataIncial.text = projeto.dataInicial ?? ''; @@ -22,6 +31,9 @@ Future criarProjeto(BuildContext context, projetoController.controllerObservacao.text = projeto.observacao ?? ''; projetoController.projetoCor(projeto.cor); projetoController.projetoId(projeto.id); + projetoController.projetoAtividades(projeto.atividades); + + atividades = projeto.atividades; } return showDialog( @@ -77,12 +89,66 @@ Future criarProjeto(BuildContext context, ), ), SelectCor( - cor: projetoController.projetoCor, - corAtual: projeto?.cor ?? ''), + cor: projetoController.projetoCor, + corAtual: projeto?.cor ?? '', + ), + ListView.builder( + primary: false, + shrinkWrap: true, + itemCount: atividades!.length, + itemBuilder: (context, index) { + return cardItem( + cor: Color(int.tryParse( + atividades![index]!.cor ?? + '0xFF6385C3') ?? + 0), + nome: atividades[index]!.nome ?? 'a', + horario: '', + abrirDialog: () { + return visualizarAtividade( + context, + atividade: atividades![index]!, + addAtividade: (atividade) { + setState((() { + atividades![index] = atividade; + })); + }, + fecharDialog: fecharDialog, + deleteAtividade: () { + setState(() { + atividades! + .remove(atividades[index]); + }); + }, + ); + }); + }), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Botao( + texto: 'Adicionar atividade', + cor: const Color(0xFF6BC8E4), + clicar: () async { + atividades!.add(AtividadeModel()); + criarAtividade( + context, + atividade: atividades[atividades.length - 1], + addAtividade: (atividade) { + setState((() { + atividades![atividades.length - 1] = + atividade; + })); + }, + fecharDialog: fecharDialog, + ); + }, + ), + ), Botao( texto: 'Salvar', cor: const Color(0xFF6385C3), clicar: () async { + projetoController.projetoAtividades(atividades); bool succes = await projetoController.saveProjeto(); diff --git a/lib/components/dialogs/projetos/projetoDialog.dart b/lib/components/dialogs/projetos/projetoDialog.dart index 0bb6a29..fbdc77d 100644 --- a/lib/components/dialogs/projetos/projetoDialog.dart +++ b/lib/components/dialogs/projetos/projetoDialog.dart @@ -2,7 +2,9 @@ import 'package:flutter/material.dart'; import 'package:organizei/Model/Projeto/ProjetoModel.dart'; import 'package:organizei/Repository/ProjetoRepository.dart'; import 'package:organizei/components/botao.dart'; +import 'package:organizei/components/card_item.dart'; import 'package:organizei/components/dialog_personalizado.dart'; +import 'package:organizei/components/dialogs/atividades/atividadeDialog.dart'; import 'package:organizei/components/dialogs/projetos/projetoCadastroDialog.dart'; import '../../../Controller/ProjetoController.dart'; @@ -77,9 +79,49 @@ Future visualizarProjeto(BuildContext context, fontWeight: FontWeight.w700, ), ), - Text(''), + Text(projeto.progresso ?? ''), ], ), + ListView.builder( + primary: false, + shrinkWrap: true, + itemCount: projeto.atividades!.length, + itemBuilder: (context, index) { + if (projeto.atividades![index]!.concluido == + false || + projeto.atividades![index]!.concluido == + null) { + return cardItem( + cor: Color(int.tryParse( + projeto.atividades![index]!.cor ?? + '0xFF6385C3') ?? + 0), + nome: projeto.atividades![index]!.nome ?? + '', + horario: '', + abrirDialog: () { + return visualizarAtividade( + context, + atividade: + projeto.atividades![index]!, + addAtividade: (atividade) { + setState((() { + projeto.atividades![index] = + atividade; + })); + }, + deleteAtividade: () { + setState(() { + projeto.atividades!.remove( + projeto.atividades![index]); + }); + }, + fecharDialog: fecharDialog, + ); + }); + } else + return Text(''); + }), Padding( padding: const EdgeInsets.only(bottom: 16, top: 16), child: Botao( @@ -100,8 +142,11 @@ Future visualizarProjeto(BuildContext context, texto: 'Editar', cor: const Color(0xFF6385C3), clicar: () async { - criarProjeto(context, - projeto: projeto, fecharDialog: fecharDialog); + criarProjeto( + context, + projeto: projeto, + fecharDialog: fecharDialog, + ); }, ), Padding( diff --git a/lib/home_page.dart b/lib/home_page.dart index cd4b2ac..7205463 100644 --- a/lib/home_page.dart +++ b/lib/home_page.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; import 'package:http/retry.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:organizei/Controller/TarefaController.dart'; +import 'package:organizei/Model/Atividade/AtividadeModel.dart'; import 'package:organizei/Model/Habito/HabitoModel.dart'; import 'package:organizei/Model/Lembrete/LembreteModel.dart'; import 'package:organizei/Model/Tarefa/TarefaModel.dart'; import 'package:organizei/Repository/TarefaRepository.dart'; import 'package:organizei/components/card_item.dart'; import 'package:intl/intl.dart'; +import 'package:organizei/components/dialogs/atividades/atividadeDialog.dart'; import 'package:organizei/components/dialogs/habitos/habitoDialog.dart'; import 'package:organizei/components/dialogs/lembretes/lembreteDialog.dart'; import 'package:organizei/components/dialogs/tarefas/tarefaDialog.dart'; @@ -208,6 +210,11 @@ class _HomePageState extends State { item = LembreteModel.fromJson( snapshot.data['tarefas'][index]); } + + if (tipo == 'atividade') { + item = AtividadeModel.fromJson( + snapshot.data['tarefas'][index]); + } return cardItem( cor: Color(int.tryParse( item.cor ?? '0xFF6385C3') ?? @@ -240,6 +247,14 @@ class _HomePageState extends State { setState(() {}); }, ); + } else if (tipo == 'atividade') { + return visualizarAtividade( + context, + atividade: item, + fecharDialog: () { + setState(() {}); + }, + ); } }); });