diff --git a/lib/config/custom_serializer.dart b/lib/config/custom_serializer.dart index 00ed551485c6ffcbb5d0b4b99156a5d29c1d383b..60aaf724aedcb62fdfc91e7e7e239077af5acf83 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 0b92be644f1eaf3920c9f45bb060d95b9e5887f2..6ce950e515027b4881b63595ed4666613ddd63b7 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 b243bb1181f3138aa9352b2c564e49d61eb21f9b..7c6a6cfa560f3e28e5d62b6bd4b4d8fd820fb98c 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 links; + 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.links, + 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 57eba462df75dd2dcf06b1e65dafba3f2b740460..b8228aece437f1fea94d72ed7189fc367fecbd0f 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, - // links: json['links'] 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, - // 'links': instance.links, + '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 8e70ad4b6701d65f787ae760644f32541446f775..1bade00aec9156edfbdc48fa8df9ba4111faddcd 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -375,10 +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 76145d90381eeefd753bd1b987032d077b1beb46..6620cca9a7d9021532ac1f185a458fca32a16423 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 838e5f8ab15e2e5ec223c4fbd144d17d92f4b1bd..aa9deb931b0e3902c5d465b6f651caef3cfe0a74 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, - // links: widget.kegiatan.links, + 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 d7213f9b28a046af745c5e7cf014ec90523807cb..17760e075efe97e0382af5d2a4d9d923644cc64c 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post_kegiatan.dart @@ -19,7 +19,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'; @@ -95,7 +95,7 @@ class _DetailPostKegiatanPageState extends State { children: [ SizedBox(height: regularSpace), Text( - widget.kegiatan.namaKegiatan, + '${widget.kegiatan.namaKegiatan}', style: const TextStyle( fontSize: 30, fontWeight: FontWeight.w800, @@ -220,9 +220,7 @@ class _DetailPostKegiatanPageState extends State { .toList(), ), ), - const SizedBox( - height: 10, - ), + const SizedBox(height: 10), Container( key: const Key('desc'), padding: const EdgeInsets.all(doubleSpace), @@ -230,6 +228,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( @@ -237,44 +258,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( @@ -284,9 +275,44 @@ class _DetailPostKegiatanPageState extends State { ), const SizedBox(width: 7.0), Text( - widget.kegiatan.narahubung, - style: TextStyle(fontSize: 16), - key: Key('Text Narahubung'), + '${widget.kegiatan.namaKontak}', + style: const TextStyle(fontSize: 16), + key: const Key('Text Nama Kontak Kegiatan'), + ), + const SizedBox(width: 7.0), + TextButton( + key: Key('Text Nomor Kontak Kegiatan'), + onPressed: () => setState(() { + _makePhoneCall('tel:${widget.kegiatan.nomorKontak}'); + }), + child: Text( + widget.kegiatan.nomorKontak ?? '-', + 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'), + ), + ), ), ], ), @@ -313,7 +339,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, @@ -493,19 +519,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;