import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fcs/model/announcement_model.dart'; import 'package:fcs/model/main_model.dart'; import 'package:fcs/pages/util.dart'; import 'package:fcs/vo/announcement.dart'; import 'package:fcs/vo/popup_menu.dart'; import 'package:fcs/widget/local_text.dart'; import 'package:fcs/widget/popupmenu.dart'; import 'package:fcs/widget/progress.dart'; import 'package:zefyr/zefyr.dart'; import '../fcs/common/theme.dart'; import 'announcement_editor.dart'; class AnnouncementPage extends StatefulWidget { final Announcement announcement; const AnnouncementPage({Key key, this.announcement}) : super(key: key); @override _AnnouncementState createState() => _AnnouncementState(); } class _AnnouncementState extends State { ZefyrController _textController; TextEditingController nameController = new TextEditingController(); FocusNode _focusNode; NotusDocument document = new NotusDocument(); bool isLoading = false; Announcement _announcement = new Announcement(); @override void initState() { super.initState(); if (widget.announcement != null) { _announcement = widget.announcement; nameController.text = _announcement.name; _textController = ZefyrController(_loadDocument(_announcement)); _focusNode = FocusNode(); } } NotusDocument _loadDocument(Announcement announcement) { NotusDocument doc; try { doc = NotusDocument.fromJson(jsonDecode(announcement.text)); } catch (e) {} if (doc == null) { doc = NotusDocument(); } return doc; } @override Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); bool isOwnerAndAbove = mainModel.user != null && mainModel.user.isOwnerAndAbove(); bool hasAdmin = mainModel.user != null && mainModel.user.hasAdmin(); final nameBox = Container( padding: EdgeInsets.only(top: 20, left: 20, right: 20), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ LocalText(context, 'announcement.name'), SizedBox( height: 15, ), Text( nameController.text, style: textStyle, ) ], ), ); final textBox = Expanded( child: Container( padding: EdgeInsets.only(left: 5, right: 20), child: ZefyrTheme( data: ZefyrThemeData().copyWith(), child: ZefyrScaffold( child: ZefyrEditor( mode: ZefyrMode.view, padding: EdgeInsets.all(16), controller: _textController, focusNode: _focusNode, ), )), )); return LocalProgress( inAsyncCall: isLoading, child: Scaffold( appBar: AppBar( title: LocalText(context, 'announcement.form.title', color: Colors.white, fontSize: 20), backgroundColor: primaryColor, actions: [ isOwnerAndAbove || hasAdmin ? PopupMenuButton( elevation: 3.2, tooltip: 'This is tooltip', onSelected: _select, itemBuilder: (BuildContext context) { return announcementMenu.map((PopupMenu choice) { return PopupMenuItem( value: choice, child: Text(choice.status), ); }).toList(); }) : Container() ], ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ nameBox, Container( padding: EdgeInsets.only(left: 10, right: 10), child: Divider( color: Colors.grey, )), Container( padding: EdgeInsets.only(left: 20, right: 20), child: LocalText(context, 'announcement.desc')), textBox, SizedBox(height: 10) ], ), ), ); } void _select(PopupMenu choice) async { if (choice.index == 1) { Announcement _anno = await Navigator.push( context, MaterialPageRoute( builder: (context) => AnnouncementEditor(announcement: _announcement)), ); if (_anno == null) return; setState(() { _announcement = _anno; nameController.text = _announcement.name; _textController = ZefyrController(_loadDocument(_announcement)); _focusNode = FocusNode(); }); } else if (choice.index == 2) { showConfirmDialog(context, "announcement.delete_confirm", () { _delete(context); }); } } void _delete(BuildContext context) async { setState(() { isLoading = true; }); try { if (widget.announcement != null) { await Provider.of(context) .deleteAnnouncement(widget.announcement); } Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { isLoading = false; }); } } }