add UX to add a file, any file.

This commit is contained in:
2024-06-27 16:13:24 +02:00
parent 2466636727
commit 7a86144819
25 changed files with 231 additions and 62 deletions
@@ -45,16 +45,17 @@ class _BuildFilesListState extends State<BuildFilesList> {
IconButton(
onPressed: () {
js.context.callMethod('open', [
'http://localhost:9000/mih/${widget.files[index].file_name}.pdf'
'http://localhost:9000/mih/${widget.files[index].file_name}'
]);
//print(object)
},
icon: Icon(Icons.download),
)
icon: const Icon(Icons.download),
),
],
),
content: BuildPDFView(
pdfLink:
"http://localhost:9000/mih/${widget.files[index].file_name}.pdf"),
"http://localhost:9000/mih/${widget.files[index].file_name}"),
actions: [
TextButton(
onPressed: () {
@@ -1,9 +1,13 @@
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:patient_manager/components/buildFilesList.dart';
import 'package:patient_manager/components/medCertInput.dart';
import 'package:patient_manager/components/myTextInput.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/main.dart';
import 'package:patient_manager/objects/AppUser.dart';
import 'package:patient_manager/objects/files.dart';
@@ -28,15 +32,19 @@ class PatientFiles extends StatefulWidget {
class _PatientFilesState extends State<PatientFiles> {
String endpointFiles = "http://localhost:80/files/patients/";
String endpointUser = "http://localhost:80/docOffices/user/";
String endpointGenFiles = "http://localhost:80/files/generate/";
String endpointGenFiles = "http://localhost:80/files/generate/med-cert/";
String endpointFileUpload = "http://localhost:80/files/upload/file/";
String endpointInsertFiles = "http://localhost:80/files/insert/";
final startDateController = TextEditingController();
final endDateTextController = TextEditingController();
final retDateTextController = TextEditingController();
final selectedFileController = TextEditingController();
late Future<List<PFile>> futueFiles;
late String userEmail = "";
late AppUser appUser;
late PlatformFile selected;
Future<void> generateMedCert() async {
var response1 = await http.post(
@@ -53,9 +61,9 @@ class _PatientFilesState extends State<PatientFiles> {
"returnDate": retDateTextController.text,
}),
);
print(response1.statusCode);
//print(response1.statusCode);
String fileName =
"Med-Cert-${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}-${startDateController.text}";
"Med-Cert-${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}-${startDateController.text}.pdf";
if (response1.statusCode == 200) {
var response2 = await http.post(
Uri.parse(endpointInsertFiles),
@@ -71,6 +79,46 @@ class _PatientFilesState extends State<PatientFiles> {
print(response2.statusCode);
if (response2.statusCode == 201) {
setState(() {
startDateController.clear();
endDateTextController.clear();
retDateTextController.clear();
futueFiles =
fetchFiles(endpointFiles + widget.patientIndex.toString());
});
String message = "Successfully added file";
messagePopUp(message);
} else {
messagePopUp("error response 2");
}
} else {
messagePopUp("error respose 1");
}
}
Future<void> uploadSelectedFile(PlatformFile file) async {
//var strem = new http.ByteStream.fromBytes(file.bytes.)
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);
if (response1.statusCode == 200) {
var response2 = await http.post(
Uri.parse(endpointInsertFiles),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"file_path": file.name.replaceAll(RegExp(r' '), '-'),
"file_name": file.name.replaceAll(RegExp(r' '), '-'),
"patient_id": widget.patientIndex
}),
);
print(response2.statusCode);
if (response2.statusCode == 201) {
setState(() {
selectedFileController.clear();
futueFiles =
fetchFiles(endpointFiles + widget.patientIndex.toString());
});
@@ -131,6 +179,110 @@ class _PatientFilesState extends State<PatientFiles> {
);
}
void medCertPopUp() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Create Medical Certificate"),
],
),
content: Medcertinput(
startDateController: startDateController,
endDateTextController: endDateTextController,
retDateTextController: retDateTextController,
),
actions: [
TextButton(
onPressed: () {
generateMedCert();
Navigator.pop(context);
},
child: const Text(
"Generate",
style: TextStyle(fontWeight: FontWeight.bold),
),
),
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Cancel"),
)
],
),
);
}
void uploudFilePopUp() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Upload File"),
],
),
content: SizedBox(
width: 700,
height: 250,
child: Column(
children: [
SizedBox(
width: 700,
child: MyButton(
onTap: () async {
FilePickerResult? result =
await FilePicker.platform.pickFiles();
if (result == null) return;
final selectedFile = result.files.first;
//selectedFile
// print("Name: ${selectedFile.name}");
// print("Extension: ${selectedFile.extension}");
// print("Content: ${selectedFile.bytes}");
setState(() {
selected = selectedFile;
});
setState(() {
selectedFileController.text = selectedFile.name;
});
},
buttonText: "Select File"),
),
MyTextField(
controller: selectedFileController,
hintText: "Selected FIle",
editable: false)
],
),
),
actions: [
TextButton(
onPressed: () {
uploadSelectedFile(selected);
Navigator.pop(context);
},
child: const Text(
"Upload",
style: TextStyle(fontWeight: FontWeight.bold),
),
),
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Cancel"),
)
],
),
);
}
@override
void initState() {
futueFiles = fetchFiles(endpointFiles + widget.patientIndex.toString());
@@ -178,51 +330,19 @@ class _PatientFilesState extends State<PatientFiles> {
),
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Create Medical Certificate"),
],
),
content: Medcertinput(
startDateController: startDateController,
endDateTextController:
endDateTextController,
retDateTextController:
retDateTextController,
),
actions: [
TextButton(
onPressed: () {
//getPatientDetails();
generateMedCert();
Navigator.pop(context);
//print(widget.patientIndex);
},
child: const Text(
"Generate",
style: TextStyle(
fontWeight: FontWeight.bold),
),
),
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Cancel"),
)
],
),
);
medCertPopUp();
},
icon: const Icon(Icons.sick_outlined),
),
IconButton(
onPressed: () {},
icon: const Icon(Icons.medication_outlined),
),
IconButton(
onPressed: () {
uploudFilePopUp();
},
icon: const Icon(Icons.add),
)
],
),
+50 -2
View File
@@ -21,10 +21,34 @@ packages:
dependency: transitive
description:
name: app_links
sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db"
sha256: a9905d6a60e814503fabc7523a9ed161b812d7ca69c99ad8ceea14279dc4f06b
url: "https://pub.dev"
source: hosted
version: "6.1.1"
version: "6.1.3"
app_links_linux:
dependency: transitive
description:
name: app_links_linux
sha256: "567139eca3ca9fb113f2082f3aaa75a26f30f0ebdbe5fa7f09a3913c5bebd630"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
app_links_platform_interface:
dependency: transitive
description:
name: app_links_platform_interface
sha256: "58cff6f11df59b0e514dd5e4a61e988348ad5662f0e75d45d4e214ebea55c94c"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
app_links_web:
dependency: transitive
description:
name: app_links_web
sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
archive:
dependency: transitive
description:
@@ -201,6 +225,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.1"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32"
url: "https://pub.dev"
source: hosted
version: "0.3.4+1"
crypto:
dependency: transitive
description:
@@ -273,6 +305,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.0"
file_picker:
dependency: "direct main"
description:
name: file_picker
sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45"
url: "https://pub.dev"
source: hosted
version: "8.0.5"
fixnum:
dependency: transitive
description:
@@ -294,6 +334,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e
url: "https://pub.dev"
source: hosted
version: "2.0.20"
flutter_test:
dependency: "direct dev"
description: flutter
+1 -1
View File
@@ -36,7 +36,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
syncfusion_flutter_pdfviewer: ^26.1.39
#pdfx: ^2.6.0
file_picker: ^8.0.5
supabase_auth_ui: ^0.4.1
supabase_flutter: ^2.4.0
http: ^1.2.1
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+13 -13
View File
@@ -17,17 +17,17 @@ endobj
endobj
4 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1159 /Subtype /Image
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1025 /Subtype /Image
/Type /XObject /Width 100
>>
stream
Gb"/_bB>0d#Qs8iIlaoS>>g$#PERgSD:#&l^1I`DY;Jot\t#.j0$s?sls]6>ZVk+l8SkY[O(Ct`N*XX<AK.V'eZaZ&^>jB><Dut2!=mUVAUSc32lsOF'is0;Y'JpBo6"!^M8$kW?>]FlQ1qu/WZ&mh`:2WdqB#%4qnm/a\(r-,>J'::$554?nb$2TqtG:.R(q-p=Rj*TPon*4E;t!&]tPl'_i!?cNR^NhRDsGX:$JkMhpCoE$nFMkN0VNf42UrO*DEkq<8gJc;*X?1\l\Y+#-0>/(c!/PZm?aC-+^-<?GS.mYJZC<C0::nYY3c,JoKXn48/BPW`D!Z$GqAWmF^12W`mr[.L69N[pqW4I@'0#f&4*"?1h4'%6-hL6\&tAgpa6Y.Tu4L7cciHk;qJ/'\18ghUf/&rN4/F)HKpAq5[N6[o3Ya]NVqmcms/^iuUp)2AO68Go)a3jFQhnj/_]d.Z@a+/h/Hp"65Y5qMss)[jq,obU10c_[J%/k0Q7HLC>Dqa*Z<eZ+UOp**->9SZGHC]MpQUU$R'ka7"2$=:M<GCsQkH0itj,<]g..dfM:U1T^@fcd,I5k-:-]WQq8Tp"d[PBgsGSFXa+IO0[;[+/>_ORDd[QOQnsN<o:B%0O&[N\)(_O'cO@-^(MDdAs;S.dhofI#iV#tg9PIC=IIg[I9;p9\-(V1$IKlK]Z!_#_&1N,^-<;k"LnXZ^pQ-b0DPNCi"4fbKE0W`^p:0_I.*?#<f[(-3^2)u1AdmTdCi^UL%P7>^MW/kLXitM'S[?Mp[')tpeIpB_jF&=K^fOb=Rd800i^&1?BBoipZGe)S(8_QLG8G+g?SH?++A@iL5GB(<7TTmX#b5kpgH%]e9d%;[qg2=@FTbG_=C"Ia8<(Z<[?!==N,$ZqjPZ_<9I-P<drBMmi7e!)7F_'L"5-Ie"0`jO"l$L]-uYI.mC.Gj^"Um:Xs.7bN9=8*i6d39A*_8@J*Ar5-sMA`An("+*G#2GTF*YX#2Y"SR9Xa].<D2b2%8#V+Nf!GeX0])HOOr^Ab$5.35_<)--nUA?S5!L6Y"$=]Y&u\bPT.W?*QL_hnt8j[Z;Lc1nG.qX/_s`NIc8^MWLL267\u];q#JL@5s&`9o=Nb#92n-LSoRgMF*P>(Ccn^P1sLXCgDg#ON'#5Q~>endstream
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
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.a864f8048b8deb389d345068e0f01419 4 0 R
/FormXob.cd283a2c1d6ad3d76ad89881508b17eb 4 0 R
>>
>> /Rotate 0 /Trans <<
@@ -42,7 +42,7 @@ endobj
endobj
7 0 obj
<<
/Author (anonymous) /CreationDate (D:20240626135150+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240626135150+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/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)
/Subject (unspecified) /Title (untitled) /Trapped /False
>>
endobj
@@ -53,10 +53,10 @@ endobj
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 447
/Filter [ /ASCII85Decode /FlateDecode ] /Length 446
>>
stream
Gas2F5uWCi&;BTNMK`$4$:u.L33$hnc<)*(%XOo^/..6^e5$%W5[,1CVaCXiS,M3u>pr6bdI*T,^l:`9VP">Q#N\.)]Z3QhB>2h8K#aS2#%<0N9RS'n!EnB576M:V(h*=Tnf@;dQc?g394K>ON0,-=405F(MDQc%X(kl"c.8n)k]r(060+JuMdhNT=bF(kDI=9;`U!3`DY/JD85?BaQ<5W51#HC6gkHlZ!Me&.eWgsHIuUsiOWuh__/,fKad(-ZgBo=Z.\1!blAo>@/rV6Af;<T@=FG>tRo>#9b>hU,[mO8fOm`79?5I10>1loX%i#M!KXr#VAokQ,DS8$5-"]Y.ICH+lNu[5I7g[kG1s[M*mO+K)?8+9[oj['4+sNTd_SobjC>KbHf&n35KH`Ej&n29/pU'sKB\6$_S=DBHNi-$KkdH3&WbuG8\:XGWllN`.~>endstream
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
endobj
xref
0 10
@@ -65,15 +65,15 @@ xref
0000000114 00000 n
0000000221 00000 n
0000000333 00000 n
0000001683 00000 n
0000001949 00000 n
0000002017 00000 n
0000002313 00000 n
0000002372 00000 n
0000001549 00000 n
0000001815 00000 n
0000001883 00000 n
0000002179 00000 n
0000002238 00000 n
trailer
<<
/ID
[<36b4836a753ad82170aa5ba05dd47b32><36b4836a753ad82170aa5ba05dd47b32>]
[<712dd983c575d0108ff950f2c16588c6><712dd983c575d0108ff950f2c16588c6>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
@@ -81,5 +81,5 @@ trailer
/Size 10
>>
startxref
2909
2774
%%EOF