add success message to add patient, edit patient,patient notes, patient files.
update note and file view to match UI. restrict file types in file uploud. add image viewer
This commit is contained in:
Binary file not shown.
Binary file not shown.
BIN
File_Storage/Mzanzi_Innovation_Hub/mih/Docs.pdf/xl.meta
Normal file
BIN
File_Storage/Mzanzi_Innovation_Hub/mih/Docs.pdf/xl.meta
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
File_Storage/Mzanzi_Innovation_Hub/mih/asus.jpg/xl.meta
Normal file
BIN
File_Storage/Mzanzi_Innovation_Hub/mih/asus.jpg/xl.meta
Normal file
Binary file not shown.
44
Frontend/patient_manager/lib/components/BuildFileView.dart
Normal file
44
Frontend/patient_manager/lib/components/BuildFileView.dart
Normal file
@@ -0,0 +1,44 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
|
||||
|
||||
class BuildFileView extends StatefulWidget {
|
||||
final String pdfLink;
|
||||
const BuildFileView({super.key, required this.pdfLink});
|
||||
|
||||
@override
|
||||
State<BuildFileView> createState() => _BuildFileViewState();
|
||||
}
|
||||
|
||||
class _BuildFileViewState extends State<BuildFileView> {
|
||||
late PdfViewerController pdfViewerController = PdfViewerController();
|
||||
|
||||
String getExtType(String pdfLink) {
|
||||
//print(pdfLink.split(".")[1]);
|
||||
return pdfLink.split(".")[1];
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (getExtType(widget.pdfLink).toLowerCase() == "pdf") {
|
||||
return SizedBox(
|
||||
width: 700,
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SfPdfViewer.network(
|
||||
widget.pdfLink,
|
||||
controller: pdfViewerController,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return InteractiveViewer(
|
||||
maxScale: 5.0,
|
||||
//minScale: 0.,
|
||||
child: Image.network(widget.pdfLink),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
|
||||
|
||||
class BuildPDFView extends StatefulWidget {
|
||||
final String pdfLink;
|
||||
const BuildPDFView({super.key, required this.pdfLink});
|
||||
|
||||
@override
|
||||
State<BuildPDFView> createState() => _BuildPDFViewState();
|
||||
}
|
||||
|
||||
class _BuildPDFViewState extends State<BuildPDFView> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
width: 700,
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SfPdfViewer.network(widget.pdfLink),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/BuildPdfView.dart';
|
||||
import 'package:patient_manager/components/BuildFileView.dart';
|
||||
import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/objects/files.dart';
|
||||
import 'dart:js' as js;
|
||||
//import 'dart:js' as js;
|
||||
import "package:universal_html/html.dart" as html;
|
||||
|
||||
class BuildFilesList extends StatefulWidget {
|
||||
final List<PFile> files;
|
||||
@@ -14,9 +16,78 @@ class BuildFilesList extends StatefulWidget {
|
||||
State<BuildFilesList> createState() => _BuildFilesListState();
|
||||
}
|
||||
|
||||
int indexOn = 0;
|
||||
|
||||
class _BuildFilesListState extends State<BuildFilesList> {
|
||||
int indexOn = 0;
|
||||
|
||||
void viewFilePopUp(String filename) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => Dialog(
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.all(10.0),
|
||||
width: 800.0,
|
||||
//height: 475.0,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(25.0),
|
||||
border: Border.all(color: Colors.blueAccent, width: 5.0),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
filename,
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
color: Colors.blueAccent,
|
||||
fontSize: 35.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 25.0),
|
||||
Expanded(
|
||||
child: BuildFileView(
|
||||
pdfLink: "http://localhost:9000/mih/$filename")),
|
||||
SizedBox(
|
||||
width: 300,
|
||||
height: 100,
|
||||
child: MyButton(
|
||||
onTap: () {
|
||||
html.window.open(
|
||||
'http://localhost:9000/mih/$filename', 'download');
|
||||
},
|
||||
buttonText: "Dowload",
|
||||
buttonColor: Colors.blueAccent,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 5,
|
||||
right: 5,
|
||||
width: 50,
|
||||
height: 50,
|
||||
child: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.close,
|
||||
color: Colors.red,
|
||||
size: 35,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
@@ -35,36 +106,7 @@ class _BuildFilesListState extends State<BuildFilesList> {
|
||||
subtitle: Text(widget.files[index].insert_date),
|
||||
trailing: const Icon(Icons.arrow_forward),
|
||||
onTap: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(widget.files[index].file_name),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
js.context.callMethod('open', [
|
||||
'http://localhost:9000/mih/${widget.files[index].file_name}'
|
||||
]);
|
||||
//print(object)
|
||||
},
|
||||
icon: const Icon(Icons.download),
|
||||
),
|
||||
],
|
||||
),
|
||||
content: BuildPDFView(
|
||||
pdfLink:
|
||||
"http://localhost:9000/mih/${widget.files[index].file_name}"),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: const Text("Close"))
|
||||
],
|
||||
),
|
||||
);
|
||||
viewFilePopUp(widget.files[index].file_name);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/myMLTextInput.dart';
|
||||
//import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/objects/notes.dart';
|
||||
|
||||
class BuildNotesList extends StatefulWidget {
|
||||
@@ -12,9 +14,87 @@ class BuildNotesList extends StatefulWidget {
|
||||
State<BuildNotesList> createState() => _BuildNotesListState();
|
||||
}
|
||||
|
||||
int indexOn = 0;
|
||||
|
||||
class _BuildNotesListState extends State<BuildNotesList> {
|
||||
final noteTextController = TextEditingController();
|
||||
int indexOn = 0;
|
||||
|
||||
void viewNotePopUp(String title, String note) {
|
||||
setState(() {
|
||||
noteTextController.text = note;
|
||||
});
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => Dialog(
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.all(10.0),
|
||||
width: 700.0,
|
||||
//height: 475.0,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(25.0),
|
||||
border: Border.all(color: Colors.blueAccent, width: 5.0),
|
||||
),
|
||||
child: Column(
|
||||
//mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
color: Colors.blueAccent,
|
||||
fontSize: 35.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 25.0),
|
||||
Expanded(
|
||||
child: MyMLTextField(
|
||||
controller: noteTextController,
|
||||
hintText: "Note Details",
|
||||
editable: false,
|
||||
required: false,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 25.0),
|
||||
// SizedBox(
|
||||
// width: 300,
|
||||
// height: 100,
|
||||
// child: MyButton(
|
||||
// onTap: () {
|
||||
// Navigator.pop(context);
|
||||
// },
|
||||
// buttonText: "Close",
|
||||
// buttonColor: Colors.blueAccent,
|
||||
// textColor: Colors.white,
|
||||
// ),
|
||||
// )
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 5,
|
||||
right: 5,
|
||||
width: 50,
|
||||
height: 50,
|
||||
child: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.close,
|
||||
color: Colors.red,
|
||||
size: 35,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
@@ -34,27 +114,29 @@ class _BuildNotesListState extends State<BuildNotesList> {
|
||||
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}"), //Text(widget.notes[index].note_text),
|
||||
trailing: const Icon(Icons.arrow_forward),
|
||||
onTap: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Center(child: Text(widget.notes[index].note_name)),
|
||||
content: SizedBox(
|
||||
width: 700,
|
||||
height: 250,
|
||||
child: Text(
|
||||
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}",
|
||||
style: TextStyle(fontSize: 16),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: const Text("Close"))
|
||||
],
|
||||
),
|
||||
);
|
||||
viewNotePopUp(widget.notes[index].note_name,
|
||||
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}");
|
||||
// showDialog(
|
||||
// context: context,
|
||||
// builder: (context) => AlertDialog(
|
||||
// title: Center(child: Text(widget.notes[index].note_name)),
|
||||
// content: SizedBox(
|
||||
// width: 700,
|
||||
// height: 250,
|
||||
// child: Text(
|
||||
// "${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}",
|
||||
// style: TextStyle(fontSize: 16),
|
||||
// ),
|
||||
// ),
|
||||
// actions: [
|
||||
// TextButton(
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context);
|
||||
// },
|
||||
// child: const Text("Close"))
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/buildFilesList.dart';
|
||||
import 'package:patient_manager/components/medCertInput.dart';
|
||||
import 'package:patient_manager/components/myErrorMessage.dart';
|
||||
import 'package:patient_manager/components/mySuccessMessage.dart';
|
||||
import 'package:patient_manager/components/myTextInput.dart';
|
||||
import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/main.dart';
|
||||
@@ -47,6 +48,16 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
late PlatformFile selected;
|
||||
|
||||
Future<void> generateMedCert() async {
|
||||
//start loading circle
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
var response1 = await http.post(
|
||||
Uri.parse(endpointGenFiles),
|
||||
headers: <String, String>{
|
||||
@@ -85,8 +96,11 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
futueFiles =
|
||||
fetchFiles(endpointFiles + widget.patientIndex.toString());
|
||||
});
|
||||
String message = "Successfully added file";
|
||||
messagePopUp(message);
|
||||
// end loading circle
|
||||
Navigator.of(context).pop();
|
||||
String message =
|
||||
"The medical certificate $fileName has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
@@ -97,12 +111,22 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
|
||||
Future<void> uploadSelectedFile(PlatformFile file) async {
|
||||
//var strem = new http.ByteStream.fromBytes(file.bytes.)
|
||||
//start loading circle
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
var request = http.MultipartRequest('POST', Uri.parse(endpointFileUpload));
|
||||
request.headers['Content-Type'] = 'multipart/form-data';
|
||||
request.files.add(await http.MultipartFile.fromBytes('file', file.bytes!,
|
||||
filename: file.name.replaceAll(RegExp(r' '), '-')));
|
||||
var response1 = await request.send();
|
||||
print(response1.statusCode);
|
||||
//print(response1.statusCode);
|
||||
if (response1.statusCode == 200) {
|
||||
var response2 = await http.post(
|
||||
Uri.parse(endpointInsertFiles),
|
||||
@@ -115,15 +139,18 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
"patient_id": widget.patientIndex
|
||||
}),
|
||||
);
|
||||
print(response2.statusCode);
|
||||
//print(response2.statusCode);
|
||||
if (response2.statusCode == 201) {
|
||||
setState(() {
|
||||
selectedFileController.clear();
|
||||
futueFiles =
|
||||
fetchFiles(endpointFiles + widget.patientIndex.toString());
|
||||
});
|
||||
String message = "Successfully added file";
|
||||
messagePopUp(message);
|
||||
// end loading circle
|
||||
Navigator.of(context).pop();
|
||||
String message =
|
||||
"The medical certificate ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
@@ -170,6 +197,18 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
}
|
||||
}
|
||||
|
||||
void successPopUp(String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return MySuccessMessage(
|
||||
successType: "Success",
|
||||
successMessage: message,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void messagePopUp(error) {
|
||||
showDialog(
|
||||
context: context,
|
||||
@@ -232,7 +271,7 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
);
|
||||
}
|
||||
},
|
||||
buttonText: "Add Note",
|
||||
buttonText: "Generate",
|
||||
buttonColor: Colors.blueAccent,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
@@ -295,7 +334,10 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
child: MyButton(
|
||||
onTap: () async {
|
||||
FilePickerResult? result =
|
||||
await FilePicker.platform.pickFiles();
|
||||
await FilePicker.platform.pickFiles(
|
||||
type: FileType.custom,
|
||||
allowedExtensions: ['jpg', 'pdf'],
|
||||
);
|
||||
if (result == null) return;
|
||||
final selectedFile = result.files.first;
|
||||
setState(() {
|
||||
@@ -335,7 +377,7 @@ class _PatientFilesState extends State<PatientFiles> {
|
||||
);
|
||||
}
|
||||
},
|
||||
buttonText: "Add Note",
|
||||
buttonText: "Add File",
|
||||
buttonColor: Colors.blueAccent,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/buildNotesList.dart';
|
||||
import 'package:patient_manager/components/myErrorMessage.dart';
|
||||
import 'package:patient_manager/components/myMLTextInput.dart';
|
||||
import 'package:patient_manager/components/mySuccessMessage.dart';
|
||||
import 'package:patient_manager/components/myTextInput.dart';
|
||||
import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/objects/notes.dart';
|
||||
@@ -56,13 +57,26 @@ class _PatientNotesState extends State<PatientNotes> {
|
||||
});
|
||||
// Navigator.of(context)
|
||||
// .pushNamed('/patient-manager', arguments: widget.userEmail);
|
||||
String message = "Successfully added Note";
|
||||
messagePopUp(message);
|
||||
String message =
|
||||
"Your note has been successfully added to the patients medical record. You can now view it alongside their other important information.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
}
|
||||
|
||||
void successPopUp(String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return MySuccessMessage(
|
||||
successType: "Success",
|
||||
successMessage: message,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void internetConnectionPopUp() {
|
||||
showDialog(
|
||||
context: context,
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/myErrorMessage.dart';
|
||||
import 'package:patient_manager/components/mySuccessMessage.dart';
|
||||
import 'package:patient_manager/components/myTextInput.dart';
|
||||
import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/objects/appUser.dart';
|
||||
@@ -91,8 +92,8 @@ class _AddPatientState extends State<AddPatient> {
|
||||
Navigator.of(context)
|
||||
.pushNamed('/patient-manager', arguments: widget.userEmail);
|
||||
String message =
|
||||
"${fnameController.text} ${lnameController.text} Successfully added";
|
||||
messagePopUp(message);
|
||||
"${fnameController.text} ${lnameController.text} has been successfully added to the Patient Manager! You can now view their details, add notes & documents, and update their information.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
@@ -118,6 +119,18 @@ class _AddPatientState extends State<AddPatient> {
|
||||
);
|
||||
}
|
||||
|
||||
void successPopUp(String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return MySuccessMessage(
|
||||
successType: "Success",
|
||||
successMessage: message,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:patient_manager/components/myErrorMessage.dart';
|
||||
import 'package:patient_manager/components/mySuccessMessage.dart';
|
||||
import 'package:patient_manager/components/myTextInput.dart';
|
||||
import 'package:patient_manager/components/mybutton.dart';
|
||||
import 'package:patient_manager/objects/appUser.dart';
|
||||
@@ -85,8 +86,8 @@ class _EditPatientState extends State<EditPatient> {
|
||||
if (response.statusCode == 200) {
|
||||
Navigator.of(context).pushNamed('/patient-manager', arguments: userEmail);
|
||||
String message =
|
||||
"${fnameController.text} ${lnameController.text} Successfully Updated";
|
||||
messagePopUp(message);
|
||||
"${fnameController.text} ${lnameController.text}'s information has been updated successfully! Their medical records and details are now current.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
@@ -116,8 +117,8 @@ class _EditPatientState extends State<EditPatient> {
|
||||
if (response.statusCode == 200) {
|
||||
Navigator.of(context).pushNamed('/patient-manager', arguments: userEmail);
|
||||
String message =
|
||||
"${fnameController.text} ${lnameController.text} Successfully Deleted";
|
||||
messagePopUp(message);
|
||||
"${fnameController.text} ${lnameController.text}'s record has been deleted successfully. This means it will no longer be visible in patient manager and cannot be used for future appointments.";
|
||||
successPopUp(message);
|
||||
} else {
|
||||
internetConnectionPopUp();
|
||||
}
|
||||
@@ -256,6 +257,18 @@ class _EditPatientState extends State<EditPatient> {
|
||||
);
|
||||
}
|
||||
|
||||
void successPopUp(String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return MySuccessMessage(
|
||||
successType: "Success",
|
||||
successMessage: message,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
bool isFieldsFilled() {
|
||||
if (idController.text.isEmpty ||
|
||||
fnameController.text.isEmpty ||
|
||||
|
||||
@@ -185,6 +185,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -241,6 +249,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
csslib:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: csslib
|
||||
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -416,6 +432,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: html
|
||||
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.15.4"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -989,6 +1013,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
universal_html:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: universal_html
|
||||
sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.4"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: universal_io
|
||||
sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.2"
|
||||
url_launcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -36,6 +36,7 @@ dependencies:
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^1.0.2
|
||||
syncfusion_flutter_pdfviewer: ^26.1.39
|
||||
universal_html: ^2.2.4
|
||||
file_picker: ^8.0.5
|
||||
supabase_auth_ui: ^0.4.1
|
||||
supabase_flutter: ^2.4.0
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
database/ibdata1
BIN
database/ibdata1
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
24
temp.pdf
24
temp.pdf
@@ -17,17 +17,17 @@ endobj
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1025 /Subtype /Image
|
||||
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1042 /Subtype /Image
|
||||
/Type /XObject /Width 100
|
||||
>>
|
||||
stream
|
||||
Gb"/_960,J$j1SN95!t'!&SE)RS!u@.12^HrpC3WCGe^0]%f$R\j5/BAT,S;1FqQ%RD]l]I4RHPAaElT.(`#M<b2I'IE1BQWht65"#s+IQ1`si?!20Z7p(&'GijEmI_T3h3mkF<iihBj=aAmp=A?\XQPeT6:&!''G[FKA]An<B*USm].SS(E`NOW2n+Z/91&n1j=n03UPon*4k5FK0G(&iW/M$hpD6,o^au&O7[B%$.r=r73I/Xs5Pm;JcpHS"PWbY-B?CaC\WL`KA^&La,DRumT=B>5a]9jABMu%"]55K\1H$uCk]>QE$?o4mY5DrrL4NIY+M^[T$BT?@,':;h>K1o[\La!n!k1IX,JSAQ*knfB^G#Z11*gBsGnbL@c"<aI-+KO_?M[H/sfMd4nX/u*"2mYQ"jK\Z3gaaBhc9'%Q0j\#QG\+kS&MGOFlg.fYm@]KMjSEG!oV;*/bEl+h+Ij9%lASp%$j0eXMS&d@<\_&Oi^6Hs_gSVfmND_96`-s[]TX'M,m)&Zl'.%I1M-.DPa2*JXAp)>c0o*-Bac:Lh3Sl6QPJBk<q(73Am-94F'g,/oHD,XiiF2XTjD5rBss/X>'>Z,Wg+<#HO6aB*W>rjrFX_sg1cMnYHm0&hT6+nm_kl\O"maVn"YoXpYTJn=0WZd]H9V:)r4$_[2mqe(#PA.@R&$)Pp!tO$GKs^m<kr,PSKgrij3,->PPSP0#g_k0pVdKNihYSb=[Wd/nTK%?L!o'3\!?F>?8dm=ac*k(K]R@=W^,hYMi/dJ*b@YX@t`/qZn_6!\:<*?:Xf\L,"2E<E?aK1`?f[h5SAAN8_Z:M]to!nTbj"mh4H)W^Z5Z2ZHY9;*'(hap'YgeN6q0bbi#0EsOl+LsDpPh+p,LIFS)CXLu.XO/(KYG>i7P1QCS`QW72Uiq`GCAu0Uj0kWH\<04eB=d>9PpjZGc]lNZ!YGHEDi04ruaNBQAK8?E!]F35Wf(%_tPZ:jP)Tp?$'_gSFIJaQcf'u_2ZASKiF[s2fS:BDLGdd~>endstream
|
||||
Gb"/`8Tr!*$q#CA9;d-[QmedaFhh9"$H)W(eHtAN1e:$Gm$Oq.VXJ-Mc.Lpt$@,2iZGl3;QAnf0gI^'aWj4*).Eg7Zh0CmMMB&!nlCbGq]44oC^>0B%gdRfSht/qo=B9"P1\9cOc70:@?"A1t='!%@=o!5jb_cp/o0]7!^)qQcq4kZ8jnD3CpmA-@n)%b:laubsXSfQb`p0[Y9]_jI>P4-Iq^W_WZL[0eXABtEUNq?o1K1D!;0]FBWA!Y5mcj[+=RhL5]hF=o*%']AZTdG24Eaj>rCnVMKhTt<;F_)b5ooch$tI:543I&iNYLPqGqPMPC!Cm77iC15Ob.s5cQs5\/W)LQ,"$APkan9HB;Y"q%acr1W&5*rkquC/a&;W:7sS#2ZL[\3C7mdQk3Yun!qZ-P3('hg+d/_8,KY[NbNdc^9JRq.)=gbgR1?cLoZKkhN3(Wd-l"L+O\@`K%(VGEb/uq!X77&7.7Fd]1X'H$)'f(qgpaB-l5cs"nao#qM-f!BLm[O&=Ui#SptMDdZWV$!*g07lA``C(b259hd(u]p/3BdQ`JK&^YcJgF4L9-"V9F]mLXY0r@p)s@XNG9#CU-9lB45E?j:'_0%$=g6j7YsRQW71N(hQ9&b`Pe;AM_lHAm([6L!HL+=_`+5ToJH0I9HCCZ?#Xp&X4')j(I\F/i"L*c_dfA.4]&T/eK;e6;1HH),)gHFjS#SG$0s[>\X_/`7)CNKm]YXFl\W^AQ;cD=eRH[Ge*!Gd/=eV.a..EeTuafb%a()3p>J"ZCdP?]Ziq>dPi2<s0di5bKld&C3'kW^$qBJNRe2WIsH/d5G,7PkGq^)([93UjSc&or#pY:A'9:bN??7=Z<G5>`/81s?DLO-_:4f4[rD7+c98?haDC/>CKB42M9A3Q]K7PWl(miorN[oR=Zg#?PEhaulB3nr"]9*=?WLaW++>Oe8Wn:)ok1AM.4]mA<d]uI\s.OUP'?X2;!bQLoC#eoXNG93Z7HM>A+5KkK'[Bp6[>DgVIgZoT6<L*VOc3YU&%Yf*HQZ1Gg!O\~>endstream
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
|
||||
/FormXob.cd283a2c1d6ad3d76ad89881508b17eb 4 0 R
|
||||
/FormXob.38e804a25cd7412fc4aa43f361bf60ca 4 0 R
|
||||
>>
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
@@ -42,7 +42,7 @@ endobj
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Author (anonymous) /CreationDate (D:20240627140120+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240627140120+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||
/Author (anonymous) /CreationDate (D:20240704093659+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240704093659+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
@@ -56,7 +56,7 @@ endobj
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 446
|
||||
>>
|
||||
stream
|
||||
Gas2F>>rBm&;B$=/'anN6V0U_4K?3TN9D[8d)S%=V:m8"Jdh\9["(PTR!-p$mXF>02\a2:Zs,s.gi2m5'U4.bTRe28hdamD1]Q\L&I_%!`F4FE8GseO-K$a6=PP,uNtE.4K"lqFrR)N"Bkco:M_VMI"V,;po2;A!DIm>#_S-q6$pAM`,`#]HHr2M)DkeI:jp#F[)SBD&n&>m*NVO:SFGZiY$J>WYk;MtB%;:H=>M]!^s0!#90QI;oZ9M^;<cY$od^6lj0iI+8lfOtW'FV#n'TK792HHGUU<P0QW)e2Ch@AN*N:c&CoX_+R1t&HDFkD89&Toh.XUaQt](P'1<gXun%,@Gc4`ZWk*[P?$@\:)bmO'N"Y<UE/rLu)Tj=D1E9[Gmoo0FGPeYXTK,Y:I8R:2o)Vu?.Z@5mH3jI@Z?4O$<pg(o.\`m34V"n)[R`Oc'~>endstream
|
||||
Gas2F>>p/.&;B$;($AGb.3p'5qWOc9c<)*(*qV0]K1-q\RbI#@Qh7"dFZO%UYhAK8h1^H&(L>ou"'c*Wf+aH8Pb:/$&9etKkf@tZ7IWSYZ[S485G3!n$jqdp-\V4b^W-W?V\!bXB0S3W7Qc\/_d\R@=Zg)OoX%N%`hdQY<H_TE&#%#qAd!Bm:<]^u]&bKmR^n$>8V`Z(na5feUS536;U.#Kg0h5'eWUM,C]`2'QfZC8=hJYu'[-Zq)kDq#g.O%l=ZJ,dS^V2.V/>+R\XHZ*UMOc\Yd*t*+7)a&7b*E2AR9l(`=_A,YOo-#CUDeI>-h;H+N,+hc07.@HO4"oN":$YYbtoj!p!u^$/)+rcRt(B-EER`\[HAHCaX4+k^mcq1,\GGcUu0QjCt%EFAh6h8R0s4EVK@WCd%%Bh`4UNGT&)HHjd]2gW_]sL$0HnBY*I~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 10
|
||||
@@ -65,15 +65,15 @@ xref
|
||||
0000000114 00000 n
|
||||
0000000221 00000 n
|
||||
0000000333 00000 n
|
||||
0000001549 00000 n
|
||||
0000001815 00000 n
|
||||
0000001883 00000 n
|
||||
0000002179 00000 n
|
||||
0000002238 00000 n
|
||||
0000001566 00000 n
|
||||
0000001832 00000 n
|
||||
0000001900 00000 n
|
||||
0000002196 00000 n
|
||||
0000002255 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<712dd983c575d0108ff950f2c16588c6><712dd983c575d0108ff950f2c16588c6>]
|
||||
[<9654e78acfa3634d4603cd72a8d4f7eb><9654e78acfa3634d4603cd72a8d4f7eb>]
|
||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||
|
||||
/Info 7 0 R
|
||||
@@ -81,5 +81,5 @@ trailer
|
||||
/Size 10
|
||||
>>
|
||||
startxref
|
||||
2774
|
||||
2791
|
||||
%%EOF
|
||||
|
||||
Reference in New Issue
Block a user