Merge branch 'main' into fix/not_message

This commit is contained in:
Ivan Antunes 2024-08-13 09:39:11 -03:00
commit 4a40f6b6b3
19 changed files with 1452 additions and 1151 deletions

View File

@ -53,8 +53,8 @@
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
6436409727A31CDC00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 6436409227A31CDD00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; };
6436409027A31CD400820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 6436409B27A31CD600820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C1B4A503715BC7B0F8826983 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; C1B4A503715BC7B0F8826983 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@ -303,8 +303,8 @@
6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
6436409727A31CDC00820AF7 /* pt */, 6436409227A31CDD00820AF7 /* pt */,
6436409027A31CD400820AF7 /* en */, 6436409B27A31CD600820AF7 /* en */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";

View File

@ -3,6 +3,7 @@ import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:hub/shared/utils/validator_util.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import 'api_manager.dart'; import 'api_manager.dart';
@ -1391,7 +1392,7 @@ class PostProvVisitSchedulingCall {
'userUUID': userUUID, 'userUUID': userUUID,
'cliID': cliID, 'cliID': cliID,
'atividade': atividade, 'atividade': atividade,
'data': data, 'data': ValidatorUtil.toISO8601("dd/MM/yyyy HH:mm:ss", data!),
'motivo': motivo, 'motivo': motivo,
'nome': nome, 'nome': nome,
'proID': proID, 'proID': proID,
@ -1835,7 +1836,7 @@ class RespondeSolicitacaoCall {
} }
class GetAccessCall { class GetAccessCall {
Stream<ApiCallResponse> call({ Future<ApiCallResponse> call({
String? devUUID = '', String? devUUID = '',
String? userUUID = '', String? userUUID = '',
String? cliID = '', String? cliID = '',
@ -1845,43 +1846,31 @@ class GetAccessCall {
String? pesTipo = '', String? pesTipo = '',
}) { }) {
final baseUrl = PhpGroup.getBaseUrl(); final baseUrl = PhpGroup.getBaseUrl();
final StreamController<ApiCallResponse> controller = StreamController();
Future.microtask(() async { return ApiManager.instance.makeApiCall(
try { callName: 'getAccess',
final response = await ApiManager.instance.makeApiCall( apiUrl: '$baseUrl/processRequest.php',
callName: 'getAccess', callType: ApiCallType.POST,
apiUrl: '$baseUrl/processRequest.php', headers: {
callType: ApiCallType.POST, 'Content-Type': 'application/x-www-form-urlencoded',
headers: { },
'Content-Type': 'application/x-www-form-urlencoded', params: {
}, 'devUUID': devUUID,
params: { 'userUUID': userUUID,
'devUUID': devUUID, 'cliID': cliID,
'userUUID': userUUID, 'atividade': atividade,
'cliID': cliID, 'pageSize': pageSize,
'atividade': atividade, 'pageNumber': pageNumber,
'pageSize': pageSize, 'pesTipo': pesTipo,
'pageNumber': pageNumber, },
'pesTipo': pesTipo, bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
}, returnBody: true,
bodyType: BodyType.X_WWW_FORM_URL_ENCODED, encodeBodyUtf8: false,
returnBody: true, decodeUtf8: false,
encodeBodyUtf8: false, cache: false,
decodeUtf8: false, isStreamingApi: false,
cache: false, alwaysAllowBody: false,
isStreamingApi: false, );
alwaysAllowBody: false,
);
controller.add(response);
await controller.close();
} catch (e) {
controller.addError(e);
await controller.close();
}
});
return controller.stream;
} }
bool? error(dynamic response) => castToType<bool>(getJsonField( bool? error(dynamic response) => castToType<bool>(getJsonField(

View File

@ -13,6 +13,7 @@ import 'package:hub/app_state.dart';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart'; import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
@ -402,7 +403,7 @@ class NotificationHandler {
_getIdBasedOnUserType(message); _getIdBasedOnUserType(message);
return Dialog( return Dialog(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
child: VisitRequestTemplateComponentWidget( child: DetailsComponentWidget(
buttons: [ buttons: [
FlutterFlowIconButton( FlutterFlowIconButton(
icon: const Icon(Icons.done), icon: const Icon(Icons.done),

View File

@ -1,3 +1,4 @@
import 'dart:ffi';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -7,7 +8,6 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
class OptModalWidget extends StatefulWidget { class OptModalWidget extends StatefulWidget {
final String defaultPersonType; final String defaultPersonType;
final String defaultAccessType; final String defaultAccessType;
@ -30,10 +30,6 @@ class _OptModalWidgetState extends State<OptModalWidget> {
{'title': 'zok7lu4w', 'value': 'E'}, {'title': 'zok7lu4w', 'value': 'E'},
{'title': 'oonqk812', 'value': 'O'}, {'title': 'oonqk812', 'value': 'O'},
]; ];
final List<Map<String, String>> accessTypeOptions = [
{'title': '580z80ct', 'value': '0'},
{'title': '1nbwqtzs', 'value': '1'},
];
@override @override
void setState(VoidCallback callback) { void setState(VoidCallback callback) {
@ -89,7 +85,8 @@ class _OptModalWidgetState extends State<OptModalWidget> {
Navigator.pop(context, filterResult); Navigator.pop(context, filterResult);
} }
Widget _buildCheckboxListTile(String key, List<Map<String, String>> options) { Widget _buildCheckboxListTile(
String key, List<Map<String, String>> options, double fontsize) {
return Column( return Column(
children: [ children: [
Row( Row(
@ -97,14 +94,13 @@ class _OptModalWidgetState extends State<OptModalWidget> {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(0.0, 3.0, 0.0, 0.0),
const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
child: Text( child: Text(
FFLocalizations.of(context).getText('l7tw8b92'), FFLocalizations.of(context).getText('l7tw8b92'),
textAlign: TextAlign textAlign: TextAlign.left,
.left, // Adiciona esta linha para alinhar o texto à esquerda
style: FlutterFlowTheme.of(context).bodyMedium.override( style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily, fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
fontSize: fontsize,
letterSpacing: 0.0, letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily), FlutterFlowTheme.of(context).bodyMediumFamily),
@ -115,6 +111,7 @@ class _OptModalWidgetState extends State<OptModalWidget> {
], ],
), ),
ListView.builder( ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemCount: options.length, itemCount: options.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -125,6 +122,7 @@ class _OptModalWidgetState extends State<OptModalWidget> {
style: FlutterFlowTheme.of(context).bodyMedium.override( style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily, fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0, letterSpacing: 0.0,
fontSize: fontsize,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily), FlutterFlowTheme.of(context).bodyMediumFamily),
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
@ -148,9 +146,10 @@ class _OptModalWidgetState extends State<OptModalWidget> {
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100), borderRadius: BorderRadius.circular(100),
), ),
enableFeedback: true, enableFeedback: true,
side: BorderSide( side: BorderSide(
width: 10, width: 5,
color: FlutterFlowTheme.of(context).secondaryText, color: FlutterFlowTheme.of(context).secondaryText,
), ),
controlAffinity: controlAffinity:
@ -178,154 +177,70 @@ class _OptModalWidgetState extends State<OptModalWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SafeArea( double screenWidth = MediaQuery.of(context).size.width;
child: Align( double screenHeight = MediaQuery.of(context).size.height;
alignment: const AlignmentDirectional(1.0, -1.0),
return Center(
child: Container(
width: screenWidth * 0.75,
height: screenHeight * 0.35,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground,
borderRadius: BorderRadius.circular(24.0),
),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 50.0, 50.0, 0.0), padding: const EdgeInsets.all(4.0),
child: Container( child: Column(
width: 300.0, children: [
height: 450.0, Row(
decoration: BoxDecoration( mainAxisSize: MainAxisSize.max,
color: FlutterFlowTheme.of(context).primaryBackground, mainAxisAlignment: MainAxisAlignment.start,
borderRadius: BorderRadius.circular(24.0),
),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Column(
children: [ children: [
Row( Padding(
mainAxisSize: MainAxisSize.max, padding: const EdgeInsetsDirectional.fromSTEB(
mainAxisAlignment: MainAxisAlignment.start, 10.0, 10.0, 0.0, 10.0),
children: [ child: Text(
Padding( FFLocalizations.of(context)
padding: const EdgeInsetsDirectional.fromSTEB( .getText('yfj9pd6k'), // Filtros
10.0, 10.0, 0.0, 10.0), style:
child: Text( FlutterFlowTheme.of(context).headlineMedium.override(
FFLocalizations.of(context)
.getText('yfj9pd6k'), // Filtros
style: FlutterFlowTheme.of(context)
.headlineMedium
.override(
fontFamily: FlutterFlowTheme.of(context) fontFamily: FlutterFlowTheme.of(context)
.headlineMediumFamily, .headlineMediumFamily,
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
fontSize: 16.0, fontSize: 18.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context) FlutterFlowTheme.of(context)
.headlineMediumFamily), .headlineMediumFamily),
), ),
),
),
],
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
8.0, 0.0, 8.0, 0.0),
child: TextFormField(
controller: _model.textController,
focusNode: _model.textFieldFocusNode,
autofocus: false,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'0enrtljz' /* Pesquise aqui..... */,
),
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).alternate,
width: 1,
),
borderRadius: BorderRadius.circular(8.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 1,
),
borderRadius: BorderRadius.circular(8.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 1,
),
borderRadius: BorderRadius.circular(8.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 1,
),
borderRadius: BorderRadius.circular(8.0),
),
filled: true,
fillColor: FlutterFlowTheme.of(context).alternate,
suffixIcon: const Icon(
Icons.search_outlined,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
validator:
_model.textControllerValidator.asValidator(context),
),
),
SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_buildCheckboxListTile(
'personType', personTypeOptions),
_buildCheckboxListTile(
'accessType', accessTypeOptions),
],
),
),
),
ElevatedButton(
onPressed: _applyFilter,
child:
Text(FFLocalizations.of(context).getText('88kshkph')),
style: ElevatedButton.styleFrom(
foregroundColor: FlutterFlowTheme.of(context).info,
backgroundColor: FlutterFlowTheme.of(context).primary,
), ),
), ),
], ],
), ),
), Expanded(
child: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_buildCheckboxListTile(
'personType', personTypeOptions, 14),
],
),
),
),
),
ElevatedButton(
onPressed: _applyFilter,
style: ElevatedButton.styleFrom(
foregroundColor: FlutterFlowTheme.of(context).info,
backgroundColor: FlutterFlowTheme.of(context).primary,
),
child: Text(FFLocalizations.of(context).getText('88kshkph')),
),
],
), ),
), ),
), ),

View File

@ -1,6 +1,8 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:developer'; import 'dart:developer';
import 'package:auto_size_text/auto_size_text.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
@ -71,8 +73,16 @@ class _CardItemTemplateComponentWidgetState
} }
} }
String truncate(int cutoff, String mytext) {
return (mytext.length <= cutoff)
? mytext
: '${mytext.substring(0, cutoff)}...';
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
double screenHeight = MediaQuery.of(context).size.height;
context.watch<FFAppState>(); context.watch<FFAppState>();
return InkWell( return InkWell(
splashColor: Colors.transparent, splashColor: Colors.transparent,
@ -137,7 +147,7 @@ class _CardItemTemplateComponentWidgetState
fontFamily: fontFamily:
FlutterFlowTheme.of(context) FlutterFlowTheme.of(context)
.bodyMediumFamily, .bodyMediumFamily,
fontSize: 12.5, fontSize: screenWidth * 0.025,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts useGoogleFonts: GoogleFonts
@ -148,7 +158,7 @@ class _CardItemTemplateComponentWidgetState
.bodyMediumFamily), .bodyMediumFamily),
color: color:
FlutterFlowTheme.of(context) FlutterFlowTheme.of(context)
.primaryText, .customColor6,
), ),
), ),
const SizedBox( const SizedBox(

View File

@ -18,7 +18,7 @@ Widget buildDetails(
BuildContext context, BuildContext context,
Future<dynamic> Function(BuildContext, int, int, String, String)? Future<dynamic> Function(BuildContext, int, int, String, String)?
changeStatusAction) { changeStatusAction) {
return VisitRequestTemplateComponentWidget( return DetailsComponentWidget(
buttons: [ buttons: [
if (getStatus(visitaWrapItem['VAW_STATUS']) == if (getStatus(visitaWrapItem['VAW_STATUS']) ==
status.active) // REJECT ACTION status.active) // REJECT ACTION

View File

@ -2,8 +2,7 @@ import 'package:flutter/material.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
class VisitRequestTemplateComponentModel class DetailsComponentModel extends FlutterFlowModel<DetailsComponentWidget> {
extends FlutterFlowModel<VisitRequestTemplateComponentWidget> {
/// State fields for stateful widgets in this component. /// State fields for stateful widgets in this component.
// State field(s) for TextField widget. // State field(s) for TextField widget.

View File

@ -11,8 +11,8 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class VisitRequestTemplateComponentWidget extends StatefulWidget { class DetailsComponentWidget extends StatefulWidget {
const VisitRequestTemplateComponentWidget({ const DetailsComponentWidget({
Key? key, Key? key,
required this.labelsHashMap, required this.labelsHashMap,
required this.statusHashMap, required this.statusHashMap,
@ -28,13 +28,13 @@ class VisitRequestTemplateComponentWidget extends StatefulWidget {
final List<Widget> buttons; final List<Widget> buttons;
@override @override
State<VisitRequestTemplateComponentWidget> createState() => State<DetailsComponentWidget> createState() =>
_VisitRequestTemplateComponentWidgetState(); _DetailsComponentWidgetState();
} }
class _VisitRequestTemplateComponentWidgetState class _DetailsComponentWidgetState
extends State<VisitRequestTemplateComponentWidget> { extends State<DetailsComponentWidget> {
late VisitRequestTemplateComponentModel _model; late DetailsComponentModel _model;
LinkedHashMap<String, String> get labelsLinkedHashMap => LinkedHashMap<String, String> get labelsLinkedHashMap =>
LinkedHashMap.from(widget.labelsHashMap ?? {}); LinkedHashMap.from(widget.labelsHashMap ?? {});
@ -53,7 +53,7 @@ class _VisitRequestTemplateComponentWidgetState
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_model = createModel(context, () => VisitRequestTemplateComponentModel()); _model = createModel(context, () => DetailsComponentModel());
_model.textFieldFocusNodeStatus ??= FocusNode(); _model.textFieldFocusNodeStatus ??= FocusNode();
} }

View File

@ -19,7 +19,7 @@ class ForgotPasswordTemplateComponentModel
BuildContext context, String? val) { BuildContext context, String? val) {
if (val == null || val.isEmpty) { if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText( return FFLocalizations.of(context).getText(
'3hqg8buh' /* E-mail é Obrigatório */, 'snnmkbyc' /* E-mail é Obrigatório */,
); );
} }

View File

@ -320,46 +320,74 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
}, },
// scheduleProvisionalVisitPage // scheduleProvisionalVisitPage
{ {
'x7at46ur': { 'uj8acuab': {
'pt': 'Quais visitantes você deseja cadastrar?', 'pt': 'Preencha os Campos Abaixo:',
'en': 'Which visitors do you want to register?', 'en': 'Fill in the fields below:',
}, },
'shj19b2o': { '8d3679lf': {
'pt': 'Qual o período de validade da visita?', 'pt': 'Propriedade',
'en': 'Visit Validity Period', 'en': 'Property',
}, },
'8zgsw5so': { 'z6aawgqa': {
'pt': 'Ínicio da Visita', 'pt': 'Dados da Visita',
'en': 'Start of the Visit', 'en': 'Visit Data',
},
'p16wm7kp': {
'pt': 'Quando a visitas se inicia?',
'en': 'When does the visit start?',
},
'3zfd7uf9': {
'pt': 'Qual o nome do visitante?',
'en': 'What is the visitor\'s name?',
}, },
'wehvxbz4': { 'wehvxbz4': {
'pt': 'Nome do Visitante', 'pt': 'Nome / Apelido do Visitante',
'en': 'Visitor Name', 'en': 'Visitor\'s Name / Nickname',
}, },
'juh7f24w': { 'juh7f24w': {
'pt': 'Escreva o nome do visitante aqui', 'pt': '',
'en': 'Write the visitor\'s name here', 'en': '',
}, },
'jhss056s': { '8zgsw5so': {
'pt': 'Você tem alguma observação sobre está visita?', 'pt': 'Data / Hora Limite da Visita',
'en': 'Do you have any observations about this visit?', 'en': 'Visit Limit Date / Time',
},
'p16wm7kp': {
'pt': '',
'en': '',
}, },
'cw8b3tbb': { 'cw8b3tbb': {
'pt': 'Observações da Visita', 'pt': 'Observação da Visita',
'en': 'Visit Observations', 'en': 'Notes Visit',
}, },
'k4qkbv1f': { 'k4qkbv1f': {
'pt': 'Escreva as suas observações aqui', 'pt': '',
'en': 'Write your observations here', 'en': 'Write your observations here',
}, },
'bv5fg9sv': {
'pt': 'Enviar',
'en': 'Send',
},
'3hqg8buh': {
'pt': 'Nome é Obrigatório',
'en': 'Name is Required',
},
'l0b0zr50': {
'pt': 'Máximo 80 caracteres',
'en': 'Maximum 80 characters',
},
'1p76vmkn': {
'pt': 'Please choose an option from the dropdown',
'en': '',
},
'uzefkuf9': {
'pt': 'Data / Hora é Obrigatório',
'en': 'Date / Time is Required',
},
'sn6pj4tx': {
'pt': 'Please choose an option from the dropdown',
'en': '',
},
'j14it3wp': {
'pt': 'Field is required',
'en': '',
},
'ypo6pxie': {
'pt': 'Please choose an option from the dropdown',
'en': '',
},
'cifgwfxs': { 'cifgwfxs': {
'pt': 'Agendamento Provisório', 'pt': 'Agendamento Provisório',
'en': 'Provisional Scheduling', 'en': 'Provisional Scheduling',
@ -518,8 +546,8 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
// optModal // optModal
{ {
'0enrtljz': { '0enrtljz': {
'pt': 'Pesquise aqui.....', 'pt': 'Pesquise aqui...',
'en': 'Search here.....', 'en': 'Search here...',
}, },
'l7tw8b92': { 'l7tw8b92': {
'pt': 'Tipo de Pessoa', 'pt': 'Tipo de Pessoa',
@ -1047,7 +1075,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
'pt': '', 'pt': '',
'en': '', 'en': '',
}, },
'3hqg8buh': { 'snnmkbyc': {
'pt': 'E-mail é Obrigatório', 'pt': 'E-mail é Obrigatório',
'en': 'E-mail is Required', 'en': 'E-mail is Required',
}, },
@ -1055,7 +1083,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
'pt': 'E-mail Inválido', 'pt': 'E-mail Inválido',
'en': 'Invalid E-mail', 'en': 'Invalid E-mail',
}, },
'1p76vmkn': { 'ph22karc': {
'pt': 'Please choose an option from the dropdown', 'pt': 'Please choose an option from the dropdown',
'en': '', 'en': '',
}, },
@ -1064,7 +1092,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
'en': 'Send', 'en': 'Send',
}, },
}, },
// visitRequestTemplateComponent // detailsComponent
{ {
'ivfw4j04': { 'ivfw4j04': {
'pt': 'Nome', 'pt': 'Nome',

View File

@ -57,16 +57,25 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
bool includeDimensions = false, bool includeDimensions = false,
bool includeBlurHash = false, bool includeBlurHash = false,
}) async { }) async {
createUploadMediaListTile(String label, MediaSource mediaSource) => ListTile( createUploadMediaListTile(
title: Text( String label, MediaSource mediaSource, IconData icon) =>
label, ListTile(
textAlign: TextAlign.center, title: Row(
style: GoogleFonts.getFont( mainAxisAlignment: MainAxisAlignment.center,
pickerFontFamily, children: [
color: FlutterFlowTheme.of(context).primaryText, Icon(icon, color: FlutterFlowTheme.of(context).primaryText),
fontWeight: FontWeight.w600, const SizedBox(width: 5),
fontSize: 20, Text(
), label,
textAlign: TextAlign.center,
style: GoogleFonts.getFont(
pickerFontFamily,
color: FlutterFlowTheme.of(context).primaryText,
fontWeight: FontWeight.w600,
fontSize: 12,
),
),
],
), ),
tileColor: FlutterFlowTheme.of(context).primaryBackground, tileColor: FlutterFlowTheme.of(context).primaryBackground,
dense: false, dense: false,
@ -83,11 +92,22 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (!kIsWeb) ...[ if (!kIsWeb) ...[
Container(
margin: const EdgeInsets.only(top: 10),
width: 40,
height: 5,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(10),
),
),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 0), padding: const EdgeInsets.fromLTRB(0, 8, 0, 0),
child: ListTile( child: ListTile(
title: Text( title: Text(
'Choose Source', FFLocalizations.of(context).getVariableText(
ptText: "Escolha uma das opções",
enText: "Choose one of the options"),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: GoogleFonts.getFont( style: GoogleFonts.getFont(
pickerFontFamily, pickerFontFamily,
@ -95,41 +115,61 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
.primaryText .primaryText
.withOpacity(0.65), .withOpacity(0.65),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 20, fontSize: 14,
), ),
), ),
tileColor: FlutterFlowTheme.of(context).primaryBackground, tileColor: FlutterFlowTheme.of(context).primaryBackground,
dense: true, dense: true,
), ),
), ),
const Divider(),
], ],
if (allowPhoto && allowVideo) ...[ Row(
createUploadMediaListTile( mainAxisAlignment: MainAxisAlignment.spaceEvenly,
'Gallery (Photo)', children: [
MediaSource.photoGallery, if (allowPhoto && allowVideo) ...[
), Expanded(
const Divider(), child: createUploadMediaListTile(
createUploadMediaListTile( FFLocalizations.of(context).getVariableText(
'Gallery (Video)', ptText: "Galeria (Foto)",
MediaSource.videoGallery, enText: "Gallery (Photo)"),
), MediaSource.photoGallery,
] else if (allowPhoto) Icons.camera),
createUploadMediaListTile( ),
'Gallery', Expanded(
MediaSource.photoGallery, child: createUploadMediaListTile(
) FFLocalizations.of(context).getVariableText(
else ptText: "Galeria (Video)",
createUploadMediaListTile( enText: "Gallery (Video)"),
'Gallery', MediaSource.videoGallery,
MediaSource.videoGallery, Icons.videocam),
), )
if (!kIsWeb) ...[ ] else if (allowPhoto)
const Divider(), Expanded(
createUploadMediaListTile('Camera', MediaSource.camera), child: createUploadMediaListTile(
const Divider(), FFLocalizations.of(context).getVariableText(
], ptText: "Galeria", enText: "Gallery"),
const SizedBox(height: 10), MediaSource.photoGallery,
Icons.photo))
else
Expanded(
child: createUploadMediaListTile(
FFLocalizations.of(context).getVariableText(
ptText: "Galeria", enText: "Gallery"),
MediaSource.videoGallery,
Icons.videocam),
),
if (!kIsWeb) ...[
Expanded(
child: createUploadMediaListTile(
FFLocalizations.of(context).getVariableText(
ptText: "Camera", enText: "Camera"),
MediaSource.camera,
Icons.camera_alt),
)
],
],
),
const SizedBox(height: 15),
], ],
); );
}); });

View File

@ -11,11 +11,11 @@ import 'package:hub/pages/liberation_history/liberation_history_model.dart';
class AcessHistoryPageModel extends FlutterFlowModel<AcessHistoryPageWidget> { class AcessHistoryPageModel extends FlutterFlowModel<AcessHistoryPageWidget> {
final unfocusNode = FocusNode(); final unfocusNode = FocusNode();
final _accessHistoryManager = StreamRequestManager<ApiCallResponse>(); final _accessHistoryManager = FutureRequestManager<ApiCallResponse>();
Stream<ApiCallResponse> accessHistory({ Future<ApiCallResponse> accessHistory({
String? uniqueQueryKey, String? uniqueQueryKey,
bool? overrideCache, bool? overrideCache,
required Stream<ApiCallResponse> Function() requestFn, required Future<ApiCallResponse> Function() requestFn,
}) => }) =>
_accessHistoryManager.performRequest( _accessHistoryManager.performRequest(
uniqueQueryKey: uniqueQueryKey, uniqueQueryKey: uniqueQueryKey,

View File

@ -1,5 +1,7 @@
import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -7,9 +9,7 @@ import 'package:hub/app_state.dart';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/components/molecular_components/message_opt_modal/opt_modal_widget.dart'; import 'package:hub/components/molecular_components/message_opt_modal/opt_modal_widget.dart';
import 'package:hub/components/molecular_components/option_selection_modal/option_selection_modal_widget.dart';
import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart';
import 'package:hub/flutter_flow/custom_functions.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
@ -17,6 +17,8 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/pages/acess_history_page/acess_history_page_model.dart'; import 'package:hub/pages/acess_history_page/acess_history_page_model.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/log_util.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
@immutable @immutable
@ -40,8 +42,8 @@ class AccessHistoryItemWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return const Padding(
padding: const EdgeInsets.all(8.0), padding: EdgeInsets.all(8.0),
child: Column(), child: Column(),
); );
} }
@ -53,6 +55,17 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
bool _isSubjectClosed = false; bool _isSubjectClosed = false;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
late ScrollController _scrollController;
int _pageNumber = 1;
final int _pageSize = 10;
bool _hasData = false;
bool _loading = false;
String _personType = '.*';
late Future<void> _accessFuture;
List<dynamic> _accessWrap = [];
_AcessHistoryPageWidgetState(Map<String, String> opt) _AcessHistoryPageWidgetState(Map<String, String> opt)
: selectedTypeSubject = BehaviorSubject.seeded(opt) { : selectedTypeSubject = BehaviorSubject.seeded(opt) {
selectedTypeSubject.listen((value) {}); selectedTypeSubject.listen((value) {});
@ -62,6 +75,15 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
void initState() { void initState() {
super.initState(); super.initState();
_model = createModel(context, () => AcessHistoryPageModel()); _model = createModel(context, () => AcessHistoryPageModel());
_accessFuture = fetchAccessHistoryService();
_scrollController = ScrollController()
..addListener(() {
if (_scrollController.position.atEdge &&
_scrollController.position.pixels != 0) {
_loadMoreAccess();
}
});
} }
@override @override
@ -73,31 +95,28 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = FlutterFlowTheme.of(context);
return Scaffold( return Scaffold(
key: scaffoldKey, key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
appBar: _appBarOrganismWidget(context), appBar: _appBar(context, theme),
body: _accessHistoryListOrganismWidget(context)); body: _body(context));
} }
// AppBar Widgets PreferredSizeWidget _appBar(BuildContext context, FlutterFlowTheme theme) {
PreferredSizeWidget _appBarOrganismWidget(BuildContext context) {
final theme = FlutterFlowTheme.of(context);
return AppBar( return AppBar(
backgroundColor: theme.primaryBackground, backgroundColor: theme.primaryBackground,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
leading: _appBarBackButtonAtomWidget(context, theme), leading: _backButton(context, theme),
title: _appBarTitleMoleculeWidget(context, theme), title: _title(context, theme),
centerTitle: true, centerTitle: true,
elevation: 0.0, elevation: 0.0,
actions: [ actions: [_filterButton(context)],
_appBarFilterButtonAtomWidget(context),
],
); );
} }
Widget _appBarBackButtonAtomWidget( Widget _backButton(BuildContext context, FlutterFlowTheme theme) {
BuildContext context, FlutterFlowTheme theme) {
return FlutterFlowIconButton( return FlutterFlowIconButton(
borderColor: Colors.transparent, borderColor: Colors.transparent,
borderRadius: 30.0, borderRadius: 30.0,
@ -112,8 +131,7 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
); );
} }
Widget _appBarTitleMoleculeWidget( Widget _title(BuildContext context, FlutterFlowTheme theme) {
BuildContext context, FlutterFlowTheme theme) {
return Text( return Text(
FFLocalizations.of(context).getText('ch8qymga'), FFLocalizations.of(context).getText('ch8qymga'),
style: theme.headlineMedium.override( style: theme.headlineMedium.override(
@ -127,31 +145,42 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
); );
} }
Widget _appBarFilterButtonAtomWidget(BuildContext context) { Widget _filterButton(BuildContext context) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
IconButton( Padding(
icon: const Icon(Icons.filter_list), padding: const EdgeInsets.fromLTRB(0, 0, 10, 0),
padding: EdgeInsets.fromLTRB(0, 0, 10, 0), child: IconButton(
onPressed: () async { icon: const Icon(Icons.filter_list),
final Map<String, String>? selectedFilter = onPressed: () async {
await showModalBottomSheet<Map<String, String>>( final Map<String, String>? selectedFilter =
isScrollControlled: true, await showModalBottomSheet<Map<String, String>>(
backgroundColor: Colors.transparent, isScrollControlled: true,
context: context, backgroundColor: Colors.transparent,
builder: (context) => OptModalWidget( context: context,
defaultAccessType: builder: (context) {
selectedTypeSubject.value['accessType'] ?? '.*', return GestureDetector(
defaultPersonType: onTap: () => Navigator.of(context).pop(),
selectedTypeSubject.value['personType'] ?? '.*', child: Container(
), color: Colors.transparent,
); child: GestureDetector(
onTap: () {},
child: OptModalWidget(
defaultPersonType:
selectedTypeSubject.value['personType'] ??
'.*',
),
),
),
);
});
if (selectedFilter != null) { if (selectedFilter != null) {
_updateAccessHistoryAction(selectedFilter); _updateAccessHistoryAction(selectedFilter);
} }
}, },
),
), ),
], ],
); );
@ -170,96 +199,126 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
}); });
if (needsUpdate) { if (needsUpdate) {
selectedTypeSubject.add(updatedType); selectedTypeSubject.add(updatedType);
fetchCardListViewService(updatedType);
safeSetState(() {}); safeSetState(() {});
} }
} }
} }
Stream<ApiCallResponse> fetchAccessHistoryService(String selectedType) { Future<ApiCallResponse?> fetchAccessHistoryService() async {
switch (selectedType) { try {
case 'E': setState(() => _loading = true);
return _model.accessHistory( var response = await PhpGroup.getAccessCall.call(
requestFn: () => PhpGroup.getAccessCall.call( devUUID: FFAppState().devUUID,
devUUID: FFAppState().devUUID, userUUID: FFAppState().userUUID,
userUUID: FFAppState().userUUID, cliID: FFAppState().cliUUID,
cliID: FFAppState().cliUUID, atividade: 'getAcessos',
atividade: 'getAcessos', pageSize: _pageSize.toString(),
pageSize: '100', pageNumber: _pageNumber.toString(),
pageNumber: '1', pesTipo: _personType != 'E' && _personType != 'O' ? 'T' : _personType,
pesTipo: 'E', );
),
); final List<dynamic> accessHistory = response.jsonBody['acessos'] ?? [];
case 'O':
return _model.accessHistory( List<dynamic> filteredAccess = accessHistory.where((item) {
requestFn: () => PhpGroup.getAccessCall.call( final personTypeMatches =
devUUID: FFAppState().devUUID, _personType == '.*' || item["PES_TIPO"].toString() == _personType;
userUUID: FFAppState().userUUID, return personTypeMatches;
cliID: FFAppState().cliUUID, }).toList();
atividade: 'getAcessos',
pageSize: '100', if (filteredAccess != null && filteredAccess.isNotEmpty) {
pageNumber: '1', setState(() {
pesTipo: 'O', _accessWrap.addAll(filteredAccess);
), _hasData = true;
); _loading = false;
default: });
return _model.accessHistory( return response;
requestFn: () => PhpGroup.getAccessCall.call( }
devUUID: FFAppState().devUUID, _showNoMoreDataSnackbar(context);
userUUID: FFAppState().userUUID, setState(() {
cliID: FFAppState().cliUUID, _hasData = false;
atividade: 'getAcessos', _loading = false;
pageSize: '100', });
pageNumber: '1', return null;
pesTipo: 'T', } catch (e, s) {
), DialogUtil.errorDefault(context);
); LogUtil.requestAPIFailed('processRequest', "", "Busca Acesso", e, s);
setState(() {
_hasData = false;
_loading = false;
});
} }
} }
Widget _accessHistoryListOrganismWidget(BuildContext context) { void _showNoMoreDataSnackbar(BuildContext context) {
return SingleChildScrollView( ScaffoldMessenger.of(context).showSnackBar(
child: Column( SnackBar(
children: [ content: Text(
StreamBuilder<Map<String, String>>( FFLocalizations.of(context).getVariableText(
stream: selectedTypeSubject.stream, ptText: "Não há mais dados.", enText: "No more data."),
builder: (context, snapshot) { ),
if (!snapshot.hasData) { duration: const Duration(seconds: 3),
return Center(child: CircularProgressIndicator()); backgroundColor: FlutterFlowTheme.of(context).primary,
}
final selected = snapshot.data!;
return _cardListViewOrganismWidget(selected);
},
),
],
), ),
); );
} }
Future<List<dynamic>> fetchCardListViewService( Widget _body(BuildContext context) {
Map<String, String> select) async { return Column(
final response = crossAxisAlignment: CrossAxisAlignment.center,
await fetchAccessHistoryService(select['personType']!).first; children: <Widget>[
final List<dynamic> accessHistory = response.jsonBody['acessos'] ?? []; if (_hasData == false && _pageNumber <= 1 && _loading == false)
Expanded(
return accessHistory.where((item) { child: Column(
final personTypeMatches = select['personType'] == '.*' || mainAxisAlignment: MainAxisAlignment.center,
item["PES_TIPO"].toString() == select['personType']; mainAxisSize: MainAxisSize.max,
final accessTypeMatches = select['accessType'] == '.*' || children: [
item["ACE_TIPO"].toString() == select['accessType']; Center(
final searchMatches = select['search'] == '.*' || child: Text(
item["PES_NOME"] FFLocalizations.of(context).getVariableText(
.toString() ptText: "Nenhum histórico encontrado!",
.toLowerCase() enText: "No history found!"),
.contains(select['search']!.toLowerCase()); )),
return personTypeMatches && accessTypeMatches && searchMatches; ],
}).toList(); ),
)
else if (_hasData || _pageNumber >= 1)
Expanded(child: _cardListViewOrganismWidget()),
if (_hasData == true && _loading)
Container(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
FlutterFlowTheme.of(context).primary,
),
),
),
)
],
);
} }
Widget _cardListViewOrganismWidget(Map<String, String> selected) { void _loadMoreAccess() {
return FutureBuilder<List<dynamic>>( if (_hasData == true) {
future: fetchCardListViewService(selected), _pageNumber++;
_accessFuture = fetchAccessHistoryService();
}
}
void fetchCardListViewService(Map<String, String> select) {
_personType = select['personType']!;
_accessWrap = [];
_pageNumber = 1;
_accessFuture = fetchAccessHistoryService();
}
Widget _cardListViewOrganismWidget() {
return FutureBuilder<void>(
future: _accessFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting &&
_accessWrap.isEmpty) {
return Center( return Center(
child: SizedBox( child: SizedBox(
width: 50.0, width: 50.0,
@ -271,20 +330,23 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
), ),
); );
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'); return Center(
} else { child: Text(FFLocalizations.of(context).getVariableText(
final accessHistory = snapshot.data!; ptText: "Falha ao efetuar operação!",
return ListView.builder( enText: "Failed to perform operation!")),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: accessHistory.length,
itemBuilder: (context, index) {
final accessHistoryItem = accessHistory[index];
return _accessHistoryCardMoleculeWidget(
context, accessHistoryItem);
},
); );
} }
return ListView.builder(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
controller: _scrollController,
itemCount: _accessWrap.length,
itemBuilder: (context, index) {
final accessHistoryItem = _accessWrap[index];
return _accessHistoryCardMoleculeWidget(context, accessHistoryItem);
},
);
}, },
); );
} }
@ -344,3 +406,10 @@ class _AcessHistoryPageWidgetState extends State<AcessHistoryPageWidget> {
onTapCardItemAction: () async {}); onTapCardItemAction: () async {});
} }
} }
String imageUrlAtomWidget(String document, String type) {
return valueOrDefault<String>(
"https://freaccess.com.br/freaccess/getImage.php?&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=$document&tipo=$type",
"https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg",
);
}

View File

@ -337,7 +337,7 @@ Widget liberationHistoryItemCard(
builder: (context) { builder: (context) {
return Dialog( return Dialog(
alignment: Alignment.center, alignment: Alignment.center,
child: VisitRequestTemplateComponentWidget( child: DetailsComponentWidget(
// vteName: liberationHistoryItem['VTE_NOME'], // vteName: liberationHistoryItem['VTE_NOME'],
// vteReason: liberationHistoryItem['NOT_MOTIVO'], // vteReason: liberationHistoryItem['NOT_MOTIVO'],
// vawDate: liberationHistoryItem['NOT_STATUS'] == 'S' // vawDate: liberationHistoryItem['NOT_STATUS'] == 'S'

View File

@ -1,8 +1,11 @@
import 'dart:developer';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_model.dart'; import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_model.dart';
@ -13,6 +16,9 @@ import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../shared/utils/dialog_util.dart';
import '../../shared/utils/log_util.dart';
class PeopleOnThePropertyPageWidget extends StatefulWidget { class PeopleOnThePropertyPageWidget extends StatefulWidget {
const PeopleOnThePropertyPageWidget({super.key}); const PeopleOnThePropertyPageWidget({super.key});
@ -106,9 +112,30 @@ class _PeopleOnThePropertyPageWidgetState
), ),
); );
} }
if (snapshot.hasError || snapshot.data?.exception != null) {
if (snapshot.error != null && snapshot.stackTrace != null) {
LogUtil.requestAPIFailed('getPessoasLocal.php', "", 'Busca Pessoas no Local', snapshot.error, snapshot.stackTrace!);
}
return Center(
child: SizedBox(
width: double.infinity,
height: 100,
child: Text(
FFLocalizations.of(context).getVariableText(
ptText: "Pessoas não encontradas",
enText: "Persons not found"
),
textAlign: TextAlign.center,
),
),
);
}
final columnGetPessoasLocalResponse = snapshot.data!; final columnGetPessoasLocalResponse = snapshot.data!;
final getPoepleProperty = PhpGroup.getPessoasLocalCall.pessoas(columnGetPessoasLocalResponse.jsonBody,)?.toList() ?? final getPoepleProperty = PhpGroup.getPessoasLocalCall.pessoas(columnGetPessoasLocalResponse.jsonBody,)?.toList() ?? [];
[];
return ListView.builder( return ListView.builder(
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,

View File

@ -1587,7 +1587,7 @@ Widget scheduleVisit(
// updateToggleIdx: () async {}, // updateToggleIdx: () async {},
// repeatVisitSchedule: () async {}, // repeatVisitSchedule: () async {},
// ), // ),
child: VisitRequestTemplateComponentWidget( child: DetailsComponentWidget(
buttons: [ buttons: [
FlutterFlowIconButton( FlutterFlowIconButton(
icon: const Icon(Icons.done), icon: const Icon(Icons.done),

View File

@ -5,6 +5,8 @@ import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart'; import 'package:hub/pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart';
import '../../flutter_flow/internationalization.dart';
class ScheduleProvisionalVisitPageModel class ScheduleProvisionalVisitPageModel
extends FlutterFlowModel<ScheduleProvisionalVisitPageWidget> { extends FlutterFlowModel<ScheduleProvisionalVisitPageWidget> {
/// Local state fields for this page. /// Local state fields for this page.
@ -30,36 +32,65 @@ class ScheduleProvisionalVisitPageModel
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
final unfocusNode = FocusNode(); final formKey = GlobalKey<FormState>();
// State field(s) for TextField widget. // State field(s) for personName widget.
FocusNode? textFieldFocusNode1; FocusNode? personNameFocusNode;
TextEditingController? textController1; TextEditingController? personNameTextController;
String? Function(BuildContext, String?)? textController1Validator; String? Function(BuildContext, String?)? personNameTextControllerValidator;
String? _personNameTextControllerValidator(
BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'3hqg8buh' /* Nome é Obrigatório */,
);
}
if (val.length > 80) {
return FFLocalizations.of(context).getText(
'l0b0zr50' /* Máximo 80 caracteres */,
);
}
return null;
}
// State field(s) for dateTime widget.
FocusNode? dateTimeFocusNode;
TextEditingController? dateTimeTextController;
String? Function(BuildContext, String?)? dateTimeTextControllerValidator;
String? _dateTimeTextControllerValidator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'uzefkuf9' /* Data / Hora é Obrigatório */,
);
}
return null;
}
DateTime? datePicked; DateTime? datePicked;
// State field(s) for TextField widget. // State field(s) for notes widget.
FocusNode? textFieldFocusNode2; FocusNode? notesFocusNode;
TextEditingController? textController2; TextEditingController? notesTextController;
String? Function(BuildContext, String?)? textController2Validator; String? Function(BuildContext, String?)? notesTextControllerValidator;
// State field(s) for TextField widget. // Stores action output result for [Backend Call - API (postProvVisitScheduling)] action in btnSend widget.
FocusNode? textFieldFocusNode3; ApiCallResponse? provVisitSchedule;
TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator;
// Stores action output result for [Backend Call - API (postProvVisitScheduling)] action in sendContainer widget.
ApiCallResponse? provisionalVisitScheduling;
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {
personNameTextControllerValidator = _personNameTextControllerValidator;
dateTimeTextControllerValidator = _dateTimeTextControllerValidator;
}
@override @override
void dispose() { void dispose() {
unfocusNode.dispose(); personNameFocusNode?.dispose();
textFieldFocusNode1?.dispose(); personNameTextController?.dispose();
textController1?.dispose();
textFieldFocusNode2?.dispose(); dateTimeFocusNode?.dispose();
textController2?.dispose(); dateTimeTextController?.dispose();
textFieldFocusNode3?.dispose(); notesFocusNode?.dispose();
textController3?.dispose(); notesTextController?.dispose();
} }
} }

View File

@ -1,3 +1,5 @@
import 'package:intl/intl.dart';
class ValidatorUtil { class ValidatorUtil {
static bool isValidEmail(String email) { static bool isValidEmail(String email) {
if (RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email)) { if (RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email)) {
@ -14,4 +16,11 @@ class ValidatorUtil {
return false; return false;
} }
} }
static String toISO8601(String format, String value) {
DateFormat dateFormat = DateFormat(format);
DateTime dateTime = dateFormat.parse(value);
return dateTime.toIso8601String();
}
} }