Compare commits

..

No commits in common. 'main_production' and 'v.1.9.4' have entirely different histories.

@ -1,15 +1,15 @@
class URLs { class URLs {
URLs._(); URLs._();
static const String appReleaseBuildNumber = "56"; static const String appReleaseBuildNumber = "54";
static const host1 = "https://atomsm.hmg.com"; // production url static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
// static const host1 = "https://atomsmuat.hmg.com"; // local UAT url // static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
// static final String _baseUrl = "$_host/mobile"; // host local UAT static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module // static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
// static final String _baseUrl = "$_host/v6/mobile"; // for asset delivery module // static final String _baseUrl = "$_host/v6/mobile"; // for asset delivery module
@ -69,7 +69,6 @@ class URLs {
static get getDepartmentsBySites => "$_baseUrl/Customer/GetDepartmentsBySites"; // post get departments by sites static get getDepartmentsBySites => "$_baseUrl/Customer/GetDepartmentsBySites"; // post get departments by sites
static getUserSites(String userId) => "$_baseUrl/Customer/GetSitesForUser?userId=$userId"; // get user's current sites static getUserSites(String userId) => "$_baseUrl/Customer/GetSitesForUser?userId=$userId"; // get user's current sites
static getSitesNotAccessibleForUser(String userId) => "$_baseUrl/Customer/GetSitesNotAccessibleForUser?userId=$userId"; // get user's current sites static getSitesNotAccessibleForUser(String userId) => "$_baseUrl/Customer/GetSitesNotAccessibleForUser?userId=$userId"; // get user's current sites
static get getCustomersAutoCompleteSameOrg => "$_baseUrl/Customer/GetCustomersAutoCompleteSameOrg"; // get user's current sites
// static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login // static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login
static get register => "$_baseUrl/handle/create/user"; // post static get register => "$_baseUrl/handle/create/user"; // post
@ -329,8 +328,6 @@ class URLs {
static get genderLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3065"; static get genderLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3065";
static get getDemoDocumentTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=4106"; static get getDemoDocumentTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=4106";
// static get getAttachmentTypesLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4021";
static get getAttachmentTypesLookup => "$_baseUrl/Lookups/GetLookup";
static get getClassificationTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=450"; static get getClassificationTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=450";
@ -395,8 +392,6 @@ class URLs {
static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateEngineerAssetTransferNew"; // get static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateEngineerAssetTransferNew"; // get
static get assetTransferAssignEngineerToHimself => "$_baseUrl/AssetTransfer/AssignEngineerToHimself"; // get static get assetTransferAssignEngineerToHimself => "$_baseUrl/AssetTransfer/AssignEngineerToHimself"; // get
static get assetTransferEngineerReject => "$_baseUrl/AssetTransfer/EngineerReject"; // get static get assetTransferEngineerReject => "$_baseUrl/AssetTransfer/EngineerReject"; // get
static get assetDocumentHistory => "$_baseUrl/DocumentLibrary/SearchDocuments";
// employee // employee
static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get

@ -153,7 +153,6 @@ class DeviceTransferProvider extends ChangeNotifier {
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
log('payload: ${model.toCreateAssetTransferJson()}');
response = await ApiManager.instance.post(URLs.createAssetTransferRequest, body: model.toCreateAssetTransferJson()); response = await ApiManager.instance.post(URLs.createAssetTransferRequest, body: model.toCreateAssetTransferJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {

@ -31,7 +31,6 @@ class AssetProvider extends ChangeNotifier {
final pageItemNumber = 10; final pageItemNumber = 10;
final searchPageItemNumber = 10; final searchPageItemNumber = 10;
final documentPageItemNumber = 20;
bool nextPage = true; bool nextPage = true;
@ -258,40 +257,4 @@ class AssetProvider extends ChangeNotifier {
return false; return false;
} }
} }
Future<({List<GenericAttachmentModel> documents, int totalRows})> getAssetDocumentHistory({
required int assetId,
int pageNumber = 1,
}) async {
Response response;
List<GenericAttachmentModel> documents = [];
try {
var body = {
"pageSize": documentPageItemNumber,
"pageNumber": pageNumber,
"assetIds": [assetId],
};
response = await ApiManager.instance.post(URLs.assetDocumentHistory, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
final jsonData = json.decode(response.body);
List attachmentJson = jsonData["data"] ?? [];
int totalRows = jsonData["totalRows"] ?? 0;
documents = attachmentJson
.map<GenericAttachmentModel>((request) =>
GenericAttachmentModel.fromAssetDocumentJson(request))
.toList();
nextPage = documents.length < totalRows;
return (documents: documents, totalRows: totalRows);
}
return (documents: documents, totalRows: 0);
} catch (e) {
log('Error in getAssetDocumentHistory: $e');
return (documents: documents, totalRows: 0);
}
}
} }

@ -56,7 +56,7 @@ class DashBoardProvider extends ChangeNotifier {
// Helper method to check if a tab index is UnAssigned // Helper method to check if a tab index is UnAssigned
bool isUnassignedTab(int index) { bool isUnassignedTab(int index) {
if (index >= 0 && index < tabs.length) { if (index >= 0 && index < tabs.length) {
return tabs[index].requestType == RequestStatusEnum.unassigned; return tabs[index].requestType == RequestTypeEnum.unassigned;
} }
return false; return false;
} }
@ -64,7 +64,7 @@ class DashBoardProvider extends ChangeNotifier {
// Helper method to get the UnAssigned tab index (returns -1 if not found) // Helper method to get the UnAssigned tab index (returns -1 if not found)
int getUnassignedTabIndex() { int getUnassignedTabIndex() {
for (int i = 0; i < tabs.length; i++) { for (int i = 0; i < tabs.length; i++) {
if (tabs[i].requestType == RequestStatusEnum.unassigned) { if (tabs[i].requestType == RequestTypeEnum.unassigned) {
return i; return i;
} }
} }
@ -111,25 +111,25 @@ class DashBoardProvider extends ChangeNotifier {
DD.DashboardDetail? get requestDetailList => _requestDetailList; DD.DashboardDetail? get requestDetailList => _requestDetailList;
int getStatusCount(RequestStatusEnum requestType) { int getStatusCount(RequestTypeEnum requestType) {
switch (requestType) { switch (requestType) {
case RequestStatusEnum.unassigned: case RequestTypeEnum.unassigned:
return dashboardCount?.data?.countUnAssigned ?? 0; return dashboardCount?.data?.countUnAssigned ?? 0;
case RequestStatusEnum.open: case RequestTypeEnum.open:
return dashboardCount?.data?.countOpen ?? 0; return dashboardCount?.data?.countOpen ?? 0;
case RequestStatusEnum.inProgress: case RequestTypeEnum.inProgress:
return dashboardCount?.data?.countInprogress ?? 0; return dashboardCount?.data?.countInprogress ?? 0;
case RequestStatusEnum.completed: case RequestTypeEnum.completed:
return dashboardCount?.data?.countComplete ?? 0; return dashboardCount?.data?.countComplete ?? 0;
case RequestStatusEnum.pendingAcknowledgment: case RequestTypeEnum.pendingAcknowledgment:
return dashboardCount?.data?.countAcknowledge ?? 0; return dashboardCount?.data?.countAcknowledge ?? 0;
case RequestStatusEnum.canceled: case RequestTypeEnum.canceled:
return dashboardCount?.data?.countCanceled ?? 0; return dashboardCount?.data?.countCanceled ?? 0;
case RequestStatusEnum.closed: case RequestTypeEnum.closed:
return dashboardCount?.data?.countClose ?? 0; return dashboardCount?.data?.countClose ?? 0;
case RequestStatusEnum.overdue: case RequestTypeEnum.overdue:
return dashboardCount?.data?.countOverdue ?? 0; return dashboardCount?.data?.countOverdue ?? 0;
case RequestStatusEnum.highPriority: case RequestTypeEnum.highPriority:
return dashboardCount?.data?.countHighPriority ?? 0; return dashboardCount?.data?.countHighPriority ?? 0;
default: default:
return 0; return 0;
@ -310,30 +310,30 @@ class DashBoardProvider extends ChangeNotifier {
} }
// Status categories (Open, InProgress, Completed, Closed) // Status categories (Open, InProgress, Completed, Closed)
if (!tab.isHighPriority && !tab.isOverDue && tab.requestType != RequestStatusEnum.unassigned) { if (!tab.isHighPriority && !tab.isOverDue && tab.requestType != RequestTypeEnum.unassigned) {
// Map requestType to status value // Map requestType to status value
switch (tab.requestType) { switch (tab.requestType) {
case RequestStatusEnum.open: case RequestTypeEnum.open:
if (!statusTransaction.contains(1)) statusTransaction.add(1); if (!statusTransaction.contains(1)) statusTransaction.add(1);
break; break;
case RequestStatusEnum.inProgress: case RequestTypeEnum.inProgress:
if (!statusTransaction.contains(2)) statusTransaction.add(2); if (!statusTransaction.contains(2)) statusTransaction.add(2);
break; break;
case RequestStatusEnum.completed: case RequestTypeEnum.completed:
if (!statusTransaction.contains(4)) statusTransaction.add(4); if (!statusTransaction.contains(4)) statusTransaction.add(4);
break; break;
case RequestStatusEnum.closed: case RequestTypeEnum.closed:
if (!statusTransaction.contains(4)) statusTransaction.add(4); if (!statusTransaction.contains(4)) statusTransaction.add(4);
break; break;
case RequestStatusEnum.canceled: case RequestTypeEnum.canceled:
if (!statusTransaction.contains(5)) statusTransaction.add(5); if (!statusTransaction.contains(5)) statusTransaction.add(5);
break; break;
case RequestStatusEnum.pendingAcknowledgment: case RequestTypeEnum.pendingAcknowledgment:
if (!statusTransaction.contains(4)) statusTransaction.add(4); if (!statusTransaction.contains(4)) statusTransaction.add(4);
break; break;
case RequestStatusEnum.unassigned: case RequestTypeEnum.unassigned:
case RequestStatusEnum.highPriority: case RequestTypeEnum.highPriority:
case RequestStatusEnum.overdue: case RequestTypeEnum.overdue:
// These are handled separately above // These are handled separately above
break; break;
} }
@ -556,7 +556,7 @@ class CategoryTabs {
String label; String label;
int tag; int tag;
int id; int id;
RequestStatusEnum requestType; RequestTypeEnum requestType;
String icon; String icon;
Color iconColor; Color iconColor;
bool isHighPriority; bool isHighPriority;
@ -568,12 +568,12 @@ class CategoryTabs {
List<CategoryTabs> tabs = []; List<CategoryTabs> tabs = [];
if (userType == UsersTypes.engineer) { if (userType == UsersTypes.engineer) {
// Order: 1-UnAssigned, 2-HighPriority, 3-Overdue, 4-Open, 5-InProgress, 6-Completed // Order: 1-UnAssigned, 2-HighPriority, 3-Overdue, 4-Open, 5-InProgress, 6-Completed
tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1, requestType: RequestStatusEnum.unassigned, icon: "dashboard/unassigned", iconColor: AppColor.unassignedStatus(context))); tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1, requestType: RequestTypeEnum.unassigned, icon: "dashboard/unassigned", iconColor: AppColor.unassignedStatus(context)));
tabs.add(CategoryTabs(label: context.translation.highPriority, tag: 3, id: 4, requestType: RequestStatusEnum.highPriority, icon: "high_priority", iconColor: AppColor.red30, isHighPriority: true)); tabs.add(CategoryTabs(label: context.translation.highPriority, tag: 3, id: 4, requestType: RequestTypeEnum.highPriority, icon: "high_priority", iconColor: AppColor.red30, isHighPriority: true));
tabs.add(CategoryTabs(label: context.translation.overdue, tag: 3, id: 4, requestType: RequestStatusEnum.overdue, icon: "overdue", iconColor: AppColor.yellowIcon(context), isOverDue: true)); tabs.add(CategoryTabs(label: context.translation.overdue, tag: 3, id: 4, requestType: RequestTypeEnum.overdue, icon: "overdue", iconColor: AppColor.yellowIcon(context), isOverDue: true));
tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestStatusEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestStatusEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4, requestType: RequestStatusEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor)); tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4, requestType: RequestTypeEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor));
return tabs; return tabs;
} }
@ -584,29 +584,29 @@ class CategoryTabs {
// tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 2)); // tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 2));
// tabs.add(CategoryTabs(label: 'Completed', tag: 4, id: 3)); // tabs.add(CategoryTabs(label: 'Completed', tag: 4, id: 3));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 2, requestType: RequestStatusEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 2, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
tabs.add(CategoryTabs(label: 'Completed', tag: 4, id: 3, requestType: RequestStatusEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor)); tabs.add(CategoryTabs(label: 'Completed', tag: 4, id: 3, requestType: RequestTypeEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor));
return tabs; return tabs;
} }
if (userType == UsersTypes.qualityUser) { if (userType == UsersTypes.qualityUser) {
tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestStatusEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestStatusEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestStatusEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor)); tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestTypeEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor));
return tabs; return tabs;
} }
if (userType == UsersTypes.commissioningEngineer) { if (userType == UsersTypes.commissioningEngineer) {
tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestStatusEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestStatusEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestStatusEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor)); tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestTypeEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor));
return tabs; return tabs;
} }
tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestStatusEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestStatusEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
// tabs.add(CategoryTabs(label: 'Pending Acknowledgement', tag: 3, id: 1, requestType: RequestTypeEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor)); // tabs.add(CategoryTabs(label: 'Pending Acknowledgement', tag: 3, id: 1, requestType: RequestTypeEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor));
tabs.add(CategoryTabs(label: 'Acknowledgement', tag: 4, id: 1, requestType: RequestStatusEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor)); tabs.add(CategoryTabs(label: 'Acknowledgement', tag: 4, id: 1, requestType: RequestTypeEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor));
tabs.add(CategoryTabs(label: 'Canceled', tag: 6, id: 4, requestType: RequestStatusEnum.canceled, icon: "dashboard/unassigned", iconColor: AppColor.red30)); tabs.add(CategoryTabs(label: 'Canceled', tag: 6, id: 4, requestType: RequestTypeEnum.canceled, icon: "dashboard/unassigned", iconColor: AppColor.red30));
return tabs; return tabs;
} }
} }

@ -147,29 +147,29 @@ class _DashboardViewState extends State<DashboardView> {
} }
// Status categories // Status categories
if (!tab.isHighPriority && !tab.isOverDue && tab.requestType != RequestStatusEnum.unassigned) { if (!tab.isHighPriority && !tab.isOverDue && tab.requestType != RequestTypeEnum.unassigned) {
switch (tab.requestType) { switch (tab.requestType) {
case RequestStatusEnum.open: case RequestTypeEnum.open:
if (!statusTransaction.contains(1)) statusTransaction.add(1); if (!statusTransaction.contains(1)) statusTransaction.add(1);
break; break;
case RequestStatusEnum.inProgress: case RequestTypeEnum.inProgress:
if (!statusTransaction.contains(2)) statusTransaction.add(2); if (!statusTransaction.contains(2)) statusTransaction.add(2);
break; break;
case RequestStatusEnum.completed: case RequestTypeEnum.completed:
if (!statusTransaction.contains(4)) statusTransaction.add(4); if (!statusTransaction.contains(4)) statusTransaction.add(4);
break; break;
case RequestStatusEnum.closed: case RequestTypeEnum.closed:
if (!statusTransaction.contains(4)) statusTransaction.add(4); if (!statusTransaction.contains(4)) statusTransaction.add(4);
break; break;
case RequestStatusEnum.canceled: case RequestTypeEnum.canceled:
if (!statusTransaction.contains(5)) statusTransaction.add(5); if (!statusTransaction.contains(5)) statusTransaction.add(5);
break; break;
case RequestStatusEnum.pendingAcknowledgment: case RequestTypeEnum.pendingAcknowledgment:
if (!statusTransaction.contains(3)) statusTransaction.add(3); if (!statusTransaction.contains(3)) statusTransaction.add(3);
break; break;
case RequestStatusEnum.unassigned: case RequestTypeEnum.unassigned:
case RequestStatusEnum.highPriority: case RequestTypeEnum.highPriority:
case RequestStatusEnum.overdue: case RequestTypeEnum.overdue:
break; break;
} }
} }

@ -142,19 +142,18 @@ class _AppBarWidgetState extends State<AppBarWidget> with TickerProviderStateMix
children: [ children: [
Text( Text(
snapshot.user?.username ?? "", snapshot.user?.username ?? "",
maxLines: 2,
style: AppTextStyles.heading6.copyWith(color: AppColor.headingTextColor(context), fontSize: context.isTablet() ? 14 : null), style: AppTextStyles.heading6.copyWith(color: AppColor.headingTextColor(context), fontSize: context.isTablet() ? 14 : null),
), ),
// Text( Text(
// snapshot.user?.roleName ?? "", snapshot.user?.type?.name.toCamelCase ?? "",
// style: AppTextStyles.bodyText.copyWith(color: AppColor.lightTextColor(context), fontSize: context.isTablet() ? 12 : null), style: AppTextStyles.bodyText.copyWith(color: AppColor.lightTextColor(context), fontSize: context.isTablet() ? 12 : null),
// ), ),
], ],
), ),
), ),
), ),
), ),
// const Spacer(), const Spacer(),
// Action icons with right-to-left fade animation // Action icons with right-to-left fade animation
SlideTransition( SlideTransition(
position: _rightSlideAnimation, position: _rightSlideAnimation,

@ -380,7 +380,7 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
}); });
// Check if this is UnAssigned tab (index 0 for engineer) // Check if this is UnAssigned tab (index 0 for engineer)
bool isUnassignedTab = tabs[index].requestType == RequestStatusEnum.unassigned; bool isUnassignedTab = tabs[index].requestType == RequestTypeEnum.unassigned;
// Update selection state // Update selection state
requestsProvider.currentListIndex = index; requestsProvider.currentListIndex = index;

@ -46,24 +46,24 @@ class RequestsFragment extends StatelessWidget {
List<Widget> listItems = []; List<Widget> listItems = [];
if (context.userProvider.isNurse) { if (context.userProvider.isNurse) {
listItems = [ listItems = [
requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestStatusEnum.open, AppColor.openColor), requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestTypeEnum.open, AppColor.openColor),
requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestStatusEnum.inProgress, requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestTypeEnum.inProgress,
AppColor.primary10), AppColor.primary10),
requestType( requestType(
data.dashboardCount?.data?.countAcknowledge ?? 0, "complete_request", "Acknowledgement", context, data.isLoading, RequestStatusEnum.pendingAcknowledgment, AppColor.overdueColor), data.dashboardCount?.data?.countAcknowledge ?? 0, "complete_request", "Acknowledgement", context, data.isLoading, RequestTypeEnum.pendingAcknowledgment, AppColor.overdueColor),
requestType(data.dashboardCount?.data?.countCanceled ?? 0, "dashboard/unassigned", "Canceled", context, data.isLoading, RequestStatusEnum.canceled, AppColor.red30), requestType(data.dashboardCount?.data?.countCanceled ?? 0, "dashboard/unassigned", "Canceled", context, data.isLoading, RequestTypeEnum.canceled, AppColor.red30),
]; ];
} else { } else {
listItems = [ listItems = [
requestType( requestType(
data.dashboardCount?.data?.countUnAssigned ?? 0, "dashboard/unassigned", "UnAssigned", context, data.isLoading, RequestStatusEnum.unassigned, AppColor.unassignedStatus(context)), data.dashboardCount?.data?.countUnAssigned ?? 0, "dashboard/unassigned", "UnAssigned", context, data.isLoading, RequestTypeEnum.unassigned, AppColor.unassignedStatus(context)),
requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestStatusEnum.open, AppColor.openColor), requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestTypeEnum.open, AppColor.openColor),
requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestStatusEnum.inProgress, requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestTypeEnum.inProgress,
AppColor.primary10), AppColor.primary10),
requestType( requestType(
data.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, data.isLoading, RequestStatusEnum.completed, AppColor.completedColor), data.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, data.isLoading, RequestTypeEnum.completed, AppColor.completedColor),
requestType(data.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, data.isLoading, RequestStatusEnum.overdue, AppColor.yellowIcon(context)), requestType(data.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, data.isLoading, RequestTypeEnum.overdue, AppColor.yellowIcon(context)),
requestType(data.dashboardCount?.data?.countHighPriority ?? 0, "high_priority", context.translation.highPriority, context, data.isLoading, RequestStatusEnum.highPriority, AppColor.red30), requestType(data.dashboardCount?.data?.countHighPriority ?? 0, "high_priority", context.translation.highPriority, context, data.isLoading, RequestTypeEnum.highPriority, AppColor.red30),
]; ];
} }
@ -77,7 +77,7 @@ class RequestsFragment extends StatelessWidget {
}); });
} }
Widget requestType(int value, String icon, String title, BuildContext context, bool isLoading, RequestStatusEnum requestType, Color iconColor) { Widget requestType(int value, String icon, String title, BuildContext context, bool isLoading, RequestTypeEnum requestType, Color iconColor) {
return CustomBadge( return CustomBadge(
value: isLoading ? 0 : value, value: isLoading ? 0 : value,
positionR: -4, positionR: -4,

@ -197,7 +197,7 @@ enum AssetDeliveryStageEnum {
other, other,
} }
enum RequestStatusEnum { enum RequestTypeEnum {
unassigned, unassigned,
open, open,
inProgress, inProgress,

@ -7,12 +7,9 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_api_availability/google_api_availability.dart'; import 'package:google_api_availability/google_api_availability.dart';
import 'package:haptic_feedback/haptic_feedback.dart'; import 'package:haptic_feedback/haptic_feedback.dart';
import 'package:http/http.dart' as http;
import 'package:nfc_manager/nfc_manager.dart'; import 'package:nfc_manager/nfc_manager.dart';
import 'package:nfc_manager/nfc_manager_android.dart' show NfcAAndroid, NfcBAndroid; import 'package:nfc_manager/nfc_manager_android.dart' show NfcAAndroid, NfcBAndroid;
import 'package:nfc_manager/nfc_manager_ios.dart' show MiFareIos, Iso15693Ios; import 'package:nfc_manager/nfc_manager_ios.dart' show MiFareIos, Iso15693Ios;
import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart'; import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart';
@ -196,73 +193,6 @@ class Utils {
); );
} }
static Future<File?> downloadFile(
String url, {
bool autoOpen = true,
bool showToast = true,
String? authToken,
String? fileName,
}) async {
final client = http.Client();
try {
if (showToast) {
Utils.showToast("Downloading file...", longDuration: false);
}
fileName ??= url.split('/').last.split('?').first;
if (!fileName.contains('.')) {
fileName = 'downloaded_file_${DateTime.now().millisecondsSinceEpoch}.jpg';
}
final request = http.Request('GET', Uri.parse(url));
if (authToken != null) {
request.headers['Authorization'] = 'Bearer $authToken';
}
request.followRedirects = false;
final streamedResponse = await client.send(request);
File? file;
final dir = await getTemporaryDirectory();
if (streamedResponse.statusCode == 302) {
final redirectUrl = streamedResponse.headers['location'];
if (redirectUrl == null) {
throw Exception('302 Redirect missing Location header');
}
final headers = authToken != null ? {'Authorization': 'Bearer $authToken'} : <String, String>{};
final fileResponse = await http.get(Uri.parse(redirectUrl), headers: headers);
if (fileResponse.statusCode == 200) {
file = File('${dir.path}/$fileName');
await file.writeAsBytes(fileResponse.bodyBytes);
} else {
throw Exception('Download from redirect failed: ${fileResponse.statusCode}');
}
}
else if (streamedResponse.statusCode == 200) {
file = File('${dir.path}/$fileName');
await file.writeAsBytes(await streamedResponse.stream.toBytes());
}
else {
throw Exception('Download failed with status: ${streamedResponse.statusCode}');
}
if (showToast) {
Utils.showToast("File downloaded successfully", longDuration: false);
}
if (autoOpen) {
await OpenFile.open(file.path);
}
return file;
} catch (ex) {
if (showToast) {
Utils.showToast("Download failed: ${ex.toString()}");
}
return null;
} finally {
client.close();
}
}
static bool isLocalFile(String path) {
if (path.isEmpty) return false;
return path.startsWith("/") || path.startsWith("file://") || (path.length > 1 && path.substring(1).startsWith(':\\'));
}
// //
// static Widget getNoDataWidget(BuildContext context) { // static Widget getNoDataWidget(BuildContext context) {
// return Column( // return Column(

@ -69,7 +69,6 @@ import 'package:test_sa/modules/applicationDemo/providers/application_demo_reque
import 'package:test_sa/modules/applicationDemo/screens/application_demo_request_form_screen.dart'; import 'package:test_sa/modules/applicationDemo/screens/application_demo_request_form_screen.dart';
import 'package:test_sa/modules/tm_module/gas_refill/create_gas_refill_request.dart'; import 'package:test_sa/modules/tm_module/gas_refill/create_gas_refill_request.dart';
import 'package:test_sa/modules/tm_module/gas_refill/update_gas_refill_request.dart'; import 'package:test_sa/modules/tm_module/gas_refill/update_gas_refill_request.dart';
import 'package:test_sa/modules/traf_module/create_traf_request_page.dart';
import 'package:test_sa/modules/traf_module/traf_request_provider.dart'; import 'package:test_sa/modules/traf_module/traf_request_provider.dart';
import 'package:test_sa/new_views/app_style/app_themes.dart'; import 'package:test_sa/new_views/app_style/app_themes.dart';
import 'package:test_sa/new_views/pages/help_center_page.dart'; import 'package:test_sa/new_views/pages/help_center_page.dart';
@ -149,6 +148,7 @@ import 'modules/tm_module/device_transfer/device_filter_screen.dart';
import 'modules/tm_module/device_transfer/device_search_screen.dart'; import 'modules/tm_module/device_transfer/device_search_screen.dart';
import 'modules/tm_module/tasks/create_task_view.dart'; import 'modules/tm_module/tasks/create_task_view.dart';
import 'modules/tm_module/gas_refill/gas_refill_request_form.dart'; import 'modules/tm_module/gas_refill/gas_refill_request_form.dart';
import 'modules/traf_module/create_traf_request_page.dart';
import 'modules/traf_module/update_traf_request_page.dart'; import 'modules/traf_module/update_traf_request_page.dart';
import 'providers/lookups/classification_lookup_provider.dart'; import 'providers/lookups/classification_lookup_provider.dart';
import 'providers/lookups/customer_lookup_provider.dart'; import 'providers/lookups/customer_lookup_provider.dart';
@ -258,7 +258,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => EndUserStatusLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => EndUserStatusLookupProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => EndUserRejectionReasonLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => EndUserRejectionReasonLookupProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => AttachmentTypeLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => AttachmentTypeLookupProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => AttachmentTypeLookupProviderLatest(), lazy: true),
ChangeNotifierProvider(create: (_) => DemoPeriodLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => DemoPeriodLookupProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => DemoDocumentLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => DemoDocumentLookupProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => IncidentStatusLookupProvider(), lazy: true), ChangeNotifierProvider(create: (_) => IncidentStatusLookupProvider(), lazy: true),
@ -358,7 +357,6 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => DepartmentProvider(), lazy: true), ChangeNotifierProvider(create: (_) => DepartmentProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => DepartmentBySitesProvider(), lazy: true), ChangeNotifierProvider(create: (_) => DepartmentBySitesProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => SiteProvider(), lazy: true), ChangeNotifierProvider(create: (_) => SiteProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => SameOrgSiteProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => MappedSiteProvider(), lazy: true), ChangeNotifierProvider(create: (_) => MappedSiteProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider(), lazy: true), ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider(), lazy: true),
ChangeNotifierProvider(create: (_) => FlowMedicalDepartmentProvider(), lazy: true), ChangeNotifierProvider(create: (_) => FlowMedicalDepartmentProvider(), lazy: true),

@ -55,7 +55,7 @@ class AssetByIdModel {
String? comment; String? comment;
bool? isEnabled; bool? isEnabled;
String? tagCode; String? tagCode;
List<GenericAttachmentModel>? assetAttachments; List<AssetAttachment>? assetAttachments;
String? retirementTypeName; String? retirementTypeName;
String? retirementStatusName; String? retirementStatusName;
String? retirementDate; String? retirementDate;
@ -198,9 +198,9 @@ class AssetByIdModel {
isEnabled = json['isEnabled']; isEnabled = json['isEnabled'];
tagCode = json['tagCode']; tagCode = json['tagCode'];
if (json['assetAttachments'] != null) { if (json['assetAttachments'] != null) {
assetAttachments = <GenericAttachmentModel>[]; assetAttachments = <AssetAttachment>[];
json['assetAttachments'].forEach((v) { json['assetAttachments'].forEach((v) {
assetAttachments!.add(GenericAttachmentModel.fromAssetJson(v)); assetAttachments!.add(AssetAttachment.fromJson(v));
}); });
} }
retirementTypeName = json['retirementTypeName']; retirementTypeName = json['retirementTypeName'];
@ -298,7 +298,7 @@ class AssetByIdModel {
data['isEnabled'] = isEnabled; data['isEnabled'] = isEnabled;
data['tagCode'] = tagCode; data['tagCode'] = tagCode;
if (assetAttachments != null) { if (assetAttachments != null) {
data['assetAttachments'] = assetAttachments!.map((v) => v.toAssetJson()).toList(); data['assetAttachments'] = assetAttachments!.map((v) => v).toList();
} }
data['retirementTypeName'] = retirementTypeName; data['retirementTypeName'] = retirementTypeName;
data['retirementStatusName'] = retirementStatusName; data['retirementStatusName'] = retirementStatusName;

@ -1,39 +1,30 @@
//TODO: need to remove this class class AssetTransferAttachment {
// import 'package:test_sa/models/lookup.dart'; AssetTransferAttachment({
// this.id,
// class AssetTransferAttachment { this.attachmentName,
// AssetTransferAttachment({ });
// this.id,
// this.attachmentName, AssetTransferAttachment.fromJson(dynamic json) {
// this.documentType, id = json['id'];
// attachmentName = json['attachmentName'];
// }); }
//
// AssetTransferAttachment.fromJson(dynamic json) { num? id; // Now nullable
// id = json['id']; String? attachmentName; // Now nullable
// attachmentName = json['attachmentName'];
// } AssetTransferAttachment copyWith({
// num? id, // Parameter is now nullable
// num? id; // Now nullable String? attachmentName, // Parameter is now nullable
// String? attachmentName; // Now nullable }) =>
// Lookup ? documentType; AssetTransferAttachment(
// id: id ?? this.id,
// AssetTransferAttachment copyWith({ attachmentName: attachmentName ?? this.attachmentName,
// num? id, // Parameter is now nullable );
// String? attachmentName, // Parameter is now nullable
// Lookup? documentType, // Parameter is now nullable Map<String, dynamic> toJson() {
// }) => final map = <String, dynamic>{};
// AssetTransferAttachment( map['id'] = id;
// id: id ?? this.id, map['attachmentName'] = attachmentName;
// attachmentName: attachmentName ?? this.attachmentName, return map;
// documentType: documentType ?? this.documentType, }
// ); }
//
// Map<String, dynamic> toJson() {
// final map = <String, dynamic>{};
// map['id'] = id;
// map['attachmentName'] = attachmentName;
// map['documentTypeId'] = documentType?.id;
// return map;
// }
// }

@ -1,5 +1,4 @@
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
@ -96,6 +95,7 @@ class DeviceTransfer {
this.assistantEmployList, this.assistantEmployList,
this.assetTransferAssistantEmployeesReceiver, this.assetTransferAssistantEmployeesReceiver,
this.assetTransferAssistantEmployeesSender, this.assetTransferAssistantEmployeesSender,
this.statusValue, this.statusValue,
}); });
@ -130,13 +130,13 @@ class DeviceTransfer {
if (json['senderAttachments'] != null) { if (json['senderAttachments'] != null) {
senderAttachments = []; senderAttachments = [];
json['senderAttachments'].forEach((v) { json['senderAttachments'].forEach((v) {
senderAttachments!.add(GenericAttachmentModel.fromAssetTransferJson(v)); senderAttachments!.add(AssetTransferAttachment.fromJson(v));
}); });
} }
if (json['assetTransferAttachments'] != null) { if (json['assetTransferAttachments'] != null) {
assetTransferAttachments = []; assetTransferAttachments = [];
json['assetTransferAttachments'].forEach((v) { json['assetTransferAttachments'].forEach((v) {
assetTransferAttachments?.add(GenericAttachmentModel.fromAssetTransferJson(v)); assetTransferAttachments?.add(AssetTransferAttachment.fromJson(v));
}); });
} }
if (json['assetTransferContactPersons'] != null) { if (json['assetTransferContactPersons'] != null) {
@ -198,7 +198,7 @@ class DeviceTransfer {
if (json['receiverAttachments'] != null) { if (json['receiverAttachments'] != null) {
receiverAttachments = []; receiverAttachments = [];
json['receiverAttachments'].forEach((v) { json['receiverAttachments'].forEach((v) {
receiverAttachments!.add(GenericAttachmentModel.fromAssetTransferJson(v)); receiverAttachments!.add(AssetTransferAttachment.fromJson(v));
}); });
} }
assetNumber = json['assetNumber']; assetNumber = json['assetNumber'];
@ -270,9 +270,9 @@ class DeviceTransfer {
String? senderWorkingHours; String? senderWorkingHours;
String? senderTravelingHours; String? senderTravelingHours;
String? senderEngSignature; String? senderEngSignature;
List<GenericAttachmentModel>? senderAttachments; List<AssetTransferAttachment>? senderAttachments;
List<GenericAttachmentModel>? attachments; List<AssetTransferAttachment>? attachments;
List<GenericAttachmentModel>? assetTransferAttachments; List<AssetTransferAttachment>? assetTransferAttachments;
String? receiverAssignedEmployeeId; String? receiverAssignedEmployeeId;
String? receiverAssignedEmployeeNumber; String? receiverAssignedEmployeeNumber;
num? receiverMachineStatusId; num? receiverMachineStatusId;
@ -283,7 +283,7 @@ class DeviceTransfer {
String? receiverWorkingHours; String? receiverWorkingHours;
String? receiverTravelingHours; String? receiverTravelingHours;
String? receiverEngSignature; String? receiverEngSignature;
List<GenericAttachmentModel>? receiverAttachments; List<AssetTransferAttachment>? receiverAttachments;
num? supplierId; num? supplierId;
String? supplierName; String? supplierName;
String? destSiteName; String? destSiteName;
@ -314,11 +314,11 @@ class DeviceTransfer {
List<VisitTimers>? assetTransferEngineerTimers; List<VisitTimers>? assetTransferEngineerTimers;
List<TimerModel>? timerModelList = []; List<TimerModel>? timerModelList = [];
List<AssistantEmployees>? assistantEmployees; List<AssistantEmployees>? assistantEmployees;
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender = []; List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender=[];
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver = []; List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver=[];
List<AssetTransferContactPerson>? assetTransferContactPersons; List<AssetTransferContactPerson>? assetTransferContactPersons;
AssetTransferAssistantEmployees? modelAssistantEmployees; AssetTransferAssistantEmployees? modelAssistantEmployees;
List<AssetTransferAssistantEmployees>? assistantEmployList = []; List<AssetTransferAssistantEmployees>? assistantEmployList=[];
TimerModel? tbsTimer = TimerModel(); TimerModel? tbsTimer = TimerModel();
TimerModel? deviceTimePicker; TimerModel? deviceTimePicker;
@ -349,7 +349,7 @@ class DeviceTransfer {
String? senderWorkingHours, String? senderWorkingHours,
String? senderTravelingHours, String? senderTravelingHours,
String? senderEngSignature, String? senderEngSignature,
List<GenericAttachmentModel>? senderAttachments, List<AssetTransferAttachment>? senderAttachments,
String? receiverAssignedEmployeeId, String? receiverAssignedEmployeeId,
String? receiverAssignedEmployeeNumber, String? receiverAssignedEmployeeNumber,
num? receiverMachineStatusId, num? receiverMachineStatusId,
@ -359,7 +359,7 @@ class DeviceTransfer {
String? receiverWorkingHours, String? receiverWorkingHours,
String? receiverTravelingHours, String? receiverTravelingHours,
String? receiverEngSignature, String? receiverEngSignature,
List<GenericAttachmentModel>? receiverAttachments, List<AssetTransferAttachment>? receiverAttachments,
num? supplierId, num? supplierId,
String? supplierName, String? supplierName,
String? destSiteName, String? destSiteName,
@ -472,7 +472,7 @@ class DeviceTransfer {
senderVisitTimers: senderVisitTimers ?? this.senderVisitTimers, senderVisitTimers: senderVisitTimers ?? this.senderVisitTimers,
receiverVisitTimers: receiverVisitTimers ?? this.receiverVisitTimers, receiverVisitTimers: receiverVisitTimers ?? this.receiverVisitTimers,
tbsTimer: tbsTimer ?? this.tbsTimer, tbsTimer: tbsTimer ?? this.tbsTimer,
assistantEmployList: assistantEmployList ?? this.assistantEmployList, assistantEmployList: assistantEmployList??this.assistantEmployList,
deviceTimePicker: deviceTimePicker ?? this.deviceTimePicker, deviceTimePicker: deviceTimePicker ?? this.deviceTimePicker,
manufacturerName: manufacturerName ?? this.manufacturerName); manufacturerName: manufacturerName ?? this.manufacturerName);
@ -510,7 +510,7 @@ class DeviceTransfer {
map['assetTransferReceiverTimers'] = receiverVisitTimers!.map((v) => v.toJson()).toList(); map['assetTransferReceiverTimers'] = receiverVisitTimers!.map((v) => v.toJson()).toList();
} }
if (senderAttachments != null) { if (senderAttachments != null) {
map['senderAttachments'] = senderAttachments!.map((v) => v.toAssetTransferJson()).toList(); map['senderAttachments'] = senderAttachments!.map((v) => v.toJson()).toList();
} }
map['receiverAssignedEmployeeId'] = receiverAssignedEmployeeId; map['receiverAssignedEmployeeId'] = receiverAssignedEmployeeId;
map['receiverAssignedEmployeeNumber'] = receiverAssignedEmployeeNumber; map['receiverAssignedEmployeeNumber'] = receiverAssignedEmployeeNumber;
@ -522,7 +522,7 @@ class DeviceTransfer {
map['receiverTravelingHours'] = receiverTravelingHours; map['receiverTravelingHours'] = receiverTravelingHours;
map['receiverEngSignature'] = receiverEngSignature; map['receiverEngSignature'] = receiverEngSignature;
if (receiverAttachments != null) { if (receiverAttachments != null) {
map['receiverAttachments'] = receiverAttachments?.map((v) => v.toAssetTransferJson() ?? {}).toList(); map['receiverAttachments'] = receiverAttachments!.map((v) => v.toJson()).toList();
} }
map["supplierId"] = supplierId; map["supplierId"] = supplierId;
map["supplierName"] = supplierName; map["supplierName"] = supplierName;
@ -571,7 +571,7 @@ class DeviceTransfer {
map['destRoomId'] = destRoomId; map['destRoomId'] = destRoomId;
map['comment'] = comment; map['comment'] = comment;
if (attachments != null) { if (attachments != null) {
map['attachments'] = attachments!.map((v) => v.toAssetTransferJson()).toList(); map['attachments'] = attachments!.map((v) => v.toJson()).toList();
} }
return map; return map;
} }
@ -586,7 +586,7 @@ class DeviceTransfer {
map['assetTransferAssistantEmployees'] = modelAssistantEmployees; map['assetTransferAssistantEmployees'] = modelAssistantEmployees;
map['assetTransferEngineerTimers'] = assetTransferEngineerTimers; map['assetTransferEngineerTimers'] = assetTransferEngineerTimers;
if (attachments != null) { if (attachments != null) {
map['attachments'] = attachments!.map((v) => v.toAssetTransferJson()).toList(); map['attachments'] = attachments!.map((v) => v.toJson()).toList();
} }
if (assetTransferEngineerTimers != null) { if (assetTransferEngineerTimers != null) {
map['assetTransferEngineerTimers'] = assetTransferEngineerTimers!.map((v) => v.toJson()).toList(); map['assetTransferEngineerTimers'] = assetTransferEngineerTimers!.map((v) => v.toJson()).toList();
@ -634,7 +634,7 @@ class DeviceTransfer {
map['senderTravelingHours'] = senderTravelingHours; map['senderTravelingHours'] = senderTravelingHours;
map['senderEngSignature'] = senderEngSignature; map['senderEngSignature'] = senderEngSignature;
if (senderAttachments != null) { if (senderAttachments != null) {
map['senderAttachments'] = senderAttachments!.map((v) => v.toAssetTransferJson()).toList(); map['senderAttachments'] = senderAttachments!.map((v) => v.toJson()).toList();
} }
if (senderVisitTimers != null) { if (senderVisitTimers != null) {
map['assetTransferSenderTimers'] = senderVisitTimers!.map((v) => v.toJson()).toList(); map['assetTransferSenderTimers'] = senderVisitTimers!.map((v) => v.toJson()).toList();
@ -652,7 +652,7 @@ class DeviceTransfer {
map['receiverTravelingHours'] = receiverTravelingHours; map['receiverTravelingHours'] = receiverTravelingHours;
map['receiverEngSignature'] = receiverEngSignature; map['receiverEngSignature'] = receiverEngSignature;
if (receiverAttachments != null) { if (receiverAttachments != null) {
map['receiverAttachments'] = receiverAttachments!.map((v) => v.toAssetTransferJson() ?? {}).toList(); map['receiverAttachments'] = receiverAttachments!.map((v) => v.toJson()).toList();
} }
return map; return map;
} }

@ -1,213 +0,0 @@
enum RequestAttachmentTypeEnum {
correctiveMaintenance, // 1
gasRefill, // 2
transferAsset, // 3
preventiveMaintenance, // 4
recurrentWo, // 5
taskRequest, // 6
recallAndAlert, // 7
assetInventory, // 8
assessmentOfNeedAndTechnology, // 9
equipmentInternalAudit, // 10
systemInternalAudit, // 11
loanEquipment, // 12
assetDelivery, // 13
medicalGasInspection, // 14
demo, // 15
incidents, // 16
sparePartActivity, // 17
updateDeliveryNotes, // 18
traf,//19
ppmSparePartActivity// 20
}
extension RequestAttachmentTypeEnumExtension on RequestAttachmentTypeEnum {
int get id {
switch (this) {
case RequestAttachmentTypeEnum.correctiveMaintenance:
return 1;
case RequestAttachmentTypeEnum.gasRefill:
return 2;
case RequestAttachmentTypeEnum.transferAsset:
return 3;
case RequestAttachmentTypeEnum.preventiveMaintenance:
return 4;
case RequestAttachmentTypeEnum.recurrentWo:
return 5;
case RequestAttachmentTypeEnum.taskRequest:
return 6;
case RequestAttachmentTypeEnum.recallAndAlert:
return 7;
case RequestAttachmentTypeEnum.assetInventory:
return 8;
case RequestAttachmentTypeEnum.assessmentOfNeedAndTechnology:
return 9;
case RequestAttachmentTypeEnum.equipmentInternalAudit:
return 10;
case RequestAttachmentTypeEnum.systemInternalAudit:
return 11;
case RequestAttachmentTypeEnum.loanEquipment:
return 12;
case RequestAttachmentTypeEnum.assetDelivery:
return 13;
case RequestAttachmentTypeEnum.medicalGasInspection:
return 14;
case RequestAttachmentTypeEnum.demo:
return 15;
case RequestAttachmentTypeEnum.incidents:
return 16;
case RequestAttachmentTypeEnum.sparePartActivity:
return 17;
case RequestAttachmentTypeEnum.updateDeliveryNotes:
return 18;
case RequestAttachmentTypeEnum.traf:
return 19;
case RequestAttachmentTypeEnum.ppmSparePartActivity:
return 20;
}
}
int get lookupEnumId {
switch (this) {
///values with 0 we need to check with backend team for the correct lookupEnumId
case RequestAttachmentTypeEnum.correctiveMaintenance:
return 40305;
case RequestAttachmentTypeEnum.gasRefill:
return 40307;
case RequestAttachmentTypeEnum.transferAsset:
return 40304;
case RequestAttachmentTypeEnum.preventiveMaintenance:
return 40313;
case RequestAttachmentTypeEnum.recurrentWo:
return 40314;
case RequestAttachmentTypeEnum.taskRequest:
return 40317;
case RequestAttachmentTypeEnum.recallAndAlert:
return 40316;
case RequestAttachmentTypeEnum.assetInventory:
return 40303;
case RequestAttachmentTypeEnum.assessmentOfNeedAndTechnology:
return 40319;
case RequestAttachmentTypeEnum.equipmentInternalAudit:
return 40323;
case RequestAttachmentTypeEnum.systemInternalAudit:
return 40322;
case RequestAttachmentTypeEnum.loanEquipment:
return 3053;
case RequestAttachmentTypeEnum.assetDelivery:
return 5009;
case RequestAttachmentTypeEnum.medicalGasInspection:
return 3012;
case RequestAttachmentTypeEnum.demo:
return 4106;
case RequestAttachmentTypeEnum.incidents:
return 40308;
case RequestAttachmentTypeEnum.sparePartActivity:
return 40321;
case RequestAttachmentTypeEnum.ppmSparePartActivity:
return 4021;
case RequestAttachmentTypeEnum.updateDeliveryNotes:
return 40309;
case RequestAttachmentTypeEnum.traf:
return 40319;
}
}
// String getName(BuildContext context) {
// switch (this) {
// case RequestTypeEnum.correctiveMaintenance:
// return context.translation.correctiveMaintenance;
// case RequestTypeEnum.gasRefill:
// return context.translation.gasRefill;
// case RequestTypeEnum.transferAsset:
// return context.translation.transferAsset;
// case RequestTypeEnum.preventiveMaintenance:
// return context.translation.preventiveMaintenance;
// case RequestTypeEnum.recurrentWo:
// return context.translation.recurrentWo;
// case RequestTypeEnum.taskRequest:
// return context.translation.taskRequest;
// case RequestTypeEnum.recallAndAlert:
// return 'Recall and Alert';
// case RequestTypeEnum.assetInventory:
// return 'Asset Inventory';
// case RequestTypeEnum.assessmentOfNeedAndTechnology:
// return 'Assessment of Need & Technology';
// case RequestTypeEnum.equipmentInternalAudit:
// return 'Equipment Internal Audit';
// case RequestTypeEnum.systemInternalAudit:
// return 'System Internal Audit';
// case RequestTypeEnum.loanEquipment:
// return 'Loan Equipment';
// case RequestTypeEnum.assetDelivery:
// return 'Asset Delivery';
// case RequestTypeEnum.medicalGasInspection:
// return 'Medical Gas Inspection';
// case RequestTypeEnum.demo:
// return 'Demo';
// case RequestTypeEnum.incidents:
// return 'Incidents';
// case RequestTypeEnum.sparePartActivity:
// return 'Spare Part Activity';
// case RequestTypeEnum.updateDeliveryNotes:
// return 'Update Delivery Notes';
// case RequestTypeEnum.traf:
// return 'Traf';
// }
// }
static RequestAttachmentTypeEnum? fromId(int? id) {
if (id == null) return null;
switch (id) {
case 1:
return RequestAttachmentTypeEnum.correctiveMaintenance;
case 2:
return RequestAttachmentTypeEnum.gasRefill;
case 3:
return RequestAttachmentTypeEnum.transferAsset;
case 4:
return RequestAttachmentTypeEnum.preventiveMaintenance;
case 5:
return RequestAttachmentTypeEnum.recurrentWo;
case 6:
return RequestAttachmentTypeEnum.taskRequest;
case 7:
return RequestAttachmentTypeEnum.recallAndAlert;
case 8:
return RequestAttachmentTypeEnum.assetInventory;
case 9:
return RequestAttachmentTypeEnum.assessmentOfNeedAndTechnology;
case 10:
return RequestAttachmentTypeEnum.equipmentInternalAudit;
case 11:
return RequestAttachmentTypeEnum.systemInternalAudit;
case 12:
return RequestAttachmentTypeEnum.loanEquipment;
case 13:
return RequestAttachmentTypeEnum.assetDelivery;
case 14:
return RequestAttachmentTypeEnum.medicalGasInspection;
case 15:
return RequestAttachmentTypeEnum.demo;
case 16:
return RequestAttachmentTypeEnum.incidents;
case 17:
return RequestAttachmentTypeEnum.sparePartActivity;
case 18:
return RequestAttachmentTypeEnum.updateDeliveryNotes;
case 19:
return RequestAttachmentTypeEnum.traf;
case 20:
return RequestAttachmentTypeEnum.ppmSparePartActivity;
default:
return null;
}
}
// static String getNameFromId(int id, BuildContext context) {
// final requestType = fromId(id);
// return requestType?.getName(context) ?? "Type $id";
// }
static int? getLookupEnumIdFromId(int? id) {
final requestType = fromId(id);
return requestType?.lookupEnumId;
}
}

@ -1,358 +1,33 @@
import 'dart:developer'; import 'dart:io';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class GenericAttachmentModel { class GenericAttachmentModel {
GenericAttachmentModel({ GenericAttachmentModel({this.id, this.name, this.originalName, this.createdBy, this.documentTypeId});
this.id,
this.name,
this.module,
this.subModule,
this.uploadedBy,
this.originalName,
this.createdBy,
this.documentType,
this.attachmentDescription,
this.attachmentURL,
this.moduleReferenceId,
this.attachmentTypeId,
this.createdDate,
this.modifiedBy,
this.modifiedDate,
this.supplierId,
});
int? id; int? id;
String? name; String? name;
String? module;
String? subModule;
String? uploadedBy;
String? createdBy; String? createdBy;
String? originalName; String? originalName;
Lookup? documentType; Lookup? documentTypeId;
String? attachmentDescription;
String? attachmentURL;
num? moduleReferenceId;
num? attachmentTypeId;
String? createdDate;
String? modifiedBy;
String? modifiedDate;
num? supplierId;
GenericAttachmentModel.fromJson(Map<String, dynamic> json, {bool convertToLink = false}) { GenericAttachmentModel.fromJson(Map<String, dynamic> json, {bool convertToLink = false}) {
id = json['id']; id = json['id'];
name = json['name'] ?? json['attachmentName'] ?? json['imageName']; name = json['name'] ?? json['imageName'];
createdBy = json['createdBy']; createdBy = json['createdBy'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
originalName = json['originalName'] ?? json['imageOriginalName']; originalName = json['originalName'] ?? json['imageOriginalName'];
if (convertToLink) { if (convertToLink) {
name = URLs.getFileUrl(name); name = URLs.getFileUrl(name);
} }
} }
GenericAttachmentModel.fromAssetDocumentJson(Map<String, dynamic> json, {bool convertToLink = false}) {
id = json['id'];
name = json['attachmentName'] ?? json['name'] ?? json['imageName'];
module = json['module'];
subModule = json['subModule'];
createdBy = json['createdBy'];
createdDate = json['createdDate'];
uploadedBy = json['uploadedBy'];
originalName = json['originalName'] ?? json['imageOriginalName'];
documentType = json['attachmentType'] != null ? Lookup(name: json['attachmentType'], id: 0) : null;
if (convertToLink && name != null) {
name = URLs.getFileUrl(name);
}
}
GenericAttachmentModel.fromWorkOrderJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
createdBy = json['createdBy'];
}
GenericAttachmentModel.fromLoanJson(Map<String, dynamic> json) {
id = json['id']?.toInt();
name = json['attachmentName'];
attachmentDescription = json['attachmentDescription'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
moduleReferenceId = json['loanId'];
attachmentTypeId = json['loanAttachmentTypeId'];
}
GenericAttachmentModel.fromLoanDetailJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
attachmentDescription = json['attachmentDescription'];
moduleReferenceId = json['loanId'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
attachmentTypeId = json['loanAttachmentTypeId'];
createdBy = json['createdBy'];
createdDate = json['createdDate'];
modifiedBy = json['modifiedBy'];
modifiedDate = json['modifiedDate'];
}
GenericAttachmentModel.fromPpmJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'] ?? json['name'];
moduleReferenceId = json['visitId'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
attachmentURL = json['attachmentURL'];
}
GenericAttachmentModel.fromSupplierJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'] ?? json['name'];
supplierId = json['supplierId'];
moduleReferenceId = json['visitId'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
attachmentURL = json['attachmentURL'];
}
GenericAttachmentModel.fromGasRefillJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
moduleReferenceId = json['gasRefillId'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
}
GenericAttachmentModel.fromIncidentJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
moduleReferenceId = json['incidentId'];
attachmentDescription = json['attachmentDescription'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
}
GenericAttachmentModel.fromAssetTransferJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
}
GenericAttachmentModel.fromDemoJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
originalName = json['originalName'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
moduleReferenceId = json['demoRequestId'];
}
GenericAttachmentModel.fromInternalAuditJson(Map<String, dynamic> json) {
id = json['id'];
name = (json['name'] != null && !json['name'].toString().startsWith('data:image/jpeg')) ? json['name'] : null;
originalName = json['originalName'];
createdBy = json['createdBy'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
}
GenericAttachmentModel.fromPreventiveVisitJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
}
GenericAttachmentModel.fromAssetJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
attachmentURL = json['attachmentURL'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
originalName = json['originalName'];
}
GenericAttachmentModel.fromAssetInventoryJson(Map<String, dynamic> json) {
id = json['id'];
name = json['attachmentName'];
attachmentURL = json['attachmentURL'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
originalName = json['originalName'];
}
GenericAttachmentModel.fromTrafJson(Map<String, dynamic> json) {
id = json['id'];
moduleReferenceId = json['trafId'];
name = json['attachmentName'];
attachmentDescription = json['attachmentDescription'];
moduleReferenceId = json['trafId'];
documentType = json['attachmentType'] != null ? Lookup.fromJson(json['attachmentType']) : null;
}
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
data['name'] = name; data['name'] = name;
data['createdBy'] = createdBy; data['createdBy'] = createdBy;
data['originalName'] = originalName; data['originalName'] = originalName;
data['documentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toSparePartJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
data['originalName'] = originalName;
data['attachmentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toWorkOrderJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
///TODO need to keep same variable for document type in backend for all modules, currently it is different for different modules
if (documentType != null) {
data['attachmentTypeId'] = documentType?.id;
}
return data;
}
Map<String, dynamic> toLoanJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['loanId'] = moduleReferenceId;
data['loanAttachmentTypeId'] = documentType?.id;
// data['documentTypeId'] = documentType?.id;
data['attachmentDescription'] = attachmentDescription;
return data;
}
Map<String, dynamic> toLoanDetailJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['loanId'] = moduleReferenceId;
data['loanAttachmentTypeId'] = attachmentTypeId;
data['attachmentDescription'] = attachmentDescription;
data['createdBy'] = createdBy;
data['createdDate'] = createdDate;
data['documentTypeId'] = documentType?.id;
data['modifiedBy'] = modifiedBy;
data['modifiedDate'] = modifiedDate;
return data;
}
Map<String, dynamic> toGasRefillJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['gasRefillId'] = moduleReferenceId;
data['attachmentName'] = name;
data['documentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toIncidentJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['incidentId'] = moduleReferenceId;
data['attachmentTypeId'] = documentType?.id;
data['attachmentDescription'] = attachmentDescription;
return data;
}
Map<String, dynamic> toAssetTransferJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['attachmentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toDemoJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['demoRequestId'] = moduleReferenceId;
data['originalName'] = originalName;
if (documentType != null) {
data['documentTypeId'] = documentType?.id;
}
return data;
}
Map<String, dynamic> toInternalAuditJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['originalName'] = originalName;
data['attachmentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toPreventiveVisitJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['attachmentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toAssetJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = name;
data['attachmentURL'] = attachmentURL;
data['documentTypeId'] = documentType?.id;
data['originalName'] = originalName;
return data;
}
Map<String, dynamic> toAssetDeliveryJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['attachmentTypeId'] = documentType?.id;
data['originalName'] = originalName;
data['createdBy'] = createdBy;
return data;
}
Map<String, dynamic> toInventoryJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['Name'] = name;
data['attachmentURL'] = attachmentURL;
data['attachmentTypeId'] = documentType?.id;
data['originalName'] = originalName;
return data;
}
Map<String, dynamic> toTrafJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['trafId'] = moduleReferenceId;
data['attachmentName'] = name;
data['attachmentTypeId'] = documentType?.id;
return data;
}
Map<String, dynamic> toSupplierJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['supplierId'] = supplierId;
data['documentTypeId'] = documentType?.id;
data['attachmentName'] = name;
data['attachmentURL'] = attachmentURL;
return data;
}
Map<String, dynamic> toTaskJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
data['originalName'] = originalName;
data['attachmentTypeId'] = documentType?.id;
return data; return data;
} }
} }

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class AssetRetiredHelperModel { class AssetRetiredHelperModel {
@ -6,7 +5,7 @@ class AssetRetiredHelperModel {
int? workOrderId; int? workOrderId;
Lookup? retirmentReason; Lookup? retirmentReason;
String? retirementComment; String? retirementComment;
List<GenericAttachmentModel>? List<ActivityAssetToBeRetiredAttachments>?
activityAssetToBeRetiredAttachments=[]; activityAssetToBeRetiredAttachments=[];
AssetRetiredHelperModel( AssetRetiredHelperModel(
@ -31,3 +30,14 @@ class AssetRetiredHelperModel {
} }
} }
class ActivityAssetToBeRetiredAttachments {
int? id;
String? name;
ActivityAssetToBeRetiredAttachments({this.id, this.name});
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
return data;
}
}

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
@ -14,7 +13,8 @@ class SparePartHelperModel {
num? installQty; num? installQty;
num? returnQty; num? returnQty;
String? comment; String? comment;
List<GenericAttachmentModel>? sparePartAttachments;
List<SparePartAttachments> sparePartAttachments;
SparePartHelperModel({ SparePartHelperModel({
this.id, this.id,
@ -28,7 +28,7 @@ class SparePartHelperModel {
this.activityStatusId, this.activityStatusId,
this.activityStatus, this.activityStatus,
this.comment, this.comment,
List<GenericAttachmentModel>? sparePartAttachments, List<SparePartAttachments>? sparePartAttachments,
}) : sparePartAttachments = sparePartAttachments ?? []; }) : sparePartAttachments = sparePartAttachments ?? [];
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -43,12 +43,29 @@ class SparePartHelperModel {
data['activityStatusId'] = activityStatus?.id; data['activityStatusId'] = activityStatus?.id;
} }
data['comment'] = comment; data['comment'] = comment;
if (sparePartAttachments != null) { if (sparePartAttachments.isNotEmpty) {
data['acitiySparePartAttachments'] = sparePartAttachments!.map((v) => v?.toSparePartJson() ?? {}).toList(); data['acitiySparePartAttachments'] = sparePartAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
//{
// "id": 0,
// "planPreventiveVisitId": 0,
// "partCatalogItemId": 0,
// "quantity": 0,
// "comment": "string",
// "acitiySparePartAttachments": [
// {
// "id": 0,
// "name": "string",
// "originalName": "string",
// "attachmentTypeId": 0,
// "attachmentName": "string",
// "attachmentURL": "string"
// }
// ]
// }
Map<String, dynamic> toPMJson() { Map<String, dynamic> toPMJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
@ -58,9 +75,28 @@ class SparePartHelperModel {
data['comment'] = comment; data['comment'] = comment;
data['installQty'] = installQty; data['installQty'] = installQty;
data['returnQty'] = returnQty; data['returnQty'] = returnQty;
if (sparePartAttachments?.isNotEmpty ?? false) { if (sparePartAttachments.isNotEmpty) {
data['acitiySparePartAttachments'] = sparePartAttachments!.map((v) => v.toSparePartJson()).toList(); data['acitiySparePartAttachments'] = sparePartAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
} }
class SparePartAttachments {
int? id;
String? name;
SparePartAttachments({this.id, this.name});
SparePartAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
return data;
}
}

@ -1,5 +1,4 @@
import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../../new_models/work_order_detail_model.dart'; import '../../new_models/work_order_detail_model.dart';
@ -25,7 +24,7 @@ class WorkOrderHelperModel {
int? problemDescriptionId; int? problemDescriptionId;
String? comments; String? comments;
String? voiceNote; String? voiceNote;
List<GenericAttachmentModel>? workOrderAttachments; List<WorkOrderAttachments>? workOrderAttachments;
WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments}); WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments});
@ -38,21 +37,42 @@ class WorkOrderHelperModel {
data['comments'] = comments; data['comments'] = comments;
data['voiceNote'] = voiceNote; data['voiceNote'] = voiceNote;
if (workOrderAttachments != null) { if (workOrderAttachments != null) {
data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toWorkOrderJson()).toList(); data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
Map<String, dynamic> toUploadAttachmentJson(int? workOrderId, List<GenericAttachmentModel>? workOrderAttachments) { Map<String, dynamic> toUploadAttachmentJson(int? workOrderId, List<WorkOrderAttachments>? workOrderAttachments) {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['workOrderId'] = workOrderId; data['workOrderId'] = workOrderId;
if (workOrderAttachments != null) { if (workOrderAttachments != null) {
data['workOrderAttachments'] = workOrderAttachments.map((v) => v.toWorkOrderJson()).toList(); data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
} }
class WorkOrderAttachments {
WorkOrderAttachments({this.id, this.name,this.createdBy});
int? id;
String? name;
String ?createdBy;
WorkOrderAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
createdBy = json['createdBy'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
return data;
}
}
class EngineerUpdateWorkOrderHelperModel { class EngineerUpdateWorkOrderHelperModel {
int? workOrderId; int? workOrderId;
Lookup? equipmentStatus; Lookup? equipmentStatus;
@ -153,20 +173,10 @@ class WorkOrderCostModel {
String? mrNo; String? mrNo;
num? exchangeCost; num? exchangeCost;
WorkOrderCostModel({this.workOrderId, this.sparePartCost, this.labourCost, this.travelCost, this.qAmount, this.poNo, this.prNo, this.mrNo, this.exchangeCost}); WorkOrderCostModel({this.workOrderId, this.sparePartCost, this.labourCost, this.travelCost, this.qAmount, this.poNo, this.prNo,this.mrNo,this.exchangeCost});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'workOrderId': workOrderId, 'sparePartCost': sparePartCost, 'laborCost': labourCost, 'travelCost': travelCost, 'qAmount': qAmount, 'prNo': prNo, 'poNo': poNo,'mrNo':mrNo,'exchangeCost':exchangeCost};
'workOrderId': workOrderId,
'sparePartCost': sparePartCost,
'laborCost': labourCost,
'travelCost': travelCost,
'qAmount': qAmount,
'prNo': prNo,
'poNo': poNo,
'mrNo': mrNo,
'exchangeCost': exchangeCost
};
} }
Map<String, dynamic> toPMCostJson() { Map<String, dynamic> toPMCostJson() {
return {'planPreventiveVisitId': workOrderId, 'sparePartCost': sparePartCost, 'laborCost': labourCost, 'travelCost': travelCost, 'qAmount': qAmount, 'prNo': prNo, 'poNo': poNo,'mrNo':mrNo,'exchangeCost':exchangeCost}; return {'planPreventiveVisitId': workOrderId, 'sparePartCost': sparePartCost, 'laborCost': labourCost, 'travelCost': travelCost, 'qAmount': qAmount, 'prNo': prNo, 'poNo': poNo,'mrNo':mrNo,'exchangeCost':exchangeCost};

@ -3,7 +3,6 @@ import 'dart:typed_data';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
@ -88,7 +87,7 @@ class GasRefillModel {
TimerModel? gasRefillTimePicker; TimerModel? gasRefillTimePicker;
List<TimerModel>? timerModelList = []; List<TimerModel>? timerModelList = [];
List<GasRefillTimer>? gasRefillTimers = []; List<GasRefillTimer>? gasRefillTimers = [];
List<GenericAttachmentModel>? gasRefillAttachments; List<GasRefillAttachments>? gasRefillAttachments;
List<GasRefillContactPerson>? gasRefillContactPerson; List<GasRefillContactPerson>? gasRefillContactPerson;
int? statusValue; int? statusValue;
@ -116,9 +115,9 @@ class GasRefillModel {
workingHours = json['gasRefillTimers'].fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item['endDate']).difference(DateTime.parse(item['startDate'])).inSeconds) ?? 0; workingHours = json['gasRefillTimers'].fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item['endDate']).difference(DateTime.parse(item['startDate'])).inSeconds) ?? 0;
} }
if (json['gasRefillAttachments'] != null) { if (json['gasRefillAttachments'] != null) {
gasRefillAttachments = <GenericAttachmentModel>[]; gasRefillAttachments = <GasRefillAttachments>[];
json['gasRefillAttachments'].forEach((v) { json['gasRefillAttachments'].forEach((v) {
gasRefillAttachments!.add(GenericAttachmentModel.fromGasRefillJson(v)); gasRefillAttachments!.add(GasRefillAttachments.fromJson(v));
}); });
} }
if (json['gasRefillContactPerson'] != null) { if (json['gasRefillContactPerson'] != null) {
@ -128,6 +127,24 @@ class GasRefillModel {
}); });
} }
// try {
// final DateTime? sd = DateTime.tryParse(startDate ?? "");
// final DateTime? st = DateTime.tryParse(startTime ?? "");
// final DateTime? ed = DateTime.tryParse(endDate ?? "");
// final DateTime? et = DateTime.tryParse(endTime ?? "");
// timer = TimerModel(
// startAt: st == null ? sd : sd?.add(Duration(hours: st.hour, minutes: st.minute, seconds: st.second)), // Handle potential null 'sd'
// endAt: et == null ? ed : ed?.add(Duration(hours: et.hour, minutes: et.minute, seconds: et.second)), // Handle potential null 'ed'
// );
// if (timer!.endAt != null && timer!.startAt != null) {
// // Use '!' since timer could be null after initialization
// timer!.durationInSecond = (timer!.endAt!.difference(timer!.startAt!)).inSeconds;
// workingHours = (((timer!.durationInSecond ?? 0) / 60) / 60);
// }
// } catch (e) {
// print(e);
// }
engSignature = json['engSignature']; engSignature = json['engSignature'];
nurseSignature = json['nurseSignature']; nurseSignature = json['nurseSignature'];
site = json['site'] != null ? Site.fromJson(json['site']) : null; site = json['site'] != null ? Site.fromJson(json['site']) : null;
@ -171,7 +188,7 @@ class GasRefillModel {
map['comment'] = comment; map['comment'] = comment;
if (gasRefillAttachments != null) { if (gasRefillAttachments != null) {
map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toGasRefillJson() ?? {}).toList(); map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toJson()).toList();
} }
//older code..... //older code.....
@ -224,8 +241,8 @@ class GasRefillModel {
if (gasRefillTimers != null) { if (gasRefillTimers != null) {
map['gasRefillTimers'] = gasRefillTimers?.map((v) => v.toJson()).toList(); map['gasRefillTimers'] = gasRefillTimers?.map((v) => v.toJson()).toList();
} }
if (gasRefillContactPerson != null) { if (gasRefillAttachments != null) {
map['gasRefillContactPerson'] = gasRefillContactPerson?.map((v) => v?.toJson() ?? {}).toList(); map['gasRefillAttachments'] = gasRefillAttachments?.map((v) => v.toJson()).toList();
} }
return map; return map;
@ -437,30 +454,27 @@ class GasRefillTimer {
} }
} }
// class GasRefillAttachments { class GasRefillAttachments {
// int? id; int? id;
// num? gasRefillId; num? gasRefillId;
// String? attachmentName; String? attachmentName;
// Lookup ? documentType;
// GasRefillAttachments({this.id, this.attachmentName, this.gasRefillId});
// GasRefillAttachments({this.id, this.attachmentName,this.documentType, this.gasRefillId});
// GasRefillAttachments.fromJson(Map<String, dynamic> json) {
// GasRefillAttachments.fromJson(Map<String, dynamic> json) { id = json['id'];
// id = json['id']; gasRefillId = json['gasRefillId'];
// gasRefillId = json['gasRefillId']; attachmentName = json['attachmentName'];
// attachmentName = json['attachmentName']; }
// documentType = json['documentType'];
// } Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = <String, dynamic>{};
// Map<String, dynamic> toJson() { data['id'] = id;
// final Map<String, dynamic> data = <String, dynamic>{}; data['gasRefillId'] = gasRefillId;
// data['id'] = id; data['attachmentName'] = attachmentName;
// data['gasRefillId'] = gasRefillId; return data;
// data['attachmentName'] = attachmentName; }
// data['documentTypeId'] = documentType?.id; }
// return data;
// }
// }
class GasRefillContactPerson { class GasRefillContactPerson {
int? id; int? id;

@ -1,7 +1,6 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:test_sa/models/base.dart'; import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
@ -64,7 +63,7 @@ class TaskData {
Department? department; Department? department;
Rooms? room; Rooms? room;
String? callComment; String? callComment;
List<GenericAttachmentModel>? taskJobAttachments; List<TaskJobAttachment>? taskJobAttachments;
TaskContactUser? assignedEngineer; TaskContactUser? assignedEngineer;
List<TaskJobAssistantEmployees>? taskJobAssistantEmployees = []; List<TaskJobAssistantEmployees>? taskJobAssistantEmployees = [];
TaskJobAssistantEmployees? modelAssistantEmployees; TaskJobAssistantEmployees? modelAssistantEmployees;
@ -147,18 +146,18 @@ class TaskData {
}); });
} }
if (json['attachments'] != null) { if (json['attachments'] != null) {
taskJobAttachments = <GenericAttachmentModel>[]; taskJobAttachments = <TaskJobAttachment>[];
json['attachments'].forEach((v) { json['attachments'].forEach((v) {
taskJobAttachments!.add(GenericAttachmentModel.fromJson(v)); taskJobAttachments!.add(TaskJobAttachment.fromJson(v));
}); });
} }
taskType = json['taskType'] != null ? TaskTypeModel.fromJson(json['taskType']) : null; taskType = json['taskType'] != null ? TaskTypeModel.fromJson(json['taskType']) : null;
taskJobStatus = json['taskJobStatus'] != null ? TaskJobStatus.fromJson(json['taskJobStatus']) : null; taskJobStatus = json['taskJobStatus'] != null ? TaskJobStatus.fromJson(json['taskJobStatus']) : null;
callComment = json['callComment']; callComment = json['callComment'];
if (json['taskJobAttachments'] != null) { if (json['taskJobAttachments'] != null) {
taskJobAttachments = <GenericAttachmentModel>[]; taskJobAttachments = <TaskJobAttachment>[];
json['taskJobAttachments'].forEach((v) { json['taskJobAttachments'].forEach((v) {
taskJobAttachments!.add(GenericAttachmentModel.fromJson(v)); taskJobAttachments!.add(TaskJobAttachment.fromJson(v));
}); });
} }
assignedEngineer = json['assignedEngineer'] != null ? TaskContactUser.fromJson(json['assignedEngineer']) : null; assignedEngineer = json['assignedEngineer'] != null ? TaskContactUser.fromJson(json['assignedEngineer']) : null;
@ -284,7 +283,7 @@ class TaskData {
data['callComment'] = callComment; data['callComment'] = callComment;
if (taskJobAttachments != null) { if (taskJobAttachments != null) {
data['taskJobAttachments'] = taskJobAttachments!.map((e) => e.toTaskJson()).toList(); data['taskJobAttachments'] = taskJobAttachments!.map((e) => e.toJson()).toList();
} }
if (assignedEngineer != null) { if (assignedEngineer != null) {
@ -369,7 +368,7 @@ class TaskData {
data['taskJobActivityEngineerTimers'] = taskJobActivityEngineerTimers!.map((v) => v.toJson()).toList(); data['taskJobActivityEngineerTimers'] = taskJobActivityEngineerTimers!.map((v) => v.toJson()).toList();
} }
if (taskJobAttachments != null) { if (taskJobAttachments != null) {
data['attachments'] = taskJobAttachments!.map((v) => v.toTaskJson()).toList(); data['attachments'] = taskJobAttachments!.map((v) => v.toJson()).toList();
} }
data['installationBuildingId'] = building?.id; data['installationBuildingId'] = building?.id;
data['installationFloorId'] = floor?.id; data['installationFloorId'] = floor?.id;
@ -568,6 +567,26 @@ class TaskJobStatus {
}; };
} }
class TaskJobAttachment {
final int? id;
final String? name;
String? createdBy;
TaskJobAttachment({this.id, this.name, this.createdBy});
factory TaskJobAttachment.fromJson(Map<String, dynamic> json) => TaskJobAttachment(
id: json['id'],
name: json['name'],
createdBy: json['createdBy'],
);
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'createdBy': createdBy,
};
}
class TaskJobAssistantEmployees { class TaskJobAssistantEmployees {
DateTime? startDate; DateTime? startDate;
int? id; int? id;
@ -736,7 +755,7 @@ class AddTaskModel {
TaskEvaluatorUser? taskEvaluatorUser; TaskEvaluatorUser? taskEvaluatorUser;
String? alertNo; String? alertNo;
String? estimationDeliveryDate; String? estimationDeliveryDate;
List<GenericAttachmentModel>? attachments; List<TaskJobAttachment>? attachments;
String? reasonOfFSCA; String? reasonOfFSCA;
String? correctiveActionDescription; String? correctiveActionDescription;
@ -781,7 +800,7 @@ class AddTaskModel {
'reasonOfFSCA': reasonOfFSCA, 'reasonOfFSCA': reasonOfFSCA,
'correctiveActionDescription': correctiveActionDescription, 'correctiveActionDescription': correctiveActionDescription,
'evaluatorUserId': taskEvaluatorUser?.userId, 'evaluatorUserId': taskEvaluatorUser?.userId,
'attachments': attachments?.map((x) => x.toTaskJson()).toList(), 'attachments': attachments?.map((x) => x.toJson()).toList(),
}; };
} }

@ -1,6 +1,5 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -147,7 +146,7 @@ class WorkOrderData {
Lookup? problemDescription; Lookup? problemDescription;
String? comments; String? comments;
String? voiceNote; String? voiceNote;
List<GenericAttachmentModel> workOrderAttachments; List<WorkOrderAttachments> workOrderAttachments;
String? returnToService; String? returnToService;
Lookup? serviceType; Lookup? serviceType;
Lookup? failureReasone; Lookup? failureReasone;
@ -233,7 +232,7 @@ class WorkOrderData {
comments: json["comments"], comments: json["comments"],
voiceNote: json["voiceNote"], voiceNote: json["voiceNote"],
edd: json["edd"], edd: json["edd"],
workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e) => GenericAttachmentModel.fromWorkOrderJson(e)).toList(), workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e) => WorkOrderAttachments.fromJson(e)).toList(),
returnToService: json["returnToService"], returnToService: json["returnToService"],
serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]), serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]),
failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]), failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]),
@ -287,7 +286,7 @@ class WorkOrderData {
"edd": edd, "edd": edd,
'mrNo': mrNo, 'mrNo': mrNo,
'exchangeCost': exchangeCost, 'exchangeCost': exchangeCost,
"workOrderAttachments": workOrderAttachments.map((e) => e.toWorkOrderJson() ?? {}).toList(), "workOrderAttachments": workOrderAttachments.map((e) => e.toJson()).toList(),
"returnToService": returnToService, "returnToService": returnToService,
"serviceType": serviceType?.toJson(), "serviceType": serviceType?.toJson(),
"failureReasone": failureReasone?.toJson(), "failureReasone": failureReasone?.toJson(),
@ -504,7 +503,7 @@ class ActivitySparePart {
double? installQty; double? installQty;
double? returnQty; double? returnQty;
String? comment; String? comment;
List<GenericAttachmentModel>? acitiySparePartAttachments; List<SparePartAttachments>? acitiySparePartAttachments;
ActivitySparePart({this.id, this.partCatalogItem, this.quantity, this.installQty, this.returnQty, this.comment, this.acitiySparePartAttachments}); ActivitySparePart({this.id, this.partCatalogItem, this.quantity, this.installQty, this.returnQty, this.comment, this.acitiySparePartAttachments});
@ -516,9 +515,9 @@ class ActivitySparePart {
returnQty = json['returnQty']; returnQty = json['returnQty'];
comment = json['comment']; comment = json['comment'];
if (json['acitiySparePartAttachments'] != null) { if (json['acitiySparePartAttachments'] != null) {
acitiySparePartAttachments = <GenericAttachmentModel>[]; acitiySparePartAttachments = <SparePartAttachments>[];
json['acitiySparePartAttachments'].forEach((v) { json['acitiySparePartAttachments'].forEach((v) {
acitiySparePartAttachments!.add(GenericAttachmentModel.fromJson(v)); acitiySparePartAttachments!.add(SparePartAttachments.fromJson(v));
}); });
} }
} }
@ -534,7 +533,7 @@ class ActivitySparePart {
data['returnQty'] = returnQty; data['returnQty'] = returnQty;
data['comment'] = comment; data['comment'] = comment;
if (acitiySparePartAttachments != null) { if (acitiySparePartAttachments != null) {
data['acitiySparePartAttachments'] = acitiySparePartAttachments!.map((v) => v?.toJson() ?? {}).toList(); data['acitiySparePartAttachments'] = acitiySparePartAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }

@ -5,7 +5,6 @@ import 'package:flutter/widgets.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/supplier_details.dart';
@ -45,7 +44,7 @@ class PlanPreventiveVisit {
Lookup? safety; Lookup? safety;
String? engSignature; String? engSignature;
String? nurseSignature; String? nurseSignature;
List<GenericAttachmentModel>? preventiveVisitAttachments; List<PreventiveVisitAttachments>? preventiveVisitAttachments;
List<File>? attachments = []; List<File>? attachments = [];
List<PreventiveVisitCalibrations>? preventiveVisitCalibrations; List<PreventiveVisitCalibrations>? preventiveVisitCalibrations;
List<PreventiveVisitChecklists>? preventiveVisitChecklists; List<PreventiveVisitChecklists>? preventiveVisitChecklists;
@ -65,6 +64,7 @@ class PlanPreventiveVisit {
List<TimerModel>? timerModelList = []; List<TimerModel>? timerModelList = [];
TimerModel? ppMTimePicker; TimerModel? ppMTimePicker;
PlanPreventiveVisit( PlanPreventiveVisit(
{this.id, {this.id,
this.visitNo, this.visitNo,
@ -108,14 +108,14 @@ class PlanPreventiveVisit {
this.timerModelList, this.timerModelList,
this.ppMTimePicker, this.ppMTimePicker,
this.activities, this.activities,
this.labourCost, this.labourCost,
this.sparePartCost, this.sparePartCost,
this.travelCost, this.travelCost,
this.qAmount, this.qAmount,
this.prNo, this.prNo,
this.poNo, this.poNo,
this.mrNo, this.mrNo,
this.exchangeCost, this.exchangeCost,
this.preventiveVisitSuppliers}); this.preventiveVisitSuppliers});
PlanPreventiveVisit.fromJson(Map<String, dynamic> json) { PlanPreventiveVisit.fromJson(Map<String, dynamic> json) {
@ -152,18 +152,18 @@ class PlanPreventiveVisit {
safety = json['safety'] != null ? Lookup.fromJson(json['safety']) : null; safety = json['safety'] != null ? Lookup.fromJson(json['safety']) : null;
engSignature = json['engSignature']; engSignature = json['engSignature'];
nurseSignature = json['nurseSignature']; nurseSignature = json['nurseSignature'];
travelCost = json['travelCost']; travelCost= json['travelCost'];
sparePartCost = json['sparePartCost']; sparePartCost= json['sparePartCost'];
labourCost = json['laborCost']; labourCost =json['laborCost'];
qAmount = json['qAmount']; qAmount= json['qAmount'];
prNo = json['prNo']; prNo= json['prNo'];
poNo = json['poNo']; poNo= json['poNo'];
mrNo = json['mrNo']; mrNo= json['mrNo'];
exchangeCost = json['exchangeCost']; exchangeCost= json['exchangeCost'];
if (json['preventiveVisitAttachments'] != null) { if (json['preventiveVisitAttachments'] != null) {
preventiveVisitAttachments = <GenericAttachmentModel>[]; preventiveVisitAttachments = <PreventiveVisitAttachments>[];
json['preventiveVisitAttachments'].forEach((v) { json['preventiveVisitAttachments'].forEach((v) {
preventiveVisitAttachments!.add(GenericAttachmentModel.fromPreventiveVisitJson(v)); preventiveVisitAttachments!.add(PreventiveVisitAttachments.fromJson(v));
}); });
} }
if (json['preventiveVisitCalibrations'] != null) { if (json['preventiveVisitCalibrations'] != null) {
@ -220,7 +220,7 @@ class PlanPreventiveVisit {
data['nurseSignature'] = nurseSignature; data['nurseSignature'] = nurseSignature;
if (preventiveVisitAttachments != null) { if (preventiveVisitAttachments != null) {
data['preventiveVisitAttachments'] = preventiveVisitAttachments!.map((v) => v.toPreventiveVisitJson()).toList(); data['preventiveVisitAttachments'] = preventiveVisitAttachments!.map((v) => v.toJson()).toList();
} }
if (preventiveVisitCalibrations != null) { if (preventiveVisitCalibrations != null) {
data['preventiveVisitCalibrations'] = preventiveVisitCalibrations!.map((v) => v.toJson()).toList(); data['preventiveVisitCalibrations'] = preventiveVisitCalibrations!.map((v) => v.toJson()).toList();
@ -252,6 +252,10 @@ class PlanPreventiveVisit {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.actualDate}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.actualDate}");
return false; return false;
} }
// if (expectedDate == null) {
// await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.visitDate}");
// return false;
// }
if (tbsTimer?.startAt == null) { if (tbsTimer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required"); await Fluttertoast.showToast(msg: "Working Hours Required");
return false; return false;
@ -261,6 +265,11 @@ class PlanPreventiveVisit {
return false; return false;
} }
// if (externalEngineerTimer?.startAt != null && externalEngineerTimer?.endAt == null) {
// await Fluttertoast.showToast(msg: "Please Stop External Engineer Timer");
// return false;
// }
return true; return true;
} }
@ -321,6 +330,9 @@ class PreventiveVisitChecklists {
data['taskStatusId'] = taskStatus?.id; data['taskStatusId'] = taskStatus?.id;
data['taskComment'] = taskComment; data['taskComment'] = taskComment;
data['measuredValue'] = measuredValue; data['measuredValue'] = measuredValue;
// if (instructionText != null) {
// data['instructionText'] = instructionText!.toJson();
// }
return data; return data;
} }
} }
@ -369,6 +381,25 @@ class PreventiveVisitTimers {
} }
} }
class PreventiveVisitAttachments {
int? id;
String? attachmentName;
PreventiveVisitAttachments({this.id, this.attachmentName});
PreventiveVisitAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
attachmentName = json['attachmentName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['attachmentName'] = attachmentName;
return data;
}
}
class PreventiveVisitCalibrations { class PreventiveVisitCalibrations {
num? id; num? id;
Asset? asset; Asset? asset;
@ -386,6 +417,7 @@ class PreventiveVisitCalibrations {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
if (asset != null) { if (asset != null) {
// data['asset'] = asset!.toJson();
data['assetId'] = asset?.id; data['assetId'] = asset?.id;
} }
data['calibrationDateOfTesters'] = calibrationDateOfTesters; data['calibrationDateOfTesters'] = calibrationDateOfTesters;
@ -417,9 +449,11 @@ class PreventiveVisitSuppliers {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
if (supplier != null) { if (supplier != null) {
// data['supplier'] = supplier!.toJson();
data['supplierId'] = supplier?.id; data['supplierId'] = supplier?.id;
} }
if (suppPerson != null) { if (suppPerson != null) {
// data['suppPerson'] = suppPerson!.toJson();
data['suppPersonId'] = suppPerson?.id; data['suppPersonId'] = suppPerson?.id;
} }
data['startDateTime'] = startDateTime?.toIso8601String(); data['startDateTime'] = startDateTime?.toIso8601String();
@ -486,7 +520,7 @@ class PMSparePartActivityModel {
String? comment; String? comment;
dynamic price; dynamic price;
List<GenericAttachmentModel> activitySparePartPPMAttachments; List<SparePartAttachments> activitySparePartPPMAttachments;
PMSparePartActivityModel({ PMSparePartActivityModel({
this.id, this.id,
@ -497,7 +531,7 @@ class PMSparePartActivityModel {
this.returnQty, this.returnQty,
this.comment, this.comment,
this.price, this.price,
List<GenericAttachmentModel>? activitySparePartPPMAttachments, List<SparePartAttachments>? activitySparePartPPMAttachments,
}) : activitySparePartPPMAttachments = activitySparePartPPMAttachments ?? []; }) : activitySparePartPPMAttachments = activitySparePartPPMAttachments ?? [];
PMSparePartActivityModel.fromJson(Map<String, dynamic> json) : activitySparePartPPMAttachments = [] { PMSparePartActivityModel.fromJson(Map<String, dynamic> json) : activitySparePartPPMAttachments = [] {
@ -515,9 +549,13 @@ class PMSparePartActivityModel {
price = json['price']; price = json['price'];
// Handle typo in API response: "acitiySparePartPPMAttachments" instead of "activitySparePartPPMAttachments" // Handle typo in API response: "acitiySparePartPPMAttachments" instead of "activitySparePartPPMAttachments"
final attachmentsKey = json.containsKey('acitiySparePartPPMAttachments') ? 'acitiySparePartPPMAttachments' : 'activitySparePartPPMAttachments'; final attachmentsKey = json.containsKey('acitiySparePartPPMAttachments')
? 'acitiySparePartPPMAttachments'
activitySparePartPPMAttachments = json[attachmentsKey] == null ? [] : List.from(json[attachmentsKey]).map((e) => GenericAttachmentModel.fromJson(e)).toList(); : 'activitySparePartPPMAttachments';
activitySparePartPPMAttachments = json[attachmentsKey] == null
? []
: List.from(json[attachmentsKey]).map((e) => SparePartAttachments.fromJson(e)).toList();
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {

@ -5,7 +5,6 @@ import 'dart:typed_data';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/ppm/ppm_attachment.dart'; import 'package:test_sa/models/ppm/ppm_attachment.dart';
import 'package:test_sa/models/ppm/ppm_calibration_tools.dart'; import 'package:test_sa/models/ppm/ppm_calibration_tools.dart';
import 'package:test_sa/models/ppm/ppm_check_list.dart'; import 'package:test_sa/models/ppm/ppm_check_list.dart';
@ -174,7 +173,7 @@ class Ppm {
if (json['vAttachments'] != null) { if (json['vAttachments'] != null) {
files = []; files = [];
json['vAttachments'].forEach((v) { json['vAttachments'].forEach((v) {
files!.add(GenericAttachmentModel.fromPpmJson(v)); files!.add(PpmAttachments.fromJson(v));
}); });
} }
visitStatusId = json['visitStatusId']; visitStatusId = json['visitStatusId'];
@ -287,7 +286,7 @@ class Ppm {
List<PpmKits>? vKits; List<PpmKits>? vKits;
List<PpmContacts>? vContacts; List<PpmContacts>? vContacts;
List<PpmChecklists>? vChecklists; List<PpmChecklists>? vChecklists;
List<GenericAttachmentModel>? files; List<PpmAttachments>? files;
num? visitStatusId; num? visitStatusId;
List<VisitTimers>? visitTimers; List<VisitTimers>? visitTimers;
@ -381,7 +380,7 @@ class Ppm {
List<PpmKits>? vKits, List<PpmKits>? vKits,
List<PpmContacts>? vContacts, List<PpmContacts>? vContacts,
List<PpmChecklists>? vChecklists, List<PpmChecklists>? vChecklists,
List<GenericAttachmentModel>? files, List<PpmAttachments>? files,
num? visitStatusId, num? visitStatusId,
List<VisitTimers>? visitTimers, List<VisitTimers>? visitTimers,
String? startDate, String? startDate,
@ -575,7 +574,7 @@ class Ppm {
if (files?.isNotEmpty ?? false) { if (files?.isNotEmpty ?? false) {
map["vAttachments"] = files! map["vAttachments"] = files!
.map((file) => .map((file) =>
{"attachmentName": _isLocalUrl(file.name!) ? ("${file.name!.split("/").last}|${base64Encode(File(file.name!).readAsBytesSync())}") : file.name}) {"attachmentName": _isLocalUrl(file.attachmentName!) ? ("${file.attachmentName!.split("/").last}|${base64Encode(File(file.attachmentName!).readAsBytesSync())}") : file.attachmentName})
.toList(); .toList();
} }
map['visitStatusId'] = visitStatusId; map['visitStatusId'] = visitStatusId;

@ -1,42 +1,40 @@
//TODO need to delete this class PpmAttachments {
PpmAttachments({
this.id,
this.visitId,
this.attachmentName,
this.attachmentURL,
});
// class PpmAttachments { PpmAttachments.fromJson(dynamic json) {
// PpmAttachments({ id = json['id'];
// this.id, visitId = json['visitId'];
// this.visitId, attachmentName = json['attachmentName'] ?? json['attachmentURL']; // Handle potential null and prioritize'attachmentName'
// this.attachmentName, }
// this.attachmentURL,
// }); num? id; // Now nullable
// num? visitId; // Now nullable
// PpmAttachments.fromJson(dynamic json) { String? attachmentName; // Now nullable
// id = json['id']; String? attachmentURL; // Now nullable
// visitId = json['visitId'];
// attachmentName = json['attachmentName'] ?? json['attachmentURL']; // Handle potential null and prioritize'attachmentName' PpmAttachments copyWith({
// } num? id,
// num? visitId,
// num? id; // Now nullable String? attachmentName,
// num? visitId; // Now nullable String? attachmentURL,
// String? attachmentName; // Now nullable }) =>
// String? attachmentURL; // Now nullable PpmAttachments(
// id: id ?? this.id,
// PpmAttachments copyWith({ visitId: visitId ?? this.visitId,
// num? id, attachmentName: attachmentName ?? this.attachmentName,attachmentURL: attachmentURL ?? this.attachmentURL,
// num? visitId, );
// String? attachmentName,
// String? attachmentURL, Map<String, dynamic> toJson() {
// }) => final map = <String, dynamic>{};
// PpmAttachments( map['id'] = id;
// id: id ?? this.id, map['visitId'] = visitId;
// visitId: visitId ?? this.visitId, map['attachmentName'] = attachmentName;
// attachmentName: attachmentName ?? this.attachmentName,attachmentURL: attachmentURL ?? this.attachmentURL, map['attachmentURL'] = attachmentURL;
// ); return map;
// }
// Map<String, dynamic> toJson() { }
// final map = <String, dynamic>{};
// map['id'] = id;
// map['visitId'] = visitId;
// map['attachmentName'] = attachmentName;
// map['attachmentURL'] = attachmentURL;
// return map;
// }
// }

@ -1,7 +1,6 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
@ -11,6 +10,7 @@ import 'package:test_sa/models/service_request/wo_call_request.dart';
import 'package:test_sa/models/service_request/wo_parent.dart'; import 'package:test_sa/models/service_request/wo_parent.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import '../../attachment.dart';
import '../fault_description.dart'; import '../fault_description.dart';
import '../new_models/assigned_employee.dart'; import '../new_models/assigned_employee.dart';
import '../new_models/assistant_employee.dart'; import '../new_models/assistant_employee.dart';
@ -41,12 +41,12 @@ class SearchWorkOrder {
this.travelingHours, this.travelingHours,
this.travelingExpenses, this.travelingExpenses,
this.faultDescription, this.faultDescription,
this.sparePartsWorkOrders, this.sparePartsWorkOrders,
this.reviewComment, this.reviewComment,
this.comment, this.comment,
List<GenericAttachmentModel>? attachmentsWorkOrder, this.attachmentsWorkOrder,
this.equipmentStatus, this.equipmentStatus,
this.suppEngineerWorkOrders, this.suppEngineerWorkOrders,
this.engSignature, this.engSignature,
this.nurseSignature, this.nurseSignature,
this.woParentDto, this.woParentDto,
@ -106,7 +106,7 @@ class SearchWorkOrder {
if (json['attachmentsWorkOrder'] != null) { if (json['attachmentsWorkOrder'] != null) {
attachmentsWorkOrder = []; attachmentsWorkOrder = [];
json['attachmentsWorkOrder'].forEach((v) { json['attachmentsWorkOrder'].forEach((v) {
attachmentsWorkOrder!.add(GenericAttachmentModel.fromJson(v)); attachmentsWorkOrder!.add(Attachment.fromJson(v));
}); });
} }
equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null; equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null;
@ -155,8 +155,8 @@ class SearchWorkOrder {
sparePartsWorkOrders = (wo.sparePartsWorkOrders ?? sparePartsWorkOrders)?.map((e) => SparePartsWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? []; sparePartsWorkOrders = (wo.sparePartsWorkOrders ?? sparePartsWorkOrders)?.map((e) => SparePartsWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? [];
reviewComment = wo.reviewComment ?? reviewComment; reviewComment = wo.reviewComment ?? reviewComment;
comment = wo.comment ?? comment; comment = wo.comment ?? comment;
attachmentsWorkOrder = (wo.attachmentsWorkOrder ?? attachmentsWorkOrder)?.map((e) => GenericAttachmentModel.fromJson(e?.toJson() ?? {})).toList() ?? []; attachmentsWorkOrder = (wo.attachmentsWorkOrder ?? attachmentsWorkOrder)?.map((e) => Attachment.fromJson(e.toJson() ?? {})).toList() ?? [];
equipmentStatus = wo.equipmentStatus ?? equipmentStatus; equipmentStatus = Lookup.fromJson((wo.equipmentStatus ?? equipmentStatus)?.toJson() ?? {});
suppEngineerWorkOrders = (wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders)?.map((e) => SuppEngineerWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? []; suppEngineerWorkOrders = (wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders)?.map((e) => SuppEngineerWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? [];
engSignature = wo.engSignature ?? engSignature; engSignature = wo.engSignature ?? engSignature;
nurseSignature = wo.nurseSignature ?? nurseSignature; nurseSignature = wo.nurseSignature ?? nurseSignature;
@ -191,7 +191,7 @@ class SearchWorkOrder {
List<SparePartsWorkOrders>? sparePartsWorkOrders; List<SparePartsWorkOrders>? sparePartsWorkOrders;
String? reviewComment; String? reviewComment;
String? comment; String? comment;
List<GenericAttachmentModel>? attachmentsWorkOrder; List<Attachment>? attachmentsWorkOrder;
Lookup? equipmentStatus; Lookup? equipmentStatus;
List<SuppEngineerWorkOrders>? suppEngineerWorkOrders; List<SuppEngineerWorkOrders>? suppEngineerWorkOrders;
String? engSignature; String? engSignature;
@ -233,7 +233,7 @@ class SearchWorkOrder {
List<SparePartsWorkOrders>? sparePartsWorkOrders, List<SparePartsWorkOrders>? sparePartsWorkOrders,
String? reviewComment, String? reviewComment,
String? comment, String? comment,
List<GenericAttachmentModel>? attachmentsWorkOrder, List<Attachment>? attachmentsWorkOrder,
Lookup? equipmentStatus, Lookup? equipmentStatus,
List<SuppEngineerWorkOrders>? suppEngineerWorkOrders, List<SuppEngineerWorkOrders>? suppEngineerWorkOrders,
String? engSignature, String? engSignature,

@ -5,7 +5,6 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
@ -14,6 +13,7 @@ import 'package:test_sa/models/service_request/wo_call_request.dart';
import 'package:test_sa/models/service_request/wo_parent.dart'; import 'package:test_sa/models/service_request/wo_parent.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import '../../attachment.dart';
import '../device/asset.dart'; import '../device/asset.dart';
import '../fault_description.dart'; import '../fault_description.dart';
import '../new_models/assigned_employee.dart'; import '../new_models/assigned_employee.dart';
@ -118,7 +118,7 @@ class ServiceReport {
attachmentsWorkOrder = []; attachmentsWorkOrder = [];
json['attachmentsWorkOrder'].forEach((v) { json['attachmentsWorkOrder'].forEach((v) {
v["name"] = URLs.getFileUrl(v["name"]); v["name"] = URLs.getFileUrl(v["name"]);
attachmentsWorkOrder!.add(GenericAttachmentModel.fromJson(v)); attachmentsWorkOrder!.add(Attachment.fromJson(v));
}); });
} }
equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null; equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null;
@ -163,7 +163,7 @@ class ServiceReport {
List<SparePartsWorkOrders>? sparePartsWorkOrders; List<SparePartsWorkOrders>? sparePartsWorkOrders;
String? reviewComment; String? reviewComment;
String? comment; String? comment;
List<GenericAttachmentModel>? attachmentsWorkOrder; List<Attachment>? attachmentsWorkOrder;
Lookup? equipmentStatus; Lookup? equipmentStatus;
List<SuppEngineerWorkOrders>? suppEngineerWorkOrders; List<SuppEngineerWorkOrders>? suppEngineerWorkOrders;
String? engSignature; String? engSignature;
@ -204,7 +204,7 @@ class ServiceReport {
List<SparePartsWorkOrders>? sparePartsWorkOrders, List<SparePartsWorkOrders>? sparePartsWorkOrders,
String? reviewComment, String? reviewComment,
String? comment, String? comment,
List<GenericAttachmentModel>? attachmentsWorkOrder, List<Attachment>? attachmentsWorkOrder,
Lookup? equipmentStatus, Lookup? equipmentStatus,
List<SuppEngineerWorkOrders>? suppEngineerWorkOrders, List<SuppEngineerWorkOrders>? suppEngineerWorkOrders,
String? engSignature, String? engSignature,
@ -311,7 +311,7 @@ class ServiceReport {
map['reviewComment'] = reviewComment; map['reviewComment'] = reviewComment;
map['comment'] = comment; map['comment'] = comment;
if (attachmentsWorkOrder != null) { if (attachmentsWorkOrder != null) {
map['attachmentsWorkOrder'] = attachmentsWorkOrder!.where((v) => v?.name != null).map((v) => {"name": v!.name!.getFileName}).toList(); map['attachmentsWorkOrder'] = attachmentsWorkOrder!.map((v) => {"name": v.name!.getFileName}).toList();
} }
if (equipmentStatus != null) { if (equipmentStatus != null) {
map['equipmentStatus'] = equipmentStatus!.toJson(); map['equipmentStatus'] = equipmentStatus!.toJson();

@ -1,5 +1,4 @@
import 'package:test_sa/models/base.dart'; import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
class SupplierDetails extends Base { class SupplierDetails extends Base {
SupplierDetails({ SupplierDetails({
@ -61,7 +60,7 @@ class SupplierDetails extends Base {
if (json['attachments'] != null) { if (json['attachments'] != null) {
attachments = []; attachments = [];
json['attachments'].forEach((v) { json['attachments'].forEach((v) {
attachments!.add(GenericAttachmentModel.fromSupplierJson(v)); attachments!.add(Attachments.fromJson(v));
}); });
} }
if (json['suppPersons'] != null) { if (json['suppPersons'] != null) {
@ -94,7 +93,7 @@ class SupplierDetails extends Base {
List<Telephones>? telephones; List<Telephones>? telephones;
List<Faxes>? faxes; List<Faxes>? faxes;
List<Addresses>? addresses; List<Addresses>? addresses;
List<GenericAttachmentModel>? attachments; List<Attachments>? attachments;
List<SuppPersons>? suppPersons; List<SuppPersons>? suppPersons;
List<SuppTCodes>? suppTCodes; List<SuppTCodes>? suppTCodes;
@ -115,7 +114,7 @@ class SupplierDetails extends Base {
List<Telephones>? telephones, List<Telephones>? telephones,
List<Faxes>? faxes, List<Faxes>? faxes,
List<Addresses>? addresses, List<Addresses>? addresses,
List<GenericAttachmentModel>? attachments, List<Attachments>? attachments,
List<SuppPersons>? suppPersons, List<SuppPersons>? suppPersons,
List<SuppTCodes>? suppTCodes, List<SuppTCodes>? suppTCodes,
}) => }) =>
@ -166,7 +165,7 @@ class SupplierDetails extends Base {
map['addresses'] = addresses!.map((v) => v.toJson()).toList(); map['addresses'] = addresses!.map((v) => v.toJson()).toList();
} }
if (attachments != null) { if (attachments != null) {
map['attachments'] = attachments!.map((v) => v.toSupplierJson()).toList(); map['attachments'] = attachments!.map((v) => v.toJson()).toList();
} }
if (suppPersons != null) { if (suppPersons != null) {
map['suppPersons'] = suppPersons!.map((v) => v.toJson()).toList(); map['suppPersons'] = suppPersons!.map((v) => v.toJson()).toList();
@ -284,48 +283,48 @@ class SuppPersons extends Base {
} }
} }
// class Attachments { class Attachments {
// Attachments({ Attachments({
// this.id, this.id,
// this.supplierId, this.supplierId,
// this.attachmentName, this.attachmentName,
// this.attachmentURL, this.attachmentURL,
// }); });
//
// Attachments.fromJson(dynamic json) { Attachments.fromJson(dynamic json) {
// id = json['id']; id = json['id'];
// supplierId = json['supplierId']; supplierId = json['supplierId'];
// attachmentName = json['attachmentName']; attachmentName = json['attachmentName'];
// attachmentURL = json['attachmentURL']; attachmentURL = json['attachmentURL'];
// } }
//
// num? id; num? id;
// num? supplierId; num? supplierId;
// String? attachmentName; String? attachmentName;
// String? attachmentURL; String? attachmentURL;
//
// Attachments copyWith({ Attachments copyWith({
// num? id, num? id,
// num? supplierId, num? supplierId,
// String? attachmentName, String? attachmentName,
// String? attachmentURL, String? attachmentURL,
// }) => }) =>
// Attachments( Attachments(
// id: id ?? this.id, id: id ?? this.id,
// supplierId: supplierId ?? this.supplierId, supplierId: supplierId ?? this.supplierId,
// attachmentName: attachmentName ?? this.attachmentName, attachmentName: attachmentName ?? this.attachmentName,
// attachmentURL: attachmentURL ?? this.attachmentURL, attachmentURL: attachmentURL ?? this.attachmentURL,
// ); );
//
// Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
// final map = <String, dynamic>{}; final map = <String, dynamic>{};
// map['id'] = id; map['id'] = id;
// map['supplierId'] = supplierId; map['supplierId'] = supplierId;
// map['attachmentName'] = attachmentName; map['attachmentName'] = attachmentName;
// map['attachmentURL'] = attachmentURL; map['attachmentURL'] = attachmentURL;
// return map; return map;
// } }
// } }
class Addresses { class Addresses {
Addresses({ Addresses({

@ -100,8 +100,6 @@ class User {
return {"username": userName, "password": password, "fireBaseToken": FirebaseNotificationManger?.token ?? "", "notificationType": notificationType}; return {"username": userName, "password": password, "fireBaseToken": FirebaseNotificationManger?.token ?? "", "notificationType": notificationType};
} }
String get roleName => userRoles?.first.name ?? "";
UsersTypes? get type { UsersTypes? get type {
switch (userRoles?.first.value) { switch (userRoles?.first.value) {
case "R-6": case "R-6":

@ -35,7 +35,6 @@ class HelperFunction {
builder: (context) => AssetDeliveryAttachmentView( builder: (context) => AssetDeliveryAttachmentView(
tableItemId: deliveryTableItemId, tableItemId: deliveryTableItemId,
attachmentType: result!.value, attachmentType: result!.value,
documentType: Lookup(id: result.id, value: result.value, name: result.name),
// viewOnly: viewOnly, // viewOnly: viewOnly,
attachmentList: list, attachmentList: list,
))); )));

@ -9,9 +9,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/asset_delivery_module/provider/asset_delivery_provider.dart'; import 'package:test_sa/modules/asset_delivery_module/provider/asset_delivery_provider.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
@ -21,14 +19,11 @@ import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class AssetDeliveryAttachmentView extends StatefulWidget { class AssetDeliveryAttachmentView extends StatefulWidget {
final int? tableItemId; final int? tableItemId;
final int? attachmentType; final int? attachmentType;
final Lookup? documentType;
// bool viewOnly = false; // bool viewOnly = false;
final List<GenericAttachmentModel> attachmentList; final List<GenericAttachmentModel> attachmentList;
@ -37,7 +32,6 @@ class AssetDeliveryAttachmentView extends StatefulWidget {
required this.attachmentList, required this.attachmentList,
// this.viewOnly = false, // this.viewOnly = false,
this.attachmentType, this.attachmentType,
this.documentType,
this.tableItemId, this.tableItemId,
}); });
@ -79,21 +73,22 @@ class _AssetDeliveryAttachmentViewState extends State<AssetDeliveryAttachmentVie
Navigator.pop(context); Navigator.pop(context);
}, },
), ),
body: Column( body:
// widget.attachmentList.isEmpty
// ? const NoDataFound().center
// :
Column(
children: [ children: [
Flexible( Flexible(
fit: FlexFit.loose, // ✅ expands only as much as needed fit: FlexFit.loose,
child: Column( child: Column(
children: [ children: [
// widget.attachmentType == 5 && !widget.viewOnly // widget.attachmentType == 5 && !widget.viewOnly
widget.attachmentType == 5 //only add the attachment for current widget.attachmentType == 5 //only add the attachment for current
? AttachmentPicker( ? AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
showTypeDropdown: false,
attachment: _attachments, attachment: _attachments,
moduleId: RequestAttachmentTypeEnum.assetDelivery.id,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
documentType: widget.documentType,
onlyImages: false, onlyImages: false,
showAsListView: true, showAsListView: true,
buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10),
@ -105,19 +100,7 @@ class _AssetDeliveryAttachmentViewState extends State<AssetDeliveryAttachmentVie
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
) )
: _attachments.isNotEmpty : _attachments.isNotEmpty
? FilesList( ? FilesList(images: _attachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []).toShadowContainer(
showAsListView: true,
types: _attachments.map((doc) {
final attachmentType = doc.documentType?.name ?? '';
return attachmentType.isNotEmpty ? attachmentType : 'Asset Guide';
}).toList(),
images: _attachments
.map(
(e) => URLs.getFileUrl(e.name ?? '') ?? '',
)
.toList() ??
[])
.toShadowContainer(
context, context,
borderRadius: 20, borderRadius: 20,
padding: 12, padding: 12,
@ -143,13 +126,13 @@ class _AssetDeliveryAttachmentViewState extends State<AssetDeliveryAttachmentVie
} }
Future<void> _onSavePressed() async { Future<void> _onSavePressed() async {
final List<Map<String, dynamic>> attachmentPayload = _attachments.map((item) { final List<GenericAttachmentModel> attachmentPayload = _attachments.map((item) {
final String name = CMRequestUtils.isLocalUrl(item.name ?? '') ? '${item.name?.split("/").last}|${base64Encode(File(item.name!).readAsBytesSync())}' : item.name ?? ''; final String name = CMRequestUtils.isLocalUrl(item.name ?? '') ? '${item.name?.split("/").last}|${base64Encode(File(item.name!).readAsBytesSync())}' : item.name ?? '';
return GenericAttachmentModel( return GenericAttachmentModel(
id: item.id ?? 0, id: item.id ?? 0,
name: name, name: name,
documentType: widget.documentType, );
).toAssetDeliveryJson();
}).toList(); }).toList();
showDialog( showDialog(

@ -1,13 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/loading_list_notifier.dart';
///TODO need to remove this after verifying we need to use the same for all modules ..
class AttachmentTypeLookupProvider extends LoadingListNotifier<Lookup> { class AttachmentTypeLookupProvider extends LoadingListNotifier<Lookup> {
@override @override
Future getData({int? id}) async { Future getData({int? id}) async {
@ -34,41 +31,3 @@ class AttachmentTypeLookupProvider extends LoadingListNotifier<Lookup> {
} }
} }
} }
class AttachmentTypeLookupProviderLatest extends LoadingListNotifier<Lookup> {
@override
Future getData({int? id}) async {
if (loading == true) return -2;
loading = true;
notifyListeners();
int? lookupEnum = RequestAttachmentTypeEnumExtension.getLookupEnumIdFromId(id);
if (lookupEnum == null) {
log('Invalid request type id: $id');
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
try {
log('Request type id: $id, Lookup enum: $lookupEnum');
Response response = await ApiManager.instance.get(
'${URLs.getAttachmentTypesLookup}?lookupEnum=$lookupEnum',
useCache: true,
enableToastMessage: false,
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
List categoriesListJson = json.decode(response.body)["data"];
items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -1,7 +1,5 @@
import 'dart:developer'; import 'dart:developer';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/room_model.dart'; import 'package:test_sa/models/new_models/room_model.dart';
@ -108,7 +106,7 @@ class AssetInventoryModel {
Department? department; Department? department;
Rooms? room; Rooms? room;
SupplierDetails? supplier; SupplierDetails? supplier;
List<GenericAttachmentModel> assetInventoryDetailAssetAttachments = []; List<AssetInventoryDetailAssetAttachments> assetInventoryDetailAssetAttachments = [];
AssetInventoryModel({ AssetInventoryModel({
this.id, this.id,
@ -197,10 +195,10 @@ class AssetInventoryModel {
photo = json['photo']; photo = json['photo'];
photoOriginName = json['photoOriginName']; photoOriginName = json['photoOriginName'];
remarks = json['remarks']; remarks = json['remarks'];
if (json['assetInventoryDetailAssetAttachments'] != null) { if (json['assetTransferAttachments'] != null) {
assetInventoryDetailAssetAttachments = []; assetInventoryDetailAssetAttachments = [];
json['assetInventoryDetailAssetAttachments'].forEach((v) { json['assetInventoryDetailAssetAttachments'].forEach((v) {
assetInventoryDetailAssetAttachments.add(GenericAttachmentModel.fromAssetInventoryJson(v)); assetInventoryDetailAssetAttachments.add(AssetInventoryDetailAssetAttachments.fromJson(v));
}); });
} }
@ -242,7 +240,9 @@ class AssetInventoryModel {
'newSupplierName': newSupplierName, 'newSupplierName': newSupplierName,
'photo': photo, 'photo': photo,
'remarks': remarks, 'remarks': remarks,
'assetInventoryDetailAssetAttachments': assetInventoryDetailAssetAttachments.map((v) => v.toInventoryJson() ?? {}).toList(), 'assetInventoryDetailAssetAttachments': assetInventoryDetailAssetAttachments != null
? assetInventoryDetailAssetAttachments!.map((v) => v.toJson()).toList()
: [],
}; };
} }
@ -307,3 +307,39 @@ class AssetInventoryModel {
} }
class AssetInventoryDetailAssetAttachments {
AssetInventoryDetailAssetAttachments({
this.id,
this.name,
this.originalName,
});
AssetInventoryDetailAssetAttachments.fromJson(dynamic json) {
id = json['id'];
name = json['name'];
originalName = json['originalName'];
}
num? id;
String? name;
String? originalName;
AssetInventoryDetailAssetAttachments copyWith({
num? id, // Parameter is now nullable
String? name, // Parameter is now nullable
String? originalName, // Parameter is now nullable
}) =>
AssetInventoryDetailAssetAttachments(
id: id ?? this.id,
name: name??this.name,
originalName: originalName??this.originalName,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['name'] = name;
map['originalName'] = originalName;
return map;
}
}

@ -43,9 +43,11 @@ class SessionModel {
statusName = json['statusName']; statusName = json['statusName'];
startDate = json['startDate']; startDate = json['startDate'];
endDate = json['endDate']; endDate = json['endDate'];
if (json['assetInventorySites'] != null) { if (json['assetInventorySites'] != null) {
assetInventorySites = (json['assetInventorySites'] as List).map((e) => Site.fromJson(e)).toList(); assetInventorySites = (json['assetInventorySites'] as List).map((e) => Site.fromJson(e)).toList();
} }
if (json['assetInventoryAssignedEmployee'] != null) { if (json['assetInventoryAssignedEmployee'] != null) {
assetInventoryAssignedEmployee = (json['assetInventoryAssignedEmployee'] as List).map((e) => AssetInventoryAssignedEmployee.fromJson(e)).toList(); assetInventoryAssignedEmployee = (json['assetInventoryAssignedEmployee'] as List).map((e) => AssetInventoryAssignedEmployee.fromJson(e)).toList();
} }

@ -11,7 +11,6 @@ import 'package:test_sa/modules/asset_inventory_module/models/asset_inventory_mo
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart';
///TODO We are not showing attachment here we need to check this with backend team and flow .
class AssetDetailCardView extends StatelessWidget { class AssetDetailCardView extends StatelessWidget {
AssetInventoryModel assetInventoryModel; AssetInventoryModel assetInventoryModel;
VoidCallback onDeletePress; VoidCallback onDeletePress;

@ -11,7 +11,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/asset_inventory_module/models/asset_inventory_model.dart'; import 'package:test_sa/modules/asset_inventory_module/models/asset_inventory_model.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/search_asset_view.dart'; import 'package:test_sa/modules/asset_inventory_module/pages/search_asset_view.dart';
@ -24,7 +23,6 @@ import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker_item.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker_item.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import '../../../new_views/common_widgets/app_filled_button.dart'; import '../../../new_views/common_widgets/app_filled_button.dart';
import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../../new_views/common_widgets/default_app_bar.dart';
@ -296,12 +294,14 @@ class _AssetInventoryFormViewState extends State<AssetInventoryFormView> {
classificationWidget(label: _scannedAssetModel?.status), classificationWidget(label: _scannedAssetModel?.status),
], ],
12.height, 12.height,
Text(
'Attachments'.addTranslation,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.white936),
),
12.height,
AttachmentPicker( AttachmentPicker(
moduleId: RequestAttachmentTypeEnum.assetInventory.id,
label: context.translation.attachFiles, label: context.translation.attachFiles,
attachment: attachments, attachment: attachments,
showAsListView: true,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -406,7 +406,7 @@ class _AssetInventoryFormViewState extends State<AssetInventoryFormView> {
// try { // try {
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_scannedAssetModel?.assetInventoryDetailAssetAttachments.add(GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType)); _scannedAssetModel?.assetInventoryDetailAssetAttachments.add(AssetInventoryDetailAssetAttachments(id: item.id, name: fileName));
} }
// // } catch (error) { // // } catch (error) {
// // print(error); // // print(error);

@ -300,7 +300,6 @@ class OneTimeTaskPreviewScreen extends StatelessWidget {
InfoHeader16Widget( InfoHeader16Widget(
'Attachments', 'Attachments',
), ),
4.height,
FilesList( FilesList(
images: taskData.attachments!.map((attachment) => URLs.getFileUrl(attachment.name ?? '') ?? '').toList(), images: taskData.attachments!.map((attachment) => URLs.getFileUrl(attachment.name ?? '') ?? '').toList(),
showAsListView: true, showAsListView: true,

@ -260,15 +260,15 @@ class CMDetailProvider extends ChangeNotifier {
} }
//upload workorder attachment by engineer.. //upload workorder attachment by engineer..
Future addWorkOrderAttachment({required int woId, required List<GenericAttachmentModel> attachments, required List<GenericAttachmentModel> otherAttachment}) async { Future addWorkOrderAttachment({required int woId, required List<GenericAttachmentModel> attachments, required List<WorkOrderAttachments> otherAttachment}) async {
try { try {
List<GenericAttachmentModel> woAttachments = []; List<WorkOrderAttachments> woAttachments = [];
if (otherAttachment.isNotEmpty) { if (otherAttachment.isNotEmpty) {
woAttachments.addAll(otherAttachment); woAttachments.addAll(otherAttachment);
} }
for (var file in attachments) { for (var file in attachments) {
String fileName = CMRequestUtils.isLocalUrl(file.name ?? '') ? ("${file.name ?? ''.split("/").last}|${base64Encode(File(file.name ?? '').readAsBytesSync())}") : file.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(file.name ?? '') ? ("${file.name ?? ''.split("/").last}|${base64Encode(File(file.name ?? '').readAsBytesSync())}") : file.name ?? '';
woAttachments.add(GenericAttachmentModel(id: file.id, name: fileName, createdBy: file.createdBy, documentType: file.documentType)); woAttachments.add(WorkOrderAttachments(id: file.id, name: fileName, createdBy: file.createdBy));
} }
isLoading = true; isLoading = true;

@ -12,7 +12,6 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
@ -158,8 +157,6 @@ class _CreateCMRequestState extends State<CreateCMRequest> with TickerProviderSt
24.height, 24.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
moduleId: RequestAttachmentTypeEnum.correctiveMaintenance.id,
showAsListView: true,
attachment: _deviceImages, attachment: _deviceImages,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -353,10 +350,10 @@ class _CreateCMRequestState extends State<CreateCMRequest> with TickerProviderSt
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
} }
} }
List<GenericAttachmentModel> attachement = []; List<WorkOrderAttachments> attachement = [];
for (var item in _deviceImages) { for (var item in _deviceImages) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
attachement.add(GenericAttachmentModel(id: 0, name: fileName, documentType: item.documentType)); attachement.add(WorkOrderAttachments(id: 0, name: fileName));
} }
_requestDetailProvider.workOrderHelperModel = WorkOrderHelperModel( _requestDetailProvider.workOrderHelperModel = WorkOrderHelperModel(
assetId: _serviceRequest.device?.id, assetId: _serviceRequest.device?.id,

@ -4,11 +4,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart'; import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
@ -174,20 +172,7 @@ class _ActivitiesListViewState extends State<ActivitiesListView> {
if (activity.activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[ if (activity.activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[
2.height, 2.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), FilesList(images: activity.activitySparePart!.acitiySparePartAttachments!.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
4.height,
FilesList(
showAsListView: true,
types: activity.activitySparePart!.acitiySparePartAttachments!
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: activity.activitySparePart!.acitiySparePartAttachments!
.whereType<GenericAttachmentModel>()
.where((e) => e.name != null)
.map((toElement) => URLs.getFileUrl(toElement.name!)!)
.toList()),
], ],
], ],
).toShadowContainer(context, showShadow: false).onPress(() { ).toShadowContainer(context, showShadow: false).onPress(() {
@ -231,6 +216,7 @@ class _ActivitiesListViewState extends State<ActivitiesListView> {
), ),
], ],
), ),
if (showActionButtons) if (showActionButtons)
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -1,5 +1,3 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
@ -10,7 +8,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
@ -44,7 +41,7 @@ class ServiceRequestDetailView extends StatefulWidget {
class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> { class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
List<GenericAttachmentModel> _userAttachments = []; List<GenericAttachmentModel> _userAttachments = [];
List<GenericAttachmentModel> _attachments = []; List<WorkOrderAttachments> _attachments = [];
@override @override
void initState() { void initState() {
@ -56,15 +53,13 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<CMDetailProvider>(builder: (pContext, requestProvider, _) { return Consumer<CMDetailProvider>(builder: (pContext, requestProvider, _) {
if (userProvider.user?.type == UsersTypes.engineer) { if (userProvider.user?.type == UsersTypes.engineer) {
_userAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments // _userAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => File(e.name ?? '')).toList() ?? [];
.whereType<GenericAttachmentModel>() _userAttachments =
.where((e) => e.createdBy == userProvider.user?.userID) requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == userProvider.user?.userID).map((e) => GenericAttachmentModel.fromJson(e.toJson())).toList() ?? [];
.map((e) => GenericAttachmentModel(id: e.id, name: e.name, createdBy: e.createdBy, documentType: e.documentType)) _attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy != userProvider.user?.userID).toList() ?? [];
.toList() ??
[];
_attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.whereType<GenericAttachmentModel>().where((e) => e.createdBy != userProvider.user?.userID).toList() ?? [];
} else { } else {
_attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.whereType<GenericAttachmentModel>().where((e) => e.createdBy == userProvider.user?.userID).toList() ?? []; //show only nurse attachments
_attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == userProvider.user?.userID).toList() ?? [];
} }
bool showInitialVisitCard = requestProvider.currentWorkOrder?.data?.needAVisitDateTime != null && bool showInitialVisitCard = requestProvider.currentWorkOrder?.data?.needAVisitDateTime != null &&
@ -266,50 +261,26 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
if (_attachments.isNotEmpty) ...[ if (_attachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!) ?? '').toList()),
FilesList(
showAsListView: true,
images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!) ?? '').toList(),
types: _attachments
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
),
], ],
if (!requestProvider.isReadOnlyRequest && workOrder.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[ if (!requestProvider.isReadOnlyRequest && workOrder.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
showAsListView: true,
attachment: _userAttachments, attachment: _userAttachments,
moduleId: RequestAttachmentTypeEnum.correctiveMaintenance.id,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
// showAsGrid: true,
buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10),
onChange: (attachment) { onChange: (attachment) {
requestProvider.addWorkOrderAttachment( requestProvider.addWorkOrderAttachment(woId: workOrder.requestId!, attachments: attachment, otherAttachment: _attachments);
woId: workOrder.requestId!,
attachments: attachment,
otherAttachment: _attachments,
);
}, },
), ),
], ],
] else ...[ ] else ...[
if (_attachments.isNotEmpty) ...[ if (_attachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), FilesList(images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
4.height,
FilesList(
images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList(),
showAsListView: true,
types: _attachments
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
),
], ],
//handle nurse case.. //handle nurse case..
], ],

@ -7,7 +7,6 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart'; import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -107,11 +106,9 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
attachment: _attachments, attachment: _attachments,
moduleId: RequestAttachmentTypeEnum.assetDelivery.id,
showAsListView: true,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
// buttonColor: AppColor.black10, buttonColor: AppColor.black10,
), ),
], ],
).paddingOnly(start: 13, end: 13, top: 14, bottom: 16), ).paddingOnly(start: 13, end: 13, top: 14, bottom: 16),
@ -128,8 +125,7 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
for (var item in _attachments) { for (var item in _attachments) {
String fileName = String fileName =
CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments?.add(ActivityAssetToBeRetiredAttachments(id: item.id, name: fileName));
?.add(GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType));
} }
int status = await requestDetailProvider.createActivityAssetToBeRetired(); int status = await requestDetailProvider.createActivityAssetToBeRetired();
if (status == 200) { if (status == 200) {

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -309,8 +308,6 @@ class _SparePartRequestState extends State<SparePartRequest> {
), ),
AttachmentPicker( AttachmentPicker(
label: context.translation.attachQuotation, label: context.translation.attachQuotation,
showAsListView: true,
moduleId: widget.fromCm?RequestAttachmentTypeEnum.sparePartActivity.id:RequestAttachmentTypeEnum.ppmSparePartActivity.id,
attachment: _attachments, attachment: _attachments,
buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10),
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
@ -346,8 +343,7 @@ class _SparePartRequestState extends State<SparePartRequest> {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
model?.sparePartAttachments?.add( model?.sparePartAttachments?.add(
GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType), SparePartAttachments(id: item.id, name: fileName),
// SparePartAttachments(id: item.id, name: fileName),
); );
} }

@ -13,7 +13,6 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -26,6 +25,7 @@ import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart'; import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
@ -495,37 +495,36 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
List<Widget> attachmentSection() { List<Widget> attachmentSection() {
return [ return [
InfoHeader16Widget('Attachments'.addTranslation), InfoHeader16Widget('Attachments'.addTranslation),
// SingleItemDropDownMenu<Lookup, DemoDocumentLookupProvider>( SingleItemDropDownMenu<Lookup, DemoDocumentLookupProvider>(
// context: context, context: context,
// height: 56.toScreenHeight, height: 56.toScreenHeight,
// title: "Document Type", title: "Document Type",
// initialValue: demoDocumentLookup, initialValue: demoDocumentLookup,
// showShadow: false, showShadow: false,
// validator: (value) { validator: (value) {
// if (value == null) return "Mandatory"; if (value == null) return "Mandatory";
// return null; return null;
// }, },
// backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
// showAsBottomSheet: true, showAsBottomSheet: true,
// onSelect: (value) { onSelect: (value) {
// demoDocumentLookup = value; demoDocumentLookup = value;
// setState(() {}); setState(() {});
// }, },
// ), ),
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
attachment: _attachments, attachment: _attachments,
buttonColor: AppColor.primary10.withOpacity(demoDocumentLookup != null ? 1 : .4), buttonColor: AppColor.primary10.withOpacity(demoDocumentLookup != null ? 1 : .4),
onlyImages: false, onlyImages: false,
// enabled: demoDocumentLookup != null, enabled: demoDocumentLookup != null,
// documentType: demoDocumentLookup, documentType: demoDocumentLookup,
showAsListView: true, showAsListView: true,
moduleId: RequestAttachmentTypeEnum.demo.id, buttonIcon: 'image-plus'.toSvgAsset(color: (AppColor.primary10).withOpacity(demoDocumentLookup != null ? 1 : .4)),
buttonIcon: 'image-plus'.toSvgAsset(color: (AppColor.primary10)), onChange: (attachments) {
// onChange: (attachments) { _attachments = attachments;
// _attachments = attachments; setState(() {});
// setState(() {}); },
// },
), ),
]; ];
} }
@ -538,12 +537,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
_demoFormModel.demoAttachment = []; _demoFormModel.demoAttachment = [];
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_demoFormModel.demoAttachment?.add(GenericAttachmentModel( _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0, documentTypeId: item.documentTypeId!.id!));
id: 0,
name: fileName,
moduleReferenceId: 0,
documentType: item.documentType,
));
} }
Utils.showLoading(context); Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

@ -3,9 +3,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import '../../controllers/api_routes/urls.dart'; import '../../controllers/api_routes/urls.dart';
import '../../extensions/text_extensions.dart'; import '../../extensions/text_extensions.dart';
@ -55,19 +53,14 @@ class DemoActivitiesPage extends StatelessWidget {
12.height, 12.height,
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), Text(
4.height, "Attachments".addTranslation,
FilesList( style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
showAsListView: true, ),
types: allAttachments FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e ?? '') ?? '').toList() ?? []),
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: allAttachments.map((e) => URLs.getFileUrl(e ?? '') ?? '').toList()),
], ],
], ],
).toShadowContainer(context, borderRadius: 14, backgroundColor: const Color(0xffF4F8FC), showShadow: false), ).toShadowContainer(context, borderRadius: 14, backgroundColor: Color(0xffF4F8FC), showShadow: false),
16.height, 16.height,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -6,7 +6,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/demo_request_step.dart'; import 'package:test_sa/models/enums/demo_request_step.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/module_permissions_model.dart'; import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
@ -92,8 +91,8 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center; if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center;
if (snapshot.data == null) return const NoDataFound().center; if (snapshot.data == null) return const NoDataFound().center;
List<GenericAttachmentModel> allAttachments = snapshot.data!.demoAttachments! ?? []; List<DemoAttachments> allAttachments = snapshot.data!.demoAttachments! ?? [];
List<GenericAttachmentModel> suppAttachments = snapshot.data!.supplierDemoAttachments! ?? []; List<DemoAttachments> suppAttachments = snapshot.data!.supplierDemoAttachments! ?? [];
DemoRequestModel demoData = snapshot.data!; DemoRequestModel demoData = snapshot.data!;
@ -126,20 +125,18 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments"), InfoHeader16Widget("Attachments"),
4.height,
FilesList( FilesList(
showAsListView: true, showAsListView: true,
images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList(), images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(),
types: allAttachments.map((e) => e.documentType?.name ?? '').toList()), types: allAttachments.map((e) => e.documentType?.name ?? '').toList()),
], ],
if (suppAttachments.isNotEmpty) ...[ if (suppAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Supplier Attachments"), InfoHeader16Widget("Supplier Attachments"),
4.height,
FilesList( FilesList(
showAsListView: true, showAsListView: true,
images: suppAttachments.whereType<GenericAttachmentModel>().map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList(), images: suppAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(),
types: suppAttachments.whereType<GenericAttachmentModel>().map((e) => e.documentType?.name ?? '').toList()), types: suppAttachments.map((e) => e.documentType?.name ?? '').toList()),
], ],
], ],
).toShadowContainer(context, padding: 12), ).toShadowContainer(context, padding: 12),

@ -6,7 +6,7 @@ import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/api_routes/api_manager.dart'; import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart'; import '../../controllers/api_routes/urls.dart';
import '../../models/lookup.dart'; import '../../models/lookup.dart';
///TODO need to remove this when we have real api for demo document types lookup
class DemoDocumentLookupProvider extends LoadingListNotifier<Lookup> { class DemoDocumentLookupProvider extends LoadingListNotifier<Lookup> {
@override @override
Future getData({int? id}) async { Future getData({int? id}) async {
@ -36,4 +36,3 @@ class DemoDocumentLookupProvider extends LoadingListNotifier<Lookup> {
} }
} }
} }

@ -1,33 +1,31 @@
//TODO : need to remove this class import 'package:test_sa/models/lookup.dart';
// import 'package:test_sa/models/lookup.dart'; class DemoAttachments {
// int? id;
// class DemoAttachments { num? demoRequestId;
// int? id; num? documentTypeId;
// num? demoRequestId; Lookup? documentType;
// Lookup? documentType; String? attachmentName;
// String? attachmentName; String? originalName;
// String? originalName;
// DemoAttachments({this.id, this.documentTypeId, this.documentType, this.attachmentName, this.demoRequestId, this.originalName});
// DemoAttachments({this.id, this.documentType, this.attachmentName, this.demoRequestId, this.originalName});
// DemoAttachments.fromJson(dynamic json) {
// DemoAttachments.fromJson(dynamic json) { id = json['id'];
// id = json['id']; documentTypeId = json['documentTypeId'];
// documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null; documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
// demoRequestId = json['demoRequestId']; demoRequestId = json['demoRequestId'];
// attachmentName = json['attachmentName']; attachmentName = json['attachmentName'];
// originalName = json['originalName']; originalName = json['originalName'];
// } }
//
// Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
// final map = <String, dynamic>{}; final map = <String, dynamic>{};
// map['id'] = id; map['id'] = id;
// if(documentType!=null){ map['documentTypeId'] = documentTypeId;
// map['documentTypeId'] = documentType?.id; map['attachmentName'] = attachmentName;
// } map['demoRequestId'] = demoRequestId;
// map['attachmentName'] = attachmentName; map['originalName'] = originalName;
// map['demoRequestId'] = demoRequestId; return map;
// map['originalName'] = originalName; }
// return map; }
// }
// }

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
@ -33,7 +32,7 @@ class DemoFormModel {
Rooms? room; Rooms? room;
SuppEngineerWorkOrders? supEngineer; SuppEngineerWorkOrders? supEngineer;
SupplierDetails? vendor; SupplierDetails? vendor;
List<GenericAttachmentModel>? demoAttachment; List<DemoAttachments>? demoAttachment;
bool demoEaluationAcknowledge; bool demoEaluationAcknowledge;
bool acknowledgeNotEquipment; bool acknowledgeNotEquipment;
@ -88,7 +87,34 @@ class DemoFormModel {
"demoEaluationAcknowledge": demoEaluationAcknowledge, "demoEaluationAcknowledge": demoEaluationAcknowledge,
"acknowledgeNotEquipment": acknowledgeNotEquipment, "acknowledgeNotEquipment": acknowledgeNotEquipment,
"demoAttachments": "demoAttachments":
demoAttachment != null ? demoAttachment!.map((v) => v.toDemoJson()).toList() : [], // [
// {
// "id": 3,
// // "documentType": {
// // "id": 7748,
// // "name": "February",
// // "value": 2
// // },
// "documentTypeId": 7748,
// "attachmentName": "6c9f50b0-1c92-4ae9-ae64-7c284c61ea72.jpg",
// "originalName": "scaled_d245df97-1289-4d0c-92a0-569abedfb0db8154518103327960943.jpg",
// "demoRequestId": 3
// },
// {
// "id": 4,
// // "documentType": {
// // "id": 7748,
// // "name": "February",
// // "value": 2
// // },
// "documentTypeId": 7748,
// "attachmentName": "346e04f6-0f9b-4004-ad85-4cdbf8318f7c.jpg",
// "originalName": "scaled_85790b6c-7b16-46e6-891c-11c316d5897a2973693360957767376.jpg",
// "demoRequestId": 3
// }
// ]
demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
}; };
} }
@ -97,7 +123,7 @@ class DemoFormModel {
"id": id, "id": id,
"supplierId": vendor?.id, "supplierId": vendor?.id,
"suppPersonId": supEngineer?.id, "suppPersonId": supEngineer?.id,
"demoAttachments": demoAttachment != null ? demoAttachment!.whereType<GenericAttachmentModel>().map((v) => v.toDemoJson()).toList() : [], "demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
}; };
} }
} }

@ -1,8 +1,8 @@
import 'package:test_sa/models/device/asset_by_id_model.dart'; import 'package:test_sa/models/device/asset_by_id_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
class DemoRequestModel { class DemoRequestModel {
@ -29,8 +29,8 @@ class DemoRequestModel {
SuppEngineerWorkOrders? suppPerson; SuppEngineerWorkOrders? suppPerson;
Lookup? status; Lookup? status;
Lookup? endUserStatus; Lookup? endUserStatus;
List<GenericAttachmentModel>? demoAttachments; List<DemoAttachments>? demoAttachments;
List<GenericAttachmentModel>? supplierDemoAttachments; List<DemoAttachments>? supplierDemoAttachments;
dynamic demoAsset; dynamic demoAsset;
dynamic demoInstallationTaskJob; dynamic demoInstallationTaskJob;
dynamic demoPullOutTaskJob; dynamic demoPullOutTaskJob;
@ -96,8 +96,8 @@ class DemoRequestModel {
suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null; suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null;
status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null; status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null;
endUserStatus = json['endUserStatus'] != null ? (Lookup.fromJson(json['endUserStatus'])) : null; endUserStatus = json['endUserStatus'] != null ? (Lookup.fromJson(json['endUserStatus'])) : null;
demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => GenericAttachmentModel.fromDemoJson(e)).toList() : null; demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null;
supplierDemoAttachments = json['supplierDemoAttachments'] != null ? (json['supplierDemoAttachments'] as List).map((e) => GenericAttachmentModel.fromDemoJson(e)).toList() : null; supplierDemoAttachments = json['supplierDemoAttachments'] != null ? (json['supplierDemoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null;
demoAsset = json['demoAsset']; demoAsset = json['demoAsset'];
demoInstallationTaskJob = json['demoInstallationTaskJob']; demoInstallationTaskJob = json['demoInstallationTaskJob'];
demoPullOutTaskJob = json['demoPullOutTaskJob']; demoPullOutTaskJob = json['demoPullOutTaskJob'];
@ -124,8 +124,8 @@ class DemoRequestModel {
"demoPeriodId": demoPeriod?.id, "demoPeriodId": demoPeriod?.id,
"supplierId": supplier?.id, "supplierId": supplier?.id,
"suppPersonId": suppPerson?.id, "suppPersonId": suppPerson?.id,
"demoAttachments": demoAttachments != null ? demoAttachments!.whereType<GenericAttachmentModel>().map((v) => v.toDemoJson()).toList() : [], "demoAttachments": demoAttachments != null ? demoAttachments!.map((v) => v.toJson()).toList() : [],
"supplierDemoAttachments": supplierDemoAttachments != null ? supplierDemoAttachments!.whereType<GenericAttachmentModel>().map((v) => v.toDemoJson()).toList() : [], "supplierDemoAttachments": supplierDemoAttachments != null ? supplierDemoAttachments!.map((v) => v.toJson()).toList() : [],
}; };
} }
} }

@ -11,7 +11,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
@ -21,6 +20,7 @@ import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart'; import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
@ -161,9 +161,9 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
attachments.clear(); attachments.clear();
if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) { if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) {
for (final item in widget.dataModel.demoAttachments!) { for (final item in widget.dataModel.demoAttachments!) {
if ((item.name ?? '').isNotEmpty) { if ((item.attachmentName ?? '').isNotEmpty) {
attachments.add( attachments.add(
GenericAttachmentModel(name: item.name, id: item.id ?? 0, originalName: item.originalName, documentType: item.documentType), GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName, documentTypeId: item.documentType),
); );
} }
} }
@ -201,34 +201,33 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
16.height, 16.height,
"Attachments".bodyText(context).custom(color: AppColor.black10), "Attachments".bodyText(context).custom(color: AppColor.black10),
8.height, 8.height,
SingleItemDropDownMenu<Lookup, DemoDocumentLookupProvider>(
///Need to confirm we can use same lookup.. context: context,
// SingleItemDropDownMenu<Lookup, DemoDocumentLookupProvider>( height: 56.toScreenHeight,
// context: context, title: "Document Type",
// height: 56.toScreenHeight, initialValue: demoDocumentLookup,
// title: "Document Type", showShadow: false,
// initialValue: demoDocumentLookup, validator: (value) {
// showShadow: false, if (value == null) return "Mandatory";
// validator: (value) { return null;
// if (value == null) return "Mandatory"; },
// return null; backgroundColor: AppColor.fieldBgColor(context),
// }, showAsBottomSheet: true,
// backgroundColor: AppColor.fieldBgColor(context), onSelect: (value) {
// showAsBottomSheet: true, demoDocumentLookup = value;
// onSelect: (value) { setState(() {});
// demoDocumentLookup = value; },
// setState(() {}); ),
// }, 16.height,
// ),
// 16.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
attachment: attachments, attachment: attachments,
buttonColor: AppColor.black10.withOpacity(demoDocumentLookup != null ? 1 : .4), buttonColor: AppColor.black10.withOpacity(demoDocumentLookup != null ? 1 : .4),
onlyImages: false, onlyImages: false,
moduleId: RequestAttachmentTypeEnum.demo.id, documentType: demoDocumentLookup,
enabled: demoDocumentLookup != null,
showAsListView: true, showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: (AppColor.primary10).withOpacity(demoDocumentLookup != null ? 1 : .4)),
), ),
], ],
).toShadowContainer(context, borderRadius: 20), ).toShadowContainer(context, borderRadius: 20),
@ -616,13 +615,7 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
//Todo need to pass attachmentType id as well. //Todo need to pass attachmentType id as well.
_demoFormModel.demoAttachment?.add(GenericAttachmentModel( _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName,originalName: fileName, documentTypeId: item.documentTypeId!.id));
id: item.id,
name: fileName,
originalName: fileName,
moduleReferenceId: _demoFormModel.id ?? 0,
documentType: item.documentType,
));
} }
Utils.showLoading(context); Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

@ -11,7 +11,6 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
@ -42,6 +41,7 @@ import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../models/new_models/department.dart'; import '../../models/new_models/department.dart';
import '../../new_views/swipe_module/dialoge/info_dialog.dart'; import '../../new_views/swipe_module/dialoge/info_dialog.dart';
import 'flow_medical_department_provider.dart'; import 'flow_medical_department_provider.dart';
import 'incident_attachment_model.dart';
class CreateIncidentRequestPage extends StatefulWidget { class CreateIncidentRequestPage extends StatefulWidget {
static const String id = "/create-incident"; static const String id = "/create-incident";
@ -172,7 +172,6 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
label: context.translation.attachments, label: context.translation.attachments,
attachment: attachments, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
moduleId: RequestAttachmentTypeEnum.incidents.id,
onlyImages: false, onlyImages: false,
showAsListView: true, showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -695,16 +694,16 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
payload["occurrenceDate"] = occurrenceDate!.toIso8601String(); payload["occurrenceDate"] = occurrenceDate!.toIso8601String();
_formKey.currentState!.save(); _formKey.currentState!.save();
List<GenericAttachmentModel> attachmentList = []; List<IncidentAttachments> attachmentList = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
attachmentList.add(GenericAttachmentModel(id: 0, name: fileName, moduleReferenceId: 0,documentType: item.documentType)); attachmentList.add(IncidentAttachments(id: 0, attachmentName: fileName, incidentId: 0));
} }
Utils.showLoading(context); Utils.showLoading(context);
IncidentProvider incidentProvider = Provider.of<IncidentProvider>(context, listen: false); IncidentProvider incidentProvider = Provider.of<IncidentProvider>(context, listen: false);
payload["incidentAttachments"] = attachmentList.map((v) => v.toIncidentJson()).toList(); payload["incidentAttachments"] = attachmentList.map((v) => v.toJson()).toList();
bool isSuccess = await incidentProvider.addIncidentRequest(payload); bool isSuccess = await incidentProvider.addIncidentRequest(payload);
Utils.hideLoading(context); Utils.hideLoading(context);
if (isSuccess) { if (isSuccess) {

@ -1,26 +1,24 @@
//TODO : need to delete this class IncidentAttachments {
num? id;
num? incidentId;
String? attachmentName;
String? attachmentDescription;
// class IncidentAttachments { IncidentAttachments({this.id, this.attachmentName, this.incidentId, this.attachmentDescription});
// num? id;
// num? incidentId; IncidentAttachments.fromJson(dynamic json) {
// String? attachmentName; id = json['id'];
// String? attachmentDescription; incidentId = json['incidentId'];
// attachmentName = json['attachmentName'];
// IncidentAttachments({this.id, this.attachmentName, this.incidentId, this.attachmentDescription}); attachmentDescription = json['attachmentDescription'];
// }
// IncidentAttachments.fromJson(dynamic json) {
// id = json['id']; Map<String, dynamic> toJson() {
// incidentId = json['incidentId']; final map = <String, dynamic>{};
// attachmentName = json['attachmentName']; map['id'] = id;
// attachmentDescription = json['attachmentDescription']; map['attachmentName'] = attachmentName;
// } map['incidentId'] = incidentId;
// map['attachmentDescription'] = attachmentDescription;
// Map<String, dynamic> toJson() { return map;
// final map = <String, dynamic>{}; }
// map['id'] = id; }
// map['attachmentName'] = attachmentName;
// map['incidentId'] = incidentId;
// map['attachmentDescription'] = attachmentDescription;
// return map;
// }
// }

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/incident_module/incident_attachment_model.dart'; import 'package:test_sa/modules/incident_module/incident_attachment_model.dart';
class IncidentDataModel { class IncidentDataModel {
@ -74,7 +73,7 @@ class IncidentDataModel {
String? approvalSignature; String? approvalSignature;
String? occurrenceDate; String? occurrenceDate;
String? createdDate; String? createdDate;
List<GenericAttachmentModel>? incidentAttachments; List<IncidentAttachments>? incidentAttachments;
int? workOrderId; int? workOrderId;
String? workOrderNo; String? workOrderNo;
@ -231,9 +230,9 @@ class IncidentDataModel {
workOrderId = json['workOrderId']; workOrderId = json['workOrderId'];
workOrderNo = json['workOrderNo']; workOrderNo = json['workOrderNo'];
if (json['incidentAttachments'] != null) { if (json['incidentAttachments'] != null) {
incidentAttachments = <GenericAttachmentModel>[]; incidentAttachments = <IncidentAttachments>[];
json['incidentAttachments'].forEach((v) { json['incidentAttachments'].forEach((v) {
incidentAttachments!.add(GenericAttachmentModel.fromIncidentJson(v)); incidentAttachments!.add(IncidentAttachments.fromJson(v));
}); });
} }
} }
@ -315,7 +314,7 @@ class IncidentDataModel {
data['workOrderId'] = this.workOrderId; data['workOrderId'] = this.workOrderId;
data['workOrderNo'] = this.workOrderNo; data['workOrderNo'] = this.workOrderNo;
if (this.incidentAttachments != null) { if (this.incidentAttachments != null) {
data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toIncidentJson()).toList(); data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }

@ -9,7 +9,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cm_module/cm_detail_page.dart'; import 'package:test_sa/modules/cm_module/cm_detail_page.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/incident_module/incident_attachment_model.dart'; import 'package:test_sa/modules/incident_module/incident_attachment_model.dart';
@ -41,51 +40,44 @@ class IncidentDetailPage extends StatelessWidget {
if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center; if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center;
if (snapshot.data == null) return const NoDataFound().center; if (snapshot.data == null) return const NoDataFound().center;
List<GenericAttachmentModel> allAttachments = (snapshot.data!.incidentAttachments ?? []).whereType<GenericAttachmentModel>().toList(); List<IncidentAttachments> allAttachments = snapshot.data!.incidentAttachments!;
return SingleChildScrollView( return SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
StatusLabel( StatusLabel(
label: snapshot.data!.incidentStatusName!, label: snapshot.data!.incidentStatusName!,
textColor: AppColor.getRequestStatusTextColorByName(context, snapshot.data!.incidentStatusName!), textColor: AppColor.getRequestStatusTextColorByName(context, snapshot.data!.incidentStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, snapshot.data!.incidentStatusName!), backgroundColor: AppColor.getRequestStatusColorByName(context, snapshot.data!.incidentStatusName!),
), ),
1.width.expanded, 1.width.expanded,
InfoDateWidget(snapshot.data!.createdDate?.toString() ?? ""), InfoDateWidget(snapshot.data!.createdDate?.toString() ?? ""),
], ],
), ),
// 12.height, // 12.height,
...requesterDetails(context, snapshot.data!), ...requesterDetails(context, snapshot.data!),
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
...requestDetails(context, snapshot.data!), ...requestDetails(context, snapshot.data!),
if (snapshot.data!.ovrTicketNumber?.isNotEmpty ?? false) ovrInformation(context, snapshot.data!.ovrTicketNumber!), if (snapshot.data!.ovrTicketNumber?.isNotEmpty ?? false) ovrInformation(context, snapshot.data!.ovrTicketNumber!),
const Divider().defaultStyle(context),
...assetDetails(context, snapshot.data!),
const Divider().defaultStyle(context),
...personInvolvedDetails(context, snapshot.data!),
if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), ...assetDetails(context, snapshot.data!),
4.height, const Divider().defaultStyle(context),
FilesList( ...personInvolvedDetails(context, snapshot.data!),
showAsListView: true, if (allAttachments.isNotEmpty) ...[
types: allAttachments const Divider().defaultStyle(context),
.whereType<GenericAttachmentModel>() InfoHeader16Widget("Attachments".addTranslation),
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty) FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
.map((toElement) => toElement.documentType!.name!) ],
.toList(),
images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
], ).toShadowContainer(context),
).toShadowContainer(context), );
); }),
}))); ));
} }
List<Widget> requestDetails(BuildContext context, IncidentDataModel incidentData) { List<Widget> requestDetails(BuildContext context, IncidentDataModel incidentData) {

@ -1,4 +1,4 @@
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
class EngineerData { class EngineerData {
int? id; int? id;
@ -9,7 +9,7 @@ class EngineerData {
bool? isComplete; bool? isComplete;
int? statusId; int? statusId;
int? requestId; int? requestId;
List<GenericAttachmentModel>? attachments; List<InternalAuditAttachments>? attachments;
EngineerData({ EngineerData({
this.id, this.id,
@ -32,7 +32,7 @@ class EngineerData {
isComplete = json['isComplete']; isComplete = json['isComplete'];
statusId = json['statusId']; statusId = json['statusId'];
requestId = json['requestId']; requestId = json['requestId'];
attachments = json['attachments'] != null ? (json['attachments'] as List).map((e) => GenericAttachmentModel.fromInternalAuditJson(e)).toList() : []; attachments = json['attachments'] != null ? (json['attachments'] as List).map((e) => InternalAuditAttachments.fromJson(e)).toList() : [];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -46,7 +46,7 @@ class EngineerData {
data['statusId'] = statusId; data['statusId'] = statusId;
data['requestId'] = requestId; data['requestId'] = requestId;
if (attachments != null) { if (attachments != null) {
data['attachments'] = attachments!.whereType<GenericAttachmentModel>().map((e) => e.toInternalAuditJson()).toList(); data['attachments'] = attachments!.map((e) => e.toJson()).toList();
} }
return data; return data;
} }

@ -1,5 +1,6 @@
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/engineer_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/engineer_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart';
class EquipmentInternalAuditDataModel { class EquipmentInternalAuditDataModel {
@ -14,7 +15,7 @@ class EquipmentInternalAuditDataModel {
dynamic manufacture; dynamic manufacture;
String? remarks; String? remarks;
List<EquipmentsFinding>? equipmentsFindings; List<EquipmentsFinding>? equipmentsFindings;
List<GenericAttachmentModel>? attachments; List<InternalAuditAttachments>? attachments;
EngineerData? engineerData; EngineerData? engineerData;
@ -53,7 +54,7 @@ class EquipmentInternalAuditDataModel {
} }
attachments = json['attachments'] != null attachments = json['attachments'] != null
? (json['attachments'] as List) ? (json['attachments'] as List)
.map((e) => GenericAttachmentModel.fromInternalAuditJson(e)) .map((e) => InternalAuditAttachments.fromJson(e))
.where((e) => e.name != null) // optional filter if you want to skip null names .where((e) => e.name != null) // optional filter if you want to skip null names
.toList() .toList()
: []; : [];
@ -85,9 +86,7 @@ class EquipmentInternalAuditDataModel {
data['equipmentsFindings'] = data['equipmentsFindings'] =
equipmentsFindings!.map((v) => v.toJson()).toList(); equipmentsFindings!.map((v) => v.toJson()).toList();
} }
if (attachments != null) { data['attachments'] = attachments;
data['attachments'] = attachments!.whereType<GenericAttachmentModel>().map((v) => v.toInternalAuditJson()).toList();
}
if (engineerData != null) data['engineerData'] = engineerData!.toJson(); if (engineerData != null) data['engineerData'] = engineerData!.toJson();
return data; return data;
} }

@ -5,7 +5,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
class EquipmentInternalAuditFormModel { class EquipmentInternalAuditFormModel {
int? id=0; int? id=0;
@ -14,7 +14,7 @@ class EquipmentInternalAuditFormModel {
String? woOrderNo; String? woOrderNo;
List<String>? devicePhotos; List<String>? devicePhotos;
List<Lookup> findings =[]; List<Lookup> findings =[];
List<GenericAttachmentModel> attachments = []; List<InternalAuditAttachments> attachments = [];
String? remarks; String? remarks;
Asset? device; Asset? device;
EquipmentInternalAuditFormModel({ EquipmentInternalAuditFormModel({
@ -32,7 +32,7 @@ class EquipmentInternalAuditFormModel {
'assetId': device?.id, 'assetId': device?.id,
'auditorId': auditorId, 'auditorId': auditorId,
'findings': findings.map((e) => {'findingId': e.value}).toList(), 'findings': findings.map((e) => {'findingId': e.value}).toList(),
'attachments': attachments.whereType<GenericAttachmentModel>().map((e) => e.toInternalAuditJson()).toList(), 'attachments': attachments.map((e) => e.toJson()).toList(),
'remarks': remarks, 'remarks': remarks,
}; };
} }

@ -1,32 +1,26 @@
//TODO : need to remove this class. import 'dart:developer';
// import 'dart:developer';
// class InternalAuditAttachments {
// import 'package:test_sa/models/lookup.dart'; InternalAuditAttachments({this.id, this.originalName, this.name, this.createdBy});
//
// class InternalAuditAttachments { int? id;
// InternalAuditAttachments({this.id, this.originalName, this.name, this.createdBy,this.documentType}); String? name;
// String? originalName;
// int? id; String? createdBy;
// String? name;
// String? originalName; InternalAuditAttachments.fromJson(Map<String, dynamic> json) {
// String? createdBy; id = json['id'];
// Lookup ? documentType; name = (json['name'] != null && !json['name'].toString().startsWith('data:image/jpeg')) ? json['name'] : null;
// originalName = json['originalName'];
// InternalAuditAttachments.fromJson(Map<String, dynamic> json) { createdBy = json['createdBy'];
// id = json['id']; }
// name = (json['name'] != null && !json['name'].toString().startsWith('data:image/jpeg')) ? json['name'] : null;
// originalName = json['originalName']; Map<String, dynamic> toJson() {
// createdBy = json['createdBy']; final Map<String, dynamic> data = <String, dynamic>{};
// documentType =json['documentType']; data['id'] = id;
// } data['name'] = name;
// data['originalName'] = originalName;
// Map<String, dynamic> toJson() { // data['createdBy'] = createdBy;
// final Map<String, dynamic> data = <String, dynamic>{}; return data;
// data['id'] = id; }
// data['name'] = name; }
// data['originalName'] = originalName;
// data['documentTypeId'] = documentType?.id;
// // data['createdBy'] = createdBy;
// return data;
// }
// }

@ -1,6 +1,6 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/internal_audit_module/models/engineer_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/engineer_data_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart';
class SystemInternalAuditDataModel { class SystemInternalAuditDataModel {
@ -19,7 +19,7 @@ class SystemInternalAuditDataModel {
String? createdDate; String? createdDate;
String? modifiedBy; String? modifiedBy;
String? modifiedDate; String? modifiedDate;
List<GenericAttachmentModel>? attachments; List<InternalAuditAttachments>? attachments;
EngineerData? engineerData; EngineerData? engineerData;
SystemInternalAuditDataModel({ SystemInternalAuditDataModel({
@ -60,7 +60,7 @@ class SystemInternalAuditDataModel {
modifiedDate = json['modifiedDate']; modifiedDate = json['modifiedDate'];
attachments = json['attachments'] != null attachments = json['attachments'] != null
? (json['attachments'] as List) ? (json['attachments'] as List)
.map((e) => GenericAttachmentModel.fromInternalAuditJson(e)) .map((e) => InternalAuditAttachments.fromJson(e))
.where((e) => e.name != null) // optional filter if you want to skip null names .where((e) => e.name != null) // optional filter if you want to skip null names
.toList() .toList()
: []; : [];
@ -84,9 +84,6 @@ class SystemInternalAuditDataModel {
data['createdDate'] = createdDate; data['createdDate'] = createdDate;
data['modifiedBy'] = modifiedBy; data['modifiedBy'] = modifiedBy;
data['modifiedDate'] = modifiedDate; data['modifiedDate'] = modifiedDate;
if (attachments != null) {
data['attachments'] = attachments!.whereType<GenericAttachmentModel>().map((v) => v.toInternalAuditJson()).toList();
}
if (engineerData != null) data['engineerData'] = engineerData!.toJson(); if (engineerData != null) data['engineerData'] = engineerData!.toJson();
return data; return data;
} }

@ -1,7 +1,7 @@
import 'dart:developer'; import 'dart:developer';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
class SystemInternalAuditFormModel { class SystemInternalAuditFormModel {
int? id; int? id;
@ -13,7 +13,7 @@ class SystemInternalAuditFormModel {
int? correctiveMaintenanceId; int? correctiveMaintenanceId;
int? planPreventiveVisitId; int? planPreventiveVisitId;
int? assetTransferId; int? assetTransferId;
List<GenericAttachmentModel>? attachments = []; List<InternalAuditAttachments>? attachments = [];
int? taskJobId; int? taskJobId;
int? taskAlertJobId; int? taskAlertJobId;
int? gasRefillId; int? gasRefillId;
@ -56,7 +56,7 @@ class SystemInternalAuditFormModel {
'gasRefillId': gasRefillId, 'gasRefillId': gasRefillId,
'planRecurrentTaskId': planRecurrentTaskId, 'planRecurrentTaskId': planRecurrentTaskId,
'statusId': statusId, 'statusId': statusId,
'attachments': attachments?.whereType<GenericAttachmentModel>().map((e) => e.toInternalAuditJson()).toList(), 'attachments': attachments?.map((e) => e.toJson()).toList(),
}; };
} }
} }

@ -1,5 +1,5 @@
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart';
class AuditFormModel { class AuditFormModel {
@ -10,7 +10,7 @@ class AuditFormModel {
DateTime? startTime; DateTime? startTime;
DateTime? endTime; DateTime? endTime;
double? totalHours; double? totalHours;
List<GenericAttachmentModel>? attachments; List<InternalAuditAttachments>? attachments;
bool? isComplete; bool? isComplete;
TimerModel? auditTimerModel = TimerModel(); TimerModel? auditTimerModel = TimerModel();
List<InternalAuditTimerModel>? auditTimers = []; List<InternalAuditTimerModel>? auditTimers = [];
@ -40,7 +40,7 @@ class AuditFormModel {
endTime = json['endTime'] != null ? DateTime.tryParse(json['endTime']) : null; endTime = json['endTime'] != null ? DateTime.tryParse(json['endTime']) : null;
totalHours = json['totalHours']?.toDouble(); totalHours = json['totalHours']?.toDouble();
if (json['attachments'] != null) { if (json['attachments'] != null) {
attachments = (json['attachments'] as List).map((e) => GenericAttachmentModel.fromInternalAuditJson(e)).toList(); attachments = (json['attachments'] as List).map((e) => InternalAuditAttachments.fromJson(e)).toList();
} }
isComplete = json['isComplete']; isComplete = json['isComplete'];
} }
@ -54,7 +54,7 @@ class AuditFormModel {
'endTime': endTime?.toIso8601String(), 'endTime': endTime?.toIso8601String(),
// 'auditTimer': auditTimers, // 'auditTimer': auditTimers,
'totalHours': totalHours, 'totalHours': totalHours,
'attachments': attachments?.whereType<GenericAttachmentModel>().map((e) => e.toInternalAuditJson()).toList(), 'attachments': attachments?.map((e) => e.toJson()).toList(),
'isComplete': isComplete, 'isComplete': isComplete,
}; };
} }

@ -8,13 +8,12 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -120,8 +119,6 @@ class _CreateEquipmentInternalAuditFormState extends State<CreateEquipmentIntern
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
attachment: _attachments, attachment: _attachments,
showAsListView: true,
moduleId: RequestAttachmentTypeEnum.equipmentInternalAudit.id,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
onChange: (value) {}, onChange: (value) {},
@ -147,11 +144,7 @@ class _CreateEquipmentInternalAuditFormState extends State<CreateEquipmentIntern
_equipmentinternalAuditModel.attachments = []; _equipmentinternalAuditModel.attachments = [];
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_equipmentinternalAuditModel.attachments.add(GenericAttachmentModel( _equipmentinternalAuditModel.attachments.add(InternalAuditAttachments(id: item.id, name: fileName));
id: item.id,
name: fileName,
documentType: item.documentType,
));
} }
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
_equipmentinternalAuditModel.auditorId = context.userProvider.user?.userID; _equipmentinternalAuditModel.auditorId = context.userProvider.user?.userID;

@ -10,7 +10,7 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -41,7 +41,7 @@ class _EquipmentInternalAuditDetailPageState extends State<EquipmentInternalAudi
bool isWoType = true; bool isWoType = true;
EquipmentInternalAuditDataModel? model; EquipmentInternalAuditDataModel? model;
late InternalAuditProvider _internalAuditProvider; late InternalAuditProvider _internalAuditProvider;
List<GenericAttachmentModel> allAttachments = []; List<InternalAuditAttachments> allAttachments = [];
@override @override
void initState() { void initState() {
@ -56,8 +56,8 @@ class _EquipmentInternalAuditDetailPageState extends State<EquipmentInternalAudi
model = await _internalAuditProvider.getEquipmentInternalAuditById(widget.auditId); model = await _internalAuditProvider.getEquipmentInternalAuditById(widget.auditId);
allAttachments.clear(); allAttachments.clear();
allAttachments = [ allAttachments = [
...(model?.attachments?.whereType<GenericAttachmentModel>() ?? []), ...(model?.attachments ?? []),
...(model?.engineerData?.attachments?.whereType<GenericAttachmentModel>() ?? []), ...(model?.engineerData?.attachments ?? []),
]; ];
} }
@ -118,24 +118,17 @@ class _EquipmentInternalAuditDetailPageState extends State<EquipmentInternalAudi
if (model?.remarks?.isNotEmpty ?? false) ...[ if (model?.remarks?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Remarks"), InfoHeader16Widget("Remarks"),
Text( Text(model!.remarks??'',style: AppTextStyles.bodyText2.copyWith(color: AppColor.lightTextColor(context)),),
model!.remarks ?? '',
style: AppTextStyles.bodyText2.copyWith(color: AppColor.lightTextColor(context)),
),
8.height, 8.height,
], ],
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), Text(
4.height, "Attachments".addTranslation,
FilesList( style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
showAsListView: true, ),
types: allAttachments 8.height,
.whereType<GenericAttachmentModel>() FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
], ],
).paddingAll(0).toShadowContainer(context), ).paddingAll(0).toShadowContainer(context),

@ -10,14 +10,14 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/update_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/update_audit_form_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
@ -26,7 +26,6 @@ import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/common_widgets/working_time_tile.dart'; import 'package:test_sa/new_views/common_widgets/working_time_tile.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/total_working_time_detail_bottomsheet.dart'; import 'package:test_sa/views/widgets/total_working_time_detail_bottomsheet.dart';
@ -63,7 +62,7 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
formModel.requestId = widget.model?.id; formModel.requestId = widget.model?.id;
formModel.id = widget.model?.id; formModel.id = widget.model?.id;
formModel.debrief = widget.model?.engineerData?.debrief; formModel.debrief = widget.model?.engineerData?.debrief;
_attachments = widget.model?.engineerData?.attachments?.whereType<GenericAttachmentModel>().map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name ?? '')).toList() ?? []; _attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? [];
calculateWorkingTime(); calculateWorkingTime();
} }
@ -130,10 +129,9 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name?.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name?.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
formModel.attachments!.add( formModel.attachments!.add(
GenericAttachmentModel( InternalAuditAttachments(
id: item.id, id: item.id,
originalName: fileName, originalName: fileName,
documentType: item.documentType,
name: fileName, name: fileName,
), ),
); );
@ -223,8 +221,6 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
AttachmentPicker( AttachmentPicker(
label: 'Upload Attachment', label: 'Upload Attachment',
attachment: _attachments, attachment: _attachments,
showAsListView: true,
moduleId: RequestAttachmentTypeEnum.equipmentInternalAudit.id,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),

@ -9,14 +9,13 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_audit_work_order_auto_complete_field.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_audit_work_order_auto_complete_field.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart';
@ -153,8 +152,6 @@ class _CreateSystemInternalAuditFormState extends State<CreateSystemInternalAudi
16.height, 16.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
showAsListView: true,
moduleId: RequestAttachmentTypeEnum.systemInternalAudit.id,
attachment: _attachments, attachment: _attachments,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
@ -181,14 +178,10 @@ class _CreateSystemInternalAuditFormState extends State<CreateSystemInternalAudi
InternalAuditProvider internalAuditProvider = Provider.of<InternalAuditProvider>(context, listen: false); InternalAuditProvider internalAuditProvider = Provider.of<InternalAuditProvider>(context, listen: false);
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState!.save(); _formKey.currentState!.save();
_model.attachments = []; _model.attachments=[];
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_model.attachments?.add(GenericAttachmentModel( _model.attachments?.add(InternalAuditAttachments(id: item.id, name: fileName));
id: item.id,
name: fileName,
documentType: item.documentType,
));
} }
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
_model.auditorId = context.userProvider.user?.userID; _model.auditorId = context.userProvider.user?.userID;

@ -9,7 +9,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
@ -39,7 +39,7 @@ class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetai
bool isWoType = true; bool isWoType = true;
SystemInternalAuditDataModel? model; SystemInternalAuditDataModel? model;
late InternalAuditProvider _internalAuditProvider; late InternalAuditProvider _internalAuditProvider;
List<GenericAttachmentModel> allAttachments = []; List<InternalAuditAttachments> allAttachments = [];
@override @override
void initState() { void initState() {
@ -54,8 +54,8 @@ class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetai
model = await _internalAuditProvider.getInternalSystemAuditById(widget.auditId); model = await _internalAuditProvider.getInternalSystemAuditById(widget.auditId);
allAttachments.clear(); allAttachments.clear();
allAttachments = [ allAttachments = [
...(model?.attachments?.whereType<GenericAttachmentModel>() ?? []), ...(model?.attachments ?? []),
...(model?.engineerData?.attachments?.whereType<GenericAttachmentModel>() ?? []), ...(model?.engineerData?.attachments ?? []),
]; ];
} }
@ -86,19 +86,19 @@ class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetai
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
StatusLabel( StatusLabel(
label: model?.status?.name, label: model!.status!.name,
id: model?.status?.value, id: model!.status!.value,
radius: 4, radius: 4,
textColor: AppColor.getRequestStatusTextColorByName( textColor: AppColor.getRequestStatusTextColorByName(
context, context,
model?.status?.name, model!.status!.name,
), ),
backgroundColor: AppColor.getRequestStatusColorByName( backgroundColor: AppColor.getRequestStatusColorByName(
context, context,
model?.status?.name, model!.status!.name,
), ),
), ),
InfoDateWidget(model?.createdDate?.toString() ?? ""), InfoDateWidget(model!.createdDate?.toString() ?? ""),
], ],
), ),
8.height, 8.height,
@ -117,15 +117,7 @@ class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetai
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
8.height, FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
FilesList(
showAsListView: true,
types: allAttachments
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
], ],
).paddingAll(0).toShadowContainer(context), ).paddingAll(0).toShadowContainer(context),

@ -10,13 +10,14 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_timer_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/update_audit_form_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/update_audit_form_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
@ -61,7 +62,7 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
formModel.requestId = widget.model?.id; formModel.requestId = widget.model?.id;
formModel.id = widget.model?.id; formModel.id = widget.model?.id;
formModel.debrief = widget.model?.engineerData?.debrief; formModel.debrief = widget.model?.engineerData?.debrief;
_attachments = widget.model?.engineerData?.attachments?.whereType<GenericAttachmentModel>().map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name ?? '')).toList() ?? []; _attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? [];
calculateWorkingTime(); calculateWorkingTime();
} }
@ -129,9 +130,8 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name?.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name?.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
formModel.attachments!.add( formModel.attachments!.add(
GenericAttachmentModel( InternalAuditAttachments(
id: item.id, id: item.id,
documentType: item.documentType,
// originalName: fileName, // originalName: fileName,
name: fileName, name: fileName,
), ),
@ -211,9 +211,7 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
16.height, 16.height,
AttachmentPicker( AttachmentPicker(
label: 'Upload Attachment', label: 'Upload Attachment',
showAsListView: true,
attachment: _attachments, attachment: _attachments,
moduleId: RequestAttachmentTypeEnum.systemInternalAudit.id,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),

@ -1,40 +1,39 @@
//TODO need to delete this . class LoanAttachmentModel {
// class LoanAttachmentModel { int? loanId;
// int? loanId; String? attachmentName;
// String? attachmentName; int? loanAttachmentTypeId;
// int? loanAttachmentTypeId; String? attachmentDescription;
// String? attachmentDescription; int? id;
// int? id; String? createdBy;
// String? createdBy; String? createdDate;
// String? createdDate; String? modifiedBy;
// String? modifiedBy; String? modifiedDate;
// String? modifiedDate;
// LoanAttachmentModel({this.loanId, this.attachmentName, this.loanAttachmentTypeId, this.attachmentDescription, this.id, this.createdBy, this.createdDate, this.modifiedBy, this.modifiedDate});
// LoanAttachmentModel({this.loanId, this.attachmentName, this.loanAttachmentTypeId, this.attachmentDescription, this.id, this.createdBy, this.createdDate, this.modifiedBy, this.modifiedDate});
// LoanAttachmentModel.fromJson(Map<String, dynamic> json) {
// LoanAttachmentModel.fromJson(Map<String, dynamic> json) { loanId = json['loanId'];
// loanId = json['loanId']; attachmentName = json['attachmentName'];
// attachmentName = json['attachmentName']; loanAttachmentTypeId = json['loanAttachmentTypeId'];
// loanAttachmentTypeId = json['loanAttachmentTypeId']; attachmentDescription = json['attachmentDescription'];
// attachmentDescription = json['attachmentDescription']; id = json['id'];
// id = json['id']; createdBy = json['createdBy'];
// createdBy = json['createdBy']; createdDate = json['createdDate'];
// createdDate = json['createdDate']; modifiedBy = json['modifiedBy'];
// modifiedBy = json['modifiedBy']; modifiedDate = json['modifiedDate'];
// modifiedDate = json['modifiedDate']; }
// }
// Map<String, dynamic> toJson() {
// Map<String, dynamic> toJson() { final Map<String, dynamic> data = new Map<String, dynamic>();
// final Map<String, dynamic> data = new Map<String, dynamic>(); data['loanId'] = this.loanId;
// data['loanId'] = this.loanId; data['attachmentName'] = this.attachmentName;
// data['attachmentName'] = this.attachmentName; data['loanAttachmentTypeId'] = this.loanAttachmentTypeId;
// data['loanAttachmentTypeId'] = this.loanAttachmentTypeId; data['attachmentDescription'] = this.attachmentDescription;
// data['attachmentDescription'] = this.attachmentDescription; data['id'] = this.id;
// data['id'] = this.id; data['createdBy'] = this.createdBy;
// data['createdBy'] = this.createdBy; data['createdDate'] = this.createdDate;
// data['createdDate'] = this.createdDate; data['modifiedBy'] = this.modifiedBy;
// data['modifiedBy'] = this.modifiedBy; data['modifiedDate'] = this.modifiedDate;
// data['modifiedDate'] = this.modifiedDate; return data;
// return data; }
// } }
// }

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart';
import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/site.dart';
@ -25,7 +24,7 @@ class LoanFormModel {
SupplierDetails? supplier; SupplierDetails? supplier;
SuppEngineerWorkOrders? supEngineer; SuppEngineerWorkOrders? supEngineer;
MedicalDepartmentModel? department; MedicalDepartmentModel? department;
List<GenericAttachmentModel>? loanAttachment; List<LoanAttachments>? loanAttachment;
MappedSite? mappedSite; MappedSite? mappedSite;
TrafDepartment? mappedDepartment; TrafDepartment? mappedDepartment;
@ -52,6 +51,40 @@ class LoanFormModel {
this.mappedDepartment, this.mappedDepartment,
}); });
//{
// "id": 0,
// "employeeId": "fa29a9de-1337-4729-b823-68c6ecffdd33",
// "requestorUserID": "fa29a9de-1337-4729-b823-68c6ecffdd33",
// "employeeName": "engineer-dev",
// "employeeEmail": "Engineer_Dev@yahoo.com",
// "positionName": "High",
// "requesterExtensionNumber": "7726",
// "requesterContactNumber": "72132197",
// "siteId": 1,
// "departmentId": 5,
// "loanTypeId": 6448,
// "doctorName": "Doctor A",
// "doctorContact": "0561432451",
// "doctorEmail": "doctor@test.com",
// "itemDescription": "Test item",
// "requestDescription": "Test request",
// "loanPeriodId": 6453,
// "assetId": null,
// "assetNumber": "",
// "assetName": "",
// "assetSerialNumber": "",
// "model": "Model A",
// "manufacturer": "Siemens",
// "vendorName": "Vendor A",
// "vendorRepName": "Vendor Rep A",
// "vendorContact": "0561432455",
// "vendorEmail": "vendor@test.com",
// "loanStatusId": 1,
// "loanAttachments": [],
// "submittedAt": "2025-11-13T12:11:12.673Z",
// "updatedAt": null,
// "cMWOItemId": null
// }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
@ -70,10 +103,50 @@ class LoanFormModel {
"vendorContact": vendorNumber, "vendorContact": vendorNumber,
"vendorEmail": vendorEmail, "vendorEmail": vendorEmail,
"isNewVendor": isNewVendor, "isNewVendor": isNewVendor,
// 'siteId': site?.id,
'siteId': mappedSite?.id, 'siteId': mappedSite?.id,
// 'departmentId': department?.id,
'departmentId': mappedDepartment?.id, 'departmentId': mappedDepartment?.id,
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toLoanJson()).toList() : [], "loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
}; };
} }
} }
class LoanAttachments {
num? id;
num? loanAttachmentTypeId;
num? loanId;
String? attachmentName;
String? attachmentDescription;
LoanAttachments({this.id, this.loanAttachmentTypeId, this.attachmentName, this.loanId, this.attachmentDescription});
LoanAttachments.fromJson(dynamic json) {
id = json['id'];
loanAttachmentTypeId = json['loanAttachmentTypeId'];
loanId = json['loanId'];
attachmentName = json['attachmentName'];
attachmentDescription = json['attachmentDescription'];
}
// LoanAttachments copyWith({
// num? id, // Parameter is now nullable
// String? name, // Parameter is now nullable
// String? originalName, // Parameter is now nullable
// }) =>
// LoanAttachments(
// id: id ?? this.id,
// name: name ?? this.name,
// originalName: originalName ?? this.originalName,
// );
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['loanAttachmentTypeId'] = loanAttachmentTypeId;
map['attachmentName'] = attachmentName;
map['loanId'] = loanId;
map['attachmentDescription'] = attachmentDescription;
return map;
}
}

@ -1,14 +1,14 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
class LoanInstallationPullOutFormModel { class LoanInstallationPullOutFormModel {
String? snNo; String? snNo;
DateTime? date; DateTime? date;
Uint8List? signature; Uint8List? signature;
List<GenericAttachmentModel>? loanAttachment; List<LoanAttachments>? loanAttachment;
TimerModel? timerModel = TimerModel(); TimerModel? timerModel = TimerModel();
DateTime? startTime; DateTime? startTime;
DateTime? endTime; DateTime? endTime;
@ -32,11 +32,13 @@ class LoanInstallationPullOutFormModel {
}); });
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
//Need to check payload parm they need
return { return {
// 'snNo': snNo,
'serialNumber': snNo, 'serialNumber': snNo,
'installationDate': date?.toIso8601String(), 'installationDate': date?.toIso8601String(),
'pulloutDate': date?.toIso8601String(), 'pulloutDate': date?.toIso8601String(),
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toLoanJson()).toList() : [], "loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
"installationSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null, "installationSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
"signature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null, "signature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
"pulloutSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null, "pulloutSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
@ -51,11 +53,16 @@ class LoanInstallationPullOutFormModel {
} }
Map<String, dynamic> toInstallationJson() { Map<String, dynamic> toInstallationJson() {
//Need to check payload parm they need
return { return {
// 'snNo': snNo,
'serialNumber': snNo, 'serialNumber': snNo,
'installationDate': date?.toIso8601String(), 'installationDate': date?.toIso8601String(),
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toLoanJson()).toList() : [], // 'pulloutDate': date?.toIso8601String(),
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
"installationSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null, "installationSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
// "signature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
// "pulloutSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
'startTime': startTime?.toIso8601String(), 'startTime': startTime?.toIso8601String(),
'endTime': endTime?.toIso8601String(), 'endTime': endTime?.toIso8601String(),
'totalHours': totalHours, 'totalHours': totalHours,
@ -67,10 +74,15 @@ class LoanInstallationPullOutFormModel {
} }
Map<String, dynamic> toPulloutJson() { Map<String, dynamic> toPulloutJson() {
//Need to check payload parm they need
return { return {
// 'snNo': snNo,
'serialNumber': snNo, 'serialNumber': snNo,
// 'installationDate': date?.toIso8601String(),
'pulloutDate': date?.toIso8601String(), 'pulloutDate': date?.toIso8601String(),
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toLoanJson()).toList() : [], "loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
// "installationSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
// "signature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
"pulloutSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null, "pulloutSignature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
'startTime': startTime?.toIso8601String(), 'startTime': startTime?.toIso8601String(),
'endTime': endTime?.toIso8601String(), 'endTime': endTime?.toIso8601String(),

@ -1,4 +1,3 @@
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'loan_attachment_model.dart'; import 'loan_attachment_model.dart';
@ -35,7 +34,7 @@ class LoanRequestModel {
String? vendorRepName; String? vendorRepName;
String? vendorContact; String? vendorContact;
String? vendorEmail; String? vendorEmail;
List<GenericAttachmentModel>? loanAttachments; List<LoanAttachmentModel>? loanAttachments;
int? loanStatusId; int? loanStatusId;
String? loanStatusName; String? loanStatusName;
int? loanStatusValue; int? loanStatusValue;
@ -155,11 +154,11 @@ class LoanRequestModel {
vendorRepName = json['vendorRepName']; vendorRepName = json['vendorRepName'];
vendorContact = json['vendorContact']; vendorContact = json['vendorContact'];
vendorEmail = json['vendorEmail']; vendorEmail = json['vendorEmail'];
loanAttachments = <GenericAttachmentModel>[]; loanAttachments = <LoanAttachmentModel>[];
if (json['loanAttachments'] != null) { if (json['loanAttachments'] != null) {
loanAttachments = <GenericAttachmentModel>[]; loanAttachments = <LoanAttachmentModel>[];
json['loanAttachments'].forEach((v) { json['loanAttachments'].forEach((v) {
loanAttachments!.add(GenericAttachmentModel.fromLoanDetailJson(v)); loanAttachments!.add(new LoanAttachmentModel.fromJson(v));
}); });
} }
loanStatusId = json['loanStatusId']; loanStatusId = json['loanStatusId'];
@ -223,8 +222,8 @@ class LoanRequestModel {
data['vendorRepName'] = this.vendorRepName; data['vendorRepName'] = this.vendorRepName;
data['vendorContact'] = this.vendorContact; data['vendorContact'] = this.vendorContact;
data['vendorEmail'] = this.vendorEmail; data['vendorEmail'] = this.vendorEmail;
if (loanAttachments != null) { if (this.loanAttachments != null) {
data['loanAttachments'] = loanAttachments!.map((v) => v.toLoanDetailJson()).toList(); data['loanAttachments'] = this.loanAttachments!.map((v) => v.toJson()).toList();
} }
data['loanStatusId'] = this.loanStatusId; data['loanStatusId'] = this.loanStatusId;
data['loanStatusName'] = this.loanStatusName; data['loanStatusName'] = this.loanStatusName;

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart';
@ -156,7 +155,6 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.loanEquipment.id,
onlyImages: false, onlyImages: false,
showAsListView: true, showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -629,7 +627,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
_loanFormModel.loanAttachment = []; _loanFormModel.loanAttachment = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_loanFormModel.loanAttachment?.add(GenericAttachmentModel(id: 0, name: fileName, moduleReferenceId: 0,documentType: item.documentType)); _loanFormModel.loanAttachment?.add(LoanAttachments(id: 0, attachmentName: fileName, loanId: 0));
} }
Utils.showLoading(context); Utils.showLoading(context);
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false); LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
@ -167,7 +166,6 @@ class _InstallationFormViewState extends State<InstallationFormView> {
attachment: _attachments, attachment: _attachments,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
moduleId: RequestAttachmentTypeEnum.loanEquipment.id,
showAsListView: true, showAsListView: true,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),
onChange: (attachments) { onChange: (attachments) {
@ -211,7 +209,7 @@ class _InstallationFormViewState extends State<InstallationFormView> {
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_formData.loanAttachment!.add(GenericAttachmentModel(id: 0, name: fileName, moduleReferenceId: widget.loanData?.id, documentType: item.documentType)); _formData.loanAttachment!.add(LoanAttachments(id: 0, attachmentName: fileName, loanId: widget.loanData?.id));
} }
Utils.showLoading(context); Utils.showLoading(context);
_formData.loanStatusId = widget.loanData?.loanStatusValue; _formData.loanStatusId = widget.loanData?.loanStatusValue;

@ -11,7 +11,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
@ -170,7 +169,6 @@ class _InstallationPullOutFormViewState extends State<InstallationPullOutFormVie
label: context.translation.attachments, label: context.translation.attachments,
attachment: _attachments, attachment: _attachments,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
moduleId: RequestAttachmentTypeEnum.loanEquipment.id,
onlyImages: false, onlyImages: false,
showAsListView: true, showAsListView: true,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),
@ -219,7 +217,7 @@ class _InstallationPullOutFormViewState extends State<InstallationPullOutFormVie
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_formData.loanAttachment!.add(GenericAttachmentModel(id: 0, name: fileName, moduleReferenceId: widget.loanData?.id)); _formData.loanAttachment!.add(LoanAttachments(id: 0, attachmentName: fileName, loanId: widget.loanData?.id));
} }
Utils.showLoading(context); Utils.showLoading(context);
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false); LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);

@ -83,8 +83,8 @@ class InstallationDetailsView extends StatelessWidget {
"Uploads Phase 2 docs".addTranslation, "Uploads Phase 2 docs".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
4.height, 8.height,
FilesList(showAsListView: true, images: loanData.loanAttachments?.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []), FilesList(showAsListView: true, images: loanData.loanAttachments?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
], ],
], ],
).toShadowContainer(context, borderRadius: 20), ).toShadowContainer(context, borderRadius: 20),

@ -6,8 +6,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/loan_module/models/loan_attachment_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_attachment_model.dart';
@ -61,7 +59,7 @@ class _LoanEquipmentDetailPageState extends State<LoanEquipmentDetailPage> {
if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center; if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center;
if (snapshot.data == null) return const NoDataFound().center; if (snapshot.data == null) return const NoDataFound().center;
List<GenericAttachmentModel> allAttachments = (snapshot.data!.loanAttachments ?? []).whereType<GenericAttachmentModel>().toList(); List<LoanAttachmentModel> allAttachments = snapshot.data!.loanAttachments!;
return Column(children: [ return Column(children: [
ListView( ListView(
@ -97,15 +95,7 @@ class _LoanEquipmentDetailPageState extends State<LoanEquipmentDetailPage> {
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
FilesList(
showAsListView: true,
types: allAttachments
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
], ],
).toShadowContainer(context) ).toShadowContainer(context)

@ -6,7 +6,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/medical_gas_inspection/create_medical_gas_request_page.dart'; import 'package:test_sa/modules/medical_gas_inspection/create_medical_gas_request_page.dart';
import 'package:test_sa/modules/medical_gas_inspection/models/medical_gas_data_model.dart'; import 'package:test_sa/modules/medical_gas_inspection/models/medical_gas_data_model.dart';
@ -104,15 +103,7 @@ class _MedicalGasInspectionDetailPageState extends State<MedicalGasInspectionDet
if (model!.deliveryNoteAttachmentDto.isNotEmpty) ...[ if (model!.deliveryNoteAttachmentDto.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: model!.deliveryNoteAttachmentDto.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
FilesList(
showAsListView: true,
types: model!.deliveryNoteAttachmentDto
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: model!.deliveryNoteAttachmentDto.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
], ],
).toShadowContainer(context,), ).toShadowContainer(context,),

@ -55,7 +55,7 @@ class MedicalGasFormModel {
'siteId': site?.id, 'siteId': site?.id,
'supplierId': supplier?.id, 'supplierId': supplier?.id,
'isSubmitted': isSubmitted, 'isSubmitted': isSubmitted,
'gasRequestDetailDtos': gasRequestDetail != null ? gasRequestDetail?.map((e) => e.toJson()).toList() : [], 'gasRequestDetailDtos': gasRequestDetail?.map((e) => e.toJson()).toList(),
}; };
} }
} }
@ -81,7 +81,7 @@ class MedicalGasFormDetailModel {
return { return {
'id': id, 'id': id,
'medicalGasAttributeId': medicalGasAttributeId, 'medicalGasAttributeId': medicalGasAttributeId,
'requestedQuantity': requestedQuantity ?? 0, 'requestedQuantity': requestedQuantity??0,
}; };
} }
} }

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
@ -73,7 +72,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
deliveryNoteNumber: dataModel.deliveryNote); deliveryNoteNumber: dataModel.deliveryNote);
if (dataModel.deliveryNoteAttachmentDto.isNotEmpty) { if (dataModel.deliveryNoteAttachmentDto.isNotEmpty) {
_attachments.addAll(dataModel.deliveryNoteAttachmentDto.map((e) => GenericAttachmentModel(id: e.id, documentType: e.documentType, name: e.name)).toList()); _attachments.addAll(dataModel.deliveryNoteAttachmentDto.map((e) => GenericAttachmentModel(id: e.id, name: e.name)).toList());
} }
//Need to Confirm this condition //Need to Confirm this condition
// selectedItemList = dataModel.requestDetailDtos.where((item) => item.deliveredQuantity != null && item.deliveredQuantity! > 0).toList(); // selectedItemList = dataModel.requestDetailDtos.where((item) => item.deliveredQuantity != null && item.deliveredQuantity! > 0).toList();
@ -231,9 +230,8 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
AttachmentPicker( AttachmentPicker(
label: 'Upload Attachment', label: 'Upload Attachment',
attachment: _attachments, attachment: _attachments,
showAsListView: true,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
moduleId: RequestAttachmentTypeEnum.updateDeliveryNotes.id, // showAsListView: true,
onlyImages: false, onlyImages: false,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),
), ),
@ -352,7 +350,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
try { try {
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
formModel.attachments.add(GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType)); formModel.attachments.add(GenericAttachmentModel(id: item.id, name: fileName));
} }
} catch (error) { } catch (error) {
print(error); print(error);

@ -8,10 +8,10 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart';
@ -203,7 +203,6 @@ class _UpdateMedicalGasInspectionPageState extends State<UpdateMedicalGasInspect
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
showAsListView: true, showAsListView: true,
onlyImages: false, onlyImages: false,
moduleId: RequestAttachmentTypeEnum.medicalGasInspection.id,
buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'attachment_icon'.toSvgAsset(color: AppColor.primary10),
), ),
16.height, 16.height,

@ -1,5 +1,3 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
@ -10,7 +8,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart'; import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
@ -188,13 +185,7 @@ class _PmActivitiesListViewState extends State<PmActivitiesListView> {
], ],
if (activity.activitySparePartPPMAttachments.isNotEmpty) ...[ if (activity.activitySparePartPPMAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
FilesList( FilesList(images: activity.activitySparePartPPMAttachments.map((toElement) => URLs.getFileUrl(toElement.name ?? '') ?? '').toList()),
types: activity.activitySparePartPPMAttachments!
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList(),
images: activity.activitySparePartPPMAttachments.map((toElement) => URLs.getFileUrl(toElement.name ?? '') ?? '').toList(), showAsListView: true),
], ],
], ],
).toShadowContainer(context, showShadow: false).onPress(() { ).toShadowContainer(context, showShadow: false).onPress(() {

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart'; import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart';
import 'package:test_sa/models/ppm/ppm.dart'; import 'package:test_sa/models/ppm/ppm.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
@ -52,11 +51,7 @@ class _UpdatePpmState extends State<UpdatePpm> with TickerProviderStateMixin {
ppmProvider.planPreventiveVisit?.preventiveVisitAttachments = []; ppmProvider.planPreventiveVisit?.preventiveVisitAttachments = [];
for (var item in ppmProvider.ppmPlanAttachments) { for (var item in ppmProvider.ppmPlanAttachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
ppmProvider.planPreventiveVisit?.preventiveVisitAttachments?.add(GenericAttachmentModel( ppmProvider.planPreventiveVisit?.preventiveVisitAttachments?.add(PreventiveVisitAttachments(id: item.id, attachmentName: fileName));
id: item.id,
name: fileName,
documentType: item.documentType,
));
} }
ppmProvider.planPreventiveVisit?.preventiveVisitTimers = ppmProvider.planPreventiveVisit?.preventiveVisitTimers ?? []; ppmProvider.planPreventiveVisit?.preventiveVisitTimers = ppmProvider.planPreventiveVisit?.preventiveVisitTimers ?? [];

@ -1,4 +1,3 @@
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -13,7 +12,6 @@ import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/model_definition.dart'; import 'package:test_sa/models/device/model_definition.dart';
import 'package:test_sa/models/device/supplier.dart'; import 'package:test_sa/models/device/supplier.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -36,7 +34,6 @@ import 'package:test_sa/providers/ppm_task_status_provider.dart';
import 'package:test_sa/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart'; import 'package:test_sa/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
@ -66,10 +63,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
calculateWorkingTime(); calculateWorkingTime();
if (widget.planPreventiveVisit.preventiveVisitAttachments != null && widget.planPreventiveVisit.preventiveVisitAttachments!.isNotEmpty) { if (widget.planPreventiveVisit.preventiveVisitAttachments != null && widget.planPreventiveVisit.preventiveVisitAttachments!.isNotEmpty) {
ppmProvider.ppmPlanAttachments = []; ppmProvider.ppmPlanAttachments = [];
ppmProvider.ppmPlanAttachments.addAll(widget.planPreventiveVisit.preventiveVisitAttachments! ppmProvider.ppmPlanAttachments.addAll(widget.planPreventiveVisit.preventiveVisitAttachments!.map((e) => GenericAttachmentModel(id: e.id, name: e.attachmentName!)).toList());
.whereType<GenericAttachmentModel>()
.map((e) => GenericAttachmentModel(id: e.id, name: e.name ?? '', documentType: e.documentType))
.toList());
} }
}); });
@ -102,15 +96,10 @@ class _WoInfoFormState extends State<WoInfoForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// double totalWorkingHours = // double totalWorkingHours =
// widget.planPreventiveVisit.preventiveVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0; // widget.planPreventiveVisit.preventiveVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0;
return Consumer<PpmProvider>(builder: (context, ppmProvider, child) { return Consumer<PpmProvider>(builder: (context, ppmProvider, child) {
ppmProvider.ppmPlanAttachments.forEach((e){
log('attachemnt type ${e.documentType}');
});
return ListView( return ListView(
padding: const EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 16), padding: const EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 16),
children: [ children: [
@ -169,9 +158,23 @@ class _WoInfoFormState extends State<WoInfoForm> {
children: [ children: [
InfoHeader16Widget(widget.planPreventiveVisit.assetName ?? '').expanded, InfoHeader16Widget(widget.planPreventiveVisit.assetName ?? '').expanded,
// widget.planPreventiveVisit.assetName!.bodyText(context).custom(color: AppColor.headingTextColor(context)).expanded, // widget.planPreventiveVisit.assetName!.bodyText(context).custom(color: AppColor.headingTextColor(context)).expanded,
const Icon(Icons.open_in_new_rounded, color: AppColor.primary10, size: 20).onPress(() { "info_icon".toSvgAsset(height: 17, width: 17).onPress(
Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: widget.planPreventiveVisit.asset!.id); () {
}), // There is only limited information for asset is returned from backend to show all info need to return the whole model from backend...
showModalBottomSheet(
context: context,
backgroundColor: AppColor.bottomSheetColor(context),
isScrollControlled: true,
// shape: const RoundedRectangleBorder(
// borderRadius: BorderRadius.vertical(
// top: Radius.circular(20),
// ),
// ),
clipBehavior: Clip.antiAliasWithSaveLayer,
builder: (BuildContext context) => _buildAssetDetailBottomSheet(context),
);
},
)
], ],
), ),
// 2.height, // 2.height,
@ -342,9 +345,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
), ),
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
showAsListView: true,
attachment: ppmProvider.ppmPlanAttachments, attachment: ppmProvider.ppmPlanAttachments,
moduleId: RequestAttachmentTypeEnum.preventiveMaintenance.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),

@ -107,24 +107,6 @@ class SiteRequestProvider extends ChangeNotifier {
); );
} }
/// Fetches user's current sites for Change/Remove Site operations
Future<List<SiteRequestSiteModel>> getSitesByUserId(String userId) async {
List<SiteRequestSiteModel> usersSite = [];
try {
Response response = await ApiManager.instance.post(URLs.getUserSites(userId), body: {},showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
List categoriesListJson = json.decode(response.body)["data"];
usersSite = categoriesListJson
.map((item) => SiteRequestSiteModel(
id: item['siteId']?.toString() ?? '',
name: item['siteName'] ?? '',
))
.toList();
}
} catch (ex) {}
return usersSite;
}
/// Fetches user's current sites for Change/Remove Site operations /// Fetches user's current sites for Change/Remove Site operations
Future<int> fetchUserCurrentSites(String userId) async { Future<int> fetchUserCurrentSites(String userId) async {
if (_loading) return -2; if (_loading) return -2;
@ -143,7 +125,6 @@ class SiteRequestProvider extends ChangeNotifier {
errorMessage: 'Failed to fetch user sites', errorMessage: 'Failed to fetch user sites',
); );
} }
Future<int> fetchUserFilteredSites(String userId) async { Future<int> fetchUserFilteredSites(String userId) async {
if (_loading) return -2; if (_loading) return -2;
return _performApiCall( return _performApiCall(
@ -160,6 +141,7 @@ class SiteRequestProvider extends ChangeNotifier {
}, },
errorMessage: 'Failed to fetch user sites', errorMessage: 'Failed to fetch user sites',
); );
} }
/// Submits a site request to the server /// Submits a site request to the server

@ -13,7 +13,6 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
@ -75,10 +74,10 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
return; return;
} }
_formKey.currentState!.save(); _formKey.currentState!.save();
List<GenericAttachmentModel> attachement = []; List<AssetTransferAttachment> attachement = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
attachement.add(GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType)); attachement.add(AssetTransferAttachment(id: item.id, attachmentName: fileName));
} }
_transferModel.attachments = attachement; _transferModel.attachments = attachement;
@ -156,9 +155,8 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
SingleItemDropDownMenu<Site, SameOrgSiteProvider>( SingleItemDropDownMenu<Site, SiteProvider>(
context: context, context: context,
requestById: context.userProvider.user?.clientId,
title: context.translation.site, title: context.translation.site,
initialValue: _assetDestination.site, initialValue: _assetDestination.site,
disableValue: isInternal ? null : _pickedAsset?.site, disableValue: isInternal ? null : _pickedAsset?.site,
@ -247,9 +245,7 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
23.height, 23.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
showAsListView: true,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.transferAsset.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),

@ -5,17 +5,17 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/site_request_module/models/dropdown_models.dart';
import 'package:test_sa/modules/site_request_module/providers/site_request_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/multiple_item_drop_down_menu.dart'; import 'package:test_sa/new_views/common_widgets/multiple_item_drop_down_menu.dart';
import 'package:test_sa/providers/department_provider.dart'; import 'package:test_sa/providers/department_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/equipment/asset_status_buttons.dart';
import '../../../models/device/asset_search.dart'; import '../../../models/device/asset_search.dart';
import '../../../new_views/common_widgets/app_lazy_loading.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart';
import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../../new_views/common_widgets/default_app_bar.dart';
@ -33,13 +33,11 @@ class DeviceFilterScreen extends StatefulWidget {
class _DeviceFilterScreenState extends State<DeviceFilterScreen> { class _DeviceFilterScreenState extends State<DeviceFilterScreen> {
late DeviceSearch filter; late DeviceSearch filter;
Lookup? _commissioningStatus; Lookup? _commissioningStatus;
List<SiteRequestSiteModel> _selectedSites = []; List<Site> _selectedSites = [];
List<Lookup> _selectedDepartments = []; List<Lookup> _selectedDepartments = [];
String? startDate, endDate; String? startDate, endDate;
bool loading = false; bool loading = false;
List<SiteRequestSiteModel> userSites = [];
@override @override
void initState() { void initState() {
filter = widget.data ?? DeviceSearch(); filter = widget.data ?? DeviceSearch();
@ -49,15 +47,11 @@ class _DeviceFilterScreenState extends State<DeviceFilterScreen> {
startDate = filter.supplyDateFrom; startDate = filter.supplyDateFrom;
endDate = filter.supplyDateTo; endDate = filter.supplyDateTo;
_commissioningStatus = filter.assetStatus; _commissioningStatus = filter.assetStatus;
final departmentProvider = Provider.of<DepartmentProvider>(context, listen: false); final departmentProvider = Provider.of<DepartmentProvider>(context, listen: false);
Utils.showLoading(context); final siteProvider = Provider.of<SiteProvider>(context, listen: false);
if (departmentProvider.items.isEmpty ?? true) await departmentProvider.getData(); if (departmentProvider.items.isEmpty ?? true) await departmentProvider.getData();
if (userSites.isEmpty) { if (siteProvider.items.isEmpty ?? true) await siteProvider.getData();
userSites = await Provider.of<SiteRequestProvider>(context, listen: false).getSitesByUserId(context.userProvider.user?.userID ?? "");
}
await Future.delayed(const Duration(milliseconds: 100));
Utils.hideLoading(context);
// Initialize selected departments from filter // Initialize selected departments from filter
if (filter.departments != null && filter.departments!.isNotEmpty) { if (filter.departments != null && filter.departments!.isNotEmpty) {
_selectedDepartments = []; _selectedDepartments = [];
@ -76,11 +70,11 @@ class _DeviceFilterScreenState extends State<DeviceFilterScreen> {
if (filter.sites != null && filter.sites!.isNotEmpty) { if (filter.sites != null && filter.sites!.isNotEmpty) {
_selectedSites = []; _selectedSites = [];
for (var siteName in filter.sites!) { for (var siteName in filter.sites!) {
final match = userSites.firstWhere( final match = siteProvider.items.firstWhere(
(site) => site.name == siteName, (site) => site.name == siteName,
orElse: () => SiteRequestSiteModel(id: '', name: ''), orElse: () => Site(),
); );
if (match.identifier != null) { if (match.id != null) {
_selectedSites.add(match); _selectedSites.add(match);
} }
} }
@ -123,15 +117,14 @@ class _DeviceFilterScreenState extends State<DeviceFilterScreen> {
ListView( ListView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
children: [ children: [
// AssetStatusButtons( AssetStatusButtons(
// initialValue: _commissioningStatus, initialValue: _commissioningStatus,
// onSelect: (value) { onSelect: (value) {
// if (value != null) { if (value != null) {
// _commissioningStatus = value; _commissioningStatus = value;
// } }
// }, },
// ), ),
context.translation.filter.heading5(context).custom(color: AppColor.textStyleColor(context)),
16.height, 16.height,
MultipleItemDropDownMenu<Lookup, DepartmentProvider>( MultipleItemDropDownMenu<Lookup, DepartmentProvider>(
context: context, context: context,
@ -152,12 +145,11 @@ class _DeviceFilterScreenState extends State<DeviceFilterScreen> {
}, },
), ),
12.height, 12.height,
MultipleItemDropDownMenu<SiteRequestSiteModel, NullableLoadingProvider>( MultipleItemDropDownMenu<Site, SiteProvider>(
context: context, context: context,
title: context.translation.bySite, title: context.translation.bySite,
initialValue: _selectedSites, initialValue: _selectedSites,
showAsBottomSheet: true, showAsBottomSheet: true,
staticData: userSites,
// backgroundColor: AppColor.fieldBgColor(context), // backgroundColor: AppColor.fieldBgColor(context),
backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white, backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white,
showShadow: true, showShadow: true,

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cx_module/chat/chat_widget.dart'; import 'package:test_sa/modules/cx_module/chat/chat_widget.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/widgets/bottom_sheets/rejection_reason_bottom_sheet.dart'; import 'package:test_sa/views/widgets/bottom_sheets/rejection_reason_bottom_sheet.dart';
@ -65,8 +64,8 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else { } else {
_model = snapshot.data; _model = snapshot.data as DeviceTransfer?;
_attachments = _model?.assetTransferAttachments?.map((e) => File(e.name ?? '')).toList() ?? []; _attachments = _model?.assetTransferAttachments?.map((e) => File(e.attachmentName ?? '')).toList() ?? [];
return _model != null return _model != null
? Form( ? Form(
key: _formKey, key: _formKey,
@ -76,7 +75,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
stateCode: 200, stateCode: 200,
onRefresh: () async {}, onRefresh: () async {},
child: SingleChildScrollView( child: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
children: [ children: [
Column( Column(
@ -123,22 +121,12 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (_attachments.isNotEmpty) ...[ if (_attachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: _model?.assetTransferAttachments?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
FilesList(
showAsListView: true,
types: _model?.assetTransferAttachments != null
? _model!.assetTransferAttachments!
.whereType<GenericAttachmentModel>()
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty)
.map((toElement) => toElement.documentType!.name!)
.toList()
: [],
images: _model?.assetTransferAttachments?.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
] ]
], ],
), ),
], ],
).toShadowContainer(context), ).toShadowContainer(context, padding: 16),
8.height, 8.height,
if (_model?.transferType?.value == 1) ...[ if (_model?.transferType?.value == 1) ...[
_internalRequestDetailsCard() _internalRequestDetailsCard()
@ -183,7 +171,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
], ],
], ],
), ).paddingAll(16),
), ),
), ),
) )

@ -13,7 +13,6 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
@ -117,14 +116,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers; _formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers;
} }
try { try {
_formModel.assetTransferAttachments ??= [];
List<GenericAttachmentModel> newAttachments = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
newAttachments.add(GenericAttachmentModel(id: item.id, documentType: item.documentType, name: fileName)); _formModel.assetTransferAttachments!.add(AssetTransferAttachment(id: item.id, attachmentName: fileName));
_formModel.attachments = _formModel.assetTransferAttachments;
} }
_formModel.assetTransferAttachments = [...?_formModel.assetTransferAttachments, ...newAttachments];
_formModel.attachments = _formModel.assetTransferAttachments;
} catch (error) { } catch (error) {
print(error); print(error);
} }
@ -208,7 +204,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override @override
void initState() { void initState() {
_formModel.fromDetails(widget.model); _formModel.fromDetails(widget.model);
attachments = widget.model.assetTransferAttachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt()??0, name: e.name!)).toList() ?? []; attachments = widget.model.assetTransferAttachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt()??0, name: e.attachmentName!)).toList() ?? [];
calculateWorkingTime(); calculateWorkingTime();
super.initState(); super.initState();
} }
@ -297,8 +293,6 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
8.height, 8.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
showAsListView: true,
moduleId: RequestAttachmentTypeEnum.transferAsset.id,
attachment: attachments, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,

@ -3,19 +3,14 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_comments.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_comments.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/cx_module/chat/chat_widget.dart'; import 'package:test_sa/modules/cx_module/chat/chat_widget.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
@ -97,7 +92,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
return const ALoading(); return const ALoading();
} else if (snap.hasData) { } else if (snap.hasData) {
_model = snap.data as GasRefillModel; _model = snap.data as GasRefillModel;
_attachments = _model.gasRefillAttachments?.whereType<GenericAttachmentModel>().map((e) => File(e.name ?? '')).toList() ?? []; _attachments = _model.gasRefillAttachments?.map((e) => File(e.attachmentName ?? '')).toList() ?? [];
isDataUpdated = false; isDataUpdated = false;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -238,11 +233,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
if (_attachments.isNotEmpty) ...[ if (_attachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: _model.gasRefillAttachments?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
FilesList(
showAsListView: true,
types: _model.gasRefillAttachments?.whereType<GenericAttachmentModel>().where((e) => e.documentType != null && e.documentType!.name != null).map((toElement) => toElement.documentType!.name!).toList() ?? [],
images: _model.gasRefillAttachments?.whereType<GenericAttachmentModel>().where((e) => e.name != null).map((e) => URLs.getFileUrl(e.name!) ?? '').toList() ?? []),
], ],
], ],
).expanded, ).expanded,

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -217,9 +216,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
8.height, 8.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
showAsListView: true,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.gasRefill.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -241,7 +238,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
_gasModel.gasRefillAttachments = []; _gasModel.gasRefillAttachments = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_gasModel.gasRefillAttachments?.add(GenericAttachmentModel(id: item.id, moduleReferenceId: _gasModel.id ?? 0, name: fileName, documentType: item.documentType)); _gasModel.gasRefillAttachments?.add(GasRefillAttachments(id: item.id, gasRefillId: _gasModel.id ?? 0, attachmentName: fileName));
} }
await _gasRefillProvider?.addGasRefillRequest( await _gasRefillProvider?.addGasRefillRequest(
context: context, context: context,

@ -11,7 +11,6 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
@ -87,7 +86,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
} catch (ex) {} } catch (ex) {}
} }
if (_formModel.gasRefillAttachments != null && _formModel.gasRefillAttachments!.isNotEmpty) { if (_formModel.gasRefillAttachments != null && _formModel.gasRefillAttachments!.isNotEmpty) {
_attachments.addAll(_formModel.gasRefillAttachments!.whereType<GenericAttachmentModel>().where((e) => e.id != null && e.name != null).map((e) => GenericAttachmentModel(id: e.id, name: e.name, documentType: e.documentType)).toList()); _attachments.addAll(_formModel.gasRefillAttachments!.map((e) => GenericAttachmentModel(id: e.id, name: e.attachmentName!)).toList());
} }
} }
@ -183,7 +182,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
_formModel.gasRefillAttachments = []; _formModel.gasRefillAttachments = [];
for (var item in _attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_formModel.gasRefillAttachments?.add(GenericAttachmentModel(id: item.id, moduleReferenceId: _formModel.id ?? 0, name: fileName, documentType: item.documentType)); _formModel.gasRefillAttachments?.add(GasRefillAttachments(id: item.id, gasRefillId: _formModel.id ?? 0, attachmentName: fileName));
} }
await _gasRefillProvider?.updateGasRefill(status: status, model: _formModel).then((success) { await _gasRefillProvider?.updateGasRefill(status: status, model: _formModel).then((success) {
@ -293,8 +292,6 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
attachment: _attachments, attachment: _attachments,
moduleId: RequestAttachmentTypeEnum.gasRefill.id,
showAsListView: true,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),

@ -5,12 +5,10 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/enum_extensions.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -46,7 +44,7 @@ class CreateTaskView extends StatefulWidget {
} }
class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStateMixin { class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStateMixin {
List<GenericAttachmentModel> attachments = []; final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<Asset> _deviceList = []; List<Asset> _deviceList = [];
@ -60,9 +58,7 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
// WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of<TaskTypeProvider>(context, listen: false).reset();
Provider.of<TaskTypeProvider>(context, listen: false).reset();
// });
} }
@override @override
@ -120,11 +116,14 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
AttachmentPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.taskRequest.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
showAsListView: true,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
//verify this if not required delete this ..
onChange: (attachments) {
attachments = attachments;
setState(() {});
},
), ),
], ],
).toShadowContainer(context).paddingAll(16), ).toShadowContainer(context).paddingAll(16),
@ -458,7 +457,7 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
} }
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_addTaskModel?.attachments?.add(GenericAttachmentModel(id: item.id, name: fileName, documentType: item.documentType)); _addTaskModel?.attachments?.add(TaskJobAttachment(id: item.id, name: fileName));
} }
TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false); TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false);
await taskRequestProvider.addTask(context: context, task: _addTaskModel!); await taskRequestProvider.addTask(context: context, task: _addTaskModel!);

@ -9,7 +9,6 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/task_request/task_request_model.dart'; import 'package:test_sa/models/new_models/task_request/task_request_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
@ -160,11 +159,7 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
if (taskProvider.taskRequestModel?.taskJobAttachments?.isNotEmpty ?? false) ...[ if (taskProvider.taskRequestModel?.taskJobAttachments?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation), InfoHeader16Widget("Attachments".addTranslation),
4.height, FilesList(images: taskProvider.taskRequestModel!.taskJobAttachments!.map((toElement) => URLs.getFileUrl(toElement.name ?? '') ?? '').toList()),
FilesList(
showAsListView: true,
types: taskProvider.taskRequestModel!.taskJobAttachments!.whereType<GenericAttachmentModel>().where((e) => e.name != null).map((toElement) => toElement.documentType?.name ?? '').toList(),
images: taskProvider.taskRequestModel!.taskJobAttachments!.whereType<GenericAttachmentModel>().where((e) => e.name != null).map((toElement) => URLs.getFileUrl(toElement.name ?? '') ?? '').toList()),
], ],
buildTechnicalComments(taskModel: taskModel), buildTechnicalComments(taskModel: taskModel),
], ],

@ -15,7 +15,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
@ -64,7 +63,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<GenericAttachmentModel> attachments = []; List<GenericAttachmentModel> attachments = [];
List<GenericAttachmentModel> otherAttachments = []; List<TaskJobAttachment> otherAttachments = [];
bool installationType = true; bool installationType = true;
String comments = ''; String comments = '';
List<TimerHistoryModel> timerList = []; List<TimerHistoryModel> timerList = [];
@ -88,8 +87,8 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
_taskProvider?.refresh(); _taskProvider?.refresh();
calculateWorkingTime(helperModel: taskModel!); calculateWorkingTime(helperModel: taskModel!);
if (taskModel.taskJobAttachments != null) { if (taskModel.taskJobAttachments != null) {
attachments = taskModel.taskJobAttachments!.whereType<GenericAttachmentModel>().where((e) => e.createdBy == _userProvider.user?.userID && e.id != null).map((e) => GenericAttachmentModel(id: e.id, name: e.name ?? '',documentType: e.documentType)).toList(); attachments = taskModel.taskJobAttachments!.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => GenericAttachmentModel(id: e.id, name: e.name ?? '')).toList();
otherAttachments = taskModel.taskJobAttachments!.whereType<GenericAttachmentModel>().where((e) => e.createdBy != _userProvider.user?.userID).toList(); otherAttachments = taskModel.taskJobAttachments?.where((e) => e.createdBy != _userProvider.user?.userID).toList() ?? [];
} }
} }
@ -192,9 +191,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
20.height, 20.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
showAsListView: true,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.taskRequest.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -257,13 +254,13 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
if (validate(model: taskModel)) { if (validate(model: taskModel)) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
List<GenericAttachmentModel> taskAttachment = []; List<TaskJobAttachment> taskAttachment = [];
if (otherAttachments.isNotEmpty) { if (otherAttachments.isNotEmpty) {
taskAttachment.addAll(otherAttachments); taskAttachment.addAll(otherAttachments);
} }
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
taskAttachment.add(GenericAttachmentModel(id: item.id, name: fileName,documentType: item.documentType)); taskAttachment.add(TaskJobAttachment(id: item.id, name: fileName));
} }
taskModel.taskJobAttachments = taskAttachment; taskModel.taskJobAttachments = taskAttachment;
taskModel.taskJobActivityEngineerTimers = []; taskModel.taskJobActivityEngineerTimers = [];

@ -11,7 +11,6 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/traf_customer.dart'; import 'package:test_sa/models/new_models/traf_customer.dart';
@ -517,9 +516,7 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
12.height, 12.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
showAsListView: true,
attachment: attachments, attachment: attachments,
moduleId: RequestAttachmentTypeEnum.traf.id,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
@ -625,7 +622,7 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
trafRequest?.attachments!.add( trafRequest?.attachments!.add(
GenericAttachmentModel(id: 0, moduleReferenceId: 0, name: fileName, documentType: item.documentType), Attachments(id: 0, trafId: 0, attachmentName: fileName),
); );
} }

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/modules/traf_module/traf_request_provider.dart'; import 'package:test_sa/modules/traf_module/traf_request_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
@ -64,7 +63,7 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
if (isLoading) return const ALoading(); if (isLoading) return const ALoading();
TrafRequestProvider trafProvider = Provider.of<TrafRequestProvider>(context, listen: false); TrafRequestProvider trafProvider = Provider.of<TrafRequestProvider>(context, listen: false);
if (trafProvider.trafRequestDataModel?.attachments != null) { if (trafProvider.trafRequestDataModel?.attachments != null) {
_attachments = trafProvider.trafRequestDataModel!.attachments!.whereType<GenericAttachmentModel>().map((e) => File(URLs.getFileUrl(e.name ?? '') ?? '')).toList(); _attachments = trafProvider.trafRequestDataModel!.attachments!.map((e) => File(URLs.getFileUrl(e.attachmentName ?? '') ?? '')).toList();
} }
return trafProvider.trafRequestDataModel == null return trafProvider.trafRequestDataModel == null
? const NoDataFound().center ? const NoDataFound().center
@ -151,17 +150,13 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
], ],
if (_attachments.isNotEmpty) ...[ if (_attachments.isNotEmpty) ...[
4.height, 4.height,
InfoHeader16Widget("Attachments".addTranslation), Text(
4.height, // todo @waseem conver to header
FilesList( "Attachments".addTranslation,
showAsListView: true, style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
types: data.attachments ),
?.whereType<GenericAttachmentModel>() // 8.height,
.where((e) => e.documentType != null && e.documentType!.name!.isNotEmpty) FilesList(images: _attachments.map((e) => URLs.getFileUrl(e.path ?? '') ?? '').toList() ?? []),
.map((toElement) => toElement.documentType!.name!)
.toList() ??
[],
images: _attachments.map((e) => URLs.getFileUrl(e.path ?? '') ?? '').toList()),
], ],
], ],
).toShadowContainer(context); ).toShadowContainer(context);

@ -1,6 +1,3 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
class TrafRequestModel { class TrafRequestModel {
List<TrafRequestDataModel>? trafRequestDataModel; List<TrafRequestDataModel>? trafRequestDataModel;
int? totalRows; int? totalRows;
@ -95,7 +92,7 @@ class TrafRequestDataModel {
String? isCombinationName; String? isCombinationName;
String? usedWithCombination; String? usedWithCombination;
String? comment; String? comment;
List<GenericAttachmentModel>? attachments; List<Attachments>? attachments;
bool? isFromMobile; bool? isFromMobile;
int? isBudgetId; int? isBudgetId;
String? isBudgetName; String? isBudgetName;
@ -312,9 +309,9 @@ class TrafRequestDataModel {
comment = json['comment']; comment = json['comment'];
isFromMobile = json['isFromMobile']; isFromMobile = json['isFromMobile'];
if (json['attachments'] != null) { if (json['attachments'] != null) {
attachments = <GenericAttachmentModel>[]; attachments = <Attachments>[];
json['attachments'].forEach((v) { json['attachments'].forEach((v) {
attachments!.add(GenericAttachmentModel.fromTrafJson(v)); attachments!.add(new Attachments.fromJson(v));
}); });
} }
isBudgetId = json['isBudgetId']; isBudgetId = json['isBudgetId'];
@ -429,8 +426,8 @@ class TrafRequestDataModel {
data['usedWithCombination'] = this.usedWithCombination; data['usedWithCombination'] = this.usedWithCombination;
data['comment'] = this.comment; data['comment'] = this.comment;
data['isFromMobile'] = this.isFromMobile; data['isFromMobile'] = this.isFromMobile;
if (attachments != null) { if (this.attachments != null) {
data['attachments'] = attachments!.map((v) => v.toTrafJson()).toList(); data['attachments'] = this.attachments!.map((v) => v.toJson()).toList();
} else { } else {
data['attachments'] = []; data['attachments'] = [];
} }
@ -539,7 +536,7 @@ class TrafRequestDataModel {
data['isBudgetId'] = isBudgetId; data['isBudgetId'] = isBudgetId;
data['attachments'] = data['attachments'] =
attachments?.map((v) => v.toTrafJson() ?? {}).toList() ?? []; attachments?.map((v) => v.toJson()).toList() ?? [];
return data; return data;
} }
@ -635,28 +632,25 @@ class Departments {
return data; return data;
} }
} }
//TODO need to remove this
// class Attachments { class Attachments {
// int? id; int? id;
// int? trafId; int? trafId;
// String? attachmentName; String? attachmentName;
// Lookup ? documentType;
// Attachments({this.id, this.trafId, this.attachmentName});
// Attachments({this.id, this.trafId, this.attachmentName,this.documentType});
// Attachments.fromJson(Map<String, dynamic> json) {
// Attachments.fromJson(Map<String, dynamic> json) { id = json['id'];
// id = json['id']; trafId = json['trafId'];
// trafId = json['trafId']; attachmentName = json['attachmentName'];
// attachmentName = json['attachmentName']; }
// documentType = json['documentType'];
// } Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// Map<String, dynamic> toJson() { data['id'] = this.id;
// final Map<String, dynamic> data = new Map<String, dynamic>(); data['trafId'] = this.trafId;
// data['id'] = this.id; data['attachmentName'] = this.attachmentName;
// data['trafId'] = this.trafId; return data;
// data['attachmentName'] = this.attachmentName; }
// data['documentTypeId'] = this.documentType?.id; }
// return data;
// }
// }

@ -7,7 +7,6 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/request_attachment_type_enum.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
@ -59,7 +58,7 @@ class _UpdateTrafRequestPageState extends State<UpdateTrafRequestPage> {
Provider.of<RecommendationLookupProvider>(context, listen: false).reset(); Provider.of<RecommendationLookupProvider>(context, listen: false).reset();
trafRequestProvider = Provider.of<TrafRequestProvider>(context, listen: false); trafRequestProvider = Provider.of<TrafRequestProvider>(context, listen: false);
trafRequest = trafRequestProvider.trafRequestDataModel!; trafRequest = trafRequestProvider.trafRequestDataModel!;
attachments = trafRequest.attachments?.whereType<GenericAttachmentModel>().map((item) => GenericAttachmentModel(id: item.id, name: item.name ?? '')).toList() ?? []; attachments = trafRequest.attachments?.map((item) => GenericAttachmentModel(id: item.id, name: item.attachmentName)).toList() ?? [];
} }
@override @override
@ -213,8 +212,6 @@ class _UpdateTrafRequestPageState extends State<UpdateTrafRequestPage> {
12.height, 12.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
showAsListView: true,
moduleId: RequestAttachmentTypeEnum.traf.id,
attachment: attachments, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
@ -236,7 +233,7 @@ class _UpdateTrafRequestPageState extends State<UpdateTrafRequestPage> {
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
trafRequest.attachments!.add( trafRequest.attachments!.add(
GenericAttachmentModel(id: item.id, moduleReferenceId: item.id, name: fileName, documentType: item.documentType), Attachments(id: item.id, trafId: item.id, attachmentName: fileName),
); );
} }
} }

@ -106,7 +106,6 @@ class _CreateRequestTypeBottomSheetState extends State<CreateRequestTypeBottomSh
icon: requestList[index].icon, icon: requestList[index].icon,
label: requestList[index].title, label: requestList[index].title,
onTap: () { onTap: () {
log('route name is ${requestList[index].routeName}');
Navigator.pushReplacementNamed(context, requestList[index].routeName); Navigator.pushReplacementNamed(context, requestList[index].routeName);
}, },
), ),

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save