Fakultas Ilmu Komputer UI
Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ppl-fasilkom-ui
PPL Sosial
bisago
bisago-fe
Commits
3676b365
Commit
3676b365
authored
Jun 03, 2021
by
jovi_013
Browse files
[GREEN] Implement multiple image upload
parent
f798f1a2
Pipeline
#81147
passed with stages
in 13 minutes and 18 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
android/app/src/debug/AndroidManifest.xml
View file @
3676b365
...
...
@@ -6,4 +6,9 @@
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<uses-permission
android:name=
"android.permission.MANAGE_DOCUMENTS"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
</manifest>
android/app/src/main/AndroidManifest.xml
View file @
3676b365
...
...
@@ -8,7 +8,13 @@
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<uses-permission
android:name=
"android.permission.MANAGE_DOCUMENTS"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<application
android:requestLegacyExternalStorage=
"true"
android:name=
"io.flutter.app.FlutterApplication"
android:label=
"bisaGo"
android:icon=
"@mipmap/launcher_icon"
>
...
...
android/app/src/profile/AndroidManifest.xml
View file @
3676b365
...
...
@@ -6,4 +6,9 @@
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<uses-permission
android:name=
"android.permission.MANAGE_DOCUMENTS"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
</manifest>
lib/bloc/kegiatan_bloc.dart
View file @
3676b365
...
...
@@ -36,9 +36,9 @@ class KegiatanBloc {
}
Future
<
dynamic
>
addNewKegiatan
(
Map
<
String
,
dynamic
>
newKegiatanData
,
String
placeId
)
async
{
Map
<
String
,
dynamic
>
newKegiatanData
)
async
{
try
{
return
await
_kegiatanRepository
.
createKegiatan
(
newKegiatanData
,
placeId
);
return
await
_kegiatanRepository
.
createKegiatan
(
newKegiatanData
);
}
catch
(
e
)
{
return
Response
(
'Failed to register komentar'
,
400
);
}
...
...
lib/page/filter_fasilitas/add_kegiatan.dart
View file @
3676b365
import
'dart:async'
;
import
'dart:io'
;
//
import 'dart:io';
import
'package:bisaGo/bloc/kegiatan_bloc.dart'
;
import
'package:bisaGo/component/bisago_appbar.dart'
;
...
...
@@ -15,6 +15,7 @@ import 'package:dio/dio.dart';
import
'package:flutter/material.dart'
;
import
'package:flutter_datetime_picker/flutter_datetime_picker.dart'
;
import
'package:font_awesome_flutter/font_awesome_flutter.dart'
;
import
'package:http_parser/http_parser.dart'
;
import
'package:image_picker/image_picker.dart'
;
import
'package:intl/intl.dart'
;
import
'package:material_design_icons_flutter/material_design_icons_flutter.dart'
;
...
...
@@ -49,6 +50,7 @@ class _AddKegiatanState extends State<AddKegiatan> {
'
${DateFormat('yyyy-MM-ddTHH:mm').format(DateTime.now())}
'
;
List
<
Asset
>
images
=
<
Asset
>[];
bool
permissionGranted
=
false
;
@override
Widget
build
(
BuildContext
context
)
{
...
...
@@ -104,12 +106,6 @@ class _AddKegiatanState extends State<AddKegiatan> {
if
(
_formKey
.
currentState
.
validate
())
{
form
.
save
();
final
fileName
=
_image
.
path
.
split
(
'/'
).
last
;
final
_imageFile
=
await
MultipartFile
.
fromFile
(
_image
.
path
,
filename:
fileName
,
);
final
newKegiatan
=
KegiatanModel
(
namaKegiatan:
namaKegiatanController
.
text
,
penyelenggara:
penyelenggaraController
.
text
,
...
...
@@ -123,14 +119,29 @@ class _AddKegiatanState extends State<AddKegiatan> {
),
);
final
newKegiatanData
=
newKegiatan
.
toJson
();
newKegiatanData
[
'images'
]
=
_imageFile
;
var
newKegiatanData
=
newKegiatan
.
toJson
();
var
multipartImageList
=
<
MultipartFile
>[];
newKegiatanData
[
'place_id'
]
=
widget
.
placeId
;
newKegiatanData
[
'zona_waktu'
]
=
'WIB'
;
if
(
images
!=
null
)
{
for
(
var
asset
in
images
)
{
var
byteData
=
await
asset
.
getByteData
();
var
imageData
=
byteData
.
buffer
.
asUint8List
();
var
multipartFile
=
MultipartFile
.
fromBytes
(
imageData
,
filename:
asset
.
name
,
contentType:
MediaType
(
'image'
,
'jpeg'
),
);
multipartImageList
.
add
(
multipartFile
);
}
newKegiatanData
[
'images'
]
=
multipartImageList
;
}
newKegiatanData
[
'images'
]
??=
[
''
];
final
_bloc
=
KegiatanBloc
(
widget
.
placeId
);
await
_bloc
.
addNewKegiatan
(
newKegiatanData
,
widget
.
placeId
,
);
await
_bloc
.
addNewKegiatan
(
newKegiatanData
);
successDialog
(
context
);
Timer
(
const
Duration
(
seconds:
2
),
()
{
...
...
@@ -173,52 +184,72 @@ class _AddKegiatanState extends State<AddKegiatan> {
}
final
picker
=
ImagePicker
();
File
_image
;
//
File _image;
Future
_getCameraImage
()
async
{
final
image
=
await
picker
.
getImage
(
source
:
ImageSource
.
camera
,
imageQuality:
50
);
return
File
(
image
.
path
);
}
//
Future _getCameraImage() async {
//
final image =
//
await picker.getImage(source: ImageSource.camera, imageQuality: 50);
//
return File(image.path);
//
}
Future
<
void
>
pickImages
()
async
{
var
resultList
=
<
Asset
>[];
// var status = await Permission.camera.status;
await
_getStoragePermission
();
await
_getCameraPermission
();
try
{
// if (status.isGranted) {
// }
resultList
=
await
MultiImagePicker
.
pickImages
(
maxImages:
300
,
if
(
permissionGranted
)
{
resultList
=
await
MultiImagePicker
.
pickImages
(
maxImages:
50
,
enableCamera:
true
,
selectedAssets:
images
,
materialOptions:
MaterialOptions
(
actionBarTitle:
widget
.
nama
,
actionBarColor:
'#ff3A903A'
,
statusBarColor:
'#ff347D34'
,
useDetailsView:
true
,
startInAllView:
true
,
textOnNothingSelected:
'Tidak ada gambar yang dipilih'
,
),
);
setState
(()
{
images
=
resultList
;
});
}
else
{
await
openAppSettings
();
}
}
on
Exception
catch
(
e
)
{
print
(
e
);
}
}
setState
(()
{
images
=
resultList
;
});
Future
_getStoragePermission
()
async
{
if
(
await
Permission
.
storage
.
request
().
isGranted
)
{
setState
(()
{
permissionGranted
=
true
;
});
}
else
if
(
await
Permission
.
storage
.
request
().
isPermanentlyDenied
)
{
await
openAppSettings
();
}
else
if
(
await
Permission
.
storage
.
request
().
isDenied
)
{
setState
(()
{
permissionGranted
=
false
;
});
}
}
// Future<bool> checkAndRequestCameraPermissions() async {
// PermissionStatus permission =
// await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
// if (permission != PermissionStatus.granted) {
// Map<PermissionGroup, PermissionStatus> permissions =
// await PermissionHandler().requestPermissions([PermissionGroup.camera]);
// return permissions[PermissionGroup.camera] == PermissionStatus.granted;
// } else {
// return true;
// }
// }
Future
_getCameraPermission
()
async
{
if
(
await
Permission
.
camera
.
request
().
isGranted
)
{
setState
(()
{
permissionGranted
=
true
;
});
}
else
if
(
await
Permission
.
camera
.
request
().
isPermanentlyDenied
)
{
await
openAppSettings
();
}
else
if
(
await
Permission
.
camera
.
request
().
isDenied
)
{
setState
(()
{
permissionGranted
=
false
;
});
}
}
Widget
namaLokasi
()
{
return
Padding
(
...
...
@@ -337,9 +368,8 @@ class _AddKegiatanState extends State<AddKegiatan> {
return
CustomTextField
(
title:
'Link Kegiatan'
,
hint:
'Masukkan link kegiatan (jika ada)'
,
required
:
tru
e
,
required
:
fals
e
,
key:
const
Key
(
'Text Field Link Kegiatan'
),
validator:
FieldValidator
.
validateName
,
controller:
linkController
,
);
}
...
...
@@ -348,7 +378,7 @@ class _AddKegiatanState extends State<AddKegiatan> {
return
Padding
(
padding:
const
EdgeInsets
.
only
(
bottom:
16
),
child:
Row
(
//
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment:
MainAxisAlignment
.
spaceBetween
,
children:
<
Widget
>[
Padding
(
padding:
const
EdgeInsets
.
fromLTRB
(
0
,
0
,
20
,
10
),
...
...
@@ -406,10 +436,13 @@ class _AddKegiatanState extends State<AddKegiatan> {
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
spaceBetween
,
children:
[
const
Text
(
'Foto'
,
style:
TextStyle
(
fontSize:
18
),
textAlign:
TextAlign
.
left
,
Padding
(
padding:
const
EdgeInsets
.
only
(
right:
doubleSpace
),
child:
const
Text
(
'Foto'
,
style:
TextStyle
(
fontSize:
18
),
textAlign:
TextAlign
.
left
,
),
),
TextButton
(
key:
const
Key
(
'Button Input Foto Gallery'
),
...
...
@@ -419,7 +452,7 @@ class _AddKegiatanState extends State<AddKegiatan> {
},
child:
Container
(
width:
MediaQuery
.
of
(
context
).
size
.
width
*
0.35
,
//
width: MediaQuery.of(context).size.width * 0.35,
padding:
const
EdgeInsets
.
all
(
9.0
),
alignment:
Alignment
.
centerLeft
,
decoration:
BoxDecoration
(
...
...
@@ -435,7 +468,7 @@ class _AddKegiatanState extends State<AddKegiatan> {
),
const
SizedBox
(
width:
regularSpace
),
const
Text
(
'
Dari Gallery
'
,
'
Tambah foto
'
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
14.0
),
),
...
...
@@ -443,40 +476,6 @@ class _AddKegiatanState extends State<AddKegiatan> {
),
),
),
TextButton
(
key:
const
Key
(
'Button Input Foto Camera'
),
style:
TextButton
.
styleFrom
(
padding:
EdgeInsets
.
zero
),
onPressed:
()
async
{
final
imageSelected
=
await
_getCameraImage
();
setState
(()
{
_image
=
imageSelected
;
});
},
child:
Container
(
width:
MediaQuery
.
of
(
context
).
size
.
width
*
0.35
,
padding:
const
EdgeInsets
.
all
(
9.0
),
alignment:
Alignment
.
centerLeft
,
decoration:
BoxDecoration
(
boxShadow:
regularShadow
,
borderRadius:
BorderRadius
.
circular
(
10.0
),
color:
greenPrimary
),
child:
Row
(
children:
[
const
Icon
(
MdiIcons
.
imagePlus
,
color:
Colors
.
white
,
size:
14.0
,
),
const
SizedBox
(
width:
regularSpace
),
const
Text
(
'Dari Kamera'
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
14.0
),
),
],
),
),
)
],
),
);
...
...
lib/repository/kegiatan_repository.dart
View file @
3676b365
...
...
@@ -6,7 +6,7 @@ abstract class BaseKegiatanRepository {
Future
<
KegiatanList
>
fetchKegiatan
(
String
placeId
);
Future
<
List
<
String
>>
fetchImages
(
String
placeId
,
int
id
);
Future
<
dynamic
>
createKegiatan
(
Map
<
String
,
dynamic
>
newKegiatanData
,
String
placeId
);
Map
<
String
,
dynamic
>
newKegiatanData
);
Future
<
KegiatanModel
>
fetchDetailKegiatan
(
String
placeId
,
int
kegiatanId
);
}
...
...
@@ -47,10 +47,9 @@ class KegiatanRepository implements BaseKegiatanRepository {
@override
Future
<
dynamic
>
createKegiatan
(
Map
<
String
,
dynamic
>
newKegiatanData
,
String
placeId
,
)
async
{
final
response
=
await
_network
.
post
(
url:
'/informasi-fasilitas/lokasi/add-kegiatan/
$
placeId
/'
,
url:
'/informasi-fasilitas/lokasi/add-kegiatan/
$
{newKegiatanData['place_id']}
/'
,
bodyParams:
newKegiatanData
,
);
return
response
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment