From 8c008e3f9d667e8d44e7c34dc27716b4c50102bf Mon Sep 17 00:00:00 2001 From: Putri Salsabila Date: Thu, 27 May 2021 11:11:50 +0700 Subject: [PATCH 1/3] [REFACTOR] Add link kegiatan & change detail post order --- lib/model/kegiatan.dart | 4 +- lib/model/kegiatan.g.dart | 4 +- lib/page/dashboard/dashboard.dart | 1 + lib/page/filter_fasilitas/kegiatan.dart | 2 +- .../postingan/detail_post_kegiatan.dart | 135 +++++++++++------- 5 files changed, 87 insertions(+), 59 deletions(-) diff --git a/lib/model/kegiatan.dart b/lib/model/kegiatan.dart index b243bb1..68ec597 100644 --- a/lib/model/kegiatan.dart +++ b/lib/model/kegiatan.dart @@ -20,7 +20,7 @@ class KegiatanModel { final String penyelenggara; final String narahubung; final String deskripsi; - // final String links; + final String links; @JsonKey(name: 'time_start', fromJson: CustomSerializer.stringToDateTime) final DateTime timeStart; @JsonKey(name: 'time_end', fromJson: CustomSerializer.stringToDateTime) @@ -36,7 +36,7 @@ class KegiatanModel { this.penyelenggara, this.narahubung, this.deskripsi, - // this.links, + this.links, this.timeStart, this.timeEnd, this.image, diff --git a/lib/model/kegiatan.g.dart b/lib/model/kegiatan.g.dart index 57eba46..7318813 100644 --- a/lib/model/kegiatan.g.dart +++ b/lib/model/kegiatan.g.dart @@ -30,7 +30,7 @@ KegiatanModel _$KegiatanModelFromJson(Map json) { penyelenggara: json['penyelenggara'] as String, narahubung: json['narahubung'] as String, deskripsi: json['deskripsi'] as String, - // links: json['links'] as String, + links: json['links'] as String, timeStart: CustomSerializer.stringToDateTime(json['time_start'] as String), timeEnd: CustomSerializer.stringToDateTime(json['time_end'] as String), image: (json['image'] as List)?.map((e) => e as String)?.toList(), @@ -46,7 +46,7 @@ Map _$KegiatanModelToJson(KegiatanModel instance) => 'penyelenggara': instance.penyelenggara, 'narahubung': instance.narahubung, 'deskripsi': instance.deskripsi, - // 'links': instance.links, + 'links': instance.links, 'time_start': instance.timeStart?.toIso8601String(), 'time_end': instance.timeEnd?.toIso8601String(), 'image': instance.image, diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index 8e70ad4..93f91a4 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -377,6 +377,7 @@ class DashboardState extends State { penyelenggara: kegiatan.penyelenggara, narahubung: kegiatan.narahubung, deskripsi: kegiatan.deskripsi, + links: kegiatan.links, timeStart: kegiatan.timeStart, timeEnd: kegiatan.timeEnd, image: kegiatan.image, diff --git a/lib/page/filter_fasilitas/kegiatan.dart b/lib/page/filter_fasilitas/kegiatan.dart index 838e5f8..7646f2c 100644 --- a/lib/page/filter_fasilitas/kegiatan.dart +++ b/lib/page/filter_fasilitas/kegiatan.dart @@ -33,7 +33,7 @@ class _KegiatanState extends State { penyelenggara: widget.kegiatan.penyelenggara, narahubung: widget.kegiatan.narahubung, deskripsi: widget.kegiatan.deskripsi, - // links: widget.kegiatan.links, + links: widget.kegiatan.links, timeStart: widget.kegiatan.timeStart, timeEnd: widget.kegiatan.timeEnd, image: widget.kegiatan.image, diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index f34fb28..b3dcb87 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -18,7 +18,7 @@ import 'package:bisaGo/network/data/network_model.dart'; import 'package:bisaGo/page/login/login.dart'; import 'package:share/share.dart'; import 'package:shared_preferences/shared_preferences.dart'; -// import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../fasilitas.dart'; @@ -94,7 +94,7 @@ class _DetailPostKegiatanPageState extends State { children: [ SizedBox(height: regularSpace), Text( - widget.kegiatan.namaKegiatan, + '${widget.kegiatan.namaKegiatan}', style: const TextStyle( fontSize: 30, fontWeight: FontWeight.w800, @@ -206,9 +206,7 @@ class _DetailPostKegiatanPageState extends State { .toList(), ), ), - const SizedBox( - height: 10, - ), + const SizedBox(height: 10), Container( key: const Key('desc'), padding: const EdgeInsets.all(doubleSpace), @@ -216,6 +214,29 @@ class _DetailPostKegiatanPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text( + '${widget.kegiatan.deskripsi}', + textAlign: TextAlign.justify, + style: const TextStyle(fontSize: 16), + key: const Key('Text Deskripsi Kegiatan'), + ), + SizedBox(height: 20), + Row( + children: [ + const Icon( + Icons.calendar_today, + size: 20, + color: Colors.green, + ), + const SizedBox(width: 15), + Text( + '${DateFormat('EEEEEE, dd MMM yyy').format(widget.kegiatan.timeStart)}', + style: TextStyle(fontSize: 16), + key: Key('Text Tanggal Pelaksanaan'), + ), + ], + ), + SizedBox(height: 15), Row( children: [ const Icon( @@ -223,44 +244,14 @@ class _DetailPostKegiatanPageState extends State { size: 20, color: Colors.green, ), - const SizedBox(width: 7.0), + const SizedBox(width: 15), Text( - '${DateFormat('EEEEEE, dd MMM yyy hh:mm').format(widget.kegiatan.timeStart)}', + '${DateFormat('hh:mm').format(widget.kegiatan.timeStart)}', style: TextStyle(fontSize: 16), key: Key('Text Waktu Pelaksanaan'), ), ], ), - SizedBox(height: 35), - Text( - widget.kegiatan.deskripsi, - style: const TextStyle(fontSize: 16), - key: const Key('Text Deskripsi Kegiatan'), - ), - // UNTUK SPRINT 4 - // SizedBox(height: 35), - // Wrap( - // children: [ - // const Icon( - // Icons.language, - // size: 20, - // color: Colors.green, - // ), - // const SizedBox(width: 7.0), - // TextButton( - // key: const Key('Text Deskripsi Kegiatan'), - // onPressed: () => setState(() { - // _launchInBrowser(widget.kegiatan.links); - // }), - // child: Text( - // widget.kegiatan.links, - // style: TextStyle(fontSize: 16), - // key: Key('Text Link'), - // ), - // ), - // ], - // ), - SizedBox(height: 35), Row( children: [ const Icon( @@ -269,10 +260,39 @@ class _DetailPostKegiatanPageState extends State { color: Colors.green, ), const SizedBox(width: 7.0), - Text( - widget.kegiatan.narahubung, - style: TextStyle(fontSize: 16), + TextButton( key: Key('Text Narahubung'), + onPressed: () => setState(() { + _makePhoneCall(widget.kegiatan.narahubung); + }), + child: Text( + widget.kegiatan.narahubung ?? '-', + style: TextStyle(fontSize: 16), + key: Key('Text Link'), + ), + ), + ], + ), + Row( + children: [ + const Icon( + Icons.language, + size: 20, + color: Colors.green, + ), + const SizedBox(width: 7.0), + Expanded( + child: TextButton( + key: const Key('Text Link Kegiatan'), + onPressed: () => setState(() { + _launchInBrowser(widget.kegiatan.links); + }), + child: Text( + widget.kegiatan.links ?? '-', + style: TextStyle(fontSize: 16), + key: Key('Text Link'), + ), + ), ), ], ), @@ -299,7 +319,7 @@ class _DetailPostKegiatanPageState extends State { maxWidth: MediaQuery.of(context).size.width * 0.3), child: Text( - widget.kegiatan.creator, + '${widget.kegiatan.creator}', key: Key('creator-${widget.kegiatan.creator}'), overflow: TextOverflow.fade, softWrap: false, @@ -479,19 +499,26 @@ class _DetailPostKegiatanPageState extends State { } } - // UNTUK SPRINT 4 - // Future _launchInBrowser(String url) async { - // if (await canLaunch(url)) { - // await launch( - // url, - // forceSafariVC: false, - // forceWebView: false, - // headers: {'Key': 'URLlaunch'}, - // ); - // } else { - // throw 'Could not launch $url'; - // } - // } + Future _launchInBrowser(String url) async { + if (await canLaunch(url)) { + await launch( + url, + forceSafariVC: false, + forceWebView: false, + headers: {'Key': 'URLlaunch'}, + ); + } else { + throw 'Could not launch $url'; + } + } + + Future _makePhoneCall(String url) async { + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } Future _validateKomentarKegiatanInput() async { final form = _formKey.currentState; -- GitLab From ad28cb0961da2a132459f202702368c4feedbe29 Mon Sep 17 00:00:00 2001 From: Putri Salsabila Date: Thu, 27 May 2021 12:49:47 +0700 Subject: [PATCH 2/3] [REFACTOR] Debug url call launcher --- lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index b3dcb87..40dc3cf 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -263,7 +263,7 @@ class _DetailPostKegiatanPageState extends State { TextButton( key: Key('Text Narahubung'), onPressed: () => setState(() { - _makePhoneCall(widget.kegiatan.narahubung); + _makePhoneCall('tel:${widget.kegiatan.narahubung}'); }), child: Text( widget.kegiatan.narahubung ?? '-', -- GitLab From 82b3eabf801767e9f04830ffe3fbbe8d34abdc3b Mon Sep 17 00:00:00 2001 From: Putri Salsabila Date: Sat, 29 May 2021 16:39:08 +0700 Subject: [PATCH 3/3] [REFACTOR] Add nama & nomor kontak model and form --- lib/config/custom_serializer.dart | 3 +- lib/config/strings.dart | 6 ++ lib/model/kegiatan.dart | 8 ++- lib/model/kegiatan.g.dart | 8 ++- lib/page/dashboard/dashboard.dart | 4 +- lib/page/filter_fasilitas/add_kegiatan.dart | 68 +++++++++++++++---- lib/page/filter_fasilitas/kegiatan.dart | 4 +- .../postingan/detail_post_kegiatan.dart | 12 +++- 8 files changed, 88 insertions(+), 25 deletions(-) diff --git a/lib/config/custom_serializer.dart b/lib/config/custom_serializer.dart index 00ed551..60aaf72 100644 --- a/lib/config/custom_serializer.dart +++ b/lib/config/custom_serializer.dart @@ -2,6 +2,7 @@ import 'package:intl/intl.dart'; class CustomSerializer { static DateTime stringToDateTime(String date) { - return DateFormat('yyyy-MM-dd hh:mm').parse(date); + return DateFormat('%Y-%m-%dT%H:%M%z').parse(date); + // return DateFormat('yyyy-MM-dd THH:mm:ssZ').parse(date); pake yg ini coba kalo atasnya error } } diff --git a/lib/config/strings.dart b/lib/config/strings.dart index 0b92be6..6ce950e 100644 --- a/lib/config/strings.dart +++ b/lib/config/strings.dart @@ -99,6 +99,12 @@ const fasilitas = { 'TB': 'Tempat Parkir Biasa', }; +const zonaWaktu = { + 'WIB': 'WIB', + 'WITA': 'WITA', + 'WIT': 'WIT', +}; + String getTag(String tag) { return tags[tag]; } diff --git a/lib/model/kegiatan.dart b/lib/model/kegiatan.dart index 68ec597..7c6a6cf 100644 --- a/lib/model/kegiatan.dart +++ b/lib/model/kegiatan.dart @@ -18,13 +18,15 @@ class KegiatanModel { @JsonKey(name: 'nama_kegiatan') final String namaKegiatan; final String penyelenggara; - final String narahubung; final String deskripsi; + final String namaKontak; + final String nomorKontak; final String links; @JsonKey(name: 'time_start', fromJson: CustomSerializer.stringToDateTime) final DateTime timeStart; @JsonKey(name: 'time_end', fromJson: CustomSerializer.stringToDateTime) final DateTime timeEnd; + final String zonaWaktu; List image; KegiatanModel( @@ -34,11 +36,13 @@ class KegiatanModel { this.creator, this.namaKegiatan, this.penyelenggara, - this.narahubung, this.deskripsi, + this.namaKontak, + this.nomorKontak, this.links, this.timeStart, this.timeEnd, + this.zonaWaktu, this.image, } ); diff --git a/lib/model/kegiatan.g.dart b/lib/model/kegiatan.g.dart index 7318813..b8228ae 100644 --- a/lib/model/kegiatan.g.dart +++ b/lib/model/kegiatan.g.dart @@ -28,11 +28,13 @@ KegiatanModel _$KegiatanModelFromJson(Map json) { creator: json['creator'] as String, namaKegiatan: json['nama_kegiatan'] as String, penyelenggara: json['penyelenggara'] as String, - narahubung: json['narahubung'] as String, deskripsi: json['deskripsi'] as String, + namaKontak: json['nama_kontak'] as String, + nomorKontak: json['nomor_kontak'] as String, links: json['links'] as String, timeStart: CustomSerializer.stringToDateTime(json['time_start'] as String), timeEnd: CustomSerializer.stringToDateTime(json['time_end'] as String), + zonaWaktu: json['zona_waktu'] as String, image: (json['image'] as List)?.map((e) => e as String)?.toList(), ); } @@ -44,10 +46,12 @@ Map _$KegiatanModelToJson(KegiatanModel instance) => 'creator': instance.creator, 'nama_kegiatan': instance.namaKegiatan, 'penyelenggara': instance.penyelenggara, - 'narahubung': instance.narahubung, 'deskripsi': instance.deskripsi, + 'nama_kontak': instance.namaKontak, + 'nomor_kontak': instance.nomorKontak, 'links': instance.links, 'time_start': instance.timeStart?.toIso8601String(), 'time_end': instance.timeEnd?.toIso8601String(), + 'zona_waktu': instance.zonaWaktu, 'image': instance.image, }; diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index 93f91a4..1bade00 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -375,11 +375,13 @@ class DashboardState extends State { creator: kegiatan.creator, namaKegiatan: kegiatan.namaKegiatan, penyelenggara: kegiatan.penyelenggara, - narahubung: kegiatan.narahubung, deskripsi: kegiatan.deskripsi, + namaKontak: kegiatan.namaKontak, + nomorKontak: kegiatan.nomorKontak, links: kegiatan.links, timeStart: kegiatan.timeStart, timeEnd: kegiatan.timeEnd, + zonaWaktu: kegiatan.zonaWaktu, image: kegiatan.image, ), )); diff --git a/lib/page/filter_fasilitas/add_kegiatan.dart b/lib/page/filter_fasilitas/add_kegiatan.dart index 76145d9..6620cca 100644 --- a/lib/page/filter_fasilitas/add_kegiatan.dart +++ b/lib/page/filter_fasilitas/add_kegiatan.dart @@ -4,9 +4,11 @@ import 'dart:io'; import 'package:bisaGo/bloc/kegiatan_bloc.dart'; import 'package:bisaGo/component/bisago_appbar.dart'; import 'package:bisaGo/component/image_preview_holder.dart'; +// import 'package:bisaGo/config/strings.dart'; import 'package:bisaGo/config/styles.dart'; import 'package:bisaGo/model/kegiatan.dart'; import 'package:bisaGo/utils/custom_button.dart'; +// import 'package:bisaGo/utils/custom_dropdown.dart'; import 'package:bisaGo/utils/custom_text_field.dart'; import 'package:bisaGo/utils/validator.dart'; import 'package:dio/dio.dart'; @@ -34,14 +36,15 @@ class AddKegiatan extends StatefulWidget { class _AddKegiatanState extends State { final GlobalKey _formKey = GlobalKey(); - TextEditingController nameController = TextEditingController(); - TextEditingController phoneController = TextEditingController(); + TextEditingController namaKegiatanController = TextEditingController(); TextEditingController penyelenggaraController = TextEditingController(); - TextEditingController narahubungController = TextEditingController(); TextEditingController deskripsiController = TextEditingController(); + TextEditingController namaKontakController = TextEditingController(); + TextEditingController nomorKontakController = TextEditingController(); + TextEditingController linkController = TextEditingController(); String tanggalKegiatan = - '${DateFormat('yyyy-MM-dd hh:mm').format(DateTime.now())}'; + '${DateFormat('yyyy-MM-dd THH:mm:ssZ').format(DateTime.now())}'; @override Widget build(BuildContext context) { @@ -75,7 +78,9 @@ class _AddKegiatanState extends State { namaKegiatanField(), deskripsiField(), penyelenggaraField(), - narahubungField(), + namaKontakField(), + nomorKontakField(), + linkField(), tanggalKegiatanField(), fotoField(), _showImagePreview(), @@ -111,7 +116,7 @@ class _AddKegiatanState extends State { required: true, key: const Key('Text Field Nama'), validator: FieldValidator.validateName, - controller: nameController, + controller: namaKegiatanController, ); } @@ -179,20 +184,40 @@ class _AddKegiatanState extends State { ); } - Widget narahubungField() { + Widget namaKontakField() { return CustomTextField( - title: 'Nomor Telepon Narahubung', + title: 'Nama Narahubung', required: true, - key: const Key('Text Field Nomor Telepon Narahubung'), + key: const Key('Text Field Nama Narahubung'), validator: FieldValidator.validateName, - controller: narahubungController, + controller: namaKontakController, + ); + } + + Widget nomorKontakField() { + return CustomTextField( + title: 'Nomor Kontak Narahubung', + required: true, + key: const Key('Text Field Nomor Kontak Narahubung'), + validator: FieldValidator.validateName, + controller: nomorKontakController, + ); + } + + Widget linkField() { + return CustomTextField( + title: 'Link Kegiatan', + required: true, + key: const Key('Text Field Link Kegiatan'), + validator: FieldValidator.validateName, + controller: linkController, ); } Widget tanggalKegiatanField() { return Padding( padding: const EdgeInsets.only(bottom: 16), - child: Wrap( + child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( @@ -218,7 +243,7 @@ class _AddKegiatanState extends State { onChanged: (date) { setState(() { tanggalKegiatan = - '${DateFormat('yyyy-MM-dd hh:mm').format(date)}'; + '${DateFormat('yyyy-MM-dd THH:mm:ssZ').format(date)}'; }); }, ); @@ -229,6 +254,17 @@ class _AddKegiatanState extends State { fontSize: 15.0, color: Colors.white), ), ), + // CustomDropdown( + // title: 'Fasilitas / Layanan', + // key: const Key('Dropdown Fasilitas Layanan'), + // dropdownList: zonaWaktu, + // validator: FieldValidator.validateDropdown, + // hint: 'Pilih fasilitas / layanan', + // onChanged: (value) { + // setState(() { + // _blombikinstringnya = value; + // }); + // }), ], ), ); @@ -340,10 +376,12 @@ class _AddKegiatanState extends State { ); final newKegiatan = KegiatanModel( - namaKegiatan: nameController.text, - deskripsi: deskripsiController.text, - narahubung: narahubungController.text, + namaKegiatan: namaKegiatanController.text, penyelenggara: penyelenggaraController.text, + deskripsi: deskripsiController.text, + namaKontak: namaKontakController.text, + nomorKontak: nomorKontakController.text, + links: linkController.text, timeStart: DateTime.parse(tanggalKegiatan), timeEnd: DateTime.parse(tanggalKegiatan).add( Duration(days: 1), diff --git a/lib/page/filter_fasilitas/kegiatan.dart b/lib/page/filter_fasilitas/kegiatan.dart index 7646f2c..aa9deb9 100644 --- a/lib/page/filter_fasilitas/kegiatan.dart +++ b/lib/page/filter_fasilitas/kegiatan.dart @@ -31,11 +31,13 @@ class _KegiatanState extends State { creator: widget.kegiatan.creator, namaKegiatan: widget.kegiatan.namaKegiatan, penyelenggara: widget.kegiatan.penyelenggara, - narahubung: widget.kegiatan.narahubung, deskripsi: widget.kegiatan.deskripsi, + namaKontak: widget.kegiatan.namaKontak, + nomorKontak: widget.kegiatan.nomorKontak, links: widget.kegiatan.links, timeStart: widget.kegiatan.timeStart, timeEnd: widget.kegiatan.timeEnd, + zonaWaktu: widget.kegiatan.zonaWaktu, image: widget.kegiatan.image, ), ) diff --git a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart index 7d19f18..17760e0 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -274,13 +274,19 @@ class _DetailPostKegiatanPageState extends State { color: Colors.green, ), const SizedBox(width: 7.0), + Text( + '${widget.kegiatan.namaKontak}', + style: const TextStyle(fontSize: 16), + key: const Key('Text Nama Kontak Kegiatan'), + ), + const SizedBox(width: 7.0), TextButton( - key: Key('Text Narahubung'), + key: Key('Text Nomor Kontak Kegiatan'), onPressed: () => setState(() { - _makePhoneCall('tel:${widget.kegiatan.narahubung}'); + _makePhoneCall('tel:${widget.kegiatan.nomorKontak}'); }), child: Text( - widget.kegiatan.narahubung ?? '-', + widget.kegiatan.nomorKontak ?? '-', style: TextStyle(fontSize: 16), key: Key('Text Link'), ), -- GitLab