Added Members Management Page With Demo Data

This commit is contained in:
Mohammad Salameh
2024-04-24 10:39:53 +03:00
parent 50c1e9be84
commit eee889d3e4
3 changed files with 275 additions and 2 deletions

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/view/widgets/smart_door/members_management_view.dart';
import 'package:syncrow_app/features/devices/view/widgets/smart_door/unlocking_records_view.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
@ -73,7 +74,7 @@ List<Map<String, dynamic>> doorLockButtons = [
{
'title': 'Memebers Managment',
'image': Assets.doorlockAssetsMembersManagement,
'page': null,
'page': const MembersManagementView(),
},
{
'title': 'Temporary Password',

View File

@ -0,0 +1,269 @@
import 'package:flutter/material.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/helpers/misc_string_helpers.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class MembersManagementView extends StatefulWidget {
const MembersManagementView({super.key});
@override
State<MembersManagementView> createState() => _MembersManagementViewState();
}
class _MembersManagementViewState extends State<MembersManagementView> {
bool showFamilyMembers = true;
@override
Widget build(BuildContext context) {
return DefaultScaffold(
title: 'Manage Members',
actions: const [
Padding(
padding: EdgeInsets.only(right: 10),
child: Icon(
Icons.add,
size: 30,
),
)
],
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
InkWell(
onTap: () {
setState(() {
showFamilyMembers = true;
});
},
child: BodyMedium(
text: 'Family Members',
fontWeight:
showFamilyMembers ? FontWeight.bold : FontWeight.normal,
),
),
const SizedBox(width: 10),
InkWell(
onTap: () {
setState(() {
showFamilyMembers = false;
});
},
child: BodyMedium(
text: 'Other Members',
fontWeight: !showFamilyMembers
? FontWeight.bold
: FontWeight.normal,
),
),
],
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: BodySmall(
text:
'Administrators can set passwords for themselves or other users. Family members can set passwords only when they are granted the permission to set passwords.',
style: context.bodySmall.copyWith(fontSize: 8),
),
),
DefaultContainer(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(
members.length,
(index) {
if (showFamilyMembers) {
if (members[index]['role'] == MemberRole.FamilyMember) {
return Column(
children: [
Row(
children: [
const SizedBox.square(
dimension: 35,
child: CircleAvatar(
backgroundColor: Colors.grey,
),
),
const SizedBox(
width: 10,
),
BodyMedium(
text: StringHelpers.toTitleCase(
members[index]['name'] as String)),
const Spacer(),
const BodyMedium(
text: 'Family Member',
fontColor: Colors.grey,
)
],
),
index != members.length - 1
? Container(
margin: const EdgeInsets.only(
left: 45, top: 8, bottom: 8),
height: 1,
color: ColorsManager.greyColor,
)
: const SizedBox(),
],
);
} else {
return const SizedBox();
}
} else {
if (members[index]['role'] == MemberRole.OtherMember) {
return Column(
children: [
Row(
children: [
const SizedBox.square(
dimension: 35,
child: CircleAvatar(
backgroundColor: Colors.grey,
),
),
const SizedBox(
width: 10,
),
BodyMedium(
text: StringHelpers.toTitleCase(
members[index]['name'] as String)),
const Spacer(),
const BodyMedium(
text: 'Other Member',
fontColor: Colors.grey,
)
],
),
index != members.length - 1
? Container(
margin: const EdgeInsets.only(
left: 45, top: 8, bottom: 8),
height: 1,
color: ColorsManager.greyColor,
)
: const SizedBox(),
],
);
} else {
return const SizedBox();
}
}
},
),
),
),
],
),
),
);
}
}
enum MemberRole {
FamilyMember,
OtherMember,
}
//TODO sort memebers by role
var members = [
{
'name': 'member 1',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 2',
'role': MemberRole.OtherMember,
},
{
'name': 'member 3',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 4',
'role': MemberRole.OtherMember,
},
{
'name': 'member 5',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 6',
'role': MemberRole.OtherMember,
},
{
'name': 'member 7',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 8',
'role': MemberRole.OtherMember,
},
{
'name': 'member 9',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 10',
'role': MemberRole.OtherMember,
},
{
'name': 'member 11',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 12',
'role': MemberRole.OtherMember,
},
{
'name': 'member 13',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 14',
'role': MemberRole.OtherMember,
},
{
'name': 'member 15',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 16',
'role': MemberRole.OtherMember,
},
{
'name': 'member 17',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 18',
'role': MemberRole.OtherMember,
},
{
'name': 'member 19',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 20',
'role': MemberRole.OtherMember,
},
{
'name': 'member 21',
'role': MemberRole.FamilyMember,
},
{
'name': 'member 22',
'role': MemberRole.OtherMember,
},
{
'name': 'member 23',
'role': MemberRole.FamilyMember,
},
];

View File

@ -7,10 +7,12 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
class DefaultScaffold extends StatelessWidget {
const DefaultScaffold({super.key, required this.child, this.title});
const DefaultScaffold(
{super.key, required this.child, this.title, this.actions});
final Widget child;
final String? title;
final List<Widget>? actions;
@override
Widget build(BuildContext context) {
return AnnotatedRegion(
@ -31,6 +33,7 @@ class DefaultScaffold extends StatelessWidget {
fontColor: ColorsManager.primaryColor,
fontWeight: FontsManager.bold,
),
actions: actions,
),
body: Container(
width: MediaQuery.sizeOf(context).width,