Progress towards 1493.

This commit is contained in:
Faris Armoush
2025-04-29 17:00:06 +03:00
parent c114161357
commit 1923ac7014
15 changed files with 404 additions and 31 deletions
+76 -29
View File
@@ -17,7 +17,15 @@ import 'package:syncrow_web/utils/style.dart';
class SpaceTreeView extends StatefulWidget {
final bool? isSide;
final Function onSelect;
const SpaceTreeView({required this.onSelect, this.isSide, super.key});
final bool shouldDisableDeselectingChildrenOfSelectedParent;
final Widget? title;
const SpaceTreeView({
required this.onSelect,
this.isSide,
super.key,
this.shouldDisableDeselectingChildrenOfSelectedParent = false,
this.title,
});
@override
State<SpaceTreeView> createState() => _SpaceTreeViewState();
@@ -41,17 +49,31 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
@override
Widget build(BuildContext context) {
return BlocBuilder<SpaceTreeBloc, SpaceTreeState>(builder: (context, state) {
final communities =
state.searchQuery.isNotEmpty ? state.filteredCommunity : state.communityList;
final communities = state.searchQuery.isNotEmpty
? state.filteredCommunity
: state.communityList;
return Container(
height: MediaQuery.sizeOf(context).height,
decoration: widget.isSide == true
? subSectionContainerDecoration.copyWith(color: ColorsManager.whiteColors)
? subSectionContainerDecoration.copyWith(
color: ColorsManager.whiteColors)
: const BoxDecoration(color: ColorsManager.whiteColors),
child: state is SpaceTreeLoadingState
? const Center(child: CircularProgressIndicator())
: Column(
children: [
if (widget.title != null)
Container(
alignment: AlignmentDirectional.centerStart,
padding: const EdgeInsets.all(24),
child: DefaultTextStyle(
style: context.textTheme.titleMedium!.copyWith(
color: ColorsManager.blackColor,
fontSize: 20,
),
child: widget.title!,
),
),
if (widget.isSide == true)
Container(
decoration: const BoxDecoration(
@@ -79,10 +101,12 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
style: context.textTheme.bodyMedium?.copyWith(
color: ColorsManager.blackColor,
),
onChanged: (value) => context.read<SpaceTreeBloc>().add(
SearchQueryEvent(value),
),
decoration: textBoxDecoration(radios: 20)?.copyWith(
onChanged: (value) =>
context.read<SpaceTreeBloc>().add(
SearchQueryEvent(value),
),
decoration:
textBoxDecoration(radios: 20)?.copyWith(
fillColor: Colors.white,
suffixIcon: Padding(
padding: const EdgeInsets.only(right: 16),
@@ -92,7 +116,8 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
height: 24,
),
),
hintStyle: context.textTheme.bodyMedium?.copyWith(
hintStyle:
context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w400,
fontSize: 12,
color: ColorsManager.textGray,
@@ -131,15 +156,16 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
itemBuilder: (context, index) {
return CustomExpansionTileSpaceTree(
title: communities[index].name,
isSelected:
state.selectedCommunities.contains(communities[index].uuid),
isSoldCheck:
state.selectedCommunities.contains(communities[index].uuid),
onExpansionChanged: () => context.read<SpaceTreeBloc>().add(
OnCommunityExpanded(
communities[index].uuid,
),
),
isSelected: state.selectedCommunities
.contains(communities[index].uuid),
isSoldCheck: state.selectedCommunities
.contains(communities[index].uuid),
onExpansionChanged: () =>
context.read<SpaceTreeBloc>().add(
OnCommunityExpanded(
communities[index].uuid,
),
),
isExpanded: state.expandedCommunities.contains(
communities[index].uuid,
),
@@ -156,8 +182,19 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
(space) {
return CustomExpansionTileSpaceTree(
title: space.name,
isExpanded: state.expandedSpaces.contains(space.uuid),
isExpanded:
state.expandedSpaces.contains(space.uuid),
onItemSelected: () {
final isParentSelected = _isParentSelected(
state,
communities[index],
space,
);
if (widget
.shouldDisableDeselectingChildrenOfSelectedParent &&
isParentSelected) {
return;
}
context.read<SpaceTreeBloc>().add(
OnSpaceSelected(
communities[index],
@@ -167,15 +204,18 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
);
widget.onSelect();
},
onExpansionChanged: () => context.read<SpaceTreeBloc>().add(
OnSpaceExpanded(
communities[index].uuid,
space.uuid ?? '',
),
),
isSelected: state.selectedSpaces.contains(space.uuid) ||
onExpansionChanged: () =>
context.read<SpaceTreeBloc>().add(
OnSpaceExpanded(
communities[index].uuid,
space.uuid ?? '',
),
),
isSelected: state.selectedSpaces
.contains(space.uuid) ||
state.soldCheck.contains(space.uuid),
isSoldCheck:
state.soldCheck.contains(space.uuid),
isSoldCheck: state.soldCheck.contains(space.uuid),
children: _buildNestedSpaces(
context,
state,
@@ -196,6 +236,13 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
});
}
bool _isParentSelected(
SpaceTreeState state, CommunityModel community, SpaceModel space) {
return state.selectedCommunities.contains(community.uuid) ||
(space.spaceModel?.uuid != null &&
state.selectedSpaces.contains(space.spaceModel?.uuid));
}
List<Widget> _buildNestedSpaces(
BuildContext context,
SpaceTreeState state,
@@ -204,8 +251,8 @@ class _SpaceTreeViewState extends State<SpaceTreeView> {
) {
return space.children.map((child) {
return CustomExpansionTileSpaceTree(
isSelected:
state.selectedSpaces.contains(child.uuid) || state.soldCheck.contains(child.uuid),
isSelected: state.selectedSpaces.contains(child.uuid) ||
state.soldCheck.contains(child.uuid),
isSoldCheck: state.soldCheck.contains(child.uuid),
title: child.name,
isExpanded: state.expandedSpaces.contains(child.uuid),