added validity for reusing space name in same layer

This commit is contained in:
hannathkadher
2024-11-27 22:41:18 +04:00
parent 448e798da1
commit 22a9ee5a14
2 changed files with 33 additions and 11 deletions

View File

@ -270,6 +270,7 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
builder: (BuildContext context) { builder: (BuildContext context) {
return CreateSpaceDialog( return CreateSpaceDialog(
products: widget.products, products: widget.products,
parentSpace: parentIndex != null? spaces[parentIndex] : null,
onCreateSpace: (String name, String icon, List<SelectedProduct> selectedProducts) { onCreateSpace: (String name, String icon, List<SelectedProduct> selectedProducts) {
setState(() { setState(() {
// Set the first space in the center or use passed position // Set the first space in the center or use passed position

View File

@ -4,6 +4,7 @@ import 'package:syncrow_web/pages/common/buttons/cancel_button.dart';
import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart';
import 'package:syncrow_web/pages/spaces_management/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/product_model.dart';
import 'package:syncrow_web/pages/spaces_management/model/selected_product_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/selected_product_model.dart';
import 'package:syncrow_web/pages/spaces_management/model/space_model.dart';
import 'package:syncrow_web/pages/spaces_management/widgets/add_device_type_widget.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/add_device_type_widget.dart';
import 'package:syncrow_web/pages/spaces_management/widgets/dialogs/icon_selection_dialog.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/dialogs/icon_selection_dialog.dart';
import 'package:syncrow_web/pages/spaces_management/widgets/hoverable_button.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/hoverable_button.dart';
@ -18,9 +19,11 @@ class CreateSpaceDialog extends StatefulWidget {
final String? icon; final String? icon;
final bool isEdit; final bool isEdit;
final List<SelectedProduct> selectedProducts; final List<SelectedProduct> selectedProducts;
final SpaceModel? parentSpace;
const CreateSpaceDialog( const CreateSpaceDialog(
{super.key, {super.key,
this.parentSpace,
required this.onCreateSpace, required this.onCreateSpace,
this.products, this.products,
this.name, this.name,
@ -39,6 +42,7 @@ class CreateSpaceDialogState extends State<CreateSpaceDialog> {
late TextEditingController nameController; late TextEditingController nameController;
bool isOkButtonEnabled = false; bool isOkButtonEnabled = false;
bool isNameFieldInvalid = false; bool isNameFieldInvalid = false;
bool isNameFieldExist = false;
@override @override
void initState() { void initState() {
@ -47,7 +51,6 @@ class CreateSpaceDialogState extends State<CreateSpaceDialog> {
nameController = TextEditingController(text: widget.name ?? ''); nameController = TextEditingController(text: widget.name ?? '');
selectedProducts = widget.selectedProducts.isNotEmpty ? widget.selectedProducts : []; selectedProducts = widget.selectedProducts.isNotEmpty ? widget.selectedProducts : [];
isOkButtonEnabled = enteredName.isNotEmpty || nameController.text.isNotEmpty; isOkButtonEnabled = enteredName.isNotEmpty || nameController.text.isNotEmpty;
isNameFieldInvalid = nameController.text.isEmpty;
} }
@override @override
@ -116,14 +119,20 @@ class CreateSpaceDialogState extends State<CreateSpaceDialog> {
TextField( TextField(
controller: nameController, controller: nameController,
onChanged: (value) { onChanged: (value) {
enteredName = value; enteredName = value.trim();
setState(() { setState(() {
if (value.isNotEmpty) { isNameFieldExist = false;
isOkButtonEnabled = true;
isNameFieldInvalid = false;
} else {
isNameFieldInvalid = true;
isOkButtonEnabled = false; isOkButtonEnabled = false;
isNameFieldInvalid = value.isEmpty;
if (!isNameFieldInvalid) {
if (widget.parentSpace?.children
.any((child) => child.name == value) ??
false) {
isNameFieldExist = true;
} else {
isOkButtonEnabled = true;
}
} }
}); });
}, },
@ -140,8 +149,9 @@ class CreateSpaceDialogState extends State<CreateSpaceDialog> {
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
borderSide: BorderSide( borderSide: BorderSide(
color: color: isNameFieldInvalid || isNameFieldExist
isNameFieldInvalid ? ColorsManager.red : ColorsManager.boxColor, ? ColorsManager.red
: ColorsManager.boxColor,
width: 1.5, width: 1.5,
), ),
), ),
@ -165,6 +175,17 @@ class CreateSpaceDialogState extends State<CreateSpaceDialog> {
?.copyWith(color: ColorsManager.red), ?.copyWith(color: ColorsManager.red),
), ),
), ),
if (isNameFieldExist)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
'*Name already exist',
style: Theme.of(context)
.textTheme
.bodySmall
?.copyWith(color: ColorsManager.red),
),
),
const SizedBox(height: 16), const SizedBox(height: 16),
if (selectedProducts.isNotEmpty) if (selectedProducts.isNotEmpty)
_buildSelectedProductsButtons(widget.products ?? []) _buildSelectedProductsButtons(widget.products ?? [])