From aea7d2a470952a19f25cf583c6b273bc7a225ad7 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Wed, 2 Jun 2021 20:39:19 +0700 Subject: [PATCH 01/24] Fix conflict --- lib/component/bisago_drawer.dart | 8 ++++---- lib/model/kegiatan.dart | 2 +- lib/repository/kegiatan_repository.dart | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index 7e45592..177827f 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -1,4 +1,4 @@ -import 'package:bisaGo/page/informasi/list_sekolah.dart'; +import 'package:bisaGo/page/informasi/list_kegiatan.dart'; import 'package:bisaGo/page/profile/profile.dart'; import 'package:bisaGo/page/tentang_disabilitas/tentang_disabilitas.dart'; import 'package:flutter/material.dart'; @@ -15,7 +15,7 @@ class BisaGoDrawer extends StatelessWidget { {'title': 'Profile', 'icon': Icons.person}, {'title': 'Beranda', 'icon': Icons.home}, {'title': 'Riwayat Pencarian', 'icon': Icons.history}, - {'title': 'Layanan Disabilitas', 'icon': Icons.group}, + {'title': 'Agenda Kegiatan', 'icon': Icons.group}, {'title': 'Tentang Disabilitas', 'icon': Icons.accessible}, {'title': 'Tentang Aplikasi', 'icon': Icons.info}, {'title': 'Login', 'icon': Icons.keyboard_backspace} @@ -195,8 +195,8 @@ class BisaGoDrawer extends StatelessWidget { route = MaterialPageRoute(builder: (_) => const AboutUs()); } else if (page == 'Tentang Disabilitas') { route = MaterialPageRoute(builder: (_) => TentangDisabilitas()); - } else if (page == 'Layanan Disabilitas') { - route = MaterialPageRoute(builder: (_) => ListSekolah()); + } else if (page == 'Agenda Kegiatan') { + route = MaterialPageRoute(builder: (_) => ListKegiatan()); } Navigator.of(context).push(route); } diff --git a/lib/model/kegiatan.dart b/lib/model/kegiatan.dart index 6531c58..6024bff 100644 --- a/lib/model/kegiatan.dart +++ b/lib/model/kegiatan.dart @@ -52,4 +52,4 @@ class KegiatanModel { factory KegiatanModel.fromJson(Map json) => _$KegiatanModelFromJson(json); Map toJson() => _$KegiatanModelToJson(this); -} +} \ No newline at end of file diff --git a/lib/repository/kegiatan_repository.dart b/lib/repository/kegiatan_repository.dart index adf6701..c531731 100644 --- a/lib/repository/kegiatan_repository.dart +++ b/lib/repository/kegiatan_repository.dart @@ -8,6 +8,7 @@ abstract class BaseKegiatanRepository { Future createKegiatan( Map newKegiatanData, String placeId); Future fetchDetailKegiatan(String placeId, int kegiatanId); + Future fetchKegiatanSearch(String search); } class KegiatanRepository implements BaseKegiatanRepository { @@ -29,6 +30,25 @@ class KegiatanRepository implements BaseKegiatanRepository { return KegiatanList(allKegiatan); } + @override + Future fetchKegiatanSearch(String search) async { + print('00000000000000000000000000000000000000000000000000000000000'); + final url = '/informasi-fasilitas/lokasi/search-kegiatan/$search'; + final response = await _network.get(url: url, isLogin: false); + print('11111111111111111111111111111111111111111111111111111111111111'); + print(response.entries.toList()); + print(url); + var list = []; + for (var each in response.entries.toList()) { + print(each.value); + list.add(KegiatanModel.fromJson(each.value)); + } + print('22222222222222222222222222222222222222222222222222222222222222'); + print(list); + print(url); + return list; // KegiatanSearchList + } + @override Future> fetchImages(String placeId, int id) async { final url = '/informasi-fasilitas/lokasi/list-foto-kegiatan/$placeId/$id'; -- GitLab From 54f213e29365f150aae13b644234ea824dafb200 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Thu, 3 Jun 2021 00:00:49 +0700 Subject: [PATCH 02/24] [RED] Add test for list kegiatan search --- test/list_kegiatan_test.dart | 83 ++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 test/list_kegiatan_test.dart diff --git a/test/list_kegiatan_test.dart b/test/list_kegiatan_test.dart new file mode 100644 index 0000000..e46c4a5 --- /dev/null +++ b/test/list_kegiatan_test.dart @@ -0,0 +1,83 @@ +import 'package:bisaGo/repository/kegiatan_repository.dart'; +import 'package:bisaGo/repository/lokasi_repository.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:flutter/material.dart'; +import 'package:bisaGo/page/informasi/list_kegiatan.dart'; + +class MockKegiatanRepository extends Fake implements KegiatanRepository { + final mockKegiatan = { + 'id': 2, + 'nama_lokasi': 'Margo City', + 'creator': 'Putri Salsabila', + 'nama_kegiatan': 'Kopdar Rutin', + 'penyelenggara': 'DTB Indonesia', + 'narahubung': 'Putsal 08123123123', + 'deskripsi': 'lorem ipsum dolor sit amet', + 'time_start': '12-12-2021 06:30:00', + 'time_end': '12-12-2021 09:30:00' + }; +} + +class MockLokasiRepository extends Fake implements LokasiRepository { + final komunitasData = { + 'name': 'Margo City', + 'alamat': 'Jl. Margonda Raya No.358, Kemiri Muka, Kecamatan Beji, Kota Depok, Jawa Barat 16423', + 'image': 'Margo.jpg', + 'no_telp': '02178870888', + 'counter': 69, + }; +} + +void main() { + setUpAll(() { + final _getIt = GetIt.instance; + _getIt.registerLazySingleton( + () => MockKegiatanRepository()); + _getIt.registerLazySingleton( + () => MockLokasiRepository()); + }); + + testWidgets('Find Agenda Kegiatan Page', (WidgetTester tester) async { + // Provide the childWidget to the Container. + await tester.pumpWidget(MaterialApp(home: ListKegiatan())); + await tester.pumpAndSettle(); + + // positive test + expect(find.text('Agenda Kegiatan'), findsOneWidget); + + // negative test + expect(find.text('aagenda kkegiatan'), findsNothing); + + // Provide text field + final textFieldKey = Key('Text Field Cari Kegiatan'); + final textFieldKey2 = Key('Text Field Cari Kegiatann'); + + // positive test + expect(find.byKey(textFieldKey), findsOneWidget); + + // negative test + expect(find.byKey(textFieldKey2), findsNothing); + + // input text + await tester.enterText(find.byKey(textFieldKey), 'Kopdar Rutin'); + await tester.pumpAndSettle(); + + // positive test + expect(find.text('Kopdar Rutin'), findsOneWidget); + + // negative test + expect(find.text('Kopdar Rajin'), findsNothing); + + // redirect to detail kegiatan + await tester.tap(find.text('Kopdar Rutin')); + await tester.pumpAndSettle(); + + // positive test + expect(find.text('Kopdar Rutin'), findsOneWidget); + + // negative test + expect(find.text('Kopdar Rajin'), findsNothing); + }); +} + -- GitLab From 4c2c88c182a05717bb59c61e1351db9a8a40fb38 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Thu, 3 Jun 2021 00:05:03 +0700 Subject: [PATCH 03/24] [GREEN] Add list kegiatan search --- lib/bloc/lokasi_response_bloc.dart | 9 + lib/component/bisago_drawer.dart | 2 +- .../postingan/detail_post_kegiatan.dart | 6 +- lib/page/informasi/list_kegiatan.dart | 185 ++++++++++++++++++ lib/page/informasi/list_sekolah.dart | 2 +- lib/repository/kegiatan_repository.dart | 8 - lib/repository/lokasi_repository.dart | 29 +++ 7 files changed, 227 insertions(+), 14 deletions(-) create mode 100644 lib/page/informasi/list_kegiatan.dart diff --git a/lib/bloc/lokasi_response_bloc.dart b/lib/bloc/lokasi_response_bloc.dart index 593be08..a4024cb 100644 --- a/lib/bloc/lokasi_response_bloc.dart +++ b/lib/bloc/lokasi_response_bloc.dart @@ -42,6 +42,15 @@ class LokasiResponseBloc { } } + Future fetchLokasiListById(String placeId) async { + lokasiListSink.add(NetworkModel.loading('Getting Location by Id')); + try { + return await _lokasiRepository.fetchLokasiById(placeId); + } catch (e) { + return Lokasi(); + } + } + Future fetchRecentSearch() async { recentSearchSink.add(NetworkModel.loading('Getting Recent Search')); try { diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index 177827f..523ba03 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -15,7 +15,7 @@ class BisaGoDrawer extends StatelessWidget { {'title': 'Profile', 'icon': Icons.person}, {'title': 'Beranda', 'icon': Icons.home}, {'title': 'Riwayat Pencarian', 'icon': Icons.history}, - {'title': 'Agenda Kegiatan', 'icon': Icons.group}, + {'title': 'Agenda Kegiatan', 'icon': Icons.calendar_today}, {'title': 'Tentang Disabilitas', 'icon': Icons.accessible}, {'title': 'Tentang Aplikasi', 'icon': Icons.info}, {'title': 'Login', 'icon': Icons.keyboard_backspace} diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index 6274e66..938aee9 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -159,8 +159,7 @@ class _DetailPostKegiatanPageState extends State { initialPage: 0, autoPlay: true, ), - items: widget.kegiatan.images - .map((item) => Container( + items: widget.kegiatan.images?.map((item) => Container( child: Container( child: ClipRRect( borderRadius: BorderRadius.all( @@ -216,8 +215,7 @@ class _DetailPostKegiatanPageState extends State { ], )), ), - )) - .toList(), + ))?.toList(), ), ), const SizedBox(height: 10), diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart new file mode 100644 index 0000000..143cfe1 --- /dev/null +++ b/lib/page/informasi/list_kegiatan.dart @@ -0,0 +1,185 @@ +import 'package:bisaGo/bloc/kegiatan_search_bloc.dart'; +import 'package:bisaGo/component/bisago_drawer.dart'; +import 'package:bisaGo/config/styles.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:bisaGo/model/kegiatan.dart'; +import 'package:bisaGo/bloc/lokasi_response_bloc.dart'; +import 'package:bisaGo/network/data/network_model.dart'; +import 'package:bisaGo/page/filter_fasilitas/postingan/detail_post_kegiatan.dart'; + +class ListKegiatan extends StatefulWidget { + const ListKegiatan({Key key}) : super(key: key); + + @override + _ListKegiatanState createState() => _ListKegiatanState(); +} + +class _ListKegiatanState extends State { + /// Search Icon for textFormField + Icon searchIcon = const Icon(Icons.search); + + KegiatanSearchBloc kegiatan_search_bloc = KegiatanSearchBloc(); + LokasiResponseBloc lokasi_bloc = LokasiResponseBloc(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + drawer: BisaGoDrawer(), + appBar: AppBar( + backgroundColor: greenPrimary, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios, size: 25), + key: const Key('Back Icon Key'), + onPressed: () => Navigator.of(context).pop()), + title: Container( + margin: const EdgeInsets.only(top: doubleSpace, bottom: doubleSpace), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: doubleBorderRadius, + boxShadow: regularShadow), + child: TextFormField( + onFieldSubmitted: (text) { + kegiatan_search_bloc.fetchKegiatanSearchList(text); + }, + key: const Key('Text Field Cari Kegiatan'), + decoration: InputDecoration( + prefixIcon: const Icon( + Icons.search, + color: greenPrimary, + size: 25, + ), + ), + ), + ), + ), + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.only( + top: tripleSpace, left: doubleSpace, right: doubleSpace), + child: Text( + 'Agenda Kegiatan' ?? '', + style: TextStyle( + fontSize: 25, + fontFamily: 'Muli', + fontWeight: FontWeight.w800), + ), + ), + //BLoC for Kegiatan Search + StreamBuilder>>( + stream: kegiatan_search_bloc.layananListStream, + builder: (context, snapshot) { + if (snapshot.hasData) { + switch (snapshot.data.status) { + case Status.loading: + return const Center( + child: CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(greenPrimary), + ), + ); + break; + case Status.completed: + var layanan = snapshot.data.data; + return Column( + children: layanan.map((each) { + return makeKegiatanWidget('kegiatan', each); + }).toList(), + ); + break; + case Status.error: + return Center( + child: Text(snapshot.data.data.toString()), + ); + break; + } + } + return Container(); + }, + ), + ], + ), + ), + ); + } + + Widget makeKegiatanWidget(String key, KegiatanModel kegiatan) { + return InkWell( + key: Key('$key-${kegiatan.namaKegiatan}'), + onTap: () { + _navigateToDetailKegiatanPage(context, kegiatan); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.transparent, + border: Border(bottom: BorderSide(color: Colors.grey[400]))), + margin: const EdgeInsets.only(left: doubleSpace, right: doubleSpace), + height: 90, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const CircleAvatar( + backgroundColor: greenPrimary, + child: Icon( + Icons.school, + color: Colors.white, + ), + ), + Expanded( + child: Container( + padding: const EdgeInsets.all(doubleSpace), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + kegiatan.namaKegiatan, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w800, + color: Colors.black, + fontFamily: 'Muli', + ), + ), + Text( + kegiatan.timeStart.toString(), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: const TextStyle( + fontSize: 15, + color: Colors.black, + fontFamily: 'Muli', + ), + ), + ], + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + color: Colors.grey[400], + size: 20, + ) + ], + ), + ), + ); + } + + void _navigateToDetailKegiatanPage( + BuildContext context, KegiatanModel kegiatan) async { + + final lokasi = await lokasi_bloc.fetchLokasiListById(kegiatan.placeId); + final route = MaterialPageRoute( + builder: (_) => DetailPostKegiatanPage( + lokasi: lokasi, + kegiatan: kegiatan)); + await Navigator.of(context).push(route); + } +} \ No newline at end of file diff --git a/lib/page/informasi/list_sekolah.dart b/lib/page/informasi/list_sekolah.dart index 2d40d87..cc273a2 100644 --- a/lib/page/informasi/list_sekolah.dart +++ b/lib/page/informasi/list_sekolah.dart @@ -80,7 +80,7 @@ class _ListSekolahState extends State { padding: EdgeInsets.only( top: tripleSpace, left: doubleSpace, right: doubleSpace), child: Text( - 'Jenis Layanan', + 'Agenda Kegiatan', style: TextStyle( fontSize: 25, fontFamily: 'Muli', diff --git a/lib/repository/kegiatan_repository.dart b/lib/repository/kegiatan_repository.dart index c531731..dc3ad1b 100644 --- a/lib/repository/kegiatan_repository.dart +++ b/lib/repository/kegiatan_repository.dart @@ -32,20 +32,12 @@ class KegiatanRepository implements BaseKegiatanRepository { @override Future fetchKegiatanSearch(String search) async { - print('00000000000000000000000000000000000000000000000000000000000'); final url = '/informasi-fasilitas/lokasi/search-kegiatan/$search'; final response = await _network.get(url: url, isLogin: false); - print('11111111111111111111111111111111111111111111111111111111111111'); - print(response.entries.toList()); - print(url); var list = []; for (var each in response.entries.toList()) { - print(each.value); list.add(KegiatanModel.fromJson(each.value)); } - print('22222222222222222222222222222222222222222222222222222222222222'); - print(list); - print(url); return list; // KegiatanSearchList } diff --git a/lib/repository/lokasi_repository.dart b/lib/repository/lokasi_repository.dart index 3609884..32d5a76 100644 --- a/lib/repository/lokasi_repository.dart +++ b/lib/repository/lokasi_repository.dart @@ -59,6 +59,35 @@ class LokasiRepository implements BaseLokasiRepository { return LokasiListResponse(freqPlaces); } + @override + Future fetchLokasiById(String placeId) async { + final response = await _network.get( + url: '/informasi-fasilitas/lokasi/list/', isLogin: false); + + final _places = GoogleMapsPlaces(apiKey: DotEnv().env['API_KEY']); + var details = await _places.getDetailsByPlaceId( + placeId, + fields: [ + 'name', + 'formatted_address', + 'formatted_phone_number', + 'photos' + ], + ); + + final result = details.result; + final lokasi = Lokasi() + ..placeId = result.placeId + ..name = result.name ?? 'INVALID' + ..alamat = result.formattedAddress ?? 'LOCATION INVALID' + ..noTelp = result.formattedPhoneNumber ?? '-'; + + final image = fetchPhoto(details.result.photos[0].photoReference, 480, 480) ?? ''; + lokasi.image = image; + + return lokasi; + } + @override Future fetchRecentSearch() async { final response = await CookiesInterface().getSearchHistory(); -- GitLab From e6cd8e4e866386febb5921a9b6d0bd1b38259f41 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Thu, 3 Jun 2021 00:17:06 +0700 Subject: [PATCH 04/24] [REFACTOR] Remove unused code and fix warnings --- lib/bloc/kegiatan_search_bloc.dart | 44 +++++++++++++++++++++ lib/page/filter_fasilitas/add_kegiatan.dart | 1 - lib/repository/lokasi_repository.dart | 4 +- 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 lib/bloc/kegiatan_search_bloc.dart diff --git a/lib/bloc/kegiatan_search_bloc.dart b/lib/bloc/kegiatan_search_bloc.dart new file mode 100644 index 0000000..463bb92 --- /dev/null +++ b/lib/bloc/kegiatan_search_bloc.dart @@ -0,0 +1,44 @@ +import 'dart:async'; + +import 'package:bisaGo/network/data/network_model.dart'; +import 'package:bisaGo/repository/kegiatan_repository.dart'; +import 'package:get_it/get_it.dart'; + +class KegiatanSearchBloc { + StreamController _recentSearchController; + KegiatanRepository _kegiatanRepository; + StreamController _kegiatanSearchListController; + + StreamController>> get recentSearchSink => + _recentSearchController.sink; + Stream>> get recentSearchStream => + _recentSearchController.stream; + + StreamSink>> get kegiatanSearchListSink => + _kegiatanSearchListController.sink; + Stream>> get layananListStream => + _kegiatanSearchListController.stream; + + KegiatanSearchBloc() { + _kegiatanSearchListController = + StreamController>>(); + _recentSearchController = + StreamController>>(); + _kegiatanRepository = GetIt.instance.get(); + } + + Future fetchKegiatanSearchList(String search) async { + kegiatanSearchListSink.add(NetworkModel.loading('Getting Kegiatan')); + try { + final kegiatanSearchListResponse = await _kegiatanRepository.fetchKegiatanSearch(search); + kegiatanSearchListSink.add(NetworkModel.completed(kegiatanSearchListResponse)); + } catch (e) { + kegiatanSearchListSink.add(NetworkModel.error(e.toString())); + } + } + + void dispose() { + _recentSearchController?.close(); + _kegiatanSearchListController?.close(); + } +} \ No newline at end of file diff --git a/lib/page/filter_fasilitas/add_kegiatan.dart b/lib/page/filter_fasilitas/add_kegiatan.dart index 4aaefeb..e42cd98 100644 --- a/lib/page/filter_fasilitas/add_kegiatan.dart +++ b/lib/page/filter_fasilitas/add_kegiatan.dart @@ -19,7 +19,6 @@ import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:multi_image_picker/multi_image_picker.dart'; -import 'package:permission_handler/permission_handler.dart'; class AddKegiatan extends StatefulWidget { AddKegiatan({ diff --git a/lib/repository/lokasi_repository.dart b/lib/repository/lokasi_repository.dart index 32d5a76..5363d5b 100644 --- a/lib/repository/lokasi_repository.dart +++ b/lib/repository/lokasi_repository.dart @@ -10,6 +10,7 @@ import 'package:http/http.dart' as http; abstract class BaseLokasiRepository { Future fetchLokasi(); + Future fetchLokasiById(String placeId); Future fetchRecentSearch(); Future saveRecentSearch(Lokasi recentSearch); Future addNewLokasi(Map lokasi); @@ -61,9 +62,6 @@ class LokasiRepository implements BaseLokasiRepository { @override Future fetchLokasiById(String placeId) async { - final response = await _network.get( - url: '/informasi-fasilitas/lokasi/list/', isLogin: false); - final _places = GoogleMapsPlaces(apiKey: DotEnv().env['API_KEY']); var details = await _places.getDetailsByPlaceId( placeId, -- GitLab From 16a45587ce60714d57fb94acd1bc9bb9f2d0f995 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Thu, 3 Jun 2021 00:52:55 +0700 Subject: [PATCH 05/24] [REFACTOR] Fix bisago_drawer --- lib/component/bisago_drawer.dart | 4 ++++ test/bisago_drawer_test.dart | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index 523ba03..53860de 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -1,4 +1,5 @@ import 'package:bisaGo/page/informasi/list_kegiatan.dart'; +import 'package:bisaGo/page/informasi/list_sekolah.dart'; import 'package:bisaGo/page/profile/profile.dart'; import 'package:bisaGo/page/tentang_disabilitas/tentang_disabilitas.dart'; import 'package:flutter/material.dart'; @@ -15,6 +16,7 @@ class BisaGoDrawer extends StatelessWidget { {'title': 'Profile', 'icon': Icons.person}, {'title': 'Beranda', 'icon': Icons.home}, {'title': 'Riwayat Pencarian', 'icon': Icons.history}, + {'title': 'Layanan Disabilitas', 'icon': Icons.group}, {'title': 'Agenda Kegiatan', 'icon': Icons.calendar_today}, {'title': 'Tentang Disabilitas', 'icon': Icons.accessible}, {'title': 'Tentang Aplikasi', 'icon': Icons.info}, @@ -195,6 +197,8 @@ class BisaGoDrawer extends StatelessWidget { route = MaterialPageRoute(builder: (_) => const AboutUs()); } else if (page == 'Tentang Disabilitas') { route = MaterialPageRoute(builder: (_) => TentangDisabilitas()); + } else if (page == 'Layanan Disabilitas') { + route = MaterialPageRoute(builder: (_) => ListSekolah()); } else if (page == 'Agenda Kegiatan') { route = MaterialPageRoute(builder: (_) => ListKegiatan()); } diff --git a/test/bisago_drawer_test.dart b/test/bisago_drawer_test.dart index 1100fdc..fb1dbc2 100644 --- a/test/bisago_drawer_test.dart +++ b/test/bisago_drawer_test.dart @@ -117,5 +117,20 @@ void main() { await tester.tap(find.byKey(layananDisabilitasKey)); }); + + testWidgets('Test BisaGo Drawer - Agenda Kegiatan', + (WidgetTester tester) async { + final agendaKegiatanKey = Key('Agenda Kegiatan'); + await tester.pumpWidget(MaterialApp(home: TentangDisabilitas())); + final locateDrawer = + find.byTooltip('Open navigation menu', skipOffstage: false); + await tester.pumpAndSettle(); + await tester.tap(locateDrawer); + await tester.ensureVisible(locateDrawer); + await tester.pumpAndSettle(); + expect(find.text('Agenda Kegiatan'), findsOneWidget); + + await tester.tap(find.byKey(agendaKegiatanKey)); + }); }); } -- GitLab From 56a0641772e0f941b4234fd9fbd6c9ad03363b3d Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Thu, 3 Jun 2021 16:11:19 +0700 Subject: [PATCH 06/24] [RED] Add test for sort kegiatan dropdown --- test/custom_dropdown_sort_kegiatan.dart | 36 +++++++++++++++++++++++++ test/list_kegiatan_test.dart | 36 +++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 test/custom_dropdown_sort_kegiatan.dart diff --git a/test/custom_dropdown_sort_kegiatan.dart b/test/custom_dropdown_sort_kegiatan.dart new file mode 100644 index 0000000..88d9b28 --- /dev/null +++ b/test/custom_dropdown_sort_kegiatan.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:bisaGo/utils/custom_dropdown_sort_kegiatan.dart'; + +void main() { + testWidgets('Renders Title and MenuItems -- Positive', + (WidgetTester tester) async { + final list = {'item 1': 'Item 1', 'item 2': 'Item 2'}; + + await tester.pumpWidget( + StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return MaterialApp( + home: Material( + child: Center( + child: CustomDropdown( + title: 'Title', + required: true, + dropdownList: list, + onChanged: (value) { + setState(() { + value = 'item 1'; + }); + }), + ), + ), + ); + }, + ), + ); + + expect(find.byType(CustomDropdown), findsOneWidget); + expect(find.byKey(Key('Title')), findsOneWidget); + expect(find.text('Item 1'), findsOneWidget); + }); +} diff --git a/test/list_kegiatan_test.dart b/test/list_kegiatan_test.dart index e46c4a5..9c79781 100644 --- a/test/list_kegiatan_test.dart +++ b/test/list_kegiatan_test.dart @@ -17,6 +17,18 @@ class MockKegiatanRepository extends Fake implements KegiatanRepository { 'time_start': '12-12-2021 06:30:00', 'time_end': '12-12-2021 09:30:00' }; + + final mockKegiatan2 = { + 'id': 3, + 'nama_lokasi': 'Margo City', + 'creator': 'Putri Salsabila', + 'nama_kegiatan': 'Rapat Mingguan', + 'penyelenggara': 'DTB Indonesia', + 'narahubung': 'Putsal 08123123123', + 'deskripsi': 'lorem ipsum dolor sit amet', + 'time_start': '10-12-2021 06:30:00', + 'time_end': '10-12-2021 09:30:00' + }; } class MockLokasiRepository extends Fake implements LokasiRepository { @@ -79,5 +91,29 @@ void main() { // negative test expect(find.text('Kopdar Rajin'), findsNothing); }); + + testWidgets('Find Sort Kegiatan Dropdown', (WidgetTester tester) async { + final textFieldKey = Key('Dropdown Sort Kegiatan'); + await tester.pumpWidget(MaterialApp(home: ListKegiatan())); + expect(find.byKey(textFieldKey), findsOneWidget); + }); + + testWidgets('Sort Function', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp(home: ListKegiatan())); + + final sortKey = find.byKey(Key('Dropdown Sort Kegiatan')); + + await tester.ensureVisible( + find.byKey(Key('Dropdown Sort Kegiatan'), skipOffstage: false)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + await tester.tap(sortKey); + await tester.pumpAndSettle(); + await tester.tap(find + .byKey(Key('Dropdown Item Kegiatan Terbaru')) + .last); + await tester.pumpAndSettle(); + await tester.tap(sortKey); + await tester.pumpAndSettle(); + }); } -- GitLab From edeffd02a7c68f5697639af7bb7b845c5e6ab43b Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Thu, 3 Jun 2021 16:19:48 +0700 Subject: [PATCH 07/24] [GREEN] Add sort kegiatan dropdown --- lib/bloc/kegiatan_search_bloc.dart | 6 +- lib/config/strings.dart | 12 ++ lib/page/informasi/list_kegiatan.dart | 41 ++++++- lib/repository/kegiatan_repository.dart | 9 +- lib/utils/custom_dropdown_sort_kegiatan.dart | 112 +++++++++++++++++++ 5 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 lib/utils/custom_dropdown_sort_kegiatan.dart diff --git a/lib/bloc/kegiatan_search_bloc.dart b/lib/bloc/kegiatan_search_bloc.dart index 463bb92..1c66396 100644 --- a/lib/bloc/kegiatan_search_bloc.dart +++ b/lib/bloc/kegiatan_search_bloc.dart @@ -27,10 +27,12 @@ class KegiatanSearchBloc { _kegiatanRepository = GetIt.instance.get(); } - Future fetchKegiatanSearchList(String search) async { + Future fetchKegiatanSearchList(String search, String sortConfig) async { + print(sortConfig); + print('ok masuk'); kegiatanSearchListSink.add(NetworkModel.loading('Getting Kegiatan')); try { - final kegiatanSearchListResponse = await _kegiatanRepository.fetchKegiatanSearch(search); + final kegiatanSearchListResponse = await _kegiatanRepository.fetchKegiatanSearch(search, sortConfig); kegiatanSearchListSink.add(NetworkModel.completed(kegiatanSearchListResponse)); } catch (e) { kegiatanSearchListSink.add(NetworkModel.error(e.toString())); diff --git a/lib/config/strings.dart b/lib/config/strings.dart index 6ce950e..93659c8 100644 --- a/lib/config/strings.dart +++ b/lib/config/strings.dart @@ -105,6 +105,18 @@ const zonaWaktu = { 'WIT': 'WIT', }; +const sortBy = { + 'time':'Kegiatan Terdekat', + 'name':'Nama Kegiatan', + 'latest-added':'Kegiatan Terbaru' +}; + +const sortByReversed = { + 'Kegiatan Terdekat':'time', + 'Nama Kegiatan':'name', + 'Kegiatan Terbaru':'latest-added', +}; + String getTag(String tag) { return tags[tag]; } diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 143cfe1..44c14c9 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -8,6 +8,11 @@ import 'package:bisaGo/bloc/lokasi_response_bloc.dart'; import 'package:bisaGo/network/data/network_model.dart'; import 'package:bisaGo/page/filter_fasilitas/postingan/detail_post_kegiatan.dart'; + +import 'package:bisaGo/config/strings.dart'; +import 'package:bisaGo/utils/custom_dropdown_sort_kegiatan.dart'; +import 'package:bisaGo/utils/validator.dart'; + class ListKegiatan extends StatefulWidget { const ListKegiatan({Key key}) : super(key: key); @@ -22,6 +27,13 @@ class _ListKegiatanState extends State { KegiatanSearchBloc kegiatan_search_bloc = KegiatanSearchBloc(); LokasiResponseBloc lokasi_bloc = LokasiResponseBloc(); + @override void initState() { + // TODO: implement initState + super.initState(); + _sortConfig = 'time'; + kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -41,7 +53,8 @@ class _ListKegiatanState extends State { boxShadow: regularShadow), child: TextFormField( onFieldSubmitted: (text) { - kegiatan_search_bloc.fetchKegiatanSearchList(text); + _text = text; + kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); }, key: const Key('Text Field Cari Kegiatan'), decoration: InputDecoration( @@ -69,6 +82,25 @@ class _ListKegiatanState extends State { fontWeight: FontWeight.w800), ), ), + Container( + child: CustomDropdown( + title: 'Urutkan berdasarkan:', + required: true, + key: const Key('Dropdown Sort Kegiatan'), + validator: FieldValidator.validateDropdown, + dropdownList: sortBy, + hint: 'tes', + onChanged: (value) { + setState(() { + _sortByValue = sortBy[value]; + _sortConfig=value; + kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); + + print(value); + }); + }, + ), + ), //BLoC for Kegiatan Search StreamBuilder>>( stream: kegiatan_search_bloc.layananListStream, @@ -85,6 +117,7 @@ class _ListKegiatanState extends State { break; case Status.completed: var layanan = snapshot.data.data; + print('layanan: $layanan'); return Column( children: layanan.map((each) { return makeKegiatanWidget('kegiatan', each); @@ -108,6 +141,8 @@ class _ListKegiatanState extends State { } Widget makeKegiatanWidget(String key, KegiatanModel kegiatan) { + print('kegiatan widget'); + print(kegiatan.id); return InkWell( key: Key('$key-${kegiatan.namaKegiatan}'), onTap: () { @@ -182,4 +217,8 @@ class _ListKegiatanState extends State { kegiatan: kegiatan)); await Navigator.of(context).push(route); } + + String _sortByValue; + String _text; + String _sortConfig; } \ No newline at end of file diff --git a/lib/repository/kegiatan_repository.dart b/lib/repository/kegiatan_repository.dart index dc3ad1b..1942566 100644 --- a/lib/repository/kegiatan_repository.dart +++ b/lib/repository/kegiatan_repository.dart @@ -8,7 +8,7 @@ abstract class BaseKegiatanRepository { Future createKegiatan( Map newKegiatanData, String placeId); Future fetchDetailKegiatan(String placeId, int kegiatanId); - Future fetchKegiatanSearch(String search); + Future fetchKegiatanSearch(String search, String sortConfig); } class KegiatanRepository implements BaseKegiatanRepository { @@ -31,8 +31,11 @@ class KegiatanRepository implements BaseKegiatanRepository { } @override - Future fetchKegiatanSearch(String search) async { - final url = '/informasi-fasilitas/lokasi/search-kegiatan/$search'; + Future fetchKegiatanSearch(String search, String sortConfig) async { + var url = '/informasi-fasilitas/lokasi/list-kegiatan-by-$sortConfig'; + if(search!=null){ + url += '/$search'; + } final response = await _network.get(url: url, isLogin: false); var list = []; for (var each in response.entries.toList()) { diff --git a/lib/utils/custom_dropdown_sort_kegiatan.dart b/lib/utils/custom_dropdown_sort_kegiatan.dart new file mode 100644 index 0000000..79d31fa --- /dev/null +++ b/lib/utils/custom_dropdown_sort_kegiatan.dart @@ -0,0 +1,112 @@ +import 'package:bisaGo/config/styles.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CustomDropdown extends StatefulWidget { + const CustomDropdown({ + this.title, + this.hint, + this.required = false, + this.key, + this.validator, + this.onSaved, + this.dropdownList, + this.onChanged, + this.value, + }) : super(key: key); + final String title; + final String value; + @override + final Key key; + final FormFieldSetter onSaved; + final String hint; + final bool required; + final FormFieldValidator validator; + final Map dropdownList; + final Function onChanged; + + @override + _CustomDropdownState createState() => _CustomDropdownState(); +} + +class _CustomDropdownState extends State { + final List> _dropdownMenuItems = []; + + void loadDropdownList() { + for (final key in widget.dropdownList.keys) { + _dropdownMenuItems.add(DropdownMenuItem( + key: Key('Dropdown Item ${widget.dropdownList[key]}'), + value: key, + child: Text(widget.dropdownList[key]), + )); + } + } + + void setDefaultValue() { + + } + + @override + void initState() { + super.initState(); + loadDropdownList(); + } + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.symmetric(vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + key: Key(widget.title), + text: TextSpan( + text: widget.title, + style: TextStyle( + fontSize: widget.title == '' ? 0 : 18, + color: Colors.black, + fontFamily: 'Muli'), + children: [ + if (widget.required) + const TextSpan(text: '', style: TextStyle(color: red)), + ], + ), + ), + const SizedBox( + height: 10, + ), + DropdownButtonFormField( + onSaved: widget.onSaved, + validator: widget.validator, + style: const TextStyle( + color: Colors.black, + fontSize: 15, + ), + decoration: InputDecoration( + hintStyle: + const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + hintText: widget.hint, + contentPadding: const EdgeInsets.all(8.0), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, + ), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, + ), + ), + ), + value: widget.value, + items: _dropdownMenuItems, + onChanged: widget.onChanged, + ), + ], + ), + ); + } +} -- GitLab From 2683f0edc8d3bc1cd6603376fbcd55e2d29c81c6 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Thu, 3 Jun 2021 16:26:59 +0700 Subject: [PATCH 08/24] [REFACTOR] Fix linter, remove debugger, changed dropdown hint text --- lib/bloc/kegiatan_search_bloc.dart | 2 -- lib/page/informasi/list_kegiatan.dart | 10 ++-------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/bloc/kegiatan_search_bloc.dart b/lib/bloc/kegiatan_search_bloc.dart index 1c66396..1f7b3c9 100644 --- a/lib/bloc/kegiatan_search_bloc.dart +++ b/lib/bloc/kegiatan_search_bloc.dart @@ -28,8 +28,6 @@ class KegiatanSearchBloc { } Future fetchKegiatanSearchList(String search, String sortConfig) async { - print(sortConfig); - print('ok masuk'); kegiatanSearchListSink.add(NetworkModel.loading('Getting Kegiatan')); try { final kegiatanSearchListResponse = await _kegiatanRepository.fetchKegiatanSearch(search, sortConfig); diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 44c14c9..4c13a43 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -89,15 +89,13 @@ class _ListKegiatanState extends State { key: const Key('Dropdown Sort Kegiatan'), validator: FieldValidator.validateDropdown, dropdownList: sortBy, - hint: 'tes', + hint: 'Kegiatan Terdekat', // hardcoded onChanged: (value) { setState(() { _sortByValue = sortBy[value]; _sortConfig=value; - kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); - - print(value); }); + kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); }, ), ), @@ -117,7 +115,6 @@ class _ListKegiatanState extends State { break; case Status.completed: var layanan = snapshot.data.data; - print('layanan: $layanan'); return Column( children: layanan.map((each) { return makeKegiatanWidget('kegiatan', each); @@ -141,8 +138,6 @@ class _ListKegiatanState extends State { } Widget makeKegiatanWidget(String key, KegiatanModel kegiatan) { - print('kegiatan widget'); - print(kegiatan.id); return InkWell( key: Key('$key-${kegiatan.namaKegiatan}'), onTap: () { @@ -218,7 +213,6 @@ class _ListKegiatanState extends State { await Navigator.of(context).push(route); } - String _sortByValue; String _text; String _sortConfig; } \ No newline at end of file -- GitLab From 8c30781588346c780ea02d0d6090b14b9674b07b Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Thu, 3 Jun 2021 16:30:02 +0700 Subject: [PATCH 09/24] [REFACTOR] Fix lint --- lib/page/informasi/list_kegiatan.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 4c13a43..a159f12 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -92,7 +92,6 @@ class _ListKegiatanState extends State { hint: 'Kegiatan Terdekat', // hardcoded onChanged: (value) { setState(() { - _sortByValue = sortBy[value]; _sortConfig=value; }); kegiatan_search_bloc.fetchKegiatanSearchList(_text,_sortConfig); -- GitLab From 3de1d26f1eacd7f91fd7704ce37647b83ca03efc Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Fri, 4 Jun 2021 23:25:07 +0700 Subject: [PATCH 10/24] [REFACTOR] Back button in detail post kegiatan redirect to previous page --- .../filter_fasilitas/postingan/detail_post_kegiatan.dart | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index 938aee9..659291f 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -50,12 +50,7 @@ class _DetailPostKegiatanPageState extends State { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () => Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (BuildContext context) => Fasilitas( - lokasi: widget.lokasi, - ))), - child: Scaffold( + return Scaffold( appBar: BisaGoAppBar( title: widget.lokasi.name, key: Key('appbar-text-${widget.lokasi.name}'), @@ -502,7 +497,6 @@ class _DetailPostKegiatanPageState extends State { ], ), ), - ), ); } -- GitLab From c61df14666b60d79a043d0975b3a565d5e536618 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Fri, 4 Jun 2021 23:56:05 +0700 Subject: [PATCH 11/24] [REFACTOR] Show all list kegiatan when open agenda kegiatan --- lib/page/informasi/list_kegiatan.dart | 9 +++++++-- lib/repository/kegiatan_repository.dart | 9 ++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 143cfe1..968d4bc 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -22,6 +22,12 @@ class _ListKegiatanState extends State { KegiatanSearchBloc kegiatan_search_bloc = KegiatanSearchBloc(); LokasiResponseBloc lokasi_bloc = LokasiResponseBloc(); + @override + void initState() { + kegiatan_search_bloc.fetchKegiatanSearchList(''); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -109,7 +115,7 @@ class _ListKegiatanState extends State { Widget makeKegiatanWidget(String key, KegiatanModel kegiatan) { return InkWell( - key: Key('$key-${kegiatan.namaKegiatan}'), + key: Key('$key-${kegiatan.id}'), onTap: () { _navigateToDetailKegiatanPage(context, kegiatan); }, @@ -174,7 +180,6 @@ class _ListKegiatanState extends State { void _navigateToDetailKegiatanPage( BuildContext context, KegiatanModel kegiatan) async { - final lokasi = await lokasi_bloc.fetchLokasiListById(kegiatan.placeId); final route = MaterialPageRoute( builder: (_) => DetailPostKegiatanPage( diff --git a/lib/repository/kegiatan_repository.dart b/lib/repository/kegiatan_repository.dart index dc3ad1b..668b87f 100644 --- a/lib/repository/kegiatan_repository.dart +++ b/lib/repository/kegiatan_repository.dart @@ -32,10 +32,17 @@ class KegiatanRepository implements BaseKegiatanRepository { @override Future fetchKegiatanSearch(String search) async { - final url = '/informasi-fasilitas/lokasi/search-kegiatan/$search'; + var url = ''; + if (search == '') { + url = '/informasi-fasilitas/lokasi/list-kegiatan-all'; + } else { + url = '/informasi-fasilitas/lokasi/search-kegiatan/$search'; + } final response = await _network.get(url: url, isLogin: false); var list = []; for (var each in response.entries.toList()) { + print('111111111111111111111111111111111111111'); + print(each); list.add(KegiatanModel.fromJson(each.value)); } return list; // KegiatanSearchList -- GitLab From a86751c953986595accaca85146d9b104e6b8402 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Sat, 5 Jun 2021 00:06:48 +0700 Subject: [PATCH 12/24] [REFACTOR] Delete Layanan disabilitas from navbar --- lib/component/bisago_drawer.dart | 6 +++--- test/bisago_drawer_test.dart | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index 53860de..2181dfb 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -16,7 +16,7 @@ class BisaGoDrawer extends StatelessWidget { {'title': 'Profile', 'icon': Icons.person}, {'title': 'Beranda', 'icon': Icons.home}, {'title': 'Riwayat Pencarian', 'icon': Icons.history}, - {'title': 'Layanan Disabilitas', 'icon': Icons.group}, + // {'title': 'Layanan Disabilitas', 'icon': Icons.group}, {'title': 'Agenda Kegiatan', 'icon': Icons.calendar_today}, {'title': 'Tentang Disabilitas', 'icon': Icons.accessible}, {'title': 'Tentang Aplikasi', 'icon': Icons.info}, @@ -197,8 +197,8 @@ class BisaGoDrawer extends StatelessWidget { route = MaterialPageRoute(builder: (_) => const AboutUs()); } else if (page == 'Tentang Disabilitas') { route = MaterialPageRoute(builder: (_) => TentangDisabilitas()); - } else if (page == 'Layanan Disabilitas') { - route = MaterialPageRoute(builder: (_) => ListSekolah()); + // } else if (page == 'Layanan Disabilitas') { + // route = MaterialPageRoute(builder: (_) => ListSekolah()); } else if (page == 'Agenda Kegiatan') { route = MaterialPageRoute(builder: (_) => ListKegiatan()); } diff --git a/test/bisago_drawer_test.dart b/test/bisago_drawer_test.dart index fb1dbc2..abc1050 100644 --- a/test/bisago_drawer_test.dart +++ b/test/bisago_drawer_test.dart @@ -103,20 +103,20 @@ void main() { await tester.tap(find.byKey(tentangDisabilitasKey)); }); - testWidgets('Test BisaGo Drawer - Info Layanan Disabilitas', - (WidgetTester tester) async { - final layananDisabilitasKey = Key('Layanan Disabilitas'); - await tester.pumpWidget(MaterialApp(home: TentangDisabilitas())); - final locateDrawer = - find.byTooltip('Open navigation menu', skipOffstage: false); - await tester.pumpAndSettle(); - await tester.tap(locateDrawer); - await tester.ensureVisible(locateDrawer); - await tester.pumpAndSettle(); - expect(find.text('Layanan Disabilitas'), findsOneWidget); - - await tester.tap(find.byKey(layananDisabilitasKey)); - }); + // testWidgets('Test BisaGo Drawer - Info Layanan Disabilitas', + // (WidgetTester tester) async { + // final layananDisabilitasKey = Key('Layanan Disabilitas'); + // await tester.pumpWidget(MaterialApp(home: TentangDisabilitas())); + // final locateDrawer = + // find.byTooltip('Open navigation menu', skipOffstage: false); + // await tester.pumpAndSettle(); + // await tester.tap(locateDrawer); + // await tester.ensureVisible(locateDrawer); + // await tester.pumpAndSettle(); + // expect(find.text('Layanan Disabilitas'), findsOneWidget); + + // await tester.tap(find.byKey(layananDisabilitasKey)); + // }); testWidgets('Test BisaGo Drawer - Agenda Kegiatan', (WidgetTester tester) async { -- GitLab From b1ec4748713c0604e21af2caff644e64d39b9692 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Sat, 5 Jun 2021 00:08:57 +0700 Subject: [PATCH 13/24] [REFACTOR] Remove unused import --- lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index 659291f..9cea078 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -21,8 +21,6 @@ import 'package:share/share.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../fasilitas.dart'; - class DetailPostKegiatanPage extends StatefulWidget { final Lokasi lokasi; final KegiatanModel kegiatan; -- GitLab From 126ae046cc6a058562d93bdbf10575f373f40ac3 Mon Sep 17 00:00:00 2001 From: "alvin.hariman" Date: Sat, 5 Jun 2021 00:14:17 +0700 Subject: [PATCH 14/24] [REFACTOR] Remove unused import --- lib/component/bisago_drawer.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index 2181dfb..c85fac4 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -1,5 +1,4 @@ import 'package:bisaGo/page/informasi/list_kegiatan.dart'; -import 'package:bisaGo/page/informasi/list_sekolah.dart'; import 'package:bisaGo/page/profile/profile.dart'; import 'package:bisaGo/page/tentang_disabilitas/tentang_disabilitas.dart'; import 'package:flutter/material.dart'; -- GitLab From 71f2990e8846113254181b997421302ec43e6ccc Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sat, 5 Jun 2021 10:32:27 +0700 Subject: [PATCH 15/24] [CHORES] Cleaning dropdown menu on list_kegiatan --- lib/utils/custom_dropdown_sort_kegiatan.dart | 68 +++++++++----------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/lib/utils/custom_dropdown_sort_kegiatan.dart b/lib/utils/custom_dropdown_sort_kegiatan.dart index 79d31fa..064e404 100644 --- a/lib/utils/custom_dropdown_sort_kegiatan.dart +++ b/lib/utils/custom_dropdown_sort_kegiatan.dart @@ -55,56 +55,48 @@ class _CustomDropdownState extends State { @override Widget build(BuildContext context) { return Container( - margin: const EdgeInsets.symmetric(vertical: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + margin: const EdgeInsets.only( + top: regularSpace, + left: doubleSpace, + right: doubleSpace, + bottom: doubleSpace), + child: Row( + //crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ RichText( key: Key(widget.title), text: TextSpan( text: widget.title, style: TextStyle( - fontSize: widget.title == '' ? 0 : 18, + fontSize: widget.title == '' ? 0 : 15, color: Colors.black, fontFamily: 'Muli'), - children: [ - if (widget.required) - const TextSpan(text: '', style: TextStyle(color: red)), - ], ), ), - const SizedBox( - height: 10, - ), - DropdownButtonFormField( - onSaved: widget.onSaved, - validator: widget.validator, - style: const TextStyle( - color: Colors.black, - fontSize: 15, - ), - decoration: InputDecoration( - hintStyle: - const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), - hintText: widget.hint, - contentPadding: const EdgeInsets.all(8.0), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - borderSide: BorderSide( - color: Theme.of(context).primaryColor, - ), + + // Container width and fontSize are bounded, re-adjust required after any change(s) + Container( + width: 165, + child:DropdownButtonFormField( + onSaved: widget.onSaved, + validator: widget.validator, + style: const TextStyle( + color: Colors.black, + fontSize: 15, + fontFamily: 'Muli', ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - borderSide: BorderSide( - color: Theme.of(context).primaryColor, - ), + decoration: InputDecoration.collapsed( + hintStyle: + const TextStyle( + fontSize: 15, + fontFamily: 'Muli',), + hintText: widget.hint, ), - ), - value: widget.value, - items: _dropdownMenuItems, - onChanged: widget.onChanged, - ), + value: widget.value, + items: _dropdownMenuItems, + onChanged: widget.onChanged, + ),), ], ), ); -- GitLab From a2b2f234f790c1cde90c300b7f54c058519dc42b Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sat, 5 Jun 2021 10:46:04 +0700 Subject: [PATCH 16/24] [REFACTOR] Fix makeKegiatanWidget key into kegiatan.id --- lib/page/informasi/list_kegiatan.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index a159f12..f44e830 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -138,7 +138,7 @@ class _ListKegiatanState extends State { Widget makeKegiatanWidget(String key, KegiatanModel kegiatan) { return InkWell( - key: Key('$key-${kegiatan.namaKegiatan}'), + key: Key('$key-${kegiatan.id}'), onTap: () { _navigateToDetailKegiatanPage(context, kegiatan); }, -- GitLab From 5ef8c2a2f2e8507d84bf3c44b0c90c83d71e23e0 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sat, 5 Jun 2021 11:55:14 +0700 Subject: [PATCH 17/24] [GREEN] Adding isExpanded to handle overflow error --- lib/utils/custom_dropdown_sort_kegiatan.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/utils/custom_dropdown_sort_kegiatan.dart b/lib/utils/custom_dropdown_sort_kegiatan.dart index 064e404..7d158c3 100644 --- a/lib/utils/custom_dropdown_sort_kegiatan.dart +++ b/lib/utils/custom_dropdown_sort_kegiatan.dart @@ -79,6 +79,7 @@ class _CustomDropdownState extends State { Container( width: 165, child:DropdownButtonFormField( + isExpanded: true, onSaved: widget.onSaved, validator: widget.validator, style: const TextStyle( -- GitLab From 9927b2ee5206cbfe349bac2177349989e8cc4c7e Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sat, 5 Jun 2021 12:02:53 +0700 Subject: [PATCH 18/24] [CHORES] Beautify list_kegiatan --- lib/page/informasi/list_kegiatan.dart | 2 +- lib/utils/custom_dropdown_sort_kegiatan.dart | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index f44e830..06f2781 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -73,7 +73,7 @@ class _ListKegiatanState extends State { children: [ const Padding( padding: EdgeInsets.only( - top: tripleSpace, left: doubleSpace, right: doubleSpace), + top: doubleSpace, left: doubleSpace, right: doubleSpace), child: Text( 'Agenda Kegiatan' ?? '', style: TextStyle( diff --git a/lib/utils/custom_dropdown_sort_kegiatan.dart b/lib/utils/custom_dropdown_sort_kegiatan.dart index 7d158c3..7cfd0ce 100644 --- a/lib/utils/custom_dropdown_sort_kegiatan.dart +++ b/lib/utils/custom_dropdown_sort_kegiatan.dart @@ -56,10 +56,9 @@ class _CustomDropdownState extends State { Widget build(BuildContext context) { return Container( margin: const EdgeInsets.only( - top: regularSpace, + top: tripleSpace, left: doubleSpace, - right: doubleSpace, - bottom: doubleSpace), + right: doubleSpace,), child: Row( //crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -77,7 +76,7 @@ class _CustomDropdownState extends State { // Container width and fontSize are bounded, re-adjust required after any change(s) Container( - width: 165, + width: 170, child:DropdownButtonFormField( isExpanded: true, onSaved: widget.onSaved, @@ -86,12 +85,14 @@ class _CustomDropdownState extends State { color: Colors.black, fontSize: 15, fontFamily: 'Muli', + fontWeight: FontWeight.bold, ), decoration: InputDecoration.collapsed( hintStyle: const TextStyle( fontSize: 15, - fontFamily: 'Muli',), + fontFamily: 'Muli', + fontWeight: FontWeight.bold,), hintText: widget.hint, ), value: widget.value, -- GitLab From c029565a14fdd5aa5ae2f52c9c68303cb27b6fc2 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sat, 5 Jun 2021 18:07:25 +0700 Subject: [PATCH 19/24] [CHORES] Adjusting list_kegiatan layout --- lib/page/informasi/list_kegiatan.dart | 51 +++++++++++++++++++-------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 06f2781..0081c52 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -12,6 +12,7 @@ import 'package:bisaGo/page/filter_fasilitas/postingan/detail_post_kegiatan.dart import 'package:bisaGo/config/strings.dart'; import 'package:bisaGo/utils/custom_dropdown_sort_kegiatan.dart'; import 'package:bisaGo/utils/validator.dart'; +import 'package:intl/intl.dart'; class ListKegiatan extends StatefulWidget { const ListKegiatan({Key key}) : super(key: key); @@ -161,25 +162,43 @@ class _ListKegiatanState extends State { Expanded( child: Container( padding: const EdgeInsets.all(doubleSpace), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, + child: Row( + //crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - kegiatan.namaKegiatan, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.left, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w800, - color: Colors.black, - fontFamily: 'Muli', + Flexible( + child:Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + kegiatan.namaKegiatan, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w800, + color: Colors.black, + fontFamily: 'Muli', + ), + ), + Text( + kegiatan.penyelenggara, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + style: const TextStyle( + fontSize: 15, + //fontWeight: FontWeight.w800, + color: Colors.black, + fontFamily: 'Muli', + ), + ), + ] ), ), Text( - kegiatan.timeStart.toString(), + DateFormat('dd-MM-yyyy\nhh:mm').format(kegiatan.timeStart), overflow: TextOverflow.ellipsis, - textAlign: TextAlign.left, + textAlign: TextAlign.right, style: const TextStyle( fontSize: 15, color: Colors.black, @@ -212,6 +231,10 @@ class _ListKegiatanState extends State { await Navigator.of(context).push(route); } + String getTanggalFormatting(KegiatanModel kegiatan) { + return null; + } + String _text; String _sortConfig; } \ No newline at end of file -- GitLab From 43d455f28daa73ae59a95ee100b0bb9af944f568 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sun, 6 Jun 2021 15:27:12 +0700 Subject: [PATCH 20/24] [REFACTOR] Minor refactor --- lib/config/strings.dart | 6 ------ lib/page/informasi/list_kegiatan.dart | 1 + lib/utils/custom_dropdown_sort_kegiatan.dart | 4 ++-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/config/strings.dart b/lib/config/strings.dart index 93659c8..e3ab391 100644 --- a/lib/config/strings.dart +++ b/lib/config/strings.dart @@ -111,12 +111,6 @@ const sortBy = { 'latest-added':'Kegiatan Terbaru' }; -const sortByReversed = { - 'Kegiatan Terdekat':'time', - 'Nama Kegiatan':'name', - 'Kegiatan Terbaru':'latest-added', -}; - String getTag(String tag) { return tags[tag]; } diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index 88f8df1..b1d4d62 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -63,6 +63,7 @@ class _ListKegiatanState extends State { color: greenPrimary, size: 25, ), + hintText: "Cari kegiatan di sini", ), ), ), diff --git a/lib/utils/custom_dropdown_sort_kegiatan.dart b/lib/utils/custom_dropdown_sort_kegiatan.dart index 7cfd0ce..14c3420 100644 --- a/lib/utils/custom_dropdown_sort_kegiatan.dart +++ b/lib/utils/custom_dropdown_sort_kegiatan.dart @@ -85,14 +85,14 @@ class _CustomDropdownState extends State { color: Colors.black, fontSize: 15, fontFamily: 'Muli', - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w800, ), decoration: InputDecoration.collapsed( hintStyle: const TextStyle( fontSize: 15, fontFamily: 'Muli', - fontWeight: FontWeight.bold,), + fontWeight: FontWeight.w800,), hintText: widget.hint, ), value: widget.value, -- GitLab From 316022150e66c7470f0e58d5f29be913d536a126 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Sun, 6 Jun 2021 15:41:41 +0700 Subject: [PATCH 21/24] [REFACTOR] Fix lint --- lib/page/informasi/list_kegiatan.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index b1d4d62..cbd47e4 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -63,7 +63,7 @@ class _ListKegiatanState extends State { color: greenPrimary, size: 25, ), - hintText: "Cari kegiatan di sini", + hintText: 'Cari kegiatan di sini', ), ), ), -- GitLab From df28babe8da5c65d0ca103a6eaa4525b3054fbc4 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Mon, 7 Jun 2021 09:19:44 +0700 Subject: [PATCH 22/24] [REFACTOR] Fix search not null issue on search_kegiatan --- lib/repository/kegiatan_repository.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repository/kegiatan_repository.dart b/lib/repository/kegiatan_repository.dart index 18b098d..05da01a 100644 --- a/lib/repository/kegiatan_repository.dart +++ b/lib/repository/kegiatan_repository.dart @@ -33,7 +33,7 @@ class KegiatanRepository implements BaseKegiatanRepository { @override Future fetchKegiatanSearch(String search, String sortConfig) async { var url = '/informasi-fasilitas/lokasi/list-kegiatan-by-$sortConfig'; - if(search != null){ + if(search != null && search!=''){ url += '/$search'; } final response = await _network.get(url: url, isLogin: false); -- GitLab From 824de8b001c8cd8161006fdfed91a389205f37d2 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Mon, 7 Jun 2021 09:28:51 +0700 Subject: [PATCH 23/24] [CHORES] Changes status.error list_kegiatan message feedback --- lib/page/informasi/list_kegiatan.dart | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/page/informasi/list_kegiatan.dart b/lib/page/informasi/list_kegiatan.dart index cbd47e4..bad4656 100644 --- a/lib/page/informasi/list_kegiatan.dart +++ b/lib/page/informasi/list_kegiatan.dart @@ -122,9 +122,16 @@ class _ListKegiatanState extends State { ); break; case Status.error: - return Center( - child: Text(snapshot.data.data.toString()), - ); + return Center(child: Container( + padding: const EdgeInsets.only(top: tripleSpace), + child: Text('Tidak ada kegaitan ditemukan', + style: const TextStyle( + fontSize: 18, + color: Colors.black, + fontFamily: 'Muli', + ), + + textAlign: TextAlign.center,),),); break; } } -- GitLab From 410a9f7edb88a06cfc68f2c52cbd04fb9b98b4b1 Mon Sep 17 00:00:00 2001 From: NoorHasyim Date: Mon, 7 Jun 2021 15:45:55 +0700 Subject: [PATCH 24/24] [REFACTOR] punya ariq --- .../metadata/android/id/changelogs/changelogs.txt | 11 +++-------- lib/page/profile/profile.dart | 1 + 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index 01e948e..8087395 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1,5 +1,6 @@ -3.5.2: +3.6.0: - Tersedia nama dan foto profil pada drawer +- Tersedia daftar agenda kegiatan - Pengguna dapat mengganti foto profil - Pengguna dapat mengubah informasi kegiatan yang sudah ada @@ -11,10 +12,4 @@ - Perbaikan bugs 3.2.0: -- Tersedia fitur membagikan informasi fasilitas/kegiatan disabilitas kepada orang lain - -3.1.2: -- Perbaikan masuk dengan Google -- Tersedia fitur pencarian layanan -- Tersedia pilihan kamera ketika menambahkan gambar fasilitas -- Tersedia fitur riwayat pencarian +- Tersedia fitur membagikan informasi fasilitas/kegiatan disabilitas kepada orang lain \ No newline at end of file diff --git a/lib/page/profile/profile.dart b/lib/page/profile/profile.dart index 1be14a3..5861ecc 100644 --- a/lib/page/profile/profile.dart +++ b/lib/page/profile/profile.dart @@ -363,6 +363,7 @@ class _ProfileState extends State { } Color _getFontColor(String fieldName, {Color seenColor = seenColor}) { + if (user == null) return seenColor; if (user.canSeeHiddenFields) return seenColor; final hiddenFields = user.hiddenFields; if (hiddenFields.contains(fieldName)) { -- GitLab