diff --git a/assets/icons/door_sensor.svg b/assets/icons/door_sensor.svg
new file mode 100644
index 00000000..fdeb661c
--- /dev/null
+++ b/assets/icons/door_sensor.svg
@@ -0,0 +1,35 @@
+
diff --git a/lib/pages/spaces_management/bloc/space_management_bloc.dart b/lib/pages/spaces_management/bloc/space_management_bloc.dart
index 831c6f30..41c7e234 100644
--- a/lib/pages/spaces_management/bloc/space_management_bloc.dart
+++ b/lib/pages/spaces_management/bloc/space_management_bloc.dart
@@ -119,7 +119,6 @@ class SpaceManagementBloc extends Bloc toJson() {
+ return {
+ 'productId': productId,
+ 'count': count,
+ };
+ }
+}
diff --git a/lib/pages/spaces_management/model/space_model.dart b/lib/pages/spaces_management/model/space_model.dart
index e64b741f..9c85724d 100644
--- a/lib/pages/spaces_management/model/space_model.dart
+++ b/lib/pages/spaces_management/model/space_model.dart
@@ -1,14 +1,15 @@
import 'dart:ui';
import 'package:syncrow_web/pages/spaces_management/model/community_model.dart';
import 'package:syncrow_web/pages/spaces_management/model/connection_model.dart';
+import 'package:syncrow_web/pages/spaces_management/model/selected_product_model.dart';
enum SpaceStatus { newSpace, modified, unchanged }
class SpaceModel {
String? uuid;
- final String? icon;
+ String? icon;
final String? spaceTuyaUuid;
- final String name;
+ String name;
final bool isPrivate;
final String? invitationCode;
SpaceModel? parent;
@@ -17,6 +18,7 @@ class SpaceModel {
Offset position;
bool isHovered;
SpaceStatus status;
+ List selectedProducts;
List outgoingConnections = []; // Connections from this space
Connection? incomingConnection; // Connections to this space
@@ -35,6 +37,7 @@ class SpaceModel {
this.isHovered = false,
this.incomingConnection,
this.status = SpaceStatus.unchanged,
+ this.selectedProducts = const [],
});
factory SpaceModel.fromJson(Map json) {
@@ -72,19 +75,6 @@ class SpaceModel {
return instance;
}
- @override
- String toString() {
- return '''
-SpaceModel {
- uuid: $uuid,
- name: $name,
- isPrivate: $isPrivate,
- position: {dx: ${position.dx}, dy: ${position.dy}},
- parentUuid: ${parent?.uuid},
- children: ${children.map((child) => child.name).toList()},
- isHovered: $isHovered
-}''';
- }
Map toMap() {
return {
diff --git a/lib/pages/spaces_management/view/dialogs/create_space_dialog.dart b/lib/pages/spaces_management/view/dialogs/create_space_dialog.dart
index d7bfeba6..76987253 100644
--- a/lib/pages/spaces_management/view/dialogs/create_space_dialog.dart
+++ b/lib/pages/spaces_management/view/dialogs/create_space_dialog.dart
@@ -3,15 +3,28 @@ import 'package:flutter_svg/flutter_svg.dart';
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/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/widgets/add_device_type_widget.dart';
+import 'package:syncrow_web/pages/spaces_management/widgets/hoverable_button.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart';
class CreateSpaceDialog extends StatefulWidget {
- final Function(String, String) onCreateSpace;
+ final Function(String, String, List selectedProducts) onCreateSpace;
final List? products;
+ final String? name;
+ final String? icon;
+ final bool isEdit;
+ final List selectedProducts;
- const CreateSpaceDialog({super.key, required this.onCreateSpace, this.products});
+ const CreateSpaceDialog(
+ {super.key,
+ required this.onCreateSpace,
+ this.products,
+ this.name,
+ this.icon,
+ this.isEdit = false,
+ this.selectedProducts = const []});
@override
CreateSpaceDialogState createState() => CreateSpaceDialogState();
@@ -20,12 +33,21 @@ class CreateSpaceDialog extends StatefulWidget {
class CreateSpaceDialogState extends State {
String selectedIcon = Assets.location;
String enteredName = '';
- Map selectedProducts = {};
+ List selectedProducts = [];
+ late TextEditingController nameController;
+
+ @override
+ void initState() {
+ super.initState();
+ selectedIcon = widget.icon ?? Assets.location;
+ nameController = TextEditingController(text: widget.name ?? '');
+ selectedProducts = widget.selectedProducts.isNotEmpty ? widget.selectedProducts : [];
+ }
@override
Widget build(BuildContext context) {
return AlertDialog(
- title: const Text('Create New Space'),
+ title: widget.isEdit ? Text('Edit Space') : Text('Create new Space'),
backgroundColor: ColorsManager.whiteColors,
content: SizedBox(
width: 600,
@@ -76,6 +98,7 @@ class CreateSpaceDialogState extends State {
children: [
// Name input field
TextField(
+ controller: nameController,
onChanged: (value) {
enteredName = value;
},
@@ -208,8 +231,10 @@ class CreateSpaceDialogState extends State {
Expanded(
child: DefaultButton(
onPressed: () {
- if (enteredName.isNotEmpty) {
- widget.onCreateSpace(enteredName, selectedIcon); // Pass the name and icon back
+ late String newName = enteredName.isNotEmpty ? enteredName : (widget.name ?? '');
+ if (newName.isNotEmpty) {
+ widget.onCreateSpace(
+ newName, selectedIcon, selectedProducts); // Pass the name and icon back
Navigator.of(context).pop(); // Close the dialog
}
},
@@ -270,49 +295,31 @@ class CreateSpaceDialogState extends State {
Widget _buildSelectedProductsButtons(List products) {
return Container(
+ width: 600,
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: ColorsManager.textFieldGreyColor,
borderRadius: BorderRadius.circular(12),
+ border: Border.all(
+ color: ColorsManager.neutralGray,
+ width: 2, // Set the border width
+ ),
),
child: Wrap(
spacing: 8, // Horizontal spacing between buttons
runSpacing: 8, // Vertical spacing between rows
children: [
// Dynamically create a button for each selected product
- for (var entry in selectedProducts.entries)
- GestureDetector(
+ for (var product in selectedProducts)
+ HoverableButton(
+ iconPath: _mapIconToProduct(product.productId, products),
+ text: 'x${product.count}',
onTap: () {
-
+ setState(() {
+ selectedProducts.remove(product);
+ });
+ // Handle button tap
},
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(16),
- ),
- child: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- // Display the product icon
- SvgPicture.asset(
- _mapIconToProduct(entry.key, products),
- width: 24,
- height: 24,
- ),
- const SizedBox(width: 8),
- // Display the product count
- Text(
- 'x${entry.value}',
- style: const TextStyle(
- fontSize: 14,
- fontWeight: FontWeight.w500,
- color: ColorsManager.spaceColor,
- ),
- ),
- ],
- ),
- ),
),
// Add Button
GestureDetector(
@@ -331,10 +338,9 @@ class CreateSpaceDialogState extends State {
);
},
child: Container(
- width: 50,
- height: 50,
+ padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(
- color: ColorsManager.textFieldGreyColor,
+ color: ColorsManager.whiteColors,
borderRadius: BorderRadius.circular(16),
),
child: const Icon(
@@ -359,7 +365,7 @@ class CreateSpaceDialogState extends State {
prodId: '',
prodType: '',
name: '',
- icon: Assets.presenceSensor,
+ icon: Assets.presenceSensor,
),
);
diff --git a/lib/pages/spaces_management/widgets/add_device_type_widget.dart b/lib/pages/spaces_management/widgets/add_device_type_widget.dart
index d6f4e8db..d069b391 100644
--- a/lib/pages/spaces_management/widgets/add_device_type_widget.dart
+++ b/lib/pages/spaces_management/widgets/add_device_type_widget.dart
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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/selected_product_model.dart';
import 'package:syncrow_web/pages/spaces_management/widgets/counter_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart';
@@ -9,8 +10,8 @@ import 'package:syncrow_web/utils/extension/build_context_x.dart';
class AddDeviceWidget extends StatefulWidget {
final List? products;
- final ValueChanged