Add Docker support and enhance data models for tender details

- Introduced a .dockerignore file to optimize Docker builds by excluding unnecessary files.
- Updated the Dockerfile to use a Flutter base image, enabling web builds for the application.
- Added new data models for `Lot` and `OrganizationAddress` to represent tender details more accurately.
- Enhanced the `Organization` model to include `companyId` and a nested `address` field.
- Updated the `TenderData` model to include new fields such as `noticeTypeCode`, `formType`, and `lots`, reflecting the API response structure.
- Regenerated necessary code for data models to ensure compatibility with the updated structures.
This commit is contained in:
AmirReza Jamali
2026-06-03 13:32:42 +03:30
parent 83b77c05ef
commit dde66521f6
35 changed files with 1362 additions and 659 deletions
@@ -9,7 +9,12 @@ import 'package:tm_app/views/detail/widgets/tender_detail_info_section.dart';
import '../../../core/constants/assets.dart';
import '../../shared/flag.dart';
import '../strings/tender_details_strings.dart';
import 'detail_drop_down.dart';
// AI-NOTE (for PR reviewer): Import is intentionally kept but commented out.
// The static/mock sections it supports (key risks, winning chance, project id,
// service/requirements/background dropdowns) were disabled — NOT removed —
// because they were hard-coded placeholders, not backend data. Re-enable this
// import together with those sections once the API provides that data.
// import 'detail_drop_down.dart';
class TenderDetailHeader extends StatelessWidget {
final bool isScreenBig;
@@ -41,44 +46,32 @@ class TenderDetailHeader extends StatelessWidget {
SizedBox(height: 16.0.h()),
_locationBudgetRow(),
SizedBox(height: 24.0.h()),
_projectId(),
SizedBox(height: 12.0.h()),
_winningChanceAndDificulty(),
SizedBox(height: 24.0.h()),
_keyRisksDropDown(),
SizedBox(height: 24.0.h()),
// AI-NOTE (for PR reviewer): The following mock sections are disabled
// on purpose (kept for future use). They render hard-coded values, not
// backend data, so they are commented out rather than deleted.
// _projectId(),
// SizedBox(height: 12.0.h()),
// _winningChanceAndDificulty(),
// SizedBox(height: 24.0.h()),
// _keyRisksDropDown(),
// SizedBox(height: 24.0.h()),
Divider(color: AppColors.grey20),
TenderDetailInfoSection(isScreenBig: isScreenBig, detail: detail),
SizedBox(height: 24.0.h()),
_overViewTitle(),
SizedBox(height: 12.0.h()),
_descriptionText(),
SizedBox(height: 24.0.h()),
_serviceDropDown(),
SizedBox(height: 24.0.h()),
_requirementsDropDown(),
SizedBox(height: 24.0.h()),
_backgroundDropDown(),
// AI-NOTE (for PR reviewer): Mock dropdowns disabled (kept for future).
// _serviceDropDown(),
// SizedBox(height: 24.0.h()),
// _requirementsDropDown(),
// SizedBox(height: 24.0.h()),
// _backgroundDropDown(),
],
),
);
}
Widget _serviceDropDown() =>
const DetailDropDown(title: 'Servive/Product', items: []);
Widget _backgroundDropDown() =>
const DetailDropDown(title: 'Background', items: []);
Widget _requirementsDropDown() {
return const DetailDropDown(
title: 'Requirements (Summary)',
items: [
'Market consultation for selecting and procuring a Customer Data Platform (CDP) to unify student data from multiple sources and improve personalization and marketing.',
],
);
}
Widget _descriptionText() {
return Text(
detail.description ?? '',
@@ -101,6 +94,26 @@ class TenderDetailHeader extends StatelessWidget {
);
}
// AI-NOTE (for PR reviewer): The mock widget builders below are intentionally
// preserved as commented-out code. They produce static placeholder content
// (not backend-driven) and will be reinstated once the API supplies the
// corresponding fields. Do not flag them as dead code — keep as-is.
/*
Widget _serviceDropDown() =>
const DetailDropDown(title: 'Servive/Product', items: []);
Widget _backgroundDropDown() =>
const DetailDropDown(title: 'Background', items: []);
Widget _requirementsDropDown() {
return const DetailDropDown(
title: 'Requirements (Summary)',
items: [
'Market consultation for selecting and procuring a Customer Data Platform (CDP) to unify student data from multiple sources and improve personalization and marketing.',
],
);
}
Widget _keyRisksDropDown() {
return const DetailDropDown(
title: 'Key risks & dealbreakers',
@@ -146,7 +159,7 @@ class TenderDetailHeader extends StatelessWidget {
borderRadius: BorderRadius.circular(8),
),
child: Text(
'Difficulty 2/5',
'Difficulty 2/5',
style: TextStyle(
color: AppColors.blue10,
fontSize: 12.0.sp(),
@@ -167,7 +180,7 @@ class TenderDetailHeader extends StatelessWidget {
borderRadius: BorderRadius.circular(8),
),
child: Text(
'Project ID 6243372025NLD',
'Project ID 6243372025NLD',
style: TextStyle(
color: AppColors.blue10,
fontSize: 12.0.sp(),
@@ -176,6 +189,7 @@ class TenderDetailHeader extends StatelessWidget {
),
);
}
*/
Widget _locationBudgetRow() {
return Row(