Commit 449891f4 authored by Karunarathna K.M.D.Y.K's avatar Karunarathna K.M.D.Y.K

Merge branch 'IT19975146' into 'master'

It19975146

See merge request !11
parents c24889e2 f539d154
import 'package:flutter/material.dart';
import 'package:govimithura/constants/post_status.dart';
import 'package:govimithura/models/entity_model.dart';
import 'package:govimithura/models/post_model.dart';
import 'package:govimithura/providers/authentication_provider.dart';
import 'package:govimithura/providers/post_provider.dart';
import 'package:govimithura/utils/screen_size.dart';
import 'package:provider/provider.dart';
import '../models/insect_model.dart';
import '../utils/loading_overlay.dart';
import '../utils/utils.dart';
import '../widgets/utils/common_widget.dart';
import 'login.dart';
import 'my_post.dart';
class AdminHome extends StatefulWidget {
const AdminHome({super.key});
@override
State<AdminHome> createState() => _AdminHomeState();
}
class _AdminHomeState extends State<AdminHome> {
late AuthenticationProvider pAuthentication;
late PostProvider pPost;
List<PostModel<InsectModel>> initialPosts = const [];
List<PostModel<InsectModel>> posts = [];
List<EntityModel> statusList = [];
EntityModel selectedStatus = EntityModel();
@override
void initState() {
super.initState();
pAuthentication =
Provider.of<AuthenticationProvider>(context, listen: false);
pPost = Provider.of<PostProvider>(context, listen: false);
Future.delayed(Duration.zero, () => initialize());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: const Icon(Icons.home),
title: const Text("Admin Home"),
actions: [
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (_) => confirmationDialog(
context,
title: "Logout from Govi Mithura",
yesFunction: () async {
await pAuthentication.signOut();
if (context.mounted) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => const LoginScreen()),
);
}
},
),
);
},
icon: const Icon(Icons.logout),
),
],
),
body: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Post Approval",
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
Row(
children: [
DropdownButton(
items: statusList.map((status) {
return DropdownMenuItem(
value: status.id,
child: Text(status.description),
);
}).toList(),
value: selectedStatus.id,
onChanged: (int? value) {
selectedStatus = statusList
.firstWhere((element) => element.id == value);
filterPosts();
},
),
spacingWidget(10, SpaceDirection.horizontal),
IconButton(
onPressed: () async {
await initialize();
},
icon: const Icon(Icons.refresh),
),
],
)
],
),
spacingWidget(15, SpaceDirection.vertical),
if (posts.isNotEmpty)
...List.generate(
posts.length,
(index) => Container(
margin: const EdgeInsets.only(bottom: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
child: Column(
children: [
ListTile(
onTap: () {
Navigator.push(
context,
SlidePageRoute(
page: MyPost(
postId: posts[index].id,
isAdmin: true,
)));
},
title: Text(
'${posts[index].refModel!.name} - ${posts[index].title}',
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Row(
children: [
Text(Utils.getAgoTime(posts[index].createdAt!)),
spacingWidget(10, SpaceDirection.horizontal),
],
),
trailing: const Icon(
Icons.chevron_right_rounded,
size: 30,
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(
children: [
postStatus(posts[index].status),
if (posts[index].status == PostStatus.pending)
Flexible(
child: ButtonBar(
children: [
FloatingActionButton.small(
elevation: 0,
backgroundColor: Colors.red,
heroTag: 'reject$index',
onPressed: () async {
PostModel post = posts[index];
post.status = PostStatus.rejected;
await LoadingOverlay.of(context)
.during(pPost
.changePostStatus(post));
await initialize();
},
child: const Icon(Icons.close)),
FloatingActionButton.small(
elevation: 0,
backgroundColor: Colors.green,
heroTag: 'approve$index',
onPressed: () async {
PostModel post = posts[index];
post.status = PostStatus.approved;
await LoadingOverlay.of(context)
.during(
pPost.changePostStatus(post));
await initialize();
},
child: const Icon(Icons.done),
),
],
),
)
],
),
)
],
),
),
)
else
SizedBox(
height: ScreenSize.height - (ScreenSize.height * 0.25),
child: Center(
child: Text(
"No ${selectedStatus.description == PostStatus.all ? '' : selectedStatus.description} posts found !",
),
),
)
],
),
),
),
);
}
Future<void> initialize() async {
posts = await LoadingOverlay.of(context).during(pPost.getAllPost());
initialPosts = posts;
statusList = [
EntityModel(id: 1, description: PostStatus.all),
EntityModel(id: 2, description: PostStatus.pending),
EntityModel(id: 3, description: PostStatus.approved),
EntityModel(id: 4, description: PostStatus.rejected),
];
selectedStatus = statusList.first;
filterPosts();
setState(() {});
}
void filterPosts() {
posts = initialPosts.where((element) {
if (selectedStatus.description == PostStatus.all) {
return true;
} else {
return element.status == selectedStatus.description;
}
}).toList();
setState(() {});
}
}
import 'package:flutter/material.dart';
import 'package:govimithura/constants/post_status.dart';
import 'package:govimithura/models/post_model.dart';
import 'package:govimithura/providers/post_provider.dart';
import 'package:govimithura/screens/admin_home.dart';
import 'package:govimithura/screens/my_post_list.dart';
import 'package:govimithura/utils/loading_overlay.dart';
import 'package:govimithura/utils/utils.dart';
import 'package:govimithura/widgets/utils/common_widget.dart';
import 'package:provider/provider.dart';
import '../widgets/utils/ratings/custom_rating_bar.dart';
class MyPost extends StatefulWidget {
final String postId;
final bool isAdmin;
const MyPost({super.key, required this.postId, this.isAdmin = false});
@override
State<MyPost> createState() => _MyPostState();
}
class _MyPostState extends State<MyPost> {
late PostProvider pPost;
PostModel post = PostModel();
@override
void initState() {
super.initState();
pPost = Provider.of<PostProvider>(context, listen: false);
Future.delayed(Duration.zero, () async {
await initialize();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My Pest Control Methods'),
actions: [
IconButton(
onPressed: () async {
showDialog(
context: context,
builder: (_) => confirmationDialog(
context,
title: "Delete Pest Control Method",
yesFunction: () async {
bool isSuccess = await LoadingOverlay.of(context)
.during(pPost.deletePost(widget.postId));
if (mounted && isSuccess) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (_) => widget.isAdmin
? const AdminHome()
: const MyPostList(),
),
);
}
},
),
);
},
icon: const Icon(Icons.delete),
),
],
),
body: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 50),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
post.title,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 25,
),
),
spacingWidget(10, SpaceDirection.vertical),
if (post.status != PostStatus.pending)
Row(
children: [
CustomRatingBar(
rating: post.rating,
itemSize: 20,
),
spacingWidget(5, SpaceDirection.horizontal),
Text(
'(${post.rateCount})',
style: const TextStyle(
fontSize: 15,
),
),
],
),
spacingWidget(10, SpaceDirection.vertical),
Text(
'Posted on ${post.formattedDateTime}',
style: const TextStyle(
fontSize: 15,
),
),
spacingWidget(10, SpaceDirection.vertical),
postStatus(post.status),
if (widget.isAdmin && post.status == PostStatus.pending)
Column(
children: [
spacingWidget(10, SpaceDirection.vertical),
Row(
children: [
const Text(
"Post Approval",
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.bold),
),
Flexible(
child: ButtonBar(
children: [
FloatingActionButton.small(
elevation: 0,
backgroundColor: Colors.red,
heroTag: 'reject',
onPressed: () async {
post.status = PostStatus.rejected;
await LoadingOverlay.of(context)
.during(pPost.changePostStatus(post));
await initialize();
},
child: const Icon(Icons.close)),
FloatingActionButton.small(
elevation: 0,
backgroundColor: Colors.green,
heroTag: 'approve',
onPressed: () async {
post.status = PostStatus.approved;
await LoadingOverlay.of(context)
.during(pPost.changePostStatus(post));
await initialize();
},
child: const Icon(Icons.done),
),
],
),
),
],
),
],
),
spacingWidget(50, SpaceDirection.vertical),
Text(
post.content,
style: const TextStyle(
fontSize: 18,
),
),
],
),
),
));
}
Future<void> initialize() async {
post = await LoadingOverlay.of(context)
.during(pPost.getPostsById(widget.postId));
post.formattedDateTime = Utils.getFormattedDateTime(post.createdAt!);
setState(() {});
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/post_provider.dart';
import '../utils/loading_overlay.dart';
import '../utils/utils.dart';
import '../widgets/drawer_widget.dart';
import '../widgets/utils/common_widget.dart';
import 'my_post.dart';
class MyPostList extends StatefulWidget {
const MyPostList({super.key});
@override
State<MyPostList> createState() => _MyPostListState();
}
class _MyPostListState extends State<MyPostList> {
late PostProvider pPost;
@override
void initState() {
super.initState();
pPost = Provider.of<PostProvider>(context, listen: false);
Future.delayed(Duration.zero, () async {
await initialize();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: const DrawerWidget(),
appBar: AppBar(
title: const Text('My Pest Control Methods'),
),
body: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(20),
child: Consumer<PostProvider>(
builder: (context, post, child) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
if (post.posts.isEmpty)
const Center(
child: Text('No Pest Control Methods found'),
),
...List.generate(
post.posts.length,
(index) => Padding(
padding: const EdgeInsets.only(bottom: 10),
child: ListTile(
onTap: () {
Navigator.push(
context,
SlidePageRoute(
page: MyPost(
postId: post.posts[index].id)));
},
title: Text(
'${post.posts[index].refModel?.name ?? ''} - ${post.posts[index].title}',
style:
const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
Utils.getAgoTime(post.posts[index].createdAt!)),
trailing: const Icon(
Icons.chevron_right_rounded,
size: 30,
)),
),
),
],
);
},
)),
),
);
}
Future<void> initialize() async {
await LoadingOverlay.of(context).during(pPost.getPostsByUid());
setState(() {});
}
}
import 'package:flutter/material.dart';
import 'package:govimithura/providers/post_provider.dart';
import 'package:provider/provider.dart';
import '../utils/loading_overlay.dart';
import '../widgets/drawer_widget.dart';
import '../widgets/expandable_post.dart';
class SavedPosts extends StatefulWidget {
const SavedPosts({super.key});
@override
State<SavedPosts> createState() => _SavedPostsState();
}
class _SavedPostsState extends State<SavedPosts> {
late PostProvider pPost;
@override
void initState() {
super.initState();
pPost = Provider.of<PostProvider>(context, listen: false);
Future.delayed(Duration.zero, () async {
await initialize();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: const DrawerWidget(),
appBar: AppBar(
title: const Text('Saved Pest Control Methods'),
),
body: SingleChildScrollView(child: Consumer<PostProvider>(
builder: (context, post, child) {
return Column(
children: List.generate(
post.posts.length,
(index) {
return ExpandablePost(index: index, post: post.posts[index]);
},
),
);
},
)),
);
}
Future<void> initialize() async {
pPost.setCurrentScreen('saved_posts');
await LoadingOverlay.of(context).during(pPost.getAllSavedPost());
setState(() {});
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment