mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
fixed space model creation
This commit is contained in:
@ -9,8 +9,10 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/selected_pr
|
||||
import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_state.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart';
|
||||
import 'package:syncrow_web/utils/color_manager.dart';
|
||||
|
||||
@ -23,8 +25,8 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
final List<String>? allTags;
|
||||
final String spaceName;
|
||||
final String title;
|
||||
final void Function(
|
||||
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onUpdate;
|
||||
final BuildContext? pageContext;
|
||||
final List<String>? otherSpaceModels;
|
||||
|
||||
const AssignTagModelsDialog(
|
||||
{Key? key,
|
||||
@ -36,7 +38,8 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
this.allTags,
|
||||
required this.spaceName,
|
||||
required this.title,
|
||||
this.onUpdate})
|
||||
this.pageContext,
|
||||
this.otherSpaceModels})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
@ -271,6 +274,8 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
if (context.mounted) {
|
||||
Navigator.of(context).pop();
|
||||
|
||||
await showDialog<bool>(
|
||||
barrierDismissible: false,
|
||||
context: context,
|
||||
@ -282,11 +287,9 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
initialSelectedProducts: addedProducts,
|
||||
allTags: allTags,
|
||||
spaceName: spaceName,
|
||||
otherSpaceModels: otherSpaceModels,
|
||||
spaceTagModels: state.tags,
|
||||
onUpdate: (tags, subspaces) {
|
||||
onUpdate?.call(state.tags, subspaces);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
pageContext: pageContext,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -304,8 +307,6 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
foregroundColor: ColorsManager.whiteColors,
|
||||
onPressed: state.isSaveEnabled
|
||||
? () async {
|
||||
Navigator.of(context).pop();
|
||||
|
||||
for (var tag in state.tags) {
|
||||
if (tag.location == null ||
|
||||
subspaces == null) {
|
||||
@ -333,8 +334,24 @@ class AssignTagModelsDialog extends StatelessWidget {
|
||||
t.internalId == tag.internalId);
|
||||
}
|
||||
}
|
||||
Navigator.of(context)
|
||||
.popUntil((route) => route.isFirst);
|
||||
|
||||
onUpdate?.call(state.tags, subspaces);
|
||||
await showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext dialogContext) {
|
||||
return CreateSpaceModelDialog(
|
||||
products: products,
|
||||
allTags: allTags,
|
||||
pageContext: pageContext,
|
||||
otherSpaceModels: otherSpaceModels,
|
||||
spaceModel: SpaceTemplateModel(
|
||||
modelName: spaceName,
|
||||
tags: state.tags,
|
||||
subspaceModels: subspaces),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
: null,
|
||||
child: const Text('Save'),
|
||||
|
@ -1,3 +1,5 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart';
|
||||
@ -52,8 +54,6 @@ class CreateSpaceModelBloc
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
on<LoadSpaceTemplate>((event, emit) {
|
||||
emit(CreateSpaceModelLoading());
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
@ -173,7 +173,12 @@ class CreateSpaceModelBloc
|
||||
on<UpdateSpaceTemplateName>((event, emit) {
|
||||
final currentState = state;
|
||||
if (currentState is CreateSpaceModelLoaded) {
|
||||
if (event.name.trim().isEmpty) {
|
||||
if (event.allModels.contains(event.name) == true) {
|
||||
emit(CreateSpaceModelLoaded(
|
||||
currentState.space,
|
||||
errorMessage: "Duplicate Model name",
|
||||
));
|
||||
} else if (event.name.trim().isEmpty) {
|
||||
emit(CreateSpaceModelLoaded(
|
||||
currentState.space,
|
||||
errorMessage: "Model name cannot be empty",
|
||||
|
@ -34,11 +34,12 @@ class CreateSpaceTemplate extends CreateSpaceModelEvent {
|
||||
|
||||
class UpdateSpaceTemplateName extends CreateSpaceModelEvent {
|
||||
final String name;
|
||||
final List<String> allModels;
|
||||
|
||||
UpdateSpaceTemplateName({required this.name});
|
||||
UpdateSpaceTemplateName({required this.name, required this.allModels});
|
||||
|
||||
@override
|
||||
List<Object> get props => [name];
|
||||
List<Object> get props => [name,allModels];
|
||||
}
|
||||
|
||||
class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent {
|
||||
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_state.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/add_space_model_widget.dart';
|
||||
@ -24,6 +23,7 @@ class SpaceModelPage extends StatelessWidget {
|
||||
} else if (state is SpaceModelLoaded) {
|
||||
final spaceModels = state.spaceModels;
|
||||
final allTagValues = _getAllTagValues(spaceModels);
|
||||
final allSpaceModelNames = _getAllSpaceModelName(spaceModels);
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: ColorsManager.whiteColors,
|
||||
@ -52,12 +52,8 @@ class SpaceModelPage extends StatelessWidget {
|
||||
return CreateSpaceModelDialog(
|
||||
products: products,
|
||||
allTags: allTagValues,
|
||||
onLoad: (newModel) {
|
||||
context.read<SpaceModelBloc>().add(
|
||||
CreateSpaceModel(
|
||||
newSpaceModel: newModel),
|
||||
);
|
||||
},
|
||||
pageContext: context,
|
||||
otherSpaceModels: allSpaceModelNames,
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -76,7 +72,7 @@ class SpaceModelPage extends StatelessWidget {
|
||||
products: products,
|
||||
allTags: allTagValues,
|
||||
spaceModel: model,
|
||||
onLoad: (newModel) {},
|
||||
otherSpaceModels: allSpaceModelNames,
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -128,4 +124,12 @@ class SpaceModelPage extends StatelessWidget {
|
||||
}
|
||||
return allTags;
|
||||
}
|
||||
|
||||
List<String> _getAllSpaceModelName(List<SpaceTemplateModel> spaceModels) {
|
||||
final List<String> names = [];
|
||||
for (final spaceModel in spaceModels) {
|
||||
names.add(spaceModel.modelName);
|
||||
}
|
||||
return names;
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_spac
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/tag_chips_display_widget.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart';
|
||||
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart';
|
||||
import 'package:syncrow_web/services/space_model_mang_api.dart';
|
||||
@ -17,15 +19,17 @@ class CreateSpaceModelDialog extends StatelessWidget {
|
||||
final List<ProductModel>? products;
|
||||
final List<String>? allTags;
|
||||
final SpaceTemplateModel? spaceModel;
|
||||
final void Function(SpaceTemplateModel newModel)? onLoad;
|
||||
final BuildContext? pageContext;
|
||||
final List<String>? otherSpaceModels;
|
||||
|
||||
const CreateSpaceModelDialog({
|
||||
Key? key,
|
||||
this.products,
|
||||
this.allTags,
|
||||
this.spaceModel,
|
||||
this.onLoad,
|
||||
}) : super(key: key);
|
||||
const CreateSpaceModelDialog(
|
||||
{Key? key,
|
||||
this.products,
|
||||
this.allTags,
|
||||
this.spaceModel,
|
||||
this.pageContext,
|
||||
this.otherSpaceModels})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -44,17 +48,17 @@ class CreateSpaceModelDialog extends StatelessWidget {
|
||||
child: BlocProvider(
|
||||
create: (_) {
|
||||
final bloc = CreateSpaceModelBloc(_spaceModelApi);
|
||||
if (spaceModel != null) {
|
||||
bloc.add(UpdateSpaceTemplate(spaceModel!));
|
||||
} else {
|
||||
bloc.add(UpdateSpaceTemplate(SpaceTemplateModel(
|
||||
modelName: '',
|
||||
subspaceModels: const [],
|
||||
)));
|
||||
}
|
||||
if (spaceModel != null) {
|
||||
bloc.add(UpdateSpaceTemplate(spaceModel!));
|
||||
} else {
|
||||
bloc.add(UpdateSpaceTemplate(SpaceTemplateModel(
|
||||
modelName: '',
|
||||
subspaceModels: const [],
|
||||
)));
|
||||
}
|
||||
|
||||
spaceNameController.addListener(() {
|
||||
bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text));
|
||||
bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text,allModels: otherSpaceModels ??[]));
|
||||
});
|
||||
|
||||
return bloc;
|
||||
@ -86,9 +90,10 @@ class CreateSpaceModelDialog extends StatelessWidget {
|
||||
child: TextField(
|
||||
controller: spaceNameController,
|
||||
onChanged: (value) {
|
||||
context
|
||||
.read<CreateSpaceModelBloc>()
|
||||
.add(UpdateSpaceTemplateName(name: value));
|
||||
context.read<CreateSpaceModelBloc>().add(
|
||||
UpdateSpaceTemplateName(
|
||||
name: value,
|
||||
allModels: otherSpaceModels ?? []));
|
||||
},
|
||||
style: const TextStyle(color: ColorsManager.blackColor),
|
||||
decoration: InputDecoration(
|
||||
@ -128,21 +133,8 @@ class CreateSpaceModelDialog extends StatelessWidget {
|
||||
subspaces: subspaces,
|
||||
allTags: allTags,
|
||||
spaceNameController: spaceNameController,
|
||||
onLoad: (tags, subspaces) {
|
||||
if (context.read<CreateSpaceModelBloc>().state
|
||||
is CreateSpaceModelLoaded) {
|
||||
if (subspaces != null) {
|
||||
context
|
||||
.read<CreateSpaceModelBloc>()
|
||||
.add(AddSubspacesToSpaceTemplate(subspaces));
|
||||
}
|
||||
if (tags != null) {
|
||||
context
|
||||
.read<CreateSpaceModelBloc>()
|
||||
.add(AddTagsToSpaceTemplate(tags));
|
||||
}
|
||||
}
|
||||
},
|
||||
pageContext: pageContext,
|
||||
otherSpaceModels: otherSpaceModels,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
SizedBox(
|
||||
@ -161,26 +153,35 @@ class CreateSpaceModelDialog extends StatelessWidget {
|
||||
onPressed: state.errorMessage == null ||
|
||||
isNameValid
|
||||
? () {
|
||||
final updatedSpaceTemplate =
|
||||
updatedSpaceModel.copyWith(
|
||||
modelName:
|
||||
spaceNameController.text.trim(),
|
||||
);
|
||||
if(updatedSpaceTemplate.uuid != null){
|
||||
if (updatedSpaceModel.uuid == null) {
|
||||
final updatedSpaceTemplate =
|
||||
updatedSpaceModel.copyWith(
|
||||
modelName:
|
||||
spaceNameController.text.trim(),
|
||||
);
|
||||
if (updatedSpaceTemplate.uuid !=
|
||||
null) {}
|
||||
|
||||
context
|
||||
.read<CreateSpaceModelBloc>()
|
||||
.add(
|
||||
CreateSpaceTemplate(
|
||||
spaceTemplate:
|
||||
updatedSpaceTemplate,
|
||||
onCreate: (newModel) {
|
||||
if (pageContext != null) {
|
||||
pageContext!
|
||||
.read<SpaceModelBloc>()
|
||||
.add(CreateSpaceModel(
|
||||
newSpaceModel:
|
||||
newModel));
|
||||
}
|
||||
Navigator.of(context)
|
||||
.pop(); // Close the dialog
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
context.read<CreateSpaceModelBloc>().add(
|
||||
CreateSpaceTemplate(
|
||||
spaceTemplate:
|
||||
updatedSpaceTemplate,
|
||||
onCreate: (newModel) {
|
||||
onLoad!(newModel);
|
||||
Navigator.of(context)
|
||||
.pop(); // Close the dialog
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
: null,
|
||||
backgroundColor: ColorsManager.secondaryColor,
|
||||
|
@ -5,7 +5,6 @@ import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assi
|
||||
import 'package:syncrow_web/pages/spaces_management/helper/tag_helper.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/button_content_widget.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart';
|
||||
import 'package:syncrow_web/utils/color_manager.dart';
|
||||
@ -17,8 +16,8 @@ class TagChipDisplay extends StatelessWidget {
|
||||
final List<SubspaceTemplateModel>? subspaces;
|
||||
final List<String>? allTags;
|
||||
final TextEditingController spaceNameController;
|
||||
final void Function(
|
||||
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onLoad;
|
||||
final BuildContext? pageContext;
|
||||
final List<String>? otherSpaceModels;
|
||||
|
||||
const TagChipDisplay(BuildContext context,
|
||||
{Key? key,
|
||||
@ -28,7 +27,8 @@ class TagChipDisplay extends StatelessWidget {
|
||||
required this.subspaces,
|
||||
required this.allTags,
|
||||
required this.spaceNameController,
|
||||
this.onLoad})
|
||||
this.pageContext,
|
||||
this.otherSpaceModels})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
@ -91,24 +91,22 @@ class TagChipDisplay extends StatelessWidget {
|
||||
|
||||
if (navigatorContext != null) {
|
||||
await showDialog<bool>(
|
||||
barrierDismissible: false,
|
||||
context: navigatorContext,
|
||||
builder: (context) => AssignTagModelsDialog(
|
||||
products: products,
|
||||
subspaces: subspaces,
|
||||
allTags: allTags,
|
||||
initialTags: TagHelper.generateInitialTags(
|
||||
barrierDismissible: false,
|
||||
context: navigatorContext,
|
||||
builder: (context) => AssignTagModelsDialog(
|
||||
products: products,
|
||||
subspaces: subspaces,
|
||||
spaceTagModels: spaceModel?.tags ?? []),
|
||||
title: 'Edit Device',
|
||||
addedProducts:
|
||||
TagHelper.createInitialSelectedProducts(
|
||||
spaceModel?.tags ?? [], subspaces),
|
||||
spaceName: spaceModel?.modelName ?? '',
|
||||
onUpdate: (tags, subspaces) {
|
||||
onLoad?.call(tags, subspaces);
|
||||
}),
|
||||
);
|
||||
pageContext: pageContext,
|
||||
allTags: allTags,
|
||||
initialTags: TagHelper.generateInitialTags(
|
||||
subspaces: subspaces,
|
||||
spaceTagModels: spaceModel?.tags ?? []),
|
||||
title: 'Edit Device',
|
||||
addedProducts:
|
||||
TagHelper.createInitialSelectedProducts(
|
||||
spaceModel?.tags ?? [], subspaces),
|
||||
spaceName: spaceModel?.modelName ?? '',
|
||||
));
|
||||
}
|
||||
},
|
||||
child: Chip(
|
||||
@ -129,6 +127,8 @@ class TagChipDisplay extends StatelessWidget {
|
||||
)
|
||||
: TextButton(
|
||||
onPressed: () async {
|
||||
Navigator.of(context).pop();
|
||||
|
||||
await showDialog<bool>(
|
||||
barrierDismissible: false,
|
||||
context: context,
|
||||
@ -137,13 +137,8 @@ class TagChipDisplay extends StatelessWidget {
|
||||
subspaces: subspaces,
|
||||
allTags: allTags,
|
||||
spaceName: spaceNameController.text,
|
||||
pageContext: pageContext,
|
||||
isCreate: true,
|
||||
onUpdate: (tags, subspaces) {
|
||||
onLoad?.call(tags, subspaces);
|
||||
},
|
||||
onLoad: (tags, subspaces) {
|
||||
onLoad?.call(tags, subspaces);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
|
@ -5,6 +5,7 @@ import 'package:syncrow_web/pages/common/buttons/default_button.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/selected_product_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/link_space_model/bloc/link_space_model_bloc.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model.dart';
|
||||
import 'package:syncrow_web/pages/spaces_management/tag_model/bloc/add_device_model_bloc.dart';
|
||||
@ -21,28 +22,23 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
|
||||
final List<String>? allTags;
|
||||
final String spaceName;
|
||||
final bool isCreate;
|
||||
final void Function(
|
||||
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onLoad;
|
||||
final void Function(
|
||||
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onUpdate;
|
||||
final List<String>? otherSpaceModels;
|
||||
final BuildContext? pageContext;
|
||||
|
||||
const AddDeviceTypeModelWidget({
|
||||
super.key,
|
||||
this.products,
|
||||
this.initialSelectedProducts,
|
||||
this.subspaces,
|
||||
this.allTags,
|
||||
this.spaceTagModels,
|
||||
required this.spaceName,
|
||||
required this.isCreate,
|
||||
this.onLoad,
|
||||
this.onUpdate,
|
||||
});
|
||||
const AddDeviceTypeModelWidget(
|
||||
{super.key,
|
||||
this.products,
|
||||
this.initialSelectedProducts,
|
||||
this.subspaces,
|
||||
this.allTags,
|
||||
this.spaceTagModels,
|
||||
required this.spaceName,
|
||||
required this.isCreate,
|
||||
this.pageContext,
|
||||
this.otherSpaceModels});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
|
||||
final size = MediaQuery.of(context).size;
|
||||
final crossAxisCount = size.width > 1200
|
||||
? 8
|
||||
@ -142,10 +138,9 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
|
||||
allTags: allTags,
|
||||
spaceName: spaceName,
|
||||
initialTags: state.initialTag,
|
||||
otherSpaceModels: otherSpaceModels,
|
||||
title: dialogTitle,
|
||||
onUpdate: (tags, subspaces) {
|
||||
onUpdate?.call(tags, subspaces);
|
||||
},
|
||||
pageContext: pageContext,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user