Files
fcs/lib/pages/announcement.dart

185 lines
5.3 KiB
Dart
Raw Normal View History

2020-05-29 07:45:27 +06:30
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 '../theme/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<AnnouncementPage> {
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<MainModel>(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: <Widget>[
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: <Widget>[
isOwnerAndAbove || hasAdmin
? PopupMenuButton<PopupMenu>(
elevation: 3.2,
tooltip: 'This is tooltip',
onSelected: _select,
itemBuilder: (BuildContext context) {
return announcementMenu.map((PopupMenu choice) {
return PopupMenuItem<PopupMenu>(
value: choice,
child: Text(choice.status),
);
}).toList();
})
: Container()
],
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
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<AnnouncementModel>(context)
.deleteAnnouncement(widget.announcement);
}
Navigator.pop(context);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
isLoading = false;
});
}
}
}