This commit is contained in:
J. A. Messias 2025-01-30 09:30:57 -03:00
parent 7dd7ed7a32
commit a79b165635
1 changed files with 52 additions and 27 deletions

View File

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/features/backend/index.dart';
@ -7,7 +9,11 @@ import 'package:hub/shared/utils/index.dart';
/// [VehicleModel] is a class that contains the business logic of the vehicle page.
class VehicleModel extends FlutterFlowModel<VehiclePage>
with _BaseVehiclePage, _VehicleHistoryScreenModel, _VehicleRegisterScreenModel, _VehicleUpdateScreenModel {
with
_BaseVehiclePage,
_VehicleHistoryScreenModel,
_VehicleRegisterScreenModel,
_VehicleUpdateScreenModel {
/// [VehicleModel] is a singleton class that contains the business logic of the vehicle page.
static VehicleModel? _instance = VehicleModel._internal();
VehicleModel._internal();
@ -31,6 +37,10 @@ class VehicleModel extends FlutterFlowModel<VehiclePage>
textFieldFocusModel = FocusNode();
textFieldControllerModel = TextEditingController();
WidgetsBinding.instance.addPostFrameCallback((_) async {
vehicleAmountRegister = 0;
});
}
@override
@ -60,11 +70,12 @@ mixin class _BaseVehiclePage {
int count = 0;
late final VehicleModel model;
late final TabController tabBarController;
dynamic item;
// dynamic item;
BuildContext context = navigatorKey.currentContext!;
bool isEditing = false;
String? vehicleId;
ApiCallResponse? vehicleResponse;
late final vehicleAmountRegister;
VoidCallback? onUpdateVehicle;
VoidCallback? onRegisterVehicle;
@ -72,7 +83,8 @@ mixin class _BaseVehiclePage {
FocusNode? textFieldFocusLicensePlate;
TextEditingController? textFieldControllerLicensePlate;
String? textControllerLicensePlateValidator(BuildContext context, String? value) {
String? textControllerLicensePlateValidator(
BuildContext context, String? value) {
if (value == null || value.isEmpty) {
return FFLocalizations.of(context).getVariableText(
ptText: 'Placa é obrigatória',
@ -85,7 +97,8 @@ mixin class _BaseVehiclePage {
// (ABC1D23)
final mercosurPlateRegex = RegExp(r'^[A-Z]{3}\d[A-Z]\d{2}$');
if (!brazilianPlateRegex.hasMatch(value) && !mercosurPlateRegex.hasMatch(value)) {
if (!brazilianPlateRegex.hasMatch(value) &&
!mercosurPlateRegex.hasMatch(value)) {
return FFLocalizations.of(context).getVariableText(
ptText: 'Placa inválida',
enText: 'Invalid license plate',
@ -126,9 +139,9 @@ mixin class _BaseVehiclePage {
}
void clearFields() async {
textFieldControllerLicensePlate!.clear();
textFieldControllerColor!.clear();
textFieldControllerModel!.clear();
textFieldControllerLicensePlate = TextEditingController(text: '');
textFieldControllerColor = TextEditingController(text: '');
textFieldControllerModel = TextEditingController(text: '');
}
void handleEditingChanged(bool editing) {
@ -136,12 +149,18 @@ mixin class _BaseVehiclePage {
clearFields();
}
void setEditForm() {
void setEditForm(dynamic item) {
if (item != null) {
vehicleId = item['vehicleId'];
textFieldControllerLicensePlate!.text = item['licensePlate'];
textFieldControllerColor!.text = item['color'];
textFieldControllerModel!.text = item['model'];
log("setEditForm ");
log("setEditForm -> ${item.toString()}");
textFieldControllerLicensePlate = TextEditingController(
text: item != null ? item['licensePlate'] ?? '' : '');
textFieldControllerColor =
TextEditingController(text: item != null ? item['color'] ?? '' : '');
textFieldControllerModel =
TextEditingController(text: item != null ? item['model'] ?? '' : '');
}
}
}
@ -149,6 +168,9 @@ mixin class _BaseVehiclePage {
/// [_VehicleHistoryScreenModel] is a mixin that contains the business logic of the vehicle history page.
mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
Map<String, Color>? generateStatusColorMap(dynamic uItem) {
final autoApproval = uItem['autoApproval'];
if (autoApproval == true) return null;
final statusMap = {
"ATI": {
"text": FFLocalizations.of(context).getVariableText(
@ -197,7 +219,8 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
final status = uItem['status'];
if (statusMap.containsKey(status)) {
return {
statusMap[status]!['text'] as String: statusMap[status]!['color'] as Color,
statusMap[status]!['text'] as String:
statusMap[status]!['color'] as Color,
};
}
return {};
@ -220,18 +243,19 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
),
);
final updateText = FFLocalizations.of(context).getVariableText(ptText: 'Editar', enText: 'Edit');
final updateText = FFLocalizations.of(context)
.getVariableText(ptText: 'Editar', enText: 'Edit');
final updateIcon = Icon(Icons.edit, color: iconButtonColor);
Future updateOnPressed() async {
context.pop();
isEditing = true;
item = item;
switchTab(1);
setEditForm();
setEditForm(item);
}
final cancelText = FFLocalizations.of(context).getVariableText(ptText: 'Cancelar', enText: 'Cancel');
final cancelText = FFLocalizations.of(context)
.getVariableText(ptText: 'Cancelar', enText: 'Cancel');
final cancelIcon = Icon(Icons.close, color: iconButtonColor);
Future cancelOnPressed() async {
showAlertDialog(
@ -244,11 +268,12 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
ptText: 'Você tem certeza que deseja cancelar essa solicitação?',
enText: 'Are you sure you want to delete this request?',
),
() async => await processCancelRequest(item['status']),
() async => await processCancelRequest(item['status'], item),
);
}
final deleteText = FFLocalizations.of(context).getVariableText(ptText: 'Excluir', enText: 'Delete');
final deleteText = FFLocalizations.of(context)
.getVariableText(ptText: 'Excluir', enText: 'Delete');
final deleteIcon = Icon(Icons.delete, color: iconButtonColor);
Future deleteOnPressed() async {
showAlertDialog(
@ -261,7 +286,7 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
ptText: 'Você tem certeza que deseja excluir esse veículo?',
enText: 'Are you sure you want to delete this vehicle?',
),
() async => await processDeleteRequest(),
() async => await processDeleteRequest(item),
);
}
@ -290,7 +315,7 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
];
}
Future<void> processDeleteRequest() async {
Future<void> processDeleteRequest(dynamic item) async {
int id = item['vehicleId'];
await PhpGroup.deleteVehicle.call(vehicleId: id).then((value) {
context.pop(value);
@ -330,18 +355,18 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
});
}
Future<void> processCancelRequest(String status) async {
Future<void> processCancelRequest(String status, dynamic item) async {
late final ApiCallResponse value;
try {
switch (status) {
case 'APR_CREATE':
value = await processCancelDeleteRequest();
value = await processCancelDeleteRequest(item);
break;
case 'AGU_CHANGE':
value = await processCancelUpdateRequest();
value = await processCancelUpdateRequest(item);
break;
case 'APR_DELETE':
value = await processCancelCreateRequest();
value = await processCancelCreateRequest(item);
break;
default:
break;
@ -382,17 +407,17 @@ mixin _VehicleHistoryScreenModel on _BaseVehiclePage {
}
}
Future<ApiCallResponse> processCancelDeleteRequest() async {
Future<ApiCallResponse> processCancelDeleteRequest(dynamic item) async {
final int id = item['vehicleId'];
return await PhpGroup.deleteVehicle.call(vehicleId: id);
}
Future<ApiCallResponse> processCancelUpdateRequest() async {
Future<ApiCallResponse> processCancelUpdateRequest(dynamic item) async {
final int id = item['vehicleId'];
return await PhpGroup.deleteVehicle.call(vehicleId: id);
}
Future<ApiCallResponse> processCancelCreateRequest() async {
Future<ApiCallResponse> processCancelCreateRequest(dynamic item) async {
final int id = item['vehicleId'];
return await PhpGroup.deleteVehicle.call(vehicleId: id);
}