QIPS-1205

master
aamir-csol 2 months ago
parent dae746587f
commit 257b803cce

@ -24,12 +24,18 @@ class EtqanGetEmployeeOvrRequestsResponse {
String? createdDate; String? createdDate;
String? description; String? description;
String? id; String? id;
bool? isAnonymous;
String? status;
String? statusAr;
String? ticketNumber; String? ticketNumber;
EtqanGetEmployeeOvrRequestsResponse({ EtqanGetEmployeeOvrRequestsResponse({
this.createdDate, this.createdDate,
this.description, this.description,
this.id, this.id,
this.isAnonymous,
this.status,
this.statusAr,
this.ticketNumber, this.ticketNumber,
}); });
@ -41,6 +47,9 @@ class EtqanGetEmployeeOvrRequestsResponse {
createdDate: json["createdDate"], createdDate: json["createdDate"],
description: json["description"], description: json["description"],
id: json["id"], id: json["id"],
isAnonymous: json["isAnonymous"],
status: json["status"],
statusAr: json["statusAr"],
ticketNumber: json["ticketNumber"], ticketNumber: json["ticketNumber"],
); );
@ -48,6 +57,9 @@ class EtqanGetEmployeeOvrRequestsResponse {
"createdDate": createdDate, "createdDate": createdDate,
"description": description, "description": description,
"id": id, "id": id,
"isAnonymous": isAnonymous,
"status": status,
"statusAr": statusAr,
"ticketNumber": ticketNumber, "ticketNumber": ticketNumber,
}; };
} }

@ -17,6 +17,9 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
List<EtqanGetIncidentRequestResponse>? getEtqanEmployeeIncidnetRequest; List<EtqanGetIncidentRequestResponse>? getEtqanEmployeeIncidnetRequest;
bool isLoading = false; bool isLoading = false;
String? _ticketId; String? _ticketId;
String? _currentStatus;
String? _currentStatusAr;
bool? _currentIsAnonymous;
// Speech to text state // Speech to text state
final SpeechToText _speechToText = SpeechToText(); final SpeechToText _speechToText = SpeechToText();
@ -34,10 +37,16 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
// Getter for ticketId // Getter for ticketId
String get getTicketId => _ticketId ?? ''; String get getTicketId => _ticketId ?? '';
String get getCurrentStatus => _currentStatus ?? '';
String get getCurrentStatusAr => _currentStatusAr ?? '';
bool get getCurrentIsAnonymous => _currentIsAnonymous ?? false;
// Setter for ticketId // Setter for ticketId with status and isAnonymous
void setTicketId(String ticketId) { void setTicketId(String ticketId, {String? status, String? statusAr, bool? isAnonymous}) {
_ticketId = ticketId; _ticketId = ticketId;
_currentStatus = status;
_currentStatusAr = statusAr;
_currentIsAnonymous = isAnonymous;
notifyListeners(); notifyListeners();
} }

@ -1,4 +1,3 @@
import 'package:easy_localization/easy_localization.dart' as lclize; import 'package:easy_localization/easy_localization.dart' as lclize;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
@ -16,6 +15,7 @@ import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:intl/src/intl/text_direction.dart' as intl; import 'package:intl/src/intl/text_direction.dart' as intl;
import 'package:sizer/sizer.dart';
class EtqanOvrHome extends StatefulWidget { class EtqanOvrHome extends StatefulWidget {
const EtqanOvrHome({Key? key}) : super(key: key); const EtqanOvrHome({Key? key}) : super(key: key);
@ -33,6 +33,18 @@ class _EtqanOvrHomeState extends State<EtqanOvrHome> {
}); });
} }
Color _getStatusColor(String status) {
String statusLower = status.toLowerCase();
if (statusLower.contains('open') || statusLower.contains('مفتوح')) {
return const Color(0xff2196F3); // Blue for open
} else if (statusLower.contains('progress') || statusLower.contains('قيد التنفيذ')) {
return const Color(0xffFF9800); // Orange for in progress
} else if (statusLower.contains('closed') || statusLower.contains('مغلق')) {
return const Color(0xff4CAF50); // Green for closed
}
return MyColors.grey70Color; // Default gray
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -51,7 +63,7 @@ class _EtqanOvrHomeState extends State<EtqanOvrHome> {
EtqanGetEmployeeOvrRequestsResponse data = provider.getEtqanEmployeeRequestsList![index]; EtqanGetEmployeeOvrRequestsResponse data = provider.getEtqanEmployeeRequestsList![index];
return InkWell( return InkWell(
onTap: () { onTap: () {
context.read<EtqanOvrProviderModel>().setTicketId(data.ticketNumber ?? ''); context.read<EtqanOvrProviderModel>().setTicketId(data.ticketNumber ?? '', status: data.status, statusAr: data.statusAr, isAnonymous: data.isAnonymous);
Navigator.pushNamed(context, AppRoutes.etqanGetIncidientRequest); Navigator.pushNamed(context, AppRoutes.etqanGetIncidientRequest);
}, },
child: Container( child: Container(
@ -64,6 +76,50 @@ class _EtqanOvrHomeState extends State<EtqanOvrHome> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Row(
children: [
Expanded(
child: Wrap(
spacing: 8,
runSpacing: 8,
children: [
if (data.status != null && data.status!.isNotEmpty)
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: _getStatusColor(data.status ?? "").withOpacity(0.1),
borderRadius: BorderRadius.circular(6),
border: Border.all(color: _getStatusColor(data.status ?? "").withOpacity(0.3), width: 1),
),
child: (AppState().isArabic(context) ? (data.statusAr ?? "") : (data.status ?? "")).toText11(
color: _getStatusColor(data.status ?? ""),
isBold: true,
),
),
if (data.isAnonymous == true)
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: MyColors.grey70Color.withOpacity(0.15),
borderRadius: BorderRadius.circular(6),
border: Border.all(color: MyColors.grey70Color.withOpacity(0.3), width: 1),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.visibility_off, size: 12, color: MyColors.grey70Color),
const SizedBox(width: 4),
(AppState().isArabic(context) ? "مجهول" : "Anonymous").toText11(color: MyColors.grey70Color, isBold: true),
],
),
),
],
),
),
const SizedBox(width: 8),
],
),
8.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
@ -72,11 +128,12 @@ class _EtqanOvrHomeState extends State<EtqanOvrHome> {
], ],
), ),
8.height, 8.height,
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [(data.description ?? "").toText12(color: MyColors.grey57Color).expanded]),
3.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
(data.description ?? "").toText12(color: MyColors.grey57Color).expanded,
const SizedBox(width: 5,),
RotatedBox( RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2 : 0, quarterTurns: AppState().isArabic(context) ? 2 : 0,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.grey70Color, width: 16, height: 16), child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.grey70Color, width: 16, height: 16),

@ -4,6 +4,7 @@ import 'dart:typed_data';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -25,9 +26,21 @@ class EtqanOvrRequestDetailed extends StatefulWidget {
} }
class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> { class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
List<String> get fieldOrder => ['Project', 'Created', 'Occurrence Time', 'OVR Reference No', 'Involved Employee Number', 'Description']; List<String> get fieldOrder => ['Status', 'Project', 'Created', 'Is Anonymous', 'Occurrence Time', 'OVR Reference No', 'Involved Employee Number', 'Description'];
List<String> get hiddenFields => ['OVR Id', 'Is Anonymous']; List<String> get hiddenFields => ['OVR Id'];
Color _getStatusColor(String status) {
String statusLower = status.toLowerCase();
if (statusLower.contains('open') || statusLower.contains('مفتوح')) {
return const Color(0xff2196F3); // Blue for open
} else if (statusLower.contains('progress') || statusLower.contains('قيد التنفيذ')) {
return const Color(0xffFF9800); // Orange for in progress
} else if (statusLower.contains('closed') || statusLower.contains('مغلق')) {
return const Color(0xff4CAF50); // Green for closed
}
return MyColors.grey70Color; // Default gray
}
Future<void> _viewAttachment(BuildContext context, String base64Data) async { Future<void> _viewAttachment(BuildContext context, String base64Data) async {
try { try {
@ -47,17 +60,35 @@ class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
} }
} }
List<EtqanGetIncidentRequestResponse> _getOrderedList(List<EtqanGetIncidentRequestResponse> list) { List<EtqanGetIncidentRequestResponse> _getOrderedList(List<EtqanGetIncidentRequestResponse> list, EtqanOvrProviderModel provider) {
List<EtqanGetIncidentRequestResponse> orderedList = []; List<EtqanGetIncidentRequestResponse> orderedList = [];
List<EtqanGetIncidentRequestResponse> filteredList = list.where((EtqanGetIncidentRequestResponse item) => !hiddenFields.any((f) => f.toLowerCase() == item.key?.toLowerCase())).toList(); List<EtqanGetIncidentRequestResponse> filteredList = list.where((EtqanGetIncidentRequestResponse item) => !hiddenFields.any((f) => f.toLowerCase() == item.key?.toLowerCase())).toList();
for (String fieldName in fieldOrder) { for (String fieldName in fieldOrder) {
// Check if this is Status or Is Anonymous - inject from provider
if (fieldName.toLowerCase() == 'status' && provider.getCurrentStatus.isNotEmpty) {
orderedList.add(EtqanGetIncidentRequestResponse(
key: 'Status',
keyAr: 'الحالة',
value: provider.getCurrentStatus,
valueAr: provider.getCurrentStatusAr.isNotEmpty ? provider.getCurrentStatusAr : provider.getCurrentStatus,
));
} else if (fieldName.toLowerCase() == 'is anonymous') {
orderedList.add(EtqanGetIncidentRequestResponse(
key: 'Is Anonymous',
keyAr: 'مجهول',
value: provider.getCurrentIsAnonymous.toString(),
valueAr: provider.getCurrentIsAnonymous.toString(),
));
} else {
// Regular field from API
var item = filteredList.firstWhere((e) => e.key?.toLowerCase() == fieldName.toLowerCase(), orElse: () => EtqanGetIncidentRequestResponse()); var item = filteredList.firstWhere((e) => e.key?.toLowerCase() == fieldName.toLowerCase(), orElse: () => EtqanGetIncidentRequestResponse());
if (item.key != null) { if (item.key != null) {
orderedList.add(item); orderedList.add(item);
} }
} }
}
for (var item in filteredList) { for (var item in filteredList) {
if (!fieldOrder.any((f) => f.toLowerCase() == item.key?.toLowerCase())) { if (!fieldOrder.any((f) => f.toLowerCase() == item.key?.toLowerCase())) {
@ -88,7 +119,7 @@ class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
return Utils.getNoDataWidget(context); return Utils.getNoDataWidget(context);
} }
List<EtqanGetIncidentRequestResponse> orderedList = _getOrderedList(provider.getEtqanEmployeeIncidnetRequest!); List<EtqanGetIncidentRequestResponse> orderedList = _getOrderedList(provider.getEtqanEmployeeIncidnetRequest!, provider);
return SingleChildScrollView( return SingleChildScrollView(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
@ -108,6 +139,8 @@ class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
EtqanGetIncidentRequestResponse data = entry.value; EtqanGetIncidentRequestResponse data = entry.value;
bool isLast = index == orderedList.length - 1; bool isLast = index == orderedList.length - 1;
bool isAttachment = data.key?.toLowerCase() == 'attachment'; bool isAttachment = data.key?.toLowerCase() == 'attachment';
bool isStatus = data.key?.toLowerCase() == 'status';
bool isAnonymous = data.key?.toLowerCase() == 'is anonymous';
String displayKey = context.locale.languageCode == "ar" ? (data.keyAr ?? data.key ?? "") : (data.key ?? ""); String displayKey = context.locale.languageCode == "ar" ? (data.keyAr ?? data.key ?? "") : (data.key ?? "");
String displayValue = context.locale.languageCode == "ar" ? (data.valueAr ?? data.value ?? "") : (data.value ?? ""); String displayValue = context.locale.languageCode == "ar" ? (data.valueAr ?? data.value ?? "") : (data.value ?? "");
@ -125,12 +158,20 @@ class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
8.width, 8.width,
Expanded( Expanded(
flex: 3, flex: 3,
child: child: isStatus
isAttachment && hasSubValues ? displayValue.toText14(
color: _getStatusColor(displayValue),
isBold: true,
)
: isAnonymous
? (displayValue.toLowerCase() == 'true' || displayValue.toLowerCase() == 'yes' || displayValue == '1'
? (context.locale.languageCode == "ar" ? "نعم" : "Yes")
: (context.locale.languageCode == "ar" ? "لا" : "No")
).toText14(color: MyColors.darkTextColor)
: isAttachment && hasSubValues
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: children: data.subValues!.asMap().entries.map((entry) {
data.subValues!.asMap().entries.map((entry) {
int subIndex = entry.key; int subIndex = entry.key;
String base64Data = entry.value; String base64Data = entry.value;
return Padding( return Padding(
@ -143,7 +184,6 @@ class _EtqanOvrRequestDetailedState extends State<EtqanOvrRequestDetailed> {
children: [ children: [
Text( Text(
data.subValues!.length > 1 ? '${LocaleKeys.viewAttachment.tr()} ${subIndex + 1}' : LocaleKeys.viewAttachment.tr(), data.subValues!.length > 1 ? '${LocaleKeys.viewAttachment.tr()} ${subIndex + 1}' : LocaleKeys.viewAttachment.tr(),
// textAlign: context.locale.languageCode == "ar" ? TextAlign.start : TextAlign.start,
style: const TextStyle( style: const TextStyle(
fontSize: 14, fontSize: 14,
color: MyColors.green9CColor, color: MyColors.green9CColor,

Loading…
Cancel
Save