fix message well, visitor register and preferences pages

This commit is contained in:
jantunesmesias 2024-07-31 12:00:25 -03:00
parent cb6a55cfd3
commit 7c11b6d84b
12 changed files with 2264 additions and 2365 deletions

View File

@ -15,7 +15,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:provider/provider.dart'; import 'package:provider/provider.dart';
class ScheduleVisitDetailWidget extends StatefulWidget { class ScheduleVisitDetailWidget extends StatefulWidget {
const ScheduleVisitDetailWidget({ const ScheduleVisitDetailWidget({
super.key, super.key,
@ -59,24 +58,22 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
super.initState(); super.initState();
_model = createModel(context, () => ScheduleVisitDetailModel()); _model = createModel(context, () => ScheduleVisitDetailModel());
_model.textController1 ??= _model.textController1 ??= TextEditingController(text: widget.visitTempStr);
TextEditingController(text: widget.visitTempStr);
_model.textFieldFocusNode1 ??= FocusNode(); _model.textFieldFocusNode1 ??= FocusNode();
_model.textController2 ??= _model.textController2 ??=
TextEditingController(text: widget.visitStartDate); TextEditingController(text: widget.visitStartDate);
_model.textFieldFocusNode2 ??= FocusNode(); _model.textFieldFocusNode2 ??= FocusNode();
_model.textController3 ??= _model.textController3 ??= TextEditingController(text: widget.visitEndDate);
TextEditingController(text: widget.visitEndDate);
_model.textFieldFocusNode3 ??= FocusNode(); _model.textFieldFocusNode3 ??= FocusNode();
_model.textController4 ??= TextEditingController( _model.textController4 ??=
text: extractDescToStr(widget.visitResonStr!)); TextEditingController(text: extractDescToStr(widget.visitResonStr!));
_model.textFieldFocusNode4 ??= FocusNode(); _model.textFieldFocusNode4 ??= FocusNode();
_model.textController5 ??= TextEditingController( _model.textController5 ??=
text: extractDescToStr(widget.visitLevelStr!)); TextEditingController(text: extractDescToStr(widget.visitLevelStr!));
_model.textFieldFocusNode5 ??= FocusNode(); _model.textFieldFocusNode5 ??= FocusNode();
_model.textController6 ??= TextEditingController(text: widget.visitObsStr); _model.textController6 ??= TextEditingController(text: widget.visitObsStr);
@ -132,8 +129,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
child: Align( child: Align(
alignment: const AlignmentDirectional(-1.0, 0.0), alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding( child: Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(15.0, 0.0, 0.0, 0.0), 15.0, 0.0, 0.0, 0.0),
child: FlutterFlowIconButton( child: FlutterFlowIconButton(
borderRadius: 20.0, borderRadius: 20.0,
borderWidth: 1.0, borderWidth: 1.0,
@ -192,41 +189,47 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
BorderRadius.circular(100.0), BorderRadius.circular(100.0),
), ),
child: Align( child: Align(
alignment: alignment: const AlignmentDirectional(
const AlignmentDirectional(1.0, -1.0), 1.0, -1.0),
child: InkWell( child: InkWell(
splashColor: Colors.transparent, splashColor: Colors.transparent,
focusColor: Colors.transparent, focusColor: Colors.transparent,
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: () async { onTap: () async {
Navigator.pop(context); // Navigator.pop(context);
await showModalBottomSheet( // await showModalBottomSheet(
isScrollControlled: true, // isScrollControlled: true,
backgroundColor: // backgroundColor:
Colors.transparent, // Colors.transparent,
useSafeArea: true, // useSafeArea: true,
context: context, // context: context,
builder: (context) { // builder: (context) {
return Padding( // return Padding(
padding: // padding:
MediaQuery.viewInsetsOf( // MediaQuery.viewInsetsOf(
context), // context),
child: // child:
const VisitorDetailsModalTemplateComponentWidget(), // VisitorDetailsModalTemplateComponentWidget(
); // visitorImageURL: '',
}, // visitorEmail: '',
).then((value) => // visitorName: '',
safeSetState(() {})); // visitorPhone: '',
// visitorType: '',
// ),
// );
// },
// ).then((value) =>
// safeSetState(() {}));
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: borderRadius:
BorderRadius.circular(100.0), BorderRadius.circular(100.0),
child: CachedNetworkImage( child: CachedNetworkImage(
fadeInDuration: fadeInDuration: const Duration(
const Duration(milliseconds: 500), milliseconds: 500),
fadeOutDuration: fadeOutDuration: const Duration(
const Duration(milliseconds: 500), milliseconds: 500),
imageUrl: imageUrl:
valueOrDefault<String>( valueOrDefault<String>(
"https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( "https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
@ -352,7 +355,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
children: [ children: [
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding:
const EdgeInsetsDirectional.fromSTEB(
8.0, 0.0, 8.0, 0.0), 8.0, 0.0, 8.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController2, controller: _model.textController2,
@ -459,7 +463,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
), ),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding:
const EdgeInsetsDirectional.fromSTEB(
8.0, 0.0, 8.0, 0.0), 8.0, 0.0, 8.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController3, controller: _model.textController3,
@ -576,7 +581,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
children: [ children: [
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding:
const EdgeInsetsDirectional.fromSTEB(
8.0, 0.0, 8.0, 0.0), 8.0, 0.0, 8.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController4, controller: _model.textController4,
@ -683,7 +689,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
), ),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding:
const EdgeInsetsDirectional.fromSTEB(
8.0, 0.0, 8.0, 0.0), 8.0, 0.0, 8.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController5, controller: _model.textController5,
@ -905,7 +912,8 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
Align( Align(
alignment: const AlignmentDirectional(0.0, 1.0), alignment: const AlignmentDirectional(0.0, 1.0),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 6.0, 0.0, 0.0), padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 6.0, 0.0, 0.0),
child: Container( child: Container(
width: double.infinity, width: double.infinity,
height: 35.0, height: 35.0,
@ -934,8 +942,7 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
dtInicio: widget.visitStartDate, dtInicio: widget.visitStartDate,
dtFim: widget.visitEndDate, dtFim: widget.visitEndDate,
unica: widget.visitTempStr, unica: widget.visitTempStr,
idMotivo: idMotivo: extractIdToStr(widget.visitResonStr!),
extractIdToStr(widget.visitResonStr!),
idNAC: extractIdToStr(widget.visitLevelStr!), idNAC: extractIdToStr(widget.visitLevelStr!),
obs: widget.visitObsStr, obs: widget.visitObsStr,
cliID: FFAppState().cliUUID, cliID: FFAppState().cliUUID,

View File

@ -1,3 +1,9 @@
import 'dart:developer';
import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart';
import 'package:hub/custom_code/actions/convert_image_file_to_base64.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/form_field_controller.dart'; import '/flutter_flow/form_field_controller.dart';
@ -25,6 +31,24 @@ class RegisiterVistorTemplateComponentModel
ptText: 'Este campo é obrigatório', ptText: 'Este campo é obrigatório',
); );
} }
return null;
}
Future<bool?> getVisitanteByDocument(
String document, BuildContext context) async {
final response = await PhpGroup.getVisitorByDocCall.call(
devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID,
atividade: 'getVisitante',
documento: document,
);
log('${response.jsonBody}');
if (response.jsonBody['visitante']['VTE_ID'] != '0' &&
response.jsonBody['error'] != 'false') {
return true;
}
return null; return null;
} }

View File

@ -1,6 +1,9 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:json_path/fun_sdk.dart';
import 'package:rxdart/rxdart.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/components/molecular_components/throw_exception/throw_exception_widget.dart'; import '/components/molecular_components/throw_exception/throw_exception_widget.dart';
@ -15,6 +18,7 @@ import 'package:flutter/material.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 'regisiter_vistor_template_component_model.dart'; import 'regisiter_vistor_template_component_model.dart';
export 'regisiter_vistor_template_component_model.dart'; export 'regisiter_vistor_template_component_model.dart';
class RegisiterVistorTemplateComponentWidget extends StatefulWidget { class RegisiterVistorTemplateComponentWidget extends StatefulWidget {
@ -45,6 +49,7 @@ class _RegisiterVistorTemplateComponentWidgetState
_model.textController2 ??= TextEditingController(); _model.textController2 ??= TextEditingController();
_model.textFieldFocusNode2 ??= FocusNode(); _model.textFieldFocusNode2 ??= FocusNode();
_model.textController2?.addListener(_onTextChanged);
_model.textController3 ??= TextEditingController(); _model.textController3 ??= TextEditingController();
_model.textFieldFocusNode3 ??= FocusNode(); _model.textFieldFocusNode3 ??= FocusNode();
@ -58,10 +63,17 @@ class _RegisiterVistorTemplateComponentWidgetState
_model.dispose(); _model.dispose();
super.dispose(); super.dispose();
_model.textController2?.removeListener(_onTextChanged);
}
void _onTextChanged() {
log('changed');
setState(() {});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BehaviorSubject<bool> visitorAlreadyRegistered = BehaviorSubject<bool>();
context.watch<FFAppState>(); context.watch<FFAppState>();
log(context log(context
.describeWidget('RegisiterVistorTemplateComponentWidget') .describeWidget('RegisiterVistorTemplateComponentWidget')
@ -83,11 +95,360 @@ class _RegisiterVistorTemplateComponentWidgetState
child: SingleChildScrollView( child: SingleChildScrollView(
child: Form( child: Form(
// key: UniqueKey(), // key: UniqueKey(),
autovalidateMode: AutovalidateMode.disabled, autovalidateMode: AutovalidateMode.onUserInteraction,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 30.0, 0.0, 15.0),
child: Text(
FFLocalizations.of(context).getText(
'zazj5d8b' /* Preencha o formulário com os d... */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController2,
focusNode: _model.textFieldFocusNode2,
autovalidateMode: AutovalidateMode.onUserInteraction,
autofocus: false,
textCapitalization: TextCapitalization.none,
autofillHints: const [AutofillHints.password],
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'rl8tvwnr' /* Documento */,
),
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,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.document_scanner,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
validator:
_model.textController2Validator.asValidator(context),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp('[0-9]')),
],
),
),
FutureBuilder(
future: _model.textController2.text.isNotEmpty
? _model.getVisitanteByDocument(
_model.textController2.text, context)
: null,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const SizedBox();
} else if (snapshot.hasError ||
snapshot.data == null ||
snapshot.data == '') {
visitorAlreadyRegistered.add(true);
return const SizedBox();
} else {
visitorAlreadyRegistered.add(false);
return _model.textController2.text.isEmpty
? const SizedBox()
: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Padding(
padding: EdgeInsets.only(
right: MediaQuery.sizeOf(context).width *
0.1),
child: Text(
FFLocalizations.of(context)
.getVariableText(
enText: 'Visitor already registered',
ptText: 'Visitante já cadastrado',
),
style: FlutterFlowTheme.of(context)
.bodySmall
.override(
fontFamily: 'Nunito',
color: FlutterFlowTheme.of(context)
.error,
fontSize: 14.0,
letterSpacing: 0.0,
)),
),
],
);
}
},
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController1,
autovalidateMode: AutovalidateMode.onUserInteraction,
focusNode: _model.textFieldFocusNode1,
autofocus: false,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'v7g73yik' /* Nome */,
),
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).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.person,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
maxLines: null,
keyboardType: TextInputType.name,
validator:
_model.textController1Validator.asValidator(context),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 10.0),
child: Container(
width: MediaQuery.sizeOf(context).width * 0.95,
decoration: const BoxDecoration(),
child: Column(
children: [
Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 7.0),
child: Text(
FFLocalizations.of(context).getText(
'yp23q90m' /* Selecione o tipo: */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 5.0),
child: FlutterFlowDropDown<String>(
controller: _model.dropDownValueController ??=
FormFieldController<String>(null),
options: [
FFLocalizations.of(context).getText(
'n8vddmcq' /* Visitante */,
),
FFLocalizations.of(context).getText(
'9luaa09e' /* Prestador de Serviço */,
)
],
onChanged: (val) =>
setState(() => _model.dropDownValue = val),
width: 200.0,
height: 44.0,
textStyle: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
hintText: FFLocalizations.of(context).getText(
'pmezihb4' /* Selecione... */,
),
icon: Icon(
Icons.keyboard_arrow_down_rounded,
color:
FlutterFlowTheme.of(context).primaryText,
size: 24.0,
),
elevation: 2.0,
borderColor:
FlutterFlowTheme.of(context).customColor6,
borderWidth: 0.5,
borderRadius: 8.0,
margin: const EdgeInsetsDirectional.fromSTEB(
16.0, 0.0, 16.0, 0.0),
hidesUnderline: true,
isOverButton: true,
isSearchable: false,
isMultiSelect: false,
),
),
]
.divide(const SizedBox(width: 19.0))
.addToStart(const SizedBox(width: 30.0)),
),
if (_model.dropDownValue == null ||
_model.dropDownValue == '')
Align(
alignment: const AlignmentDirectional(0.4, 0),
child: Text(
FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
),
style: FlutterFlowTheme.of(context)
.bodySmall
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodySmallFamily,
color: FlutterFlowTheme.of(context)
.customColor6,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodySmallFamily),
)),
),
],
),
),
),
Builder( Builder(
builder: (context) { builder: (context) {
if ((_model.uploadedLocalFile.bytes?.isNotEmpty ?? false)) { if ((_model.uploadedLocalFile.bytes?.isNotEmpty ?? false)) {
@ -246,310 +607,7 @@ class _RegisiterVistorTemplateComponentWidgetState
alignment: const AlignmentDirectional(-1.0, 0.0), alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 30.0, 0.0, 15.0), 20.0, 10.0, 0.0, 15.0),
child: Text(
FFLocalizations.of(context).getText(
'zazj5d8b' /* Preencha o formulário com os d... */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController1,
autovalidateMode: AutovalidateMode.onUserInteraction,
focusNode: _model.textFieldFocusNode1,
autofocus: false,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'v7g73yik' /* Nome */,
),
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).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.person,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
maxLines: null,
keyboardType: TextInputType.name,
validator:
_model.textController1Validator.asValidator(context),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController2,
focusNode: _model.textFieldFocusNode2,
autovalidateMode: AutovalidateMode.onUserInteraction,
autofocus: false,
textCapitalization: TextCapitalization.none,
autofillHints: const [AutofillHints.password],
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'rl8tvwnr' /* Documento */,
),
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,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.document_scanner,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
validator:
_model.textController2Validator.asValidator(context),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp('[0-9]')),
],
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 10.0),
child: Container(
width: MediaQuery.sizeOf(context).width * 0.95,
decoration: const BoxDecoration(),
child: Column(
children: [
Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 7.0),
child: Text(
FFLocalizations.of(context).getText(
'yp23q90m' /* Selecione o tipo: */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 5.0),
child: FlutterFlowDropDown<String>(
controller: _model.dropDownValueController ??=
FormFieldController<String>(null),
options: [
FFLocalizations.of(context).getText(
'n8vddmcq' /* Visitante */,
),
FFLocalizations.of(context).getText(
'9luaa09e' /* Prestador de Serviço */,
)
],
onChanged: (val) =>
setState(() => _model.dropDownValue = val),
width: 200.0,
height: 44.0,
textStyle: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
hintText: FFLocalizations.of(context).getText(
'pmezihb4' /* Selecione... */,
),
icon: Icon(
Icons.keyboard_arrow_down_rounded,
color:
FlutterFlowTheme.of(context).primaryText,
size: 24.0,
),
elevation: 2.0,
borderColor:
FlutterFlowTheme.of(context).customColor6,
borderWidth: 0.5,
borderRadius: 8.0,
margin: const EdgeInsetsDirectional.fromSTEB(
16.0, 0.0, 16.0, 0.0),
hidesUnderline: true,
isOverButton: true,
isSearchable: false,
isMultiSelect: false,
),
),
]
.divide(const SizedBox(width: 19.0))
.addToStart(const SizedBox(width: 30.0)),
),
if (_model.dropDownValue == null ||
_model.dropDownValue == '')
Align(
alignment: const AlignmentDirectional(0.4, 0),
child: Text(
FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
),
style: FlutterFlowTheme.of(context)
.bodySmall
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodySmallFamily,
color: FlutterFlowTheme.of(context)
.customColor6,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodySmallFamily),
)),
),
],
),
),
),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 0.0, 15.0),
child: Text( child: Text(
FFLocalizations.of(context).getText( FFLocalizations.of(context).getText(
'bqpucwh0' /* Contatos */, 'bqpucwh0' /* Contatos */,
@ -735,13 +793,15 @@ class _RegisiterVistorTemplateComponentWidgetState
padding: padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 65.0, 0.0, 0.0), const EdgeInsetsDirectional.fromSTEB(0.0, 65.0, 0.0, 0.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: () async { onPressed: (((_model.uploadedLocalFile.bytes?.isNotEmpty ??
if (((_model.uploadedLocalFile.bytes?.isNotEmpty ??
false)) && false)) &&
(_model.textController1.text != '') && (_model.textController1.text != '') &&
(_model.dropDownValue != null && (_model.dropDownValue != null &&
_model.dropDownValue != '') && _model.dropDownValue != '') &&
(_model.textController2.text != '')) { (_model.textController2.text != ''))
? () async {
log(visitorAlreadyRegistered.value.toString());
if (visitorAlreadyRegistered.value == true) {
_model.imgBase64 = _model.imgBase64 =
await actions.convertImageFileToBase64( await actions.convertImageFileToBase64(
_model.uploadedLocalFile, _model.uploadedLocalFile,
@ -770,7 +830,8 @@ class _RegisiterVistorTemplateComponentWidgetState
return GestureDetector( return GestureDetector(
onTap: () => Navigator.pop(context), onTap: () => Navigator.pop(context),
child: Padding( child: Padding(
padding: MediaQuery.viewInsetsOf(context), padding:
MediaQuery.viewInsetsOf(context),
child: Dialog( child: Dialog(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
child: ThrowExceptionWidget( child: ThrowExceptionWidget(
@ -788,16 +849,15 @@ class _RegisiterVistorTemplateComponentWidgetState
}, },
); );
}); });
if (PhpGroup.postScheduleVisitorCall.error( if (PhpGroup.postScheduleVisitorCall.error(
(_model.scheduleVisitor?.jsonBody ?? ''), (_model.scheduleVisitor?.jsonBody ?? ''),
) == ) ==
false) { false) {
setState(() { setState(() {
_model.textController1?.clearComposing(); _model.textController1?.clear();
_model.textController2?.clearComposing(); _model.textController2?.clear();
_model.textController3?.clearComposing(); _model.textController3?.clear();
_model.textController4?.clearComposing(); _model.textController4?.clear();
_model.dropDownValueController?.reset(); _model.dropDownValueController?.reset();
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
@ -809,81 +869,53 @@ class _RegisiterVistorTemplateComponentWidgetState
'Visitor successfully registered.'), 'Visitor successfully registered.'),
style: TextStyle( style: TextStyle(
color: color:
FlutterFlowTheme.of(context).info)), FlutterFlowTheme.of(context)
.info)),
backgroundColor: backgroundColor:
FlutterFlowTheme.of(context).primary, FlutterFlowTheme.of(context).primary,
duration: const Duration(seconds: 3), duration: const Duration(seconds: 3),
width: MediaQuery.of(context).size.width,
behavior: SnackBarBehavior.floating, behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30), borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
), ),
), ),
); );
if (widget.source == 'VisitorNotFoundComponent') { if (widget.source ==
'VisitorNotFoundComponent') {
Navigator.pop(context); Navigator.pop(context);
} }
}); });
} else { } else {
await showAdaptiveDialog( return DialogUtil.error(
context: context, context,
builder: (context) { PhpGroup.postScheduleVisitorCall
return GestureDetector( .errorMsg(
onTap: () => _model.unfocusNode.canRequestFocus _model.scheduleVisitor?.jsonBody)
? FocusScope.of(context) .toString());
.requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Padding(
padding: MediaQuery.viewInsetsOf(context),
child: Dialog(
backgroundColor: Colors.transparent,
child: ThrowExceptionWidget(
msg: PhpGroup.postScheduleVisitorCall
.errorMsg(_model
.scheduleVisitor?.jsonBody)
.toString()),
),
),
);
},
).then((value) => safeSetState(() {}));
} }
} else { } else {
await showAdaptiveDialog( DialogUtil.error(
context: context, context,
builder: (context) { FFLocalizations.of(context).getVariableText(
return GestureDetector(
onTap: () {
Form.of(context)?.validate();
Navigator.pop(context);
},
child: Padding(
padding: MediaQuery.viewInsetsOf(context),
child: Dialog(
backgroundColor: Colors.transparent,
child: ThrowExceptionWidget(
msg: FFLocalizations.of(context)
.getVariableText(
ptText: ptText:
'Você esqueceu de adicionar algum dado obrigatório. Verifique se a imagem, nome, tipo e documento foram preenchidos corretamente.', 'Visitante já cadastrado. Verifique se o documento foi preenchido corretamente.',
enText: enText:
'You forgot to add some required data. Check if the image, name, type and document were filled in correctly.', 'Visitor already registered. Check if the document was filled in correctly.',
), ));
),
),
),
);
},
).then((value) => safeSetState(() {}));
} }
}
setState(() {}); : null,
},
text: FFLocalizations.of(context).getText( text: FFLocalizations.of(context).getText(
'okbw0aiu' /* Cadastrar */, 'okbw0aiu' /* Cadastrar */,
), ),
options: FFButtonOptions( options: FFButtonOptions(
width: 250.0, width: 250.0,
height: 36.0, height: 36.0,
disabledColor: FlutterFlowTheme.of(context).customColor6,
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
80.0, 0.0, 80.0, 0.0), 80.0, 0.0, 80.0, 0.0),
iconPadding: const EdgeInsetsDirectional.fromSTEB( iconPadding: const EdgeInsetsDirectional.fromSTEB(

View File

@ -101,8 +101,7 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
TextEditingController(text: widget.visitStartDate); TextEditingController(text: widget.visitStartDate);
_model.textFieldFocusNode2 ??= FocusNode(); _model.textFieldFocusNode2 ??= FocusNode();
_model.textController3 ??= _model.textController3 ??= TextEditingController(text: widget.visitEndDate);
TextEditingController(text: widget.visitEndDate);
_model.textFieldFocusNode3 ??= FocusNode(); _model.textFieldFocusNode3 ??= FocusNode();
_model.textController4 ??= _model.textController4 ??=
@ -212,20 +211,26 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: () async { onTap: () async {
Navigator.pop(context); // Navigator.pop(context);
await showModalBottomSheet( // await showModalBottomSheet(
isScrollControlled: true, // isScrollControlled: true,
backgroundColor: Colors.transparent, // backgroundColor: Colors.transparent,
useSafeArea: true, // useSafeArea: true,
context: context, // context: context,
builder: (context) { // builder: (context) {
return Padding( // return Padding(
padding: MediaQuery.viewInsetsOf(context), // padding: MediaQuery.viewInsetsOf(context),
child: // child:
const VisitorDetailsModalTemplateComponentWidget(), // const VisitorDetailsModalTemplateComponentWidget(
); // visitorImageURL: '',
}, // visitorEmail: '',
).then((value) => safeSetState(() {})); // visitorName: '',
// visitorPhone: '',
// visitorType: '',
// ),
// );
// },
// ).then((value) => safeSetState(() {}));
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(100.0), borderRadius: BorderRadius.circular(100.0),
@ -870,7 +875,6 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
Share.share( Share.share(
'Visita agendada para ${widget.visitStartDate} com término previsto para ${widget.visitEndDate}. Motivo: ${widget.visitReasonStr}. Nível de acesso: ${widget.visitLevelStr}. Observações: ${widget.visitObsStr}.', 'Visita agendada para ${widget.visitStartDate} com término previsto para ${widget.visitEndDate}. Motivo: ${widget.visitReasonStr}. Nível de acesso: ${widget.visitLevelStr}. Observações: ${widget.visitObsStr}.',
); );
}, },
), ),
], ],

View File

@ -6,7 +6,19 @@ import 'visitor_details_modal_template_component_model.dart';
export 'visitor_details_modal_template_component_model.dart'; export 'visitor_details_modal_template_component_model.dart';
class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget { class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget {
const VisitorDetailsModalTemplateComponentWidget({super.key}); const VisitorDetailsModalTemplateComponentWidget(
{super.key,
required this.visitorImageURL,
required this.visitorName,
required this.visitorType,
required this.visitorPhone,
required this.visitorEmail});
final String? visitorImageURL;
final String? visitorName;
final String? visitorType;
final String? visitorPhone;
final String? visitorEmail;
@override @override
State<VisitorDetailsModalTemplateComponentWidget> createState() => State<VisitorDetailsModalTemplateComponentWidget> createState() =>
@ -50,11 +62,10 @@ class _VisitorDetailsModalTemplateComponentWidgetState
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
borderRadius: BorderRadius.circular(25.0), borderRadius: BorderRadius.circular(25.0),
), ),
child: Stack( child: Column(
mainAxisSize: MainAxisSize.max,
children: [ children: [
Align( Container(
alignment: const AlignmentDirectional(0.0, 1.0),
child: Container(
width: double.infinity, width: double.infinity,
height: 34.0, height: 34.0,
decoration: BoxDecoration( decoration: BoxDecoration(
@ -62,8 +73,29 @@ class _VisitorDetailsModalTemplateComponentWidgetState
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(0.0), bottomLeft: Radius.circular(0.0),
bottomRight: Radius.circular(0.0), bottomRight: Radius.circular(0.0),
topLeft: Radius.circular(0.0), topLeft: Radius.circular(25.0),
topRight: Radius.circular(0.0), topRight: Radius.circular(25.0),
),
shape: BoxShape.rectangle,
),
child: Align(
alignment: const AlignmentDirectional(1.0, -1.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
10.0, 5.0, 15.0, 0.0),
child: InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onTap: () async {
Navigator.pop(context);
},
child: Icon(
Icons.close,
color: FlutterFlowTheme.of(context).primaryBackground,
size: 24.0,
),
), ),
), ),
), ),
@ -71,21 +103,21 @@ class _VisitorDetailsModalTemplateComponentWidgetState
Align( Align(
alignment: const AlignmentDirectional(0.0, -1.0), alignment: const AlignmentDirectional(0.0, -1.0),
child: Padding( child: Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(20.0, 40.0, 20.0, 0.0), 20.0, 40.0, 20.0, 0.0),
child: Container( child: Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
shape: BoxShape.rectangle, shape: BoxShape.rectangle,
), ),
child: Stack( child: Padding(
children: [
Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 10.0, 0.0, 0.0), 0.0, 10.0, 0.0, 0.0),
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
if (widget.visitorImageURL != '' &&
widget.visitorImageURL != null)
Container( Container(
width: 100.0, width: 100.0,
height: 100.0, height: 100.0,
@ -94,7 +126,7 @@ class _VisitorDetailsModalTemplateComponentWidgetState
shape: BoxShape.circle, shape: BoxShape.circle,
), ),
child: Image.network( child: Image.network(
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', widget.visitorImageURL!,
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
), ),
@ -104,15 +136,12 @@ class _VisitorDetailsModalTemplateComponentWidgetState
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0), 20.0, 0.0, 20.0, 0.0),
child: Text( child: Text(
FFLocalizations.of(context).getText( widget.visitorName ?? '',
'kqzf7nx2' /* Nome do Visitante */,
),
textAlign: TextAlign.start, textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: fontFamily: FlutterFlowTheme.of(context)
FlutterFlowTheme.of(context)
.bodyMediumFamily, .bodyMediumFamily,
fontSize: 24.0, fontSize: 24.0,
letterSpacing: 0.0, letterSpacing: 0.0,
@ -138,8 +167,7 @@ class _VisitorDetailsModalTemplateComponentWidgetState
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
.bodyMedium .bodyMedium
.override( .override(
fontFamily: fontFamily: FlutterFlowTheme.of(context)
FlutterFlowTheme.of(context)
.bodyMediumFamily, .bodyMediumFamily,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -160,7 +188,8 @@ class _VisitorDetailsModalTemplateComponentWidgetState
size: 24.0, size: 24.0,
), ),
Align( Align(
alignment: const AlignmentDirectional(-1.0, 0.0), alignment:
const AlignmentDirectional(-1.0, 0.0),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0), 20.0, 0.0, 20.0, 0.0),
@ -177,11 +206,9 @@ class _VisitorDetailsModalTemplateComponentWidgetState
.bodyMediumFamily, .bodyMediumFamily,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts useGoogleFonts: GoogleFonts.asMap()
.asMap()
.containsKey( .containsKey(
FlutterFlowTheme.of( FlutterFlowTheme.of(context)
context)
.bodyMediumFamily), .bodyMediumFamily),
), ),
), ),
@ -198,7 +225,8 @@ class _VisitorDetailsModalTemplateComponentWidgetState
size: 24.0, size: 24.0,
), ),
Align( Align(
alignment: const AlignmentDirectional(-1.0, 0.0), alignment:
const AlignmentDirectional(-1.0, 0.0),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0), 20.0, 0.0, 20.0, 0.0),
@ -215,11 +243,9 @@ class _VisitorDetailsModalTemplateComponentWidgetState
.bodyMediumFamily, .bodyMediumFamily,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts useGoogleFonts: GoogleFonts.asMap()
.asMap()
.containsKey( .containsKey(
FlutterFlowTheme.of( FlutterFlowTheme.of(context)
context)
.bodyMediumFamily), .bodyMediumFamily),
), ),
), ),
@ -230,49 +256,25 @@ class _VisitorDetailsModalTemplateComponentWidgetState
], ],
), ),
), ),
],
),
),
),
),
Align(
alignment: const AlignmentDirectional(-1.0, -1.0),
child: Container(
width: double.infinity,
height: 34.0,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryText,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(0.0),
bottomRight: Radius.circular(0.0),
topLeft: Radius.circular(25.0),
topRight: Radius.circular(25.0),
),
shape: BoxShape.rectangle,
),
child: Align(
alignment: const AlignmentDirectional(1.0, -1.0),
child: Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(10.0, 5.0, 15.0, 0.0),
child: InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onTap: () async {
Navigator.pop(context);
},
child: Icon(
Icons.close,
color: FlutterFlowTheme.of(context).primaryBackground,
size: 24.0,
),
),
),
), ),
), ),
), ),
// Align(
// alignment: const AlignmentDirectional(0.0, 1.0),
// child: Container(
// width: double.infinity,
// height: 34.0,
// decoration: BoxDecoration(
// color: FlutterFlowTheme.of(context).primaryText,
// borderRadius: const BorderRadius.only(
// bottomLeft: Radius.circular(0.0),
// bottomRight: Radius.circular(0.0),
// topLeft: Radius.circular(0.0),
// topRight: Radius.circular(0.0),
// ),
// ),
// ),
// ),
], ],
), ),
), ),

View File

@ -47,12 +47,6 @@ class _VisitorSearchModalTemplateComponentWidgetState
_model.textController ??= TextEditingController(); _model.textController ??= TextEditingController();
_model.textFieldFocusNode ??= FocusNode(); _model.textFieldFocusNode ??= FocusNode();
WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {
_model.textController?.text = FFLocalizations.of(context).getText(
'oj12tamm' /* test */,
);
}));
} }
@override @override
@ -91,10 +85,7 @@ class _VisitorSearchModalTemplateComponentWidgetState
focusNode: _model.textFieldFocusNode, focusNode: _model.textFieldFocusNode,
onFieldSubmitted: (_) async { onFieldSubmitted: (_) async {
setState(() { setState(() {
_model.textController?.text = valueOrDefault<String>( _model.textController?.text = _model.textController.text;
_model.textController.text,
'69696777',
);
_model.textController?.selection = TextSelection.collapsed( _model.textController?.selection = TextSelection.collapsed(
offset: _model.textController!.text.length); offset: _model.textController!.text.length);
}); });
@ -268,7 +259,6 @@ class _VisitorSearchModalTemplateComponentWidgetState
builder: (context) { builder: (context) {
final visitor = final visitor =
_model.visitors.map((e) => e).toList(); _model.visitors.map((e) => e).toList();
return ListView.builder( return ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
@ -284,39 +274,42 @@ class _VisitorSearchModalTemplateComponentWidgetState
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: () async { onTap: () async {
await showModalBottomSheet( // await showModalBottomSheet(
isScrollControlled: true, // isScrollControlled: true,
enableDrag: false, // enableDrag: true,
context: context, // isDismissible: true,
builder: (context) { // context: context,
return Padding( // builder: (context) {
padding: // return Padding(
MediaQuery.viewInsetsOf(context), // padding:
child: const SizedBox( // MediaQuery.viewInsetsOf(context),
height: 610.0, // child: SizedBox(
child: // height: 610.0,
VisitorDetailsModalTemplateComponentWidget(), // child:
), // VisitorDetailsModalTemplateComponentWidget(
); // visitorImageURL:
}, // "https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
).then((value) => safeSetState(() {})); // visitorItem,
// r'''$.VTE_DOCUMENTO''',
// ).toString()}&tipo=E",
// visitorEmail: '',
// visitorName: getJsonField(
// visitorItem,
// r'''$.VTE_NOME''',
// )?.toString(),
// visitorPhone: '',
// visitorType: '',
// ),
// ),
// );
// },
// ).then((value) => safeSetState(() {}));
}, },
child: Container( child: Container(
width: 100.0, width: 100.0,
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context) color: FlutterFlowTheme.of(context)
.secondaryBackground, .primaryBackground,
boxShadow: [
BoxShadow(
blurRadius: 0.0,
color: FlutterFlowTheme.of(context)
.alternate,
offset: const Offset(
0.0,
1.0,
),
)
],
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@ -333,13 +326,11 @@ class _VisitorSearchModalTemplateComponentWidgetState
milliseconds: 500), milliseconds: 500),
fadeOutDuration: const Duration( fadeOutDuration: const Duration(
milliseconds: 500), milliseconds: 500),
imageUrl: valueOrDefault<String>( imageUrl:
"https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( "https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
visitorItem, visitorItem,
r'''$.VTE_DOCUMENTO''', r'''$.VTE_DOCUMENTO''',
).toString()}&tipo=E", ).toString()}&tipo=E",
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
),
width: 60.0, width: 60.0,
height: 60.0, height: 60.0,
fit: BoxFit.cover, fit: BoxFit.cover,
@ -348,6 +339,8 @@ class _VisitorSearchModalTemplateComponentWidgetState
Expanded( Expanded(
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
@ -382,58 +375,6 @@ class _VisitorSearchModalTemplateComponentWidgetState
), ),
), ),
), ),
Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(
4.0, 4.0, 0.0, 0.0),
child: Row(
mainAxisSize:
MainAxisSize.max,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Align(
alignment:
const AlignmentDirectional(
0.0, -1.0),
child: Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(
10.0,
0.0,
0.0,
0.0),
child: Text(
getJsonField(
visitorItem,
r'''$.VTE_TELEFONE''',
).toString(),
style: FlutterFlowTheme
.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(
context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(
context)
.primary,
letterSpacing:
0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
],
),
),
], ],
), ),
), ),
@ -442,10 +383,10 @@ class _VisitorSearchModalTemplateComponentWidgetState
borderWidth: 1.0, borderWidth: 1.0,
buttonSize: 40.0, buttonSize: 40.0,
icon: Icon( icon: Icon(
Icons.restore_from_trash, Icons.close,
color: color:
FlutterFlowTheme.of(context) FlutterFlowTheme.of(context)
.primary, .customColor6,
size: 20.0, size: 20.0,
), ),
onPressed: () async { onPressed: () async {
@ -470,13 +411,17 @@ class _VisitorSearchModalTemplateComponentWidgetState
width: 100.0, width: 100.0,
height: 100.0, height: 100.0,
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).secondaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
), ),
); );
} }
}, },
), ),
), ),
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
FFButtonWidget( FFButtonWidget(
onPressed: () async { onPressed: () async {
await widget.getVisitors?.call( await widget.getVisitors?.call(
@ -487,19 +432,21 @@ class _VisitorSearchModalTemplateComponentWidgetState
); );
Navigator.pop(context); Navigator.pop(context);
}, },
text: FFLocalizations.of(context).getText( text: FFLocalizations.of(context).getVariableText(
'ug6qzyla' /* Adicionar */, enText: 'Add',
ptText: 'Adicionar',
), ),
options: FFButtonOptions( options: FFButtonOptions(
width: double.infinity, width: MediaQuery.of(context).size.width * 0.3,
height: 30.0, height: MediaQuery.of(context).size.width * 0.1,
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0), 24.0, 0.0, 24.0, 0.0),
iconPadding: iconPadding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), 0.0, 0.0, 0.0, 0.0),
color: FlutterFlowTheme.of(context).primary, color: FlutterFlowTheme.of(context).primary,
textStyle: FlutterFlowTheme.of(context).titleSmall.override( textStyle: FlutterFlowTheme.of(context).titleSmall.override(
fontFamily: FlutterFlowTheme.of(context).titleSmallFamily, fontFamily:
FlutterFlowTheme.of(context).titleSmallFamily,
color: Colors.white, color: Colors.white,
letterSpacing: 0.0, letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
@ -511,15 +458,20 @@ class _VisitorSearchModalTemplateComponentWidgetState
width: 1.0, width: 1.0,
), ),
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(0.0), bottomLeft: Radius.circular(15),
bottomRight: Radius.circular(0.0), bottomRight: Radius.circular(15),
topLeft: Radius.circular(0.0), topLeft: Radius.circular(15),
topRight: Radius.circular(0.0), topRight: Radius.circular(15),
), ),
), ),
), ),
], ],
), ),
const SizedBox(
height: 10.0,
)
],
),
), ),
); );
} }

View File

@ -1,12 +1,13 @@
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/flutter_flow/request_manager.dart'; import 'package:hub/flutter_flow/request_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/pages/message_history_page/message_history_page_widget.dart'; import 'package:hub/pages/message_history_page/message_history_page_widget.dart';
class MessageHistoryPageModel extends FlutterFlowModel<MessageHistoryPageWidget> { class MessageHistoryPageModel
extends FlutterFlowModel<MessageHistoryPageWidget> {
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
/// ///
@ -49,7 +50,6 @@ class MessageHistoryPageModel extends FlutterFlowModel<MessageHistoryPageWidget>
textController?.dispose(); textController?.dispose();
tabBarController?.dispose(); tabBarController?.dispose();
/// Dispose query cache managers for this widget. /// Dispose query cache managers for this widget.
clearGetLiberationsCache(); clearGetLiberationsCache();

View File

@ -12,7 +12,6 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/message_history_page/message_history_page_model.dart'; import 'package:hub/pages/message_history_page/message_history_page_model.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';
@ -26,7 +25,8 @@ class MessageHistoryPageWidget extends StatefulWidget {
_MessageHistoryPageWidgetState(); _MessageHistoryPageWidgetState();
} }
class _MessageHistoryPageWidgetState extends State<MessageHistoryPageWidget> with TickerProviderStateMixin { class _MessageHistoryPageWidgetState extends State<MessageHistoryPageWidget>
with TickerProviderStateMixin {
late MessageHistoryPageModel _model; late MessageHistoryPageModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
@ -106,8 +106,7 @@ PreferredSizeWidget appBarMessage(BuildContext context) {
); );
} }
Widget bodyMessage( Widget bodyMessage(BuildContext context, MessageHistoryPageModel _model) {
BuildContext context, MessageHistoryPageModel _model) {
return SafeArea( return SafeArea(
top: true, top: true,
child: Column( child: Column(
@ -155,33 +154,26 @@ Widget bodyMessage(
}, },
), ),
), ),
Expanded(child: TabBarView( Expanded(
controller: _model.tabBarController, child: TabBarView(controller: _model.tabBarController, children: [
children: [
liberationDynamicListView(context, _model, 'P'), liberationDynamicListView(context, _model, 'P'),
liberationDynamicListView(context, _model, 'A'), liberationDynamicListView(context, _model, 'A'),
liberationDynamicListView(context, _model, 'T'), liberationDynamicListView(context, _model, 'T'),
] ])),
)),
].addToStart(const SizedBox(height: 0)), ].addToStart(const SizedBox(height: 0)),
), ),
); );
} }
Widget liberationDynamicListView( Widget liberationDynamicListView(
BuildContext context, BuildContext context, MessageHistoryPageModel _model, String DestIndex) {
MessageHistoryPageModel _model,
String DestIndex
) {
return Container( return Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
decoration: const BoxDecoration(), decoration: const BoxDecoration(),
child: FutureBuilder<ApiCallResponse>( child: FutureBuilder<ApiCallResponse>(
future: PhpGroup.getMessagesCall.call( future: PhpGroup.getMessagesCall
.call(
devUUID: FFAppState().devUUID.toString(), devUUID: FFAppState().devUUID.toString(),
userUUID: FFAppState().userUUID.toString(), userUUID: FFAppState().userUUID.toString(),
cliID: FFAppState().cliUUID.toString(), cliID: FFAppState().cliUUID.toString(),
@ -189,7 +181,8 @@ Widget liberationDynamicListView(
pageSize: '100', pageSize: '100',
pageNumber: '1', pageNumber: '1',
tipoDestino: DestIndex, tipoDestino: DestIndex,
).catchError((error) { )
.catchError((error) {
log('Error: ${error.toString()}'); log('Error: ${error.toString()}');
return Future.delayed(Duration(seconds: 1), () { return Future.delayed(Duration(seconds: 1), () {
return Center( return Center(
@ -217,8 +210,15 @@ Widget liberationDynamicListView(
child: Text('Erro ao carregar mensagens'), child: Text('Erro ao carregar mensagens'),
); );
} }
final mensagens = snapshot.data!.jsonBody['mensagens'];
final totalRows = snapshot.data!.jsonBody['total_rows'];
if (totalRows == 0 || mensagens == null || mensagens.isEmpty) {
return const Center(
child: Text('Nenhuma mensagem encontrada'),
);
}
return ListView.builder( return ListView.builder(
itemCount: snapshot.data!.jsonBody['total_rows'], itemCount: totalRows,
addAutomaticKeepAlives: false, addAutomaticKeepAlives: false,
addRepaintBoundaries: true, addRepaintBoundaries: true,
cacheExtent: 1000.0, cacheExtent: 1000.0,
@ -234,8 +234,7 @@ Widget liberationDynamicListView(
); );
} }
Widget messageHistoryItem( Widget messageHistoryItem(BuildContext context, dynamic jsonBody) {
BuildContext context, dynamic jsonBody) {
log(jsonBody.toString()); log(jsonBody.toString());
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15), padding: const EdgeInsets.symmetric(horizontal: 15),
@ -249,6 +248,10 @@ Widget messageHistoryItem(
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 15.0), padding: const EdgeInsets.only(left: 15.0),
@ -256,49 +259,50 @@ Widget messageHistoryItem(
jsonBody['MSG_DATE'].toString(), jsonBody['MSG_DATE'].toString(),
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 16, fontSize: 10,
color: FlutterFlowTheme.of(context).primary, color: FlutterFlowTheme.of(context).customColor6,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
), ),
), ),
],
),
Row(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Text(
jsonBody['MSG_ORIGEM_DESC'].toString(),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
color: FlutterFlowTheme.of(context).primary,
),
overflow: TextOverflow.fade,
),
),
Icon( Icon(
jsonBody['MSG_DESTINO_TP'] == 'T' jsonBody['MSG_DESTINO_TP'] == 'T'
? Icons.group ? Icons.group
: Icons.person, : Icons.person,
color: FlutterFlowTheme.of(context).accent1,
)
],
),
SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Text(
jsonBody['MSG_ORIGEM_DESC'].toString(),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: FlutterFlowTheme.of(context).primary, color: FlutterFlowTheme.of(context).primary,
), ),
overflow: TextOverflow.fade, ],
),
),
), ),
], ],
), ),
SizedBox(height: 8), SizedBox(height: 8),
Text(jsonBody['MSG_TEXTO'].toString(),), Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
jsonBody['MSG_TEXTO'].toString(),
),
),
SizedBox(height: 8),
], ],
), ),
), ),
), ),
), ),
); );
} }

View File

@ -51,42 +51,9 @@ class PreferencesPageModel with ChangeNotifier {
void enablePerson(BuildContext context) { void enablePerson(BuildContext context) {
notifyListeners(); notifyListeners();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(FFAppState().userDevUUID,
style: TextStyle(color: FlutterFlowTheme.of(context).info)),
FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 20.0,
borderWidth: 1.0,
buttonSize: 40.0,
icon: Icon(
Icons.share,
color: FlutterFlowTheme.of(context).info,
size: 24.0,
),
onPressed: () {
log('IconButton pressed ...');
// Implement share functionality here
Share.share( Share.share(
FFAppState().userDevUUID, FFAppState().userDevUUID,
); );
},
),
],
),
backgroundColor: FlutterFlowTheme.of(context).primary,
duration: const Duration(seconds: 1),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
);
} }
void toggleNotify(BuildContext context) { void toggleNotify(BuildContext context) {

View File

@ -113,8 +113,8 @@ class PreferencesPageWidget extends StatelessWidget {
onPressed = () => model.enablePerson(context); onPressed = () => model.enablePerson(context);
isEnabled = FFAppState().person; isEnabled = FFAppState().person;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Exibir código de identificação remota', ptText: 'Compartilhe o código de identificação remota',
enText: 'Display remote identification code', enText: 'Share the remote identification code',
); );
break; break;
case 2: case 2:

View File

@ -1,11 +1,14 @@
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/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/flutter_flow/form_field_controller.dart'; import 'package:hub/flutter_flow/form_field_controller.dart';
import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/request_manager.dart'; import 'package:hub/flutter_flow/request_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart';
import 'package:intl/intl.dart';
class ScheduleCompleteVisitPageModel class ScheduleCompleteVisitPageModel
extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> { extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> {
@ -37,6 +40,18 @@ class ScheduleCompleteVisitPageModel
visitorJsonList[index] = updateFn(visitorJsonList[index]); visitorJsonList[index] = updateFn(visitorJsonList[index]);
String visitorStrList = '0'; String visitorStrList = '0';
bool? dropDownValidator1;
bool? dropDownValidator2;
bool isValid() {
if ((textController1!.text != '') &&
(textController2!.text != '') &&
(dropDownValue1 != null && dropDownValue1 != '') &&
(dropDownValue2 != null && dropDownValue2 != '')) {
return true;
}
return false;
}
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
@ -50,16 +65,66 @@ class ScheduleCompleteVisitPageModel
FocusNode? textFieldFocusNode1; FocusNode? textFieldFocusNode1;
TextEditingController? textController1; TextEditingController? textController1;
String? Function(BuildContext, String?)? textController1Validator; String? Function(BuildContext, String?)? textController1Validator;
String? _textController1Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required.',
ptText: 'Este campo é obrigatório.',
);
}
if (val != null) {
try {
DateTime startDate = DateFormat('d/M/y H:mm:ss').parse(val);
DateTime endDate =
DateFormat('d/M/y H:mm:ss').parse(textController2!.text);
if (startDate.isAfter(endDate)) {
return FFLocalizations.of(context).getVariableText(
ptText: 'A data de início deve ser anterior à data de término.',
enText: 'Start date must be before end date.',
);
}
} catch (e) {
return '$e';
}
}
return null;
}
DateTime? datePicked1; DateTime? datePicked1;
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode2; FocusNode? textFieldFocusNode2;
TextEditingController? textController2; TextEditingController? textController2;
String? Function(BuildContext, String?)? textController2Validator; String? Function(BuildContext, String?)? textController2Validator;
String? _textController2Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required.',
ptText: 'Este campo é obrigatório.',
);
}
if (val != null) {
try {
DateTime endDate = DateFormat('d/M/y H:mm:ss').parse(val);
DateTime startDate =
DateFormat('d/M/y H:mm:ss').parse(textController1!.text);
if (endDate.isBefore(startDate)) {
return FFLocalizations.of(context).getVariableText(
enText: 'End date must be after start date.',
ptText: 'A data de término deve ser posterior à data de início.',
);
}
} catch (e) {
return '$e';
}
}
return null;
}
DateTime? datePicked2; DateTime? datePicked2;
// State field(s) for DropDown widget. // State field(s) for DropDown widget.
String? dropDownValue1; String? dropDownValue1;
FormFieldController<String>? dropDownValueController1; FormFieldController<String>? dropDownValueController1;
// State field(s) for DropDown widget. // State field(s) for DropDown widget.
String? dropDownValue2; String? dropDownValue2;
FormFieldController<String>? dropDownValueController2; FormFieldController<String>? dropDownValueController2;
@ -69,9 +134,35 @@ class ScheduleCompleteVisitPageModel
FocusNode? textFieldFocusNode3; FocusNode? textFieldFocusNode3;
TextEditingController? textController3; TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator; String? Function(BuildContext, String?)? textController3Validator;
String? _textController3Validator(BuildContext context, String? val) {
// if (val == null || val.isEmpty) {
// return FFLocalizations.of(context).getVariableText(
// enText: 'This field is required.',
// ptText: 'Este campo é obrigatório.',
// );
// }
return null;
}
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {
tabBarController = TabController(
vsync: Navigator.of(context),
length: 2,
);
textFieldFocusNode1 = FocusNode();
textController1 = TextEditingController();
textController1Validator = _textController1Validator;
textFieldFocusNode2 = FocusNode();
textController2 = TextEditingController();
textController2Validator = _textController2Validator;
textFieldFocusNode3 = FocusNode();
textController3 = TextEditingController();
textController3Validator = _textController3Validator;
}
@override @override
void dispose() { void dispose() {