Multiple Images Everywhere

main_design2.0
zaid_daoud 2 years ago
parent 6d6fc30806
commit fe9ca387ed

@ -18,7 +18,7 @@ class Pentry {
DateTime expectedVisitDate;
String travelingHours;
String image;
File file;
List<File> files = [];
// List<Contact> contacts;
List<PPMCheckList> ppmCheckLists;
@ -37,7 +37,7 @@ class Pentry {
this.actualVisitDate,
this.expectedVisitDate,
this.image,
this.file,
this.files,
// this.contacts,
this.ppmCheckLists,
this.calibrationTools,
@ -86,10 +86,8 @@ class Pentry {
map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String();
map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
}
if (file != null) {
map["vAttachments"] = [
{"attachmentName": (file.path.split("/").last + base64Encode(file.readAsBytesSync()))}
];
if (files?.isNotEmpty ?? false) {
map["vAttachments"] = files.map((file) => {"attachmentName": (file.path.split("/").last + base64Encode(file.readAsBytesSync()))}).toList();
}
map["travelingHours"] = travelingHours;
// if(contacts?.isNotEmpty == true) {
@ -157,7 +155,7 @@ class Pentry {
DateTime expectedVisitDate,
String travelingHours,
String image,
File imageFile,
List<File> files,
List<PPMCheckList> ppmCheckLists,
List<CalibrationTool> calibrationTools,
List<PMKit> pmKits,
@ -172,7 +170,7 @@ class Pentry {
expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate,
travelingHours: travelingHours ?? this.travelingHours,
image: image ?? this.image,
file: imageFile ?? this.file,
files: files ?? this.files,
ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(),
calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(),
pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(),

@ -198,6 +198,11 @@ class ServiceReport {
_parts = partsList.map((e) => Part.fromJson(e["sparePart"], reportJson: e)).toList();
}
}
List<String> _files = [];
if (parsedJson["attachmentsWorkOrder"] != null && parsedJson["attachmentsWorkOrder"] is List) {
List list = parsedJson["attachmentsWorkOrder"];
_files = list.map((e) => (URLs.getFileUrl(e["name"]))).toList();
}
return ServiceReport(
id: id,
assetType: Lookup.fromJson(parsedJson["assetType"]),
@ -208,7 +213,7 @@ class ServiceReport {
equipmentStatus: Lookup.fromJson(parsedJson["equipmentStatus"]),
type: Lookup.fromJson(parsedJson["typeOfWO"]),
faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null,
files: _files,
// faultDescription: parsedJson["faultDescription"],
// startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""),
// endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""),

@ -16,6 +16,7 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart';
import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart';
import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart';
@ -27,7 +28,6 @@ import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/buttons/app_button.dart';
import '../../widgets/date_and_time/date_picker.dart';
import '../../widgets/images/mini_one_file_picker.dart';
import '../../widgets/status/report/service_report_fault_description.dart';
import '../../widgets/status/report/service_report_reasons.dart';
import '../../widgets/titles/app_sub_title.dart';
@ -47,7 +47,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
SearchWorkOrder _subWorkOrders;
Lookup _serviceReportReason = const Lookup();
ServiceReport _serviceReport;
File _file;
final List<File> _files = [];
bool _isLoading = false;
bool _validate = false;
@ -249,6 +249,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
],
),
const SizedBox(height: 8),
MultiFilesPicker(label: subtitle.deviceFiles, files: _files),
const SizedBox(height: 8),
InkWell(
onTap: () async {
await showModalBottomSheet(
@ -302,15 +304,14 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
),
),
),
const SizedBox(height: 8),
AMiniOneFilePicker(
file: _file,
onPick: (file) {
_file = file;
_subWorkOrders.attachmentsWorkOrder ??= [];
_subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
},
),
// AMiniOneFilePicker(
// file: _file,
// onPick: (file) {
// _file = file;
// _subWorkOrders.attachmentsWorkOrder ??= [];
// _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
// },
// ),
const SizedBox(height: 50),
],
),
@ -327,6 +328,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_validate = true;
setState(() {});
if (validate()) {
_subWorkOrders.attachmentsWorkOrder ??= [];
for (var file in _files) {
_subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
}
if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Working hours required");
return;

@ -24,7 +24,6 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/images/mini_one_file_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart';
@ -35,6 +34,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../widgets/date_and_time/date_picker.dart';
import '../../../../widgets/images/multi_image_picker.dart';
import '../../../../widgets/status/report/service_report_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart';
@ -60,7 +60,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
bool _showCommentField = false;
Subtitle _subtitle;
File _file;
final List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _faultController = TextEditingController();
@ -628,25 +628,27 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const ASubTitle("Attachment"),
AMiniOneFilePicker(
//error: _validate && _serviceReport.image == null,
file: _file,
onPick: (file) {
_file = file;
_serviceReport.files[0] = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
},
),
],
),
),
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// const ASubTitle("Attachments"),
// AMiniOneFilePicker(
// //error: _validate && _serviceReport.image == null,
// file: _file,
// onPick: (file) {
// _file = file;
// _serviceReport.files[0] = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
// },
// ),
// ],
// ),
// ),
],
),
const SizedBox(height: 8),
MultiFilesPicker(label: "Attachments", files: _files),
const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation),
const SizedBox(height: 4),
ServiceReportRepairLocation(
@ -924,7 +926,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_isLoading = true;
setState(() {});
_serviceReport.files ??= [];
for (var file in _files) {
_serviceReport.files.add("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}");
}
int status = await _serviceRequestsProvider.createServiceReport(
user: _userProvider.user,
host: _settingProvider.host,

@ -61,7 +61,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
bool _showCommentField = false;
Subtitle _subtitle;
final List<File> _images = [];
List<File> _images = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _faultController = TextEditingController();
@ -74,6 +74,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
@override
void initState() {
_serviceReport = widget.report;
_images = widget.report?.files?.map((e) => File(e))?.toList();
super.initState();
}

@ -9,12 +9,12 @@ import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/images/images_list.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.dart';
import '../../../widgets/loaders/image_loader.dart';
class VisitDetailsPage extends StatelessWidget {
static const String id = "/visit-details";
@ -51,11 +51,14 @@ class VisitDetailsPage extends StatelessWidget {
buttonSize: 42,
backgroundColor: AColors.green,
onPressed: () async {
Navigator.of(context).push(MaterialPageRoute(
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => EditPentry(
visit: visit,
pentry: visit.pentry,
)));
visit: visit,
pentry: visit.pentry,
),
),
);
},
),
const SizedBox(width: 42)
@ -66,24 +69,25 @@ class VisitDetailsPage extends StatelessWidget {
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 16),
children: [
const SizedBox(
height: 8,
),
const SizedBox(height: 8),
MaterialButton(
padding: EdgeInsets.zero,
onPressed: () {
if (visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false)) {
Navigator.of(context).push(MaterialPageRoute(
if ((visit.images?.isNotEmpty ?? false) && (visit.images?.first?.isNotEmpty ?? false)) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => Scaffold(
body: InteractiveViewer(
child: Center(
child: ImageLoader(
url: visit.images.first,
boxFit: BoxFit.contain,
),
),
body: InteractiveViewer(
child: Center(
child: ImageLoader(
url: visit.images.first,
boxFit: BoxFit.contain,
),
)));
),
),
),
),
);
}
},
child: SizedBox(

@ -9,11 +9,11 @@ import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/mini_one_file_picker.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../images/multi_image_picker.dart';
import '../status/pentry/pentry_status_mune.dart';
class PentryInfoForm extends StatefulWidget {
@ -33,6 +33,7 @@ class PentryInfoForm extends StatefulWidget {
class _PentryInfoFormState extends State<PentryInfoForm> {
@override
Widget build(BuildContext context) {
widget.model?.files ??= [];
final subtitle = AppLocalization.of(context).subtitle;
final userProvider = Provider.of<UserProvider>(context);
return ListView(
@ -149,23 +150,21 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
ATextFormField(
initialValue: (widget.model.travelingHours ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.number,
onChange: (value) {
widget.model.travelingHours = value;
},
),
const SizedBox(
height: 12,
),
const ASubTitle("PPM Attachment"),
AMiniOneFilePicker(
//error: _validate && _serviceReport.image == null,
file: widget.model.file,
onPick: (file) {
widget.model.file = file;
},
),
const SizedBox(height: 12),
MultiFilesPicker(label: "PPM Attachments", files: widget.model.files),
// AMiniOneFilePicker(
// //error: _validate && _serviceReport.image == null,
// file: widget.model.file,
// onPick: (file) {
// widget.model.file = file;
// },
// ),
const SizedBox(
height: 8,
),

Loading…
Cancel
Save