diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index b0b40fa..05fb5e4 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -572,5 +572,18 @@ "processing.package.create":"New Package", "processing.package.update":"Update Package", "processing.package.delete_confirm":"Remove this package?", - "Processing End ================================================================":"" + "Processing End ================================================================":"", + + "Pickup Start ================================================================":"", + "pickup.title":"Pickups", + "pickup.info.title":"Pickup", + "pickup.edit.title":"Pickup", + "pickup.pickup_number":"Pickup Number", + "pickup.date":"Pickup Date", + "pickup.time":"Pickup Time", + "pickup.status":"Status", + "pickup.desc":"Description", + "pickup.remark":"Remark", + "pickup.edit.complete.btn":"Complete pickup", + "Pickup End ===================================================================":"" } \ No newline at end of file diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index f4e7c89..09c17f3 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -570,7 +570,18 @@ "processing.package.create":"အထုပ် အသစ်", "processing.package.update":"အထုပ် ပြင်ဆင်ခြင်း ", "processing.package.delete_confirm":"Remove this package?", - "Processing End ================================================================":"" + "Processing End ================================================================":"", - + "Pickup Start ================================================================":"", + "pickup.title":"Pickups", + "pickup.info.title":"Pickup", + "pickup.edit.title":"Pickup", + "pickup.pickup_number":"Pickup Number", + "pickup.date":"Pickup Date", + "pickup.time":"Pickup Time", + "pickup.status":"အခြေအနေ", + "pickup.desc":"ဖော်ပြချက်", + "pickup.remark":"မှတ်ချက်", + "pickup.edit.complete.btn":"Complete pickup", + "Pickup End ===================================================================":"" } \ No newline at end of file diff --git a/lib/pages/main/home_page.dart b/lib/pages/main/home_page.dart index 1e1b88d..3a13a9c 100644 --- a/lib/pages/main/home_page.dart +++ b/lib/pages/main/home_page.dart @@ -23,6 +23,7 @@ import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/package_info.dart'; import 'package:fcs/pages/package/package_list.dart'; +import 'package:fcs/pages/pickup/pickup_list.dart'; import 'package:fcs/pages/processing/processing_list.dart'; import 'package:fcs/pages/rates/shipment_rates.dart'; import 'package:fcs/pages/receiving/receiving_list.dart'; @@ -266,6 +267,11 @@ class _HomePageState extends State { forCustomer: false, )))); + final pickupBtnFcs = TaskButton("pickup.title", + icon: SimpleLineIcons.direction, + btnCallback: () => Navigator.of(context).push( + CupertinoPageRoute(builder: (context) => PickupList()))); + final fcsShipmentBtn = TaskButton("FCSshipment.title", icon: Ionicons.ios_airplane, btnCallback: () => Navigator.of(context).push(CupertinoPageRoute( @@ -335,6 +341,7 @@ class _HomePageState extends State { if (user.hasAdmin() || user.hasSupport()) widgetsFcs.add(rateBtnFcs); if (user.hasPackages()) widgetsFcs.add(packagesBtnFcs); if (user.hasShipment()) widgetsFcs.add(shipmentBtnFcs); + if (user.hasShipment()) widgetsFcs.add(pickupBtnFcs); if (user.hasInvoices()) widgetsFcs.add(invoicesBtnFcs); if (user.hasFcsShipments()) widgetsFcs.add(fcsShipmentBtn); diff --git a/lib/pages/pickup/model/processing_model.dart b/lib/pages/pickup/model/processing_model.dart new file mode 100644 index 0000000..0977245 --- /dev/null +++ b/lib/pages/pickup/model/processing_model.dart @@ -0,0 +1,30 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/domain/entities/processing.dart'; +import 'package:fcs/pages/main/model/base_model.dart'; +import 'package:logging/logging.dart'; + +class ProcessingModel extends BaseModel { + List processings = []; + final log = Logger('ProcessingModel'); + + StreamSubscription? listener; + + void initUser(user) { + super.initUser(user); + } + + @override + logout() async { + if (listener != null) await listener!.cancel(); + + processings = []; + } + + Future createProcessing(Processing processing) async {} + + Future updateProcessing(Processing processing) async {} +} diff --git a/lib/pages/pickup/pickup_editor.dart b/lib/pages/pickup/pickup_editor.dart new file mode 100644 index 0000000..1f42a87 --- /dev/null +++ b/lib/pages/pickup/pickup_editor.dart @@ -0,0 +1,286 @@ +import 'package:fcs/domain/entities/market.dart'; +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/domain/entities/user.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/market/market_editor.dart'; +import 'package:fcs/pages/market/model/market_model.dart'; +import 'package:fcs/pages/package/model/package_model.dart'; +import 'package:fcs/pages/package/tracking_id_page.dart'; +import 'package:fcs/pages/main/util.dart'; +import 'package:fcs/pages/user_search/user_serach.dart'; +import 'package:fcs/pages/widgets/display_text.dart'; +import 'package:fcs/pages/widgets/fcs_id_icon.dart'; +import 'package:fcs/pages/widgets/input_text.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:fcs/pages/widgets/multi_img_controller.dart'; +import 'package:fcs/pages/widgets/multi_img_file.dart'; +import 'package:fcs/pages/widgets/progress.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class PickupEditor extends StatefulWidget { + final Package? package; + PickupEditor({this.package}); + + @override + _PickupEditorState createState() => _PickupEditorState(); +} + +class _PickupEditorState extends State { + TextEditingController _remarkCtl = new TextEditingController(); + TextEditingController _descCtl = new TextEditingController(); + + Package? _package; + User? _user; + bool _isLoading = false; + + @override + void initState() { + super.initState(); + _package = widget.package; + selectedMarket = _package!.market ?? ""; + _descCtl.text = _package!.desc ?? ""; + _remarkCtl.text = _package!.remark ?? ""; + multiImgController.setImageUrls = _package!.photoUrls; + _user = User( + fcsID: _package!.fcsID ?? "", + name: _package!.userName ?? "", + phoneNumber: _package!.phoneNumber ?? ""); + } + + final DateFormat dateFormat = DateFormat("d MMM yyyy"); + + bool isNew = false; + MultiImgController multiImgController = MultiImgController(); + + @override + Widget build(BuildContext context) { + var timeBox = Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 150, + child: DisplayText( + text: '', + labelTextKey: "pickup.time", + iconData: Icons.timer, + ), + ), + Container( + width: 150, + child: DisplayText( + text: '', + labelTextKey: "pickup.time", + iconData: Icons.timer, + ), + ) + ], + ); + + final pickupDateBox = DisplayText( + text: "12-05-2021", + labelTextKey: "pickup.date", + iconData: Icons.date_range, + ); + + final pickupNumberBox = DisplayText( + text: "210502-ASDFRE", + labelTextKey: "pickup.pickup_number", + iconData: SimpleLineIcons.direction, + ); + final completeProcessingBtn = fcsButton( + context, + getLocalString(context, 'pickup.edit.complete.btn'), + callack: _completeProcessing, + ); + final descBox = DisplayText( + text: _package!.desc ?? "", + labelTextKey: 'processing.desc', + iconData: MaterialCommunityIcons.message_text_outline, + ); + final remarkBox = InputText( + labelTextKey: 'pickup.remark', + iconData: Entypo.new_message, + controller: _remarkCtl); + + final img = MultiImageFile( + enabled: true, + controller: multiImgController, + title: "Receipt File", + ); + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30), + onPressed: () { + if (isDataChanged()) { + showConfirmDialog(context, "back.button_confirm", () { + Navigator.of(context).pop(); + }); + } else { + Navigator.of(context).pop(); + } + }, + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + title: LocalText( + context, + "pickup.edit.title", + fontSize: 20, + color: primaryColor, + ), + ), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + children: [ + pickupNumberBox, + pickupDateBox, + timeBox, + descBox, + remarkBox, + img, + _package!.status == 'packed' + ? completeProcessingBtn + : Container(), + SizedBox( + height: 20, + ) + ], + ), + ), + ), + ); + } + + String? selectedMarket; + Widget marketDropdown() { + List _markets = Provider.of(context).markets; + List markets = _markets.map((e) => e.name).toList(); + markets.insert(0, MANAGE_MARKET); + if (!markets.contains(selectedMarket)) { + markets.insert(0, selectedMarket!); + } + + return Padding( + padding: const EdgeInsets.only(left: 5.0, right: 0), + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 0, right: 10), + child: Icon(Icons.store, color: primaryColor), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(right: 18.0), + child: LocalText( + context, + "processing.market", + color: Colors.black54, + fontSize: 16, + ), + ), + DropdownButton( + isDense: true, + value: selectedMarket, + style: TextStyle(color: Colors.black, fontSize: 14), + underline: Container( + height: 1, + color: Colors.grey, + ), + onChanged: (String? newValue) { + setState(() { + if (newValue == MANAGE_MARKET) { + selectedMarket = null; + _manageMarket(); + return; + } + selectedMarket = newValue; + }); + }, + isExpanded: true, + items: markets.map>((String? value) { + return DropdownMenuItem( + value: value, + child: Text(value ?? "", + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: value == MANAGE_MARKET + ? secondaryColor + : primaryColor)), + ); + }).toList(), + ), + ], + ), + ), + ], + ), + ); + } + + _manageMarket() { + Navigator.push( + context, + CupertinoPageRoute(builder: (context) => MarketEditor()), + ); + } + + _completeProcessing() async { + if (_user!.fcsID == null || _user!.fcsID == "") { + showMsgDialog(context, "Error", "Expected FCS-ID"); + return; + } + setState(() { + _isLoading = true; + }); + PackageModel packageModel = + Provider.of(context, listen: false); + try { + _package!.fcsID = _user!.fcsID; + _package!.desc = _descCtl.text; + _package!.remark = _remarkCtl.text; + _package!.market = selectedMarket!; + await packageModel.updateProcessing(_package!, + multiImgController.getAddedFile, multiImgController.getDeletedUrl); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + isDataChanged() { + if (isNew) { + return _user!.fcsID != "" || + selectedMarket != null || + _descCtl.text != "" || + _remarkCtl.text != "" || + multiImgController.getAddedFile.isNotEmpty; + } else { + var _package = Package( + trackingID: widget.package!.trackingID, + fcsID: _user!.fcsID, + market: selectedMarket!, + desc: _descCtl.text, + remark: _remarkCtl.text, + photoUrls: widget.package!.photoUrls); + return widget.package!.isChangedForEditProcessing(_package) || + multiImgController.getAddedFile.isNotEmpty || + multiImgController.getDeletedUrl.isNotEmpty; + } + } +} diff --git a/lib/pages/pickup/pickup_info.dart b/lib/pages/pickup/pickup_info.dart new file mode 100644 index 0000000..18e23ca --- /dev/null +++ b/lib/pages/pickup/pickup_info.dart @@ -0,0 +1,253 @@ +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/main/util.dart'; +import 'package:fcs/pages/package/model/package_model.dart'; +import 'package:fcs/pages/pickup/pickup_editor.dart'; +import 'package:fcs/pages/widgets/display_text.dart'; +import 'package:fcs/pages/widgets/fcs_id_icon.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:fcs/pages/widgets/multi_img_controller.dart'; +import 'package:fcs/pages/widgets/multi_img_file.dart'; +import 'package:fcs/pages/widgets/progress.dart'; +import 'package:fcs/pages/widgets/status_tree.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +final DateFormat dateFormat = DateFormat("d MMM yyyy"); + +class PickupInfo extends StatefulWidget { + final Package? package; + PickupInfo({this.package}); + + @override + _PickupInfoState createState() => _PickupInfoState(); +} + +class _PickupInfoState extends State { + var dateFormatter = new DateFormat('dd MMM yyyy'); + Package? _package; + bool _isLoading = false; + MultiImgController multiImgController = MultiImgController(); + + @override + void initState() { + super.initState(); + initPackage(widget.package!); + } + + initPackage(Package? package) { + if (package == null) return; + setState(() { + _package = package; + multiImgController.setImageUrls = package.photoUrls; + }); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final pickupNumberBox = DisplayText( + text: _package != null ? _package!.trackingID : '', + labelTextKey: "pickup.pickup_number", + iconData: SimpleLineIcons.direction, + ); + var fcsIDBox = DisplayText( + text: _package != null ? _package!.fcsID : "", + labelTextKey: "pickup.fcs.id", + icon: FcsIDIcon(), + ); + final phoneNumberBox = DisplayText( + text: _package != null ? _package!.phoneNumber : "", + labelTextKey: "pickup.phone", + iconData: Icons.phone, + ); + final customerNameBox = DisplayText( + text: _package != null ? _package!.userName : "", + labelTextKey: "pickup.consignee.name", + iconData: Icons.perm_identity, + ); + var senderFcsIDBox = DisplayText( + text: _package != null ? _package!.senderFCSID : "", + labelTextKey: "pickup.fcs.id", + icon: FcsIDIcon(), + ); + final senderPhoneNumberBox = DisplayText( + text: _package != null ? _package!.senderPhoneNumber : "", + labelTextKey: "pickup.phone", + iconData: Icons.phone, + ); + final senderNameBox = DisplayText( + text: _package != null ? _package!.senderName : "", + labelTextKey: "pickup.shipper.name", + iconData: Icons.perm_identity, + ); + final marketBox = DisplayText( + text: _package != null ? _package!.market : "-", + labelTextKey: "pickup.market", + iconData: Icons.store, + ); + final descBox = DisplayText( + text: _package != null ? _package!.desc : "-", + labelTextKey: "pickup.desc", + iconData: MaterialCommunityIcons.message_text_outline, + ); + final remarkBox = DisplayText( + text: _package != null ? _package!.remark : "-", + labelTextKey: "pickup.remark", + iconData: Entypo.new_message, + ); + final img = MultiImageFile( + enabled: false, + controller: multiImgController, + title: "Receipt File", + ); + + var timeBox = Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 150, + child: DisplayText( + text: '', + labelTextKey: "pickup.time", + iconData: Icons.timer, + ), + ), + Container( + width: 150, + child: DisplayText( + text: '', + labelTextKey: "pickup.time", + iconData: Icons.timer, + ), + ) + ], + ); + + final consigneeBox = Container( + child: Column( + children: [ + fcsIDBox, + phoneNumberBox, + customerNameBox, + ], + ), + ); + final shipperBox = Container( + child: Column( + children: [ + senderFcsIDBox, + senderPhoneNumberBox, + senderNameBox, + ], + ), + ); + + final pickupDateBox = DisplayText( + text: "12-05-2021", + labelTextKey: "pickup.date", + iconData: Icons.date_range, + ); + + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30), + onPressed: () => Navigator.of(context).pop(), + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + title: LocalText( + context, + "pickup.info.title", + fontSize: 20, + color: primaryColor, + ), + actions: [ + IconButton( + icon: Icon(Icons.delete, color: primaryColor), + onPressed: _delete, + ), + IconButton( + icon: Icon(Icons.edit, color: primaryColor), + onPressed: _gotoEditor, + ), + ], + ), + body: Card( + child: Column( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(10.0), + child: ListView(children: [ + pickupNumberBox, + pickupDateBox, + timeBox, + descBox, + remarkBox, + _package!.photoUrls.length == 0 ? Container() : img, + StatusTree( + shipmentHistory: _package!.shipmentHistory, + currentStatus: _package!.status ?? ""), + SizedBox( + height: 20, + ) + ]), + )), + ], + ), + ), + ), + ); + } + + _delete() { + showConfirmDialog(context, "pickup.delete.confirm", _deletePackage); + } + + _deletePackage() async { + setState(() { + _isLoading = true; + }); + PackageModel packageModel = + Provider.of(context, listen: false); + try { + await packageModel.deleteProcessing(_package!); + Navigator.pop(context, true); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _gotoEditor() async { + bool? deleted = await Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => PickupEditor( + package: widget.package, + ))); + if (deleted ?? false) { + Navigator.pop(context); + } else { + PackageModel packageModel = + Provider.of(context, listen: false); + Package? p = await packageModel.getPackage(_package!.id!); + initPackage(p); + } + } +} diff --git a/lib/pages/pickup/pickup_list.dart b/lib/pages/pickup/pickup_list.dart new file mode 100644 index 0000000..bba3551 --- /dev/null +++ b/lib/pages/pickup/pickup_list.dart @@ -0,0 +1,86 @@ +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/package/model/package_model.dart'; +import 'package:fcs/pages/package_search/package_serach.dart'; +import 'package:fcs/pages/pickup/pickup_editor.dart'; +import 'package:fcs/pages/pickup/pickup_info.dart'; +import 'package:fcs/pages/pickup/pickup_list_row.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:fcs/pages/widgets/progress.dart'; +import 'package:fcs/pagination/paginator_listview.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PickupList extends StatefulWidget { + @override + _PickupListState createState() => _PickupListState(); +} + +class _PickupListState extends State { + bool _isLoading = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + var packageModel = Provider.of(context); + var packages = packageModel.activePackages; + + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(CupertinoIcons.back), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + title: LocalText( + context, + "pickup.title", + fontSize: 20, + color: Colors.white, + ), + actions: [ + IconButton( + icon: Icon( + Icons.search, + color: Colors.white, + ), + iconSize: 30, + onPressed: () => searchPackage(context, + callbackPackageSelect: _searchCallback), + ), + ], + ), + body: PaginatorListView( + paginatorListener: packages!, + rowBuilder: (p) => PickupListRow( + key: ValueKey(p.id), + package: p, + ), + color: primaryColor, + )), + ); + } + + _searchCallback(Package package) async { + var packageModel = Provider.of(context, listen: false); + Package? _package = await packageModel.getPackage(package.id!); + if (_package == null) return; + Navigator.push( + context, + CupertinoPageRoute(builder: (context) => PickupInfo(package: _package)), + ); + } +} diff --git a/lib/pages/pickup/pickup_list_row.dart b/lib/pages/pickup/pickup_list_row.dart new file mode 100644 index 0000000..36d06e4 --- /dev/null +++ b/lib/pages/pickup/pickup_list_row.dart @@ -0,0 +1,101 @@ +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/main/util.dart'; +import 'package:fcs/pages/pickup/pickup_info.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; +import 'package:intl/intl.dart'; + +typedef CallbackPackageSelect(Package package); + +class PickupListRow extends StatelessWidget { + final Package? package; + final CallbackPackageSelect? callbackPackageSelect; + final double dotSize = 15.0; + final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); + + PickupListRow({Key? key, this.package, this.callbackPackageSelect}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (callbackPackageSelect != null) { + callbackPackageSelect!(package!); + return; + } + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => PickupInfo(package: package)), + ); + }, + child: Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: Row( + children: [ + Expanded( + child: new Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: new Row( + children: [ + Container( + padding: EdgeInsets.only(left: 5, right: 10), + child: Icon( + SimpleLineIcons.direction, + color: primaryColor, + size: 30, + ), + ), + new Expanded( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + package!.id == null ? '' : package!.trackingID!, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + package!.market == null ? '' : package!.market!, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(3.0), + child: getStatus(package!.status ?? ""), + ), + Padding( + padding: const EdgeInsets.all(0), + child: new Text( + package!.currentStatusDate != null + ? dateFormat.format(package!.currentStatusDate!) + : '', + style: new TextStyle(fontSize: 15.0, color: Colors.grey), + ), + ), + ], + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/term/term_edit.dart b/lib/pages/term/term_edit.dart index 48d11e7..b81ecb1 100644 --- a/lib/pages/term/term_edit.dart +++ b/lib/pages/term/term_edit.dart @@ -10,12 +10,13 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:provider/provider.dart'; +import 'package:zefyrka/zefyrka.dart'; // import 'package:zefyr/zefyr.dart'; typedef void ProfileCallback(); class TermEdit extends StatefulWidget { - final Term term; + final Term? term; TermEdit({required this.term}); @override _TermEditState createState() => _TermEditState(); @@ -23,12 +24,12 @@ class TermEdit extends StatefulWidget { class _TermEditState extends State { /// Allows to control the editor and the document. - // ZefyrController _controllerEng; - // ZefyrController _controllerMm; + late ZefyrController _controllerEng; + late ZefyrController _controllerMm; /// Zefyr editor like any other input field requires a focus node. - // FocusNode _focusNodeEng; - // FocusNode _focusNodeMm; + late FocusNode _focusNodeEng; + late FocusNode _focusNodeMm; bool _isLoading = false; @override @@ -37,23 +38,23 @@ class _TermEditState extends State { _isLoading = false; // Here we must load the document and pass it to Zefyr controller. - // _controllerEng = ZefyrController(_loadDocument(widget.term.termEng)); - // _controllerMm = ZefyrController(_loadDocument(widget.term.termMm)); - // _focusNodeEng = FocusNode(); - // _focusNodeMm = FocusNode(); + _controllerEng = ZefyrController(_loadDocument(widget.term!.termEng ?? "")); + _controllerMm = ZefyrController(_loadDocument(widget.term!.termMm ?? "")); + _focusNodeEng = FocusNode(); + _focusNodeMm = FocusNode(); } /// Loads the document to be edited in Zefyr. - // NotusDocument _loadDocument(String data) { - // NotusDocument doc; - // try { - // doc = NotusDocument.fromJson(jsonDecode(data)); - // } catch (e) {} - // if (doc == null) { - // doc = NotusDocument(); - // } - // return doc; - // } + NotusDocument _loadDocument(String data) { + late NotusDocument doc; + try { + doc = NotusDocument.fromJson(jsonDecode(data)); + } catch (e) {} + if (doc == null) { + doc = NotusDocument(); + } + return doc; + } @override Widget build(BuildContext context) { @@ -116,8 +117,8 @@ class _TermEditState extends State { height: MediaQuery.of(context).size.height - 200, child: TabBarView( children: [ - // textEditor(_controllerEng, _focusNodeEng), - // textEditor(_controllerMm, _focusNodeMm), + textEditor(_controllerEng, _focusNodeEng), + textEditor(_controllerMm, _focusNodeMm), ], ), ), @@ -129,35 +130,24 @@ class _TermEditState extends State { ); } - // Widget textEditor(ZefyrController controller, FocusNode focusNode) { - // return ListView( - // children: [ - // Container( - // height: MediaQuery.of(context).size.height - 200, - // child: ZefyrScaffold( - // child: ZefyrTheme( - // data: ZefyrThemeData().copyWith( - // defaultLineTheme: LineTheme( - // padding: EdgeInsets.all(0), - // textStyle: TextStyle(fontFamily: "Myanmar3"), - // ), - // ), - // child: ZefyrEditor( - // autofocus: false, - // padding: EdgeInsets.all(16), - // controller: controller, - // focusNode: focusNode, - // ), - // ), - // ), - // ), - // // savebtn, - // SizedBox( - // height: 10, - // ) - // ], - // ); - // } + Widget textEditor(ZefyrController controller, FocusNode focusNode) { + return ListView( + children: [ + Container( + height: MediaQuery.of(context).size.height - 200, + child: ZefyrEditor( + autofocus: false, + padding: EdgeInsets.all(16), + controller: controller, + focusNode: focusNode, + ), + ), + SizedBox( + height: 10, + ) + ], + ); + } _unfocus() { FocusScope.of(context).unfocus(); @@ -168,11 +158,11 @@ class _TermEditState extends State { _isLoading = true; }); try { - // final contentsEng = jsonEncode(_controllerEng.document); - // final contentsMm = jsonEncode(_controllerMm.document); + final contentsEng = jsonEncode(_controllerEng.document); + final contentsMm = jsonEncode(_controllerMm.document); // print('contents => $contentsEng'); - // TermModel termModel = Provider.of(context, listen: false); - // await termModel.saveTerm(Term(termEng: contentsEng, termMm: contentsMm)); + TermModel termModel = Provider.of(context, listen: false); + await termModel.saveTerm(Term(termEng: contentsEng, termMm: contentsMm)); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { diff --git a/lib/pages/term/term_page.dart b/lib/pages/term/term_page.dart index ee765c8..d121853 100644 --- a/lib/pages/term/term_page.dart +++ b/lib/pages/term/term_page.dart @@ -10,7 +10,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -// import 'package:zefyr/zefyr.dart'; +import 'package:zefyrka/zefyrka.dart'; typedef void ProfileCallback(); @@ -23,29 +23,29 @@ class TermPage extends StatefulWidget { } class _TermPageState extends State { - // ZefyrController _controller; - // FocusNode _focusNode; - // NotusDocument document = new NotusDocument(); + late ZefyrController _controller; + late FocusNode _focusNode; + late NotusDocument document = new NotusDocument(); bool isLoading = false; @override void initState() { super.initState(); - // _focusNode = FocusNode(); + _focusNode = FocusNode(); } - // NotusDocument _loadDocument(Setting setting) { - // bool isEng = Provider.of(context).isEng; - // String term = isEng ? setting.termsEng : setting.termsMm; - // NotusDocument doc; - // try { - // doc = NotusDocument.fromJson(jsonDecode(term)); - // } catch (e) {} - // if (doc == null) { - // doc = NotusDocument(); - // } - // return doc; - // } + NotusDocument _loadDocument(Setting? setting) { + bool isEng = Provider.of(context).isEng; + String? term = isEng ? (setting!.termsEng ?? "") : (setting!.termsMm ?? ""); + late NotusDocument doc; + try { + doc = NotusDocument.fromJson(jsonDecode(term)); + } catch (e) {} + if (doc == null) { + doc = NotusDocument(); + } + return doc; + } @override Widget build(BuildContext context) { @@ -79,31 +79,17 @@ class _TermPageState extends State { TermEdit(term: Term.fromSetting(setting!)), )), icon: Icon( - CupertinoIcons.pen, + Icons.edit, color: primaryColor, )) ] : [], ), - // body: ZefyrTheme( - // data: ZefyrThemeData().copyWith( - // defaultLineTheme: LineTheme( - // padding: EdgeInsets.all(0), - // textStyle: TextStyle(fontFamily: "Myanmar3"), - // ), - // ), - // // data: ZefyrThemeData().copyWith( - // // defaultLineTheme: LineTheme( - // // textStyle: TextStyle(color: Colors.black), - // // padding: EdgeInsets.all(0))), - // child: ZefyrScaffold( - // child: ZefyrEditor( - // mode: ZefyrMode.view, - // padding: EdgeInsets.all(16), - // controller: ZefyrController(_loadDocument(setting)), - // focusNode: _focusNode, - // ), - // )), + body: ZefyrEditor( + padding: EdgeInsets.all(16), + controller: ZefyrController(_loadDocument(setting)), + focusNode: _focusNode, + ), ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 260c466..4211a6e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: font_awesome_flutter: ^9.1.0 photo_view: ^0.12.0 uuid: ^3.0.4 - # zefyr: + zefyrka: ^1.0.10 path_provider: ^2.0.2 camera: ^0.9.0 url_launcher: ^6.0.9