Merge pull request #117 from SyncrowIOT/SP-1318

Sp 1318
This commit is contained in:
hannathkadher
2025-03-13 14:51:54 +04:00
committed by GitHub
6 changed files with 60 additions and 54 deletions

View File

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart';
@ -457,7 +458,8 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
emit(SpaceManagementLoading());
try {
final updatedSpaces = await saveSpacesHierarchically(event.spaces, event.communityUuid);
final updatedSpaces =
await saveSpacesHierarchically(event.context, event.spaces, event.communityUuid);
final allSpaces = await _fetchSpacesForCommunity(event.communityUuid);
@ -508,9 +510,14 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
}
Future<List<SpaceModel>> saveSpacesHierarchically(
List<SpaceModel> spaces, String communityUuid) async {
BuildContext context, List<SpaceModel> spaces, String communityUuid) async {
final orderedSpaces = flattenHierarchy(spaces);
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
var spaceBloc = context.read<SpaceTreeBloc>();
List<CommunityModel> communities = spaceBloc.state.communityList;
CommunityModel? selectedCommunity = communities.firstWhere(
(community) => community.uuid == communityUuid,
);
final parentsToDelete = orderedSpaces.where((space) =>
space.status == SpaceStatus.deleted &&
@ -532,7 +539,13 @@ class SpaceManagementBloc extends Bloc<SpaceManagementEvent, SpaceManagementStat
if (space.uuid != null && space.uuid!.isNotEmpty) {
List<TagModelUpdate> tagUpdates = [];
final prevSpace = await _api.getSpace(communityUuid, space.uuid!, projectUuid);
List<SpaceModel> matchedSpaces =
selectedCommunity.spaces.where((space) => space.uuid == space.uuid).toList();
if (matchedSpaces.isEmpty) continue;
final prevSpace = matchedSpaces[0];
final List<UpdateSubspaceTemplateModel> subspaceUpdates = [];
final List<SubspaceModel>? prevSubspaces = prevSpace?.subspaces;
final List<SubspaceModel>? newSubspaces = space.subspaces;

View File

@ -58,14 +58,16 @@ class CreateSpaceEvent extends SpaceManagementEvent {
class SaveSpacesEvent extends SpaceManagementEvent {
final List<SpaceModel> spaces;
final String communityUuid;
final BuildContext context;
const SaveSpacesEvent({
const SaveSpacesEvent(
this.context, {
required this.spaces,
required this.communityUuid,
});
@override
List<Object> get props => [spaces, communityUuid];
List<Object> get props => [spaces, communityUuid, context];
}
class UpdateSpacePositionEvent extends SpaceManagementEvent {

View File

@ -460,6 +460,7 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
String communityUuid = widget.selectedCommunity!.uuid;
context.read<SpaceManagementBloc>().add(SaveSpacesEvent(
context,
spaces: spacesToSave,
communityUuid: communityUuid,
));

View File

@ -18,8 +18,10 @@ import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dynamic_
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dynamic_room_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
import 'package:syncrow_web/utils/string_utils.dart';
class SpaceModelCardWidget extends StatelessWidget {
class SpaceModelCardWidget extends StatelessWidget with HelperResponsiveLayout {
final SpaceTemplateModel model;
final BuildContext? pageContext;
final bool topActionsDisabled;
@ -76,14 +78,17 @@ class SpaceModelCardWidget extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
model.modelName,
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
color: Colors.black,
fontWeight: FontWeight.bold,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
Expanded(
child: Text(
StringUtils.capitalizeFirstLetter(model.modelName),
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
color: ColorsManager.blackColor,
fontWeight: FontWeight.bold,
fontSize: isSmallScreenSize(context) ? 13 : 20,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
if (!topActionsDisabled)
Row(
@ -95,15 +100,12 @@ class SpaceModelCardWidget extends StatelessWidget {
builder: (BuildContext dialogContext) {
return BlocProvider<LinkSpaceToModelBloc>(
create: (_) => LinkSpaceToModelBloc(),
child: BlocListener<LinkSpaceToModelBloc,
LinkSpaceToModelState>(
child: BlocListener<LinkSpaceToModelBloc, LinkSpaceToModelState>(
listenWhen: (previous, current) {
return previous != current;
},
listener: (context, state) {
final _bloc =
BlocProvider.of<LinkSpaceToModelBloc>(
context);
final _bloc = BlocProvider.of<LinkSpaceToModelBloc>(context);
if (state is SpaceModelLoading) {
showDialog(
context: context,
@ -111,19 +113,14 @@ class SpaceModelCardWidget extends StatelessWidget {
builder: (BuildContext context) {
return Dialog(
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(
20)),
borderRadius: BorderRadius.circular(20)),
elevation: 10,
backgroundColor: Colors.white,
child: Padding(
padding:
const EdgeInsets.symmetric(
vertical: 30,
horizontal: 50),
padding: const EdgeInsets.symmetric(
vertical: 30, horizontal: 50),
child: Column(
mainAxisSize:
MainAxisSize.min,
mainAxisSize: MainAxisSize.min,
children: [
CustomLoadingIndicator(),
],
@ -132,19 +129,14 @@ class SpaceModelCardWidget extends StatelessWidget {
);
},
);
} else if (state
is AlreadyHaveLinkedState) {
} else if (state is AlreadyHaveLinkedState) {
Navigator.of(dialogContext).pop();
showOverwriteDialog(
context, _bloc, model);
} else if (state
is SpaceValidationSuccess) {
showOverwriteDialog(context, _bloc, model);
} else if (state is SpaceValidationSuccess) {
_bloc.add(LinkSpaceModelEvent(
isOverWrite: false,
selectedSpaceMode: model.uuid));
isOverWrite: false, selectedSpaceMode: model.uuid));
Future.delayed(
const Duration(seconds: 1), () {
Future.delayed(const Duration(seconds: 1), () {
Navigator.of(dialogContext).pop();
Navigator.of(dialogContext).pop();
Navigator.of(dialogContext).pop();
@ -152,29 +144,23 @@ class SpaceModelCardWidget extends StatelessWidget {
showDialog(
context: context,
builder:
(BuildContext dialogContext) {
builder: (BuildContext dialogContext) {
return const LinkingSuccessful();
},
).then((v) {
Future.delayed(
const Duration(seconds: 2), () {
Future.delayed(const Duration(seconds: 2), () {
Navigator.of(dialogContext).pop();
});
});
} else if (state
is SpaceModelLinkSuccess) {
} else if (state is SpaceModelLinkSuccess) {
Navigator.of(dialogContext).pop();
Navigator.of(dialogContext).pop();
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext
successDialogContext) {
Future.delayed(
const Duration(seconds: 2), () {
Navigator.of(successDialogContext)
.pop();
builder: (BuildContext successDialogContext) {
Future.delayed(const Duration(seconds: 2), () {
Navigator.of(successDialogContext).pop();
});
return const LinkingSuccessful();
@ -232,8 +218,7 @@ class SpaceModelCardWidget extends StatelessWidget {
),
),
),
if (productTagCount.isNotEmpty &&
model.subspaceModels != null)
if (productTagCount.isNotEmpty && model.subspaceModels != null)
Container(
width: 1.0,
color: ColorsManager.softGray,

View File

@ -6,7 +6,6 @@ import 'package:syncrow_web/pages/routines/models/routine_details_model.dart';
import 'package:syncrow_web/pages/routines/models/routine_model.dart';
import 'package:syncrow_web/services/api/http_service.dart';
import 'package:syncrow_web/utils/constants/api_const.dart';
import 'package:syncrow_web/utils/constants/temp_const.dart';
class SceneApi {
static final HTTPService _httpService = HTTPService();

View File

@ -0,0 +1,6 @@
class StringUtils {
static String capitalizeFirstLetter(String text) {
if (text.isEmpty) return text;
return text[0].toUpperCase() + text.substring(1);
}
}